1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-19 19:54:47 +00:00
This commit is contained in:
Zeno Rogue 2021-07-31 20:38:26 +02:00
commit 8da22c4ba9
10 changed files with 349 additions and 281 deletions

View File

@ -527,7 +527,7 @@ EX void killMonster(cell *c, eMonster who, flagtype deathflags IS(0)) {
princess::reviveAt = gold(NO_LOVE) + 20;
}
}
if(princess::challenge) showMissionScreen();
if(princess::challenge) changes.at_commit([] { showMissionScreen(); });
}
}

View File

@ -911,6 +911,7 @@ EX namespace dice {
int faces;
int facesides;
int order;
int highest_hardness;
die_structure(int ord, const vector<vector<int>>& v) {
sides = v;
spins = sides;
@ -933,6 +934,9 @@ EX namespace dice {
for(int i=0; i<faces; i++)
for(int j: sides[i])
hardness[i] = min(hardness[i], hardness[j]+1);
highest_hardness = 0;
for(int i=0; i<faces; i++)
highest_hardness = max(highest_hardness, hardness[i]);
}
};
@ -1201,7 +1205,11 @@ EX namespace dice {
visit(c, dd, V);
for(int i=0; i<isize(data); i++) {
auto dat = data[i];
queuestr(fpp ? dat.V * zpush(cgi.FLOOR) : dat.V, .5, its(dat.dd.val+1), 0xFF8000FF);
int wa = dw->hardness[dat.dd.val];
int wb = dw->highest_hardness;
unsigned int red = ((wa * 0x00) + ((wb-wa) * 0xff)) / wb;
color_t col = 0xFF0000FF + (red << 16);
queuestr(fpp ? dat.V * zpush(cgi.FLOOR) : dat.V, .5, its(dat.dd.val+1), col);
if(i <= 22)
forCellIdEx(c2, id, dat.c) if(can_roll(si, dat.dd.dir, movei(dat.c, id)) && !visited.count(c2)) {
auto re = roll_effect(movei(dat.c, id), dat.dd);

View File

@ -9,7 +9,7 @@ namespace hr {
bool doAutoplay;
eLand autoplayLand;
namespace prairie { extern long long enter; }
namespace prairie { extern cell *enter; }
bool sameland(eLand ll, eLand ln) {
if(ln == laBarrier || ln == laOceanWall)
@ -20,6 +20,111 @@ bool sameland(eLand ll, eLand ln) {
return false;
}
void randomCheat() {
int croll = hrand(50);
if (croll < 25) {
eItem b = (eItem) hrand(ittypes);
printf("Gain item: %s\n", iinf[b].name);
items[b] = (1 << hrand(11)) - 1;
items[itOrbYendor] &= 15;
reduceOrbPowers(); // in particlar, cancel out slaying+weakness, since the combination may confuse shadow
} else if (croll == 25) {
printf("Gain kills\n");
kills[hrand(motypes)] = (1 << hrand(11)) - 1;
} else if (croll == 26) {
printf("Princess soon\n");
princess::saved = true;
princess::everSaved = true;
items[itSavedPrincess]++;
items[itOrbLove] = 1;
items[itOrbTime] = 0;
} else if (croll == 27) {
printf("Gain allies\n");
forCellEx(cz, cwt.at)
if (!cz->monst)
cz->monst = pick(moMouse, moFriendlyGhost, moGolem, moTameBomberbird, moKnight);
} else if (croll == 28) {
printf("Place orbs with pickup effects\n");
forCellEx(cz, cwt.at)
if (!cz->item)
cz->item = pick(itOrbLife, itOrbFriend, itOrbSpeed, itOrbShield, itOrbChaos, itOrbPurity);
} else if (croll == 29) {
printf("Place fun walls\n");
forCellEx(cz, cwt.at)
if (!cz->wall && !cz->monst)
cz->wall = pick(waExplosiveBarrel, waBigStatue, waThumperOff, waBonfireOff, waCloud, waMirror);
} else if (croll == 30) {
cell *ct = dcal[hrand(isize(dcal))];
if (!isPlayerOn(ct) && !ct->monst && !ct->wall) {
eWall hazard = pick(waRose, waFireTrap, waMineMine, waTrapdoor, waChasm, waCavewall);
printf("Spam a hazard: %s\n", winf[hazard].name);
ct->wall = hazard;
}
} else if (croll == 31 && !memory_saving_mode) {
//printf("Saving memory\n");
//memory_saving_mode = true;
//save_memory();
//memory_saving_mode = false;
} else if (croll == 33) {
cell *ct = dcal[hrand(isize(dcal))];
if (!isPlayerOn(ct) && !ct->monst && !ct->wall) {
printf("Spam some slime\n");
ct->item = itNone;
ct->wall = hrand(2) ? waFloorA : waFloorB;
switch(hrand(4)) {
case 0: ct->monst = moSlime; break;
case 1: ct->item = itGreenStone; break;
default: ;
}
}
} else if (croll == 37) {
cell *ct = dcal[hrand(isize(dcal))];
if (!isPlayerOn(ct) && !ct->monst && !ct->wall) {
ct->monst = pick(moRagingBull, moTroll, moAcidBird, moMiner, moReptile, moVineBeast, moBug0, moBug1);
printf("Spam a monster: %s\n", minf[ct->monst].name);
}
// todo: dice
} else if (croll == 38) {
forCellEx(cz, cwt.at) {
if (cz->monst == moPrincessArmed) {
printf("Disarming a princess\n");
cz->monst = moPrincess;
}
}
} else if (croll == 39) {
//forCellEx(cz, cwt.at) {
// if (!cz->monst) {
// printf("Summoning an unarmed princess incorrectly\n");
// cz->monst = moPrincess;
// break;
// }
//}
} else if (croll == 40) {
//forCellEx(cz, cwt.at) {
// if (!cz->monst) {
// printf("Summoning an armed princess incorrectly\n");
// cz->monst = moPrincessArmed;
// break;
// }
//}
} else if (croll == 41) {
cell *ct = dcal[hrand(isize(dcal))];
if (among(ct->wall, waNone, waVinePlant, waFloorA, waFloorB, waTrapdoor, waChasm, waBigStatue)) {
// Set wparam on a cell where it shouldn't matter, so that if this wall is later converted
// to a walltype that does care by some code that assumes wparam was 0,
// we can find out if that causes bugs.
printf("Randomizing wparam on %s at %p\n", winf[ct->wall].name, (void *)ct);
ct->wparam = (unsigned char) hrand(256);
}
} else if (croll == 42) {
vid.wallmode = hrand(7);
printf("Set vid.wallmode to %d: %s\n", vid.wallmode, wdmodes[vid.wallmode]);
} else if (croll == 43) {
vid.monmode = hrand(4);
printf("Set vid.monmode to %d: %s\n", vid.monmode, mdmodes[vid.monmode]);
}
}
cell *cellToTarget() {
if (isCrossroads(cwt.at->land)) {
for (cell *c: dcal) {
@ -50,6 +155,175 @@ cell *cellToTarget() {
return dcal[hrand(isize(dcal))];
}
void randomMove()
{
// don't show warning dialogs
items[itWarning] = 1;
int roll = hrand(50);
if (roll == 0) {
// drop dead orb
bool res = movepcto(MD_DROP, 1);
printf("DROP: %d\n", res);
} else if (roll < 5) {
// skip turn
bool res = movepcto(MD_WAIT, 1);
printf("WAIT: %d\n", res);
} else if (roll < 42) {
// move to or attack a neighbor cell
int i = hrand(cwt.at->type);
cell *c2 = cwt.at->move(i);
cwt.spin = 0;
int d = neighborId(cwt.at, c2);
if (d >= 0) {
int subdir = (roll%2==0)?1:-1;
string c2info = dnameof(c2->wall) + "; " + dnameof(c2->monst) + "; " + dnameof(c2->item);
bool res = movepcto(d, subdir, false);
printf("MOVE %d [%s] sub %d: %d\n", d, c2info.c_str(), subdir, res);
if (!res && c2->monst) {
printf("clearing the monster (%s)\n", minf[c2->monst].name);
killMonster(c2, moNone);
}
} else {
printf("MOVE CONFUSED %d\n", d);
}
} else {
// try to use a ranged orb
cell *ct = cellToTarget();
eItem ti = targetRangedOrb(ct, roMouseForce);
const char *tm = (ti == eItem(-1)) ? "orb cannot be used (see message log)" : iinf[ti].name;
printf("TARGET %p: %s\n", (void*)ct, tm);
}
}
void noteUnusualSituations()
{
if(cwt.at->monst && !isMultitile(cwt.at->monst)) {
// This is possible in multiple ways
printf("on a non-multitile monster: %s\n", minf[cwt.at->monst].name);
}
else if(isDie(cwt.at->wall)) {
// This is possible with aether + teleport
printf("on a wall-type die: %s\n", winf[cwt.at->wall].name);
}
}
bool isAnythingWrong()
{
uintptr_t ienter = (uintptr_t) prairie::enter;
if(ienter && ienter < 100000) {
printf("ERROR: prairie::enter has incorrect value\n");
return true;
}
if(buggyGeneration || isize(buggycells)) {
println(hlog, "ERROR: buggy generation");
return true;
}
if(isIcyLand(cwt.at)) {
float heat = HEAT(cwt.at);
// Checking for extreme values as well as NaNs and infinities
if (!(-1e10 < heat && heat < 1e10)) {
printf("ERROR: Heat is out of expected range\n");
return true;
}
}
if (cwt.at->land == laCamelot) {
for(int i=0; i<isize(dcal); i++) {
cell *c = dcal[i];
if(c->land == laCamelot && celldistAltRelative(c) == 0 && c->wall != waRoundTable) {
printf("ERROR: The round table of camelot is interrupted by a cell of %s\n", winf[c->wall].name);
return true;
}
}
}
for(int i=0; i<isize(dcal); i++) {
cell *c = dcal[i];
(void)isChild(c, NULL);
if(childbug) return true;
if(c->land == laNone) {
printf("ERROR: no-land found\n");
return true;
}
if(c->item == itBuggy || c->item == itBuggy2) {
printf("ERROR: buggy item found\n");
return true;
}
if(!euclid && isPrincess(c->monst) && princess::getPrincessInfo(c) == nullptr) {
printf("ERROR: missing princess info\n");
return true;
}
if(dice::on(c)) {
if(dice::data.count(c) == 0) {
c->item = itBuggy;
printf("ERROR: missing dice::data[%p]\n", (void *)c);
return true;
}
else if(!dice::data[c].which) {
// we might get here instead if someone already tried to do data[c], which creates a new element out of nothing
c->item = itBuggy;
printf("ERROR: missing dice::data[%p].which\n", (void *)c);
return true;
}
}
}
return false;
}
void stopIfBug()
{
if(isAnythingWrong()) {
if(noGUI) {
exit(1);
}
else {
kills[moPlayer] = 0;
canmove = true;
doAutoplay = false;
}
}
}
void showAutoplayStats()
{
printf("cells travelled: %d\n", celldist(cwt.at));
printf("\n");
for(int i=0; i<ittypes; i++) if(items[i])
printf("%4dx %s\n", items[i], iinf[i].name);
printf("\n");
for(int i=1; i<motypes; i++) if(kills[i])
printf("%4dx %s <%d>\n", kills[i], minf[i].name, i);
printf("\n\n\n");
}
void resetIfNeeded(int *gcount)
{
if(hrand(5000) == 0 || (isGravityLand(cwt.at->land) && coastvalEdge(cwt.at) >= 100) || *gcount > 2000 || cellcount >= 20000000) {
printf("RESET\n");
*gcount = 0;
cellcount = 0;
activateSafety(autoplayLand ? autoplayLand : landlist[hrand(isize(landlist))]);
if (cellcount < 0) {
//printf("How did cellcount become negative?\n");
cellcount = 1;
}
}
if(cwt.at->land == laWestWall && cwt.at->landparam >= 30) {
printf("Safety generated\n");
forCellEx(c2, cwt.at) c2->item = itOrbSafety;
}
}
/* auto a3 = addHook(hooks_nextland, 100, [] (eLand l) {
eLand l2;
do { l2 = pick(laRuins, laTerracotta, laPrairie); } while(l2 == l);
@ -77,13 +351,7 @@ void autoplay(int num_moves = 1000000000) {
int lastdraw = 0;
#endif
while(doAutoplay) {
long long ienter = (long long) prairie::enter;
if(ienter && ienter < 100000) {
printf("ERROR: enter has incorrect value\n");
exit(1);
}
if(gold() > lastgold) {
lastgold = gold();
gcount = 0;
@ -114,261 +382,12 @@ void autoplay(int num_moves = 1000000000) {
else if(lcount < 50 && c2->item && c2->item != itOrbSafety) break;
} */
// Use a random cheat
int croll = hrand(50);
if (croll < 25) {
eItem b = (eItem) hrand(ittypes);
printf("Gain item: %s\n", iinf[b].name);
items[b] = (1 << hrand(11)) - 1;
items[itOrbYendor] &= 15;
reduceOrbPowers(); // in particlar, cancel out slaying+weakness, since the combination may confuse shadow
} else if (croll == 25) {
printf("Gain kills\n");
kills[hrand(motypes)] = (1 << hrand(11)) - 1;
} else if (croll == 26) {
printf("Princess soon\n");
princess::saved = true;
princess::everSaved = true;
items[itSavedPrincess]++;
items[itOrbLove] = 1;
items[itOrbTime] = 0;
} else if (croll == 27) {
printf("Gain allies\n");
forCellEx(cz, cwt.at)
if (!cz->monst)
cz->monst = pick(moMouse, moFriendlyGhost, moGolem, moTameBomberbird, moKnight);
} else if (croll == 28) {
printf("Place orbs with pickup effects\n");
forCellEx(cz, cwt.at)
if (!cz->item)
cz->item = pick(itOrbLife, itOrbFriend, itOrbSpeed, itOrbShield, itOrbChaos, itOrbPurity);
} else if (croll == 29) {
printf("Place fun walls\n");
forCellEx(cz, cwt.at)
if (!cz->wall && !cz->monst)
cz->wall = pick(waExplosiveBarrel, waBigStatue, waThumperOff, waBonfireOff, waCloud, waMirror);
} else if (croll == 30) {
cell *ct = dcal[hrand(isize(dcal))];
if (!isPlayerOn(ct) && !ct->monst && !ct->wall) {
eWall hazard = pick(waRose, waFireTrap, waMineMine, waTrapdoor, waChasm, waCavewall);
printf("Spam a hazard: %s\n", winf[hazard].name);
ct->wall = hazard;
}
} else if (croll == 31 && !memory_saving_mode) {
//printf("Saving memory\n");
//memory_saving_mode = true;
//save_memory();
//memory_saving_mode = false;
} else if (croll == 33) {
cell *ct = dcal[hrand(isize(dcal))];
if (!isPlayerOn(ct) && !ct->monst && !ct->wall) {
printf("Spam some slime\n");
ct->item = itNone;
ct->wall = hrand(2) ? waFloorA : waFloorB;
switch(hrand(4)) {
case 0: ct->monst = moSlime; break;
case 1: ct->item = itGreenStone; break;
default: ;
}
}
} else if (croll == 37) {
cell *ct = dcal[hrand(isize(dcal))];
if (!isPlayerOn(ct) && !ct->monst && !ct->wall) {
ct->monst = pick(moRagingBull, moTroll, moAcidBird, moMiner, moReptile, moVineBeast, moBug0, moBug1);
printf("Spam a monster: %s\n", minf[ct->monst].name);
}
// todo: dice
} else if (croll == 38) {
forCellEx(cz, cwt.at) {
if (cz->monst == moPrincessArmed) {
printf("Disarming a princess\n");
cz->monst = moPrincess;
}
}
} else if (croll == 39) {
//forCellEx(cz, cwt.at) {
// if (!cz->monst) {
// printf("Summoning an unarmed princess incorrectly\n");
// cz->monst = moPrincess;
// break;
// }
//}
} else if (croll == 40) {
//forCellEx(cz, cwt.at) {
// if (!cz->monst) {
// printf("Summoning an armed princess incorrectly\n");
// cz->monst = moPrincessArmed;
// break;
// }
//}
} else if (croll == 41) {
cell *ct = dcal[hrand(isize(dcal))];
if (among(ct->wall, waNone, waVinePlant, waFloorA, waFloorB, waTrapdoor, waChasm, waBigStatue)) {
// Set wparam on a cell where it shouldn't matter, so that if this wall is later converted
// to a walltype that does care by some code that assumes wparam was 0,
// we can find out if that causes bugs.
printf("Randomizing wparam on %s at %p\n", winf[ct->wall].name, (void *)ct);
ct->wparam = (unsigned char) hrand(256);
}
} else if (croll == 42) {
vid.wallmode = hrand(7);
printf("Set vid.wallmode to %d: %s\n", vid.wallmode, wdmodes[vid.wallmode]);
} else if (croll == 43) {
vid.monmode = hrand(4);
printf("Set vid.monmode to %d: %s\n", vid.monmode, mdmodes[vid.monmode]);
}
// don't show warning dialogs
items[itWarning] = 1;
// Make a random move
int roll = hrand(50);
if (roll == 0) {
// drop dead orb
bool res = movepcto(MD_DROP, 1);
printf("DROP: %d\n", res);
} else if (roll < 5) {
// skip turn
bool res = movepcto(MD_WAIT, 1);
printf("WAIT: %d\n", res);
} else if (roll < 42) {
// move to or attack a neighbor cell
int i = hrand(cwt.at->type);
cell *c2 = cwt.at->move(i);
cwt.spin = 0;
int d = neighborId(cwt.at, c2);
if (d >= 0) {
int subdir = (roll%2==0)?1:-1;
string c2info = dnameof(c2->wall) + "; " + dnameof(c2->monst) + "; " + dnameof(c2->item);
bool res = movepcto(d, subdir, false);
printf("MOVE %d [%s] sub %d: %d\n", d, c2info.c_str(), subdir, res);
if (!res && c2->monst) {
printf("clearing the monster (%s)\n", minf[c2->monst].name);
killMonster(c2, moNone);
}
} else {
printf("MOVE CONFUSED %d\n", d);
return;
}
} else {
// try to use a ranged orb
cell *ct = cellToTarget();
eItem ti = targetRangedOrb(ct, roMouseForce);
const char *tm = (ti == eItem(-1)) ? "orb cannot be used (see message log)" : iinf[ti].name;
printf("TARGET %p: %s\n", (void*)ct, tm);
}
if(false) if(turncount % 5000 == 0) {
printf("cells travelled: %d\n", celldist(cwt.at));
printf("\n");
for(int i=0; i<ittypes; i++) if(items[i])
printf("%4dx %s\n", items[i], iinf[i].name);
printf("\n");
for(int i=1; i<motypes; i++) if(kills[i])
printf("%4dx %s <%d>\n", kills[i], minf[i].name, i);
printf("\n\n\n");
}
if(hrand(5000) == 0 || (isGravityLand(cwt.at->land) && coastvalEdge(cwt.at) >= 100) || gcount > 2000 || cellcount >= 20000000) {
printf("RESET\n");
gcount = 0;
cellcount = 0;
activateSafety(autoplayLand ? autoplayLand : landlist[hrand(isize(landlist))]);
if (cellcount < 0) {
//printf("How did cellcount become negative?\n");
cellcount = 1;
}
}
if(cwt.at->land == laWestWall && cwt.at->landparam >= 30) {
printf("Safety generated\n");
forCellEx(c2, cwt.at) c2->item = itOrbSafety;
}
if(isIcyLand(cwt.at)) {
float heat = HEAT(cwt.at);
// Checking for extreme values as well as NaNs and infinities
if (!(-1e10 < heat && heat < 1e10)) {
printf("Heat is out of expected range\n");
canmove = true;
doAutoplay = false;
}
}
if (cwt.at->land == laCamelot) {
for(int i=0; i<isize(dcal); i++) {
cell *c = dcal[i];
if(c->land == laCamelot && celldistAltRelative(c) == 0 && c->wall != waRoundTable) {
printf("The round table of camelot is interrupted by a cell of %s\n", winf[c->wall].name);
kills[moPlayer] = 0;
canmove = true;
doAutoplay = false;
}
}
}
if(cwt.at->monst && !isMultitile(cwt.at->monst)) {
printf("on a non-multitile monster: %s\n", minf[cwt.at->monst].name);
}
else if(isDie(cwt.at->wall)) {
printf("on a wall-type die: %s\n", winf[cwt.at->wall].name);
}
for(int i=0; i<isize(dcal); i++) {
cell *c = dcal[i];
if(isChild(c, NULL)) {
}
if(childbug) doAutoplay = false;
if(c->land == laNone) {
printf("no-land found\n");
kills[moPlayer] = 0;
canmove = true;
doAutoplay = false;
}
if(c->item == itBuggy || c->item == itBuggy2) {
printf("buggy item found\n");
kills[moPlayer] = 0;
canmove = true;
doAutoplay = false;
}
if(isPrincess(c->monst) && princess::getPrincessInfo(c) == nullptr) {
printf("missing princess info\n");
kills[moPlayer] = 0;
canmove = true;
doAutoplay = false;
}
if(dice::on(c)) {
if(dice::data.count(c) == 0) {
c->item = itBuggy;
printf("missing dice::data[%p]\n", (void *)c);
kills[moPlayer] = 0;
canmove = true;
doAutoplay = false;
}
else if(!dice::data[c].which) {
// we might get here instead if someone already tried to do data[c], which creates a new element out of nothing
c->item = itBuggy;
printf("missing dice::data[%p].which\n", (void *)c);
kills[moPlayer] = 0;
canmove = true;
doAutoplay = false;
}
}
}
if(buggyGeneration || isize(buggycells)) {
if(noGUI) {
printf("Fatal: buggy generation\n");
exit(1);
}
println(hlog, "buggy generation");
return;
}
randomCheat();
randomMove();
if(false) if(turncount % 5000 == 0) showAutoplayStats();
resetIfNeeded(&gcount);
noteUnusualSituations();
stopIfBug();
if(turncount >= num_moves) return;
}

View File

@ -678,8 +678,8 @@ S("Rangers take care of the magic mirrors in the Land of Mirrors. "
"Strážci se starají o kouzelná zrcadla v Kraji zrcadel. Vědí, že lupiči "
"jako ty rádi tato zrcadla rozbíjejí... a proto na tebe útočí!")
S("A nasty creature native to the Living Caves. They don't like you "
"for some reason.",
// TODO update translation
S("A nasty creature that lives in caves. They don't like you for some reason.",
"Hnusná potvora žijící v Živoucích jeskyních. Z nějakého důvodu "
"tě nemají rády.")

View File

@ -641,8 +641,8 @@ S("Rangers take care of the magic mirrors in the Land of Mirrors. "
"Ranger beschützen die Zauberspiegel im Spiegelland. Sie wissen, dass Schurken wie du "
"die Spiegel gerne zerbrechen - also greifen sie dich an!")
S("A nasty creature native to the Living Caves. They don't like you "
"for some reason.",
// TODO update translation
S("A nasty creature that lives in caves. They don't like you for some reason.",
"Ein grässliches Geschöpf, das in den Lebenden Höhlen haust. Irgendwie können diese Kreaturen dich nicht leiden.")
S("A tribe of men native to the Desert. They have even tamed the huge Sandworms, who won't attack them.",

View File

@ -654,8 +654,8 @@ S("Rangers take care of the magic mirrors in the Land of Mirrors. "
"Strażnicy chronią lustra w Krainie Luster. Wiedzą, że złodzieje lubią "
"rozbijać lustra... także spodziewaj się ataku!")
S("A nasty creature native to the Living Caves. They don't like you "
"for some reason.",
// TODO update translation
S("A nasty creature that lives in caves. They don't like you for some reason.",
"Brzydki stwór z Żywych Jaskiń. Jakoś Cię nie lubi.")
S("A tribe of men native to the Desert. They have even tamed the huge Sandworms, who won't attack them.",
@ -8399,7 +8399,7 @@ N("shallow water", GEN_F, "płytka woda", "płytkie wody", "płytką wodę", "p
S("Shallow water is passable both for land creatures and for water creatures.",
"Przez płytką wodę mogą przejść i stworzenia lądowe, i wodne.")
N("shallow water", GEN_F, "głęboka woda", "głębokie wody", "głęboką wodę", "głęboką wodą")
N("deep water", GEN_F, "głęboka woda", "głębokie wody", "głęboką wodę", "głęboką wodą")
S("This body of water is calm and beautiful, but too deep to pass.",
"Ta woda jest spokojna i piękna, ale zbyt głęboka, by przez nią przejść.")
@ -9408,3 +9408,5 @@ S(
)
N("Palace Quest", GEN_O, "Misja w Pałacu", "Misje w Pałacu", "Misję w Pałacu", "na Misji w Pałacu")
N("Pike", GEN_F, "Szczupak", "Szczupaki", "Szczupaka", "Szczupakiem")

View File

@ -665,14 +665,14 @@ S(
"Rangers take care of the magic mirrors in the Land of Mirrors. "
"They know that rogues like to break these mirrors... so "
"they will attack you!",
"Strażnicy chronią lustra w Krainie Luster. Wiedzą, że złodzieje lubią "
"rozbijać lustra... także spodziewaj się ataku!")
// TODO update translation
S(
"A nasty creature native to the Living Caves. They don't like you "
"for some reason.",
"A nasty creature that lives in caves. They don't like you for some reason.",
"Brzydki stwór z Żywych Jaskiń."
"Jakoś Cię nie lubi.")

View File

@ -651,8 +651,8 @@ S("Rangers take care of the magic mirrors in the Land of Mirrors. "
"Странники охраняют магические зеркала. Они знают, что эти "
"разбойники хотят разбить их зеркала и тут же нападают на Вас!")
S("A nasty creature native to the Living Caves. They don't like you "
"for some reason.",
// TODO update translation
S("A nasty creature that lives in caves. They don't like you for some reason.",
"Противное существо из Живых пещер. По каким-то причинам не любит людей.")
S("A tribe of men native to the Desert. They have even tamed the huge Sandworms, who won't attack them.",
@ -7325,6 +7325,43 @@ S("multiplayer", "режим нескольких игроков")
// [PL:7811]
S("Hint: these keys usually work during the game", "Подсказка: можно использовать эти клавиши во время игры")
// [PL:8390]
N("Wetland", GEN_N, "Водно-болотное угодье", "Водно-болотные угодья", "Водно-болотное угодье", "в Водно-болотном угодье")
S("Some people have definitely drowned in this treacherous area. Better be careful!",
"Некоторые люди несомненно утонули в этом опасном месте. Берегитесь!")
N("Water Lily", GEN_F, "Кувшинка", "Кувшинки", "Кувшинку", "Кувшинкой")
S("A beautiful plant from the Wetland.", "Красивое растение из Водно-болотного угодья.")
N("shallow water", GEN_F, "неглубокая вода", "неглубокая вода", "неглубокую воду", "в неглубокой воде")
S("Shallow water is passable both for land creatures and for water creatures.",
"Эта вода проходима и для наземных существ, и для водных существ.")
N("deep water", GEN_F, "глубокая вода", "глубокая вода", "глубокую воду", "в глубокой воде")
S("This body of water is calm and beautiful, but too deep to pass.",
"Эта вода тиха и красива, но слишком глубока, чтобы через неё проходить.")
S("You remember anglers from your hometown showing the impressive pikes they have caught. This one is much larger.",
"Вы помните, как рыбаки из Вашей родины показывали щук впечатляющих размеров, которых они ловили. "
"А эта щука гораздо больше.")
N("Rusałka", GEN_F, "Русалка", "Русалки", "Русалку", "Русалкой")
S("A malicious water being. When you kill her, she changes the tile you are standing on, from land to shallow water, or from shallow water to deep water.",
"Злобное водное существо. Когда её убьёте, она превратит клетку на котором Вы стоите из суши в неглубокую воду, или из неглубокой воды в глубокую.")
N("Topielec", GEN_M, "Утопец", "Утопцы", "Утопца", "Утопцем")
S("A malicious water being. When you kill him, he changes the tile you are standing on, from land to shallow water, or from shallow water to deep water.",
"Злобное водное существо. Когда его убьёте, он превратит клетку на котором Вы стоите из суши в неглубокую воду, или из неглубокой воды в глубокую.")
Orb("Plague", "Заражения")
S(
"When you kill an enemy, adjacent enemies are also attacked, as long as they are further away from you than from the originally attacked enemy. "
"These enemies may in turn infect further enemies, up to distance of at most 4 from you.",
"Когда Вы убьёте врага, стоящие рядом враги тоже будут атакованы, если они находятся дальше от Вас, "
"чем изначально атакованный. "
"Эти враги, в своём очереди, заразят стоящих рядом них врагов, вплоть до 4 клетки от Вас.")
// [PL:8443]
N("Frog Park", GEN_O, "Жабный парк", "Жабные парки", "Жабный парк", "в Жабном парке")
@ -7394,6 +7431,8 @@ S("highlight stuff", "подсветить вещи")
N("Palace Quest", GEN_O, "Дворцовый квест", "Дворцовые квесты", "Дворцовый квест", "в Дворцовом квесте")
N("Pike", GEN_F, "Щука", "Щуки", "Щуку", "Щукой")
// Note: the translation should be complete until the marked line.
// The following are missing from the Polish translation:
S("quick projection", "быстрая проекция")

View File

@ -608,8 +608,8 @@ S("Rangers take care of the magic mirrors in the Land of Mirrors. "
"they will attack you!",
"Seyyahların aynalarını kıracağını bildiklerinden sana saldıracaklar!")
S("A nasty creature native to the Living Caves. They don't like you "
"for some reason.",
// TODO update translation
S("A nasty creature that lives in caves. They don't like you for some reason.",
"Yaşayan Mağaralarda yaşayan iğrenç bir yaratık. Nedense seni hiç sevmiyor.")
S("A tribe of men native to the Desert. They have even tamed the huge Sandworms, who won't attack them.",

View File

@ -191,7 +191,7 @@ EX void initgame() {
if((isGravityLand(firstland) && !isCyclic(firstland)) || (firstland == laOcean && !safety && !yendor::on))
firstland = weirdhyperbolic ? laCrossroads4 : laCrossroads;
clear_euland(specialland);
clear_euland(firstland);
cwt.at = currentmap->gamestart(); cwt.spin = 0; cwt.mirrored = false;
cwt.at->land = firstland;