1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-27 14:37:16 +00:00
This commit is contained in:
Zeno Rogue 2021-07-04 09:49:34 +02:00
commit 43fed4adac
30 changed files with 155 additions and 140 deletions

View File

@ -51,18 +51,28 @@ OK, now lots of the above can be changed. You can change the geometry and topolo
various in-game quests, and even try some other game genres in non-Euclidean spaces (roguelite aka shmup, racing, peaceful puzzles). Or use the engine for non-Euclidean computations
and visualizations (see [RogueViz](http://roguetemple.com/z/hyper/rogueviz.php)). Have fun!
## Technical information ##
## Development ##
You should be able to compile on Linux, OSX, or MinGW with something like this (you need SDL, SDL_ttf, and SDL_gfx):
### Build prerequisites ###
On Linux with apt-get:
```sudo apt-get install make g++ libsdl1.2-dev libsdl-ttf2.0-dev libsdl-gfx1.2-dev libsdl-mixer1.2-dev libglew-dev```
On macOS with Homebrew:
```brew install sdl sdl_ttf sdl_gfx sdl_mixer glew```
macOS users might also have to edit /usr/local/include/SDL/SDL_gfxPrimitives.h at line 38 to use quote include.
### Building HyperRogue from source ###
```
sudo apt-get install gcc libsdl1.2-dev libsdl-ttf2.0-dev libsdl-gfx1.2-dev
git clone https://github.com/zenorogue/hyperrogue.git hyperrogue
cd hyperrogue
make
```
The `mymake` program builds HyperRogue in parts. It takes longer than the method shown above, but when you change something, `mymake` will only recompile the changed file.
The `mymake` program builds HyperRogue in parts. It takes longer than the method shown above, but it uses significantly less memory during compilation, and when you change something, `mymake` will only recompile the changed file.
Additionally, it can be easily configured, e.g., to produce an optimized build, or to include addons (see `mymake.cpp` for some example invocations, and `devmods` for some example addons).
```

View File

@ -1099,6 +1099,7 @@ EX bool flashWouldKill(cell *c, flagtype extra) {
for(int u=0; u<c2->type; u++) {
cell *c3 = c2->move(u);
if(isWorm(c3)) continue; // immune to Flash
if(isFriendly(c3)) continue; // player's allies and mounts don't count
if(c3->monst == moEvilGolem) continue; // evil golems don't count
if(c3 != c && (c3->monst || isPlayerOn(c3))) {
bool b = canAttack(NULL, moWitchFlash, c3, c3->monst, AF_MAGIC | extra);

View File

@ -16,7 +16,7 @@ extern int default_levs();
struct hrmap {
virtual heptagon *getOrigin() { return NULL; }
virtual cell *gamestart() { return getOrigin()->c7; }
virtual ~hrmap() { };
virtual ~hrmap() { }
virtual vector<cell*>& allcells();
virtual void verify() { }
virtual void on_dim_change() { }

View File

@ -411,7 +411,7 @@ const char *twdesc = "This structure will disappear after some time.";
const char *jellydesc =
"Some of the Slime Beasts have decided to revolt against the color rules in the "
"Alchemist Lab. They have changed their shape and consistency, declared independence, and established their own Kingdom.\n\n"
"Jellies switch between being a wall and being a monster after every treasure you pick.";
"Jellies switch between being a wall and being a monster after every treasure you collect.";
const char *ruindesc =
"Once a beautiful city... but now overrun by the mighty Raiders of unknown origin.\n\n"

View File

@ -27,7 +27,7 @@ struct supersaver {
virtual void load(const string& s) = 0;
virtual bool dosave() = 0;
virtual void reset() = 0;
virtual ~supersaver() {};
virtual ~supersaver() {}
virtual bool affects(void* v) { return false; }
virtual void set_default() = 0;
};

View File

@ -107,7 +107,7 @@ MONSTER( 'N', 0x404040, "Necromancer", moNecromancer, CF_FACE_UP | CF_HIGH_THREA
"Necromancers can raise ghosts and zombies from fresh graves."
)
MONSTER( 'S', 0x404040, "Shadow", moShadow, CF_FACE_UP | CF_NOBLOW | CF_NONLIVING | CF_SPAM, RESERVED, moNone,
"A creepy monster who follows you everywhere in the Graveyard."
"A creepy monster who follows you everywhere in the Graveyard and the Cursed Canyon."
)
MONSTER( 'T', 0x40E040, "Tentacle", moTentacle, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM, RESERVED, moNone, tentdes )
MONSTER( 't', 0x008000, "Tentacle Tail", moTentacletail, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM | CF_INACTIVE | CF_SPAM, RESERVED, moNone, tentdes )
@ -1523,7 +1523,7 @@ LAND( 0x804000, "Brown Island", laBrownian, ZERO | LF_PURESEA, itBrownian, RESER
REQAS(laOcean,)
LAND( 0x211F6F, "Free Fall", laWestWall, ZERO | LF_GRAVITY | LF_EQUI, itWest, RESERVED,
"What on one side looks to be a normal (well, infinite) horizontal wall, on to the other side turns out to be the vertical wall"
"What on one side looks to be a normal (well, infinite) horizontal wall, on the other side turns out to be the vertical wall"
" of an infinitely high tower. Jump from the window, and let the magical gravity carry you..."
)
NATIVE(among(m, moWestHawk, moFallingDog) ? 2 : 0)

View File

@ -30,7 +30,7 @@ namespace util {
template <std::size_t I, typename T> struct nth {
inline static typename std::tuple_element<I, T>::type
get(const T& t) { return std::get<I>(t); };
get(const T& t) { return std::get<I>(t); }
};
}

View File

@ -20,7 +20,7 @@ string euchelp =
"You can try many different geometries here. We start by gluing "
"n-gons in such a way that k of them meet in every vertex. "
"Depending on n and k, this either folds into a sphere, unfolds into a plane, "
"or requires a hyperbolic space. The result may be then 'bitrunc' by "
"or requires a hyperbolic space. The result may be then 'bitruncated' by "
"replacing each vertex by a 2k-gon. Furthermore, you can play "
"with quotient geometries. For example, the elliptic geometry is "
"obtained from the sphere by making the antipodes be the same point, "
@ -28,7 +28,7 @@ string euchelp =
"Have fun experimenting! "
"Achievements and leaderboards do not work in geometry experiments, "
"except some specific ones.\n\n"
"In standard geometry (bitrunc or not), you can play the full game, but in other geometries "
"In standard geometry (bitruncated or not), you can play the full game, but in other geometries "
"you select a particular land. Lands are unlocked by visiting them in this "
"session, or permanently by collecting 25 treasure. Try Crossroads in Euclidean "
"or chaos mode in non-standard non-quotient hyperbolic to visit many lands. "

View File

@ -495,11 +495,13 @@ EX string generateHelpForItem(eItem it) {
for(auto& oi: orbinfos) {
if(treasureType(oi.l) == it) {
if(oi.gchance > 0) {
help += "\n\n";
help += XLAT("\n\nOrb unlocked: %1", oi.orb);
describeOrb(help, oi);
}
else if(oi.l == cwt.at->land || inv::on) {
help += XLAT("\n\nSecondary orb: %1", oi.orb);
help += "\n\n";
help += XLAT("Secondary orb: %1", oi.orb);
describeOrb(help, oi);
}
}
@ -1177,8 +1179,12 @@ EX void gotoHelpFor(eLand l) {
else listbeasts();
if(l == laTortoise)
help_extensions.push_back(help_extension{'t', XLAT("Galápagos shading"), [] () {
help_extensions.push_back(help_extension{'s', XLAT("Galápagos shading"), [] () {
tortoise::shading_enabled = !tortoise::shading_enabled;
}});
help_extensions.push_back(help_extension{'w', XLAT("wiki"), [l] () {
open_wiki(linf[l].name);
}});
}
}

View File

@ -173,10 +173,10 @@ int glyphflags(int gid) {
return f;
}
EX bool graphglyph() {
EX bool graphglyph(bool isMonster) {
// if(GDIM == 3) return false;
if(vrhr::active()) return false;
return vid.graphglyph == 2 || (vid.graphglyph == 1 && vid.monmode);
return vid.graphglyph == 2 || (vid.graphglyph == 1 && (isMonster ? mmmon : mmitem));
}
bool displayglyph(int cx, int cy, int buttonsize, char glyph, color_t color, int qty, int flags, int id) {
@ -190,10 +190,11 @@ bool displayglyph(int cx, int cy, int buttonsize, char glyph, color_t color, int
int d = ticks - glasttime[id];
double zoom = (d <= 250 && d >= 0) ? 1.25 - .001 * d : 1;
glsize = int(glsize * zoom);
bool isMonster = (id >= ittypes);
if(graphglyph()) {
if(graphglyph(isMonster)) {
initquickqueue();
if(id >= ittypes) {
if(isMonster) {
eMonster m = eMonster(id - ittypes);
double bsize = buttonsize * 2/3;
if(m == moKrakenH) bsize /= 3;

View File

@ -26,8 +26,8 @@ namespace hr {
/** \brief A helper structure that acts as a boolean which is always false. Helpful when disabling stuff with compiler flags. */
struct always_false {
operator bool() const { return false; };
bool operator = (bool b) const { return b; };
operator bool() const { return false; }
bool operator = (bool b) const { return b; }
};
/** \brief placate GCC's overzealous -Wunused-result */

View File

@ -534,7 +534,7 @@ EX namespace inv {
ld py = current_display->ycenter + pos.second * rad3;
int icol = iinf[o].color;
if(!remaining[i]) icol = gradient(icol, 0, 0, .5, 1);
bool gg = graphglyph();
bool gg = graphglyph(false);
if(!hiliteclick) {
if(gg) {

View File

@ -106,7 +106,7 @@ EX bool collectItem(cell *c2, bool telekinesis IS(false)) {
string s0 = "";
if(c2->item == itPalace && items[c2->item] == 12)
princess::forceVizier = true;
changes.value_set(princess::forceVizier, true);
if(!cantGetGrimoire(c2, false)) collectMessage(c2, c2->item);
if(c2->item == itDodeca && peace::on) peace::simon::extend();

View File

@ -2192,11 +2192,11 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
case laMountain:
if(d == 7) {
if(hrand_monster(50000) < 100)
if(hrand_monster(50000) < 100 && !safety)
buildIvy(c, 0, 3);
else if(hrand_monster(125000) < 100 - celldistAlt(c))
else if(hrand_monster(125000) < 100 - celldistAlt(c) && !safety)
c->monst = moMonkey;
else if(hrand_monster(200000) < min(100, -10*celldistAlt(c)) - celldistAlt(c))
else if(hrand_monster(200000) < min(100, -10*celldistAlt(c)) - celldistAlt(c) && !safety)
c->monst = moEagle;
else if(hrand(100) < 5)
c->wall = waPlatform;
@ -2333,7 +2333,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
c->wall = waRuinWall, c->landparam = 1;
}
}
if(hrand_monster(40000) < kf && !c->monst && !c->wall && !shmup::on) {
if(hrand_monster(40000) < kf && !c->monst && !c->wall && !shmup::on && !safety) {
cell *c1 = c;
cell *c2 = createMov(c1, hrand(c1->type));
if(c2->monst || c2->wall) return;
@ -2758,7 +2758,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
}
}
if(d == 7) {
if(d == 7 && !safety) {
if(c->wall == waNone) {
if(hrand_monster(2000) < ((cwt.at->land == laFrog || items[itFrog]) ? 20 : 0) + (items[itFrog] + yendor::hardness()))
c->monst = pick(moFrog, moPhaser, moVaulter);

View File

@ -715,8 +715,8 @@ S("A typical monster from the Graveyard, who moves through walls.\n\n"
S("Necromancers can raise ghosts and zombies from fresh graves.",
"Nekromanceři dokážou probouzet duchy a zombie z čerstvých hrobů.")
S("A creepy monster who follows you everywhere in the Graveyard.",
"Děsivý netvor, který tě sleduje po celém Hřbitově.")
S("A creepy monster who follows you everywhere in the Graveyard and the Cursed Canyon.",
"Děsivý netvor, který tě sleduje po celém Hřbitově.") //TODO UPDATE
S("People worshipping Cthulhu. They are very dangerous.",
"Lidé uctívající Cthulhua. Jsou velmi nebezpeční.")
@ -3440,9 +3440,6 @@ S( "This Orb makes you stunningly beautiful. "
S( "A big, beautiful, magical flower.", "Velká, krásná, magická květina.")
S("Don't be fooled by beauty, or you will be stabbed if you come too close!",
"Nenech se oklamat krásou -- když se moc přiblížíš, můžeš dostat ránu nožem!")
S("You just cannot stand in place, those roses smell too nicely.",
"Nemůžeš zůstat na místě, ty růže příliš krásně voní.")
S("Those roses smell too nicely. You have to come towards them.",
@ -5758,9 +5755,8 @@ S("see how it ended", "podívej se, jak to skonèilo")
// other missing/new things
// ------------------------
S("\n\nOrb unlocked: %1", "\n\nByla odemèena Sféra: %1")
S("Orb unlocked: %1", "Byla odemèena Sféra: %1")
S("\n\nSecondary orb: %1", "\n\nSekundární Sféra: %1")
S("Secondary orb: %1", "Sekundární Sféra: %1")
S(" to submerge", " do ponoøení")
S(" to surface", " do vynoøení")
S("%The1 says, \"not this place, it looks even worse...\"",
@ -6727,7 +6723,7 @@ N("Jelly Kingdom", GEN_N, "Království rosolu", "Království rosolu", "Králov
S("Some of the Slime Beasts have decided to revolt against the color rules in the "
"Alchemist Lab. They have changed their shape and consistency, declared independence, and established their own Kingdom.\n\n"
"Jellies switch between being a wall and being a monster after every treasure you pick.",
"Jellies switch between being a wall and being a monster after every treasure you collect.",
"Nìkteøí Slizoví netvoøi se rozhodli vzbouøit proti barevným pravidlùm v Alchymistické laboratoøi. Zmìnili svùj tvar a konzistencim vyhlásili nezávislost a založili si své vlastní Království.\n\n"
"Kdykoli sebereš nìjaký poklad, rosoly se zmìní ze zdí na netvory a opaènì."
@ -7488,15 +7484,11 @@ S("animate parameters", "animace parametrù")
S(
"Most parameters can be animated simply by using '..' in their editing dialog. "
"For example, the value of a parameter set to 0..1 will grow linearly from 0 to 1. "
"You can also use functions (e.g. cos(0..2*pi)) and refer to other parameters; "
"parameters 'a' and 'b' exist for this purpose. "
"See the list below for parameters which are currently animated (or changed).",
"You can also use functions (e.g. cos(0..2*pi)) and refer to other parameters.",
"Vìtšinu parametrù lze animovat jen tím, že v jejich editaèním dialogu napíšeš '..'. "
"Tak napøíklad hodnota parametru nastaveného na 0..1 poroste lineárnì od 0 do 1. "
"Lze také použít funkce (napø. cos(0..2*pi) a odkazovat na jiné parametry; "
"za tímto úèelem existují parametry 'a' a 'b'. "
"Viz níže uvedený seznam parametrù, které jsou v souèasné dobì animovány (nebo zmìnìny).")
"Lze také použít funkce (napø. cos(0..2*pi) a odkazovat na jiné parametry.")
// color edit dialog
@ -7700,7 +7692,7 @@ S("Did you know that it is possible to break a magical sphere into finitely many
N("Free Fall", GEN_O, "Volný pád", "Volné pády", "Volný pád", "ve Volném pádu")
S("What on one side looks to be a normal (well, infinite) horizontal wall, on to the other side turns out to be the vertical wall"
S("What on one side looks to be a normal (well, infinite) horizontal wall, on the other side turns out to be the vertical wall"
" of an infinitely high tower. Jump from the window, and let the magical gravity carry you...",
"To, co na jedné straně vypadá jako normální (no, nekonečná) vodorovná "
@ -8160,7 +8152,6 @@ S(
S("use the full 3D models", "používej úplné 3D modely")
S("Z shift", "Z-posuv")
S("Eye level", "úroveň očí")
S("fixed Y/Z rotation", "stálá Y/Z rotace")
S("configure FPP automatically", "automatická konfigurace FPP")
@ -8948,7 +8939,7 @@ S(
"If the pointer length is 0.5m, the object pointed to is 0.5 meter from the controller. "
"This is used in situations where the controller is used as a 3D mouse, e.g., "
"the drawing tool in three-dimensional geometries. When pointing at two-dimensional surfaces, "
"this is not relevant (the pointer is as long as needed to hit the surface.)",
"this is not relevant (the pointer is as long as needed to hit the surface).",
"Pokud je délka ukazatele 0,5 m, je objekt, na který ukazuje, 0,5 metru od ovladače. "
"To se používá v situacích, kdy se ovladač používá jako 3D myš, např. "
@ -9050,11 +9041,7 @@ S(
"x, y, z (hyperboloid/sphere/plane coordinates in non-crystal geometries)\n"
"ex, ey, ez (in Euclidean geometries)\n"
"x0, x1, x2... (crystal geometry only)\n"
"0 is black, 1 is white, rgb(1,0,0) is red, ifp(p-2,1,0) is blue (p=1 for red, 2 for green, 3 for blue)."
"w (fourth coordinate)\n"
"wallif(condition, color)\n"
,
"0 is black, 1 is white, rgb(1,0,0) is red, ifp(p-2,1,0) is blue (p=1 for red, 2 for green, 3 for blue).",
"Zde můžeš specifikovat barevný vzor jako funkci políčka. "
"Dostupné parametry:\n\n"
@ -9062,6 +9049,12 @@ S(
"ex, ey, ez (v eukleidovských geometriích)\n"
"x0, x1, x2... (pouze v krystalové geometrii)\n"
"0 je černá, 1 bílá, rbg(1,0,0) červená, ifp(p-2,1,0) modrá (p=1 pro červenou, 2 pro zelenou, 3 pro modrou)."
)
S(
"w (fourth coordinate)\n"
"wallif(condition, color)\n",
"w (čtvrtá souřadnice)\n"
"wallif(podmínka, barva)\n"
)

View File

@ -680,8 +680,8 @@ S("A typical monster from the Graveyard, who moves through walls.\n\n"
S("Necromancers can raise ghosts and zombies from fresh graves.",
"Totenbeschwörer können Geister und Zombies aus frischen Gräbern auferwecken.")
S("A creepy monster who follows you everywhere in the Graveyard.",
"Ein gruseliges Monster das dir über den ganzen Friedhof folgt!")
S("A creepy monster who follows you everywhere in the Graveyard and the Cursed Canyon.",
"Ein gruseliges Monster das dir über den ganzen Friedhof folgt!") //TODO UPDATE
S("People worshipping Cthulhu. They are very dangerous.",
"Verehrer Cthulhus. Sie sind sehr gefährlich.")
@ -2407,7 +2407,7 @@ S("Variants of %the1 are available in the Random Pattern Mode after "
S(" kills: %1", " Kills: %1")
S(" $$$: %1", " $$$: %1")
S(" Hyperstone: %1/%2", " Hypersteine: %1/%2")
S(" Hell: %1/9", " Hölle: %1/9")
S(" Hell: %1/%2", " Hölle: %1/%2")
// improved editor
// ---------------
@ -3228,9 +3228,6 @@ S("This Orb makes you stunningly beautiful. "
S("A big, beautiful, magical flower.", "Eine große, schöne, magische Blume.")
S("Don't be fooled by beauty, or you will be stabbed if you come too close!",
"Lass dich von Schönheit nicht täuschen - oder du wirst erstochen, wenn du zu nah kommst!")
S("Each eight turns, each rosebush at distance at most 5 from you will "
"release a wave of alluring scent. Creatures on the frontwave "
"will move towards where the scent came from. Even if it causes them "

View File

@ -340,7 +340,7 @@ S("Your score: %1", "Twój wynik: %1")
S("Enemies killed: %1", "Potwory pokonane: %1")
S("Orbs of Yendor found: %1", "Znalezione Sfery Yendoru: %1")
S("Collect %1 $$$ to access more worlds", "Znajdź %1 $$$, by iść do nowych krain")
S("Collect at least %1 treasures in each of 9 types to access Hell", "Znajdź po %1 skarbów w %2 typach, by się dostać do Piekła")
S("Collect at least %1 treasures in each of %2 types to access Hell", "Znajdź po %1 skarbów w %2 typach, by się dostać do Piekła")
S("Collect at least %1 Demon Daisies to find the Orbs of Yendor", "Znajdź %1 Czarciego Ziela, by znaleźć Sfery Yendoru")
S("Hyperstone Quest: collect at least %3 %1 in %the2", "Misja alternatywna: znajdź co najmniej %3 skarbów %abl2")
S("Hyperstone Quest completed!", "Misja alternatywna zakończona!")
@ -693,8 +693,8 @@ S("A typical monster from the Graveyard, who moves through walls.\n\n"
S("Necromancers can raise ghosts and zombies from fresh graves.",
"Nekromanci wzbudzają duchy i zombie ze świeżych grobów.")
S("A creepy monster who follows you everywhere in the Graveyard.",
"Ten odrażający potwór chodzi za Tobą po cmentarzu!")
S("A creepy monster who follows you everywhere in the Graveyard and the Cursed Canyon.",
"Ten odrażający potwór chodzi za Tobą po cmentarzu!") //TODO UPDATE
S("People worshipping Cthulhu. They are very dangerous.",
"Wyznawcy Cthulhu, bardzo niebiezpieczni.")
@ -1693,7 +1693,7 @@ S("Hell has these lakes everywhere... They are shaped like evil stars, and fille
S("hardcore mode", "tryb hardcore")
S("One wrong move, and it is game over!", "Jeden fałszywy ruch i koniec gry!")
S("One wrong move and it is game over!", "Jeden fałszywy ruch i koniec gry!")
S("Not so hardcore?", "Hardkor to nie to?")
// Shoot'em up Mode
@ -3376,10 +3376,6 @@ S( "This Orb makes you stunningly beautiful. "
S( "A big, beautiful, magical flower.", "Duży, piękny, magiczny kwiat.")
S("Don't be fooled by beauty, or you will be stabbed if you come too close!",
"Nie daj się zwieść urodzie, bo jak się za bardzo zbliżysz, możesz zostać ugodzon%y0 nożem!")
S(
"Each eight turns, each rosebush at distance at most 5 from you will "
"release a wave of alluring scent. Creatures on the frontwave "
@ -5694,9 +5690,8 @@ S(" (%1 more digits)", " (jeszcze cyfr: %1)")
S("see how it ended", "jak się skończyło")
// other missing/new things
S("\n\nOrb unlocked: %1", "\n\nOdblokowana Sfera: %1")
S("Orb unlocked: %1", "Odblokowana Sfera: %1")
S("\n\nSecondary orb: %1", "\n\nDodatkowa Sfera: %1")
S("Secondary orb: %1", "Dodatkowa Sfera: %1")
S(" to submerge", " do zanurzenia")
S(" to surface", " do wynurzenia")
S("%The1 says, \"not this place, it looks even worse...\"",
@ -6566,7 +6561,7 @@ N("Jelly Kingdom", GEN_N, "Królestwo Galarety", "Królestwa Galarety", "Króles
S("Some of the Slime Beasts have decided to revolt against the color rules in the "
"Alchemist Lab. They have changed their shape and consistency, declared independence, and established their own Kingdom.\n\n"
"Jellies switch between being a wall and being a monster after every treasure you pick.",
"Jellies switch between being a wall and being a monster after every treasure you collect.",
"Część Mazistych Stworów z Laboratorium postanowiło zbuntować się przeciwko regułom koloru w "
"Laboratorium. Zmieniły kształt i konsystencję, ogłosiły niepodległość i stworzyły własne Królestwo.\n\n"
@ -7237,15 +7232,11 @@ S("animate parameters", "animacja parametrów")
S(
"Most parameters can be animated simply by using '..' in their editing dialog. "
"For example, the value of a parameter set to 0..1 will grow linearly from 0 to 1. "
"You can also use functions (e.g. cos(0..2*pi)) and refer to other parameters; "
"parameters 'a' and 'b' exist for this purpose. "
"See the list below for parameters which are currently animated (or changed).",
"You can also use functions (e.g. cos(0..2*pi)) and refer to other parameters.",
"Większość parametrów może być animowana w prosty sposób, przez wpisanie '..' w ich pole edycji. "
"Przykładowo, wartość parametru ustawiona na 0..1 będzie rosła liniowa od 0 do 1. "
"Możesz też używać funkcji (np. cos(0..2*pi)) lub odnosić się do innych parametrów; "
"parametry 'a' i 'b' istnieją w tym celu. Poniżej lista parametrów obecnie "
"animowanych (lub zmienionych).")
"Możesz też używać funkcji (np. cos(0..2*pi)) lub odnosić się do innych parametrów.")
// color edit dialog
@ -7443,7 +7434,7 @@ S("Did you know that it is possible to break a magical sphere into finitely many
N("Free Fall", GEN_O, "Swobodny Spadek", "Swobodne Spadki", "Swobodny Spadek", "w Swobodnym Spadku")
S("What on one side looks to be a normal (well, infinite) horizontal wall, on to the other side turns out to be the vertical wall"
S("What on one side looks to be a normal (well, infinite) horizontal wall, on the other side turns out to be the vertical wall"
" of an infinitely high tower. Jump from the window, and let the magical gravity carry you...",
"Co wygląda z jednej strony na zwykłą (nieskończoną) poziomą ścianę, z drugiej strony okazuje się być pionową ścianą nieskończenie "
@ -7878,7 +7869,6 @@ S(
S("use the full 3D models", "użyj pełnych modeli 3D")
S("Z shift", "przesunięcie Z")
S("Eye level", "poziom oka")
S("fixed Y/Z rotation", "ustalona rotacja Y/Z")
S("configure FPP automatically", "automatycznie skonfiguruj FPP")
@ -8667,7 +8657,7 @@ S(
"If the pointer length is 0.5m, the object pointed to is 0.5 meter from the controller. "
"This is used in situations where the controller is used as a 3D mouse, e.g., "
"the drawing tool in three-dimensional geometries. When pointing at two-dimensional surfaces, "
"this is not relevant (the pointer is as long as needed to hit the surface.).",
"this is not relevant (the pointer is as long as needed to hit the surface).",
"Jeśli długość wskaźnika to 0.5m, wskazywany punkt jest 0.5 metra od kontrolera. "
"Ma to znaczenie, gdy kontroler jest używany jako mysz 3D, np. narzędzie do rysowania w "
@ -8781,8 +8771,7 @@ S(
S(
"w (fourth coordinate)\n"
"wallif(condition, color)\n"
,
"wallif(condition, color)\n",
"w (czwarta współrzędna)\n"
"wallif(warunek, kolor)\n"

View File

@ -343,8 +343,8 @@ S("Your score: %1", "Sua pontuação: %1")
S("Enemies killed: %1", "Inimigos mortos: %1")
S("Orbs of Yendor found: %1", "Orbes de Yendor encontrados: %1")
S("Collect %1 $$$ to access more worlds", "Colete %1 $$$, para acessar novos mundos")
S("Collect at least %1 treasures in each of 9 types to access Hell", "Colete pelo menos %1 tesouros de cada um dos 9 tipos para acessar o Inferno")
S("Collect at least 10 Demon Daisies to find the Orbs of Yendor", "Colete pelo menos 10 Margaridas Demônio para encontrar os Orbes de Yendor")
S("Collect at least %1 treasures in each of %2 types to access Hell", "Colete pelo menos %1 tesouros de cada um dos %2 tipos para acessar o Inferno")
S("Collect at least %1 Demon Daisies to find the Orbs of Yendor", "Colete pelo menos %1 Margaridas Demônio para encontrar os Orbes de Yendor")
S("Hyperstone Quest: collect at least %3 %1 in %the2", "Missão da Pedra do Ímpeto: colete pelo menos %3 %1 no-a %abl1")
S("Hyperstone Quest completed!", "Missão da Pedra do Ímpeto completa!")
S("Look for the Orbs of Yendor in Hell or in the Crossroads!", "Procure pelos Orbes de Yendor no Inferno e nas Encruzilhadas!")
@ -483,10 +483,10 @@ S(
"números mostrados para saber seus significados.\n")
S(
"Move with mouse, num pad, qweadzxc, or hjklyubn. Wait by pressing 's' or '.'. Spin the world with arrows, PageUp/Down, and Home/Space. "
"Move with mouse, num pad, qweadzxc, or hjklyubn. Wait by pressing 's' or '.'. Spin the world with arrows, PageUp/Down, and Space. "
"To save the game you need an Orb of Safety. Press 'v' for the main menu (configuration, special modes, etc.), ESC for the quest status.\n\n",
"Mova-se com o mouse, teclado numérico, qweadzxc, ou hjklyubn. Espere apertando 's' ou '.'. Gire o mundo com as setas, PageUp/Down, ou Home/Espaço."
"Mova-se com o mouse, teclado numérico, qweadzxc, ou hjklyubn. Espere apertando 's' ou '.'. Gire o mundo com as setas, PageUp/Down, ou Espaço."
"Para salvar o jogo você precisa de um Orbe da Segurança. Pressione 'v' para ir ao menu principal (configurações, modos especiais, etc.), ESC para o estado da missão.\n\n")
S("See more on the website: ", "Veja mais no site: ")
@ -721,8 +721,8 @@ S(
"Nekromanci wzbudzają duchy i zombie ze świeżych grobów.")
S(
"A creepy monster who follows you everywhere in the Graveyard.",
"Ten odrażający potwór chodzi za Tobą po cmentarzu!")
"A creepy monster who follows you everywhere in the Graveyard and the Cursed Canyon.",
"Ten odrażający potwór chodzi za Tobą po cmentarzu!") //TODO UPDATE
S(
"People worshipping Cthulhu. They are very dangerous.",
@ -2610,7 +2610,7 @@ S("Variants of %the1 are available in the Random Pattern Mode after "
S(" kills: %1", " zabicia: %1")
S(" $$$: %1", " $$$: %1")
S(" Hyperstone: %1/%2", " Hiperkamienie: %1/%2")
S(" Hell: %1/9", " Piekło: %1/9")
S(" Hell: %1/%2", " Piekło: %1/%2")
// improved editor
@ -3465,10 +3465,6 @@ S( "This Orb makes you stunningly beautiful. "
S( "A big, beautiful, magical flower.", "Duży, piękny, magiczny kwiat.")
S("Don't be fooled by beauty, or you will be stabbed if you come too close!",
"Nie daj się zwieść urodzie, bo jak się za bardzo zbliżysz, możesz zostać ugodzon%y0 nożem!")
S(
"Each eight turns, each rosebush at distance at most 5 from you will "
"release a wave of alluring scent. Creatures on the frontwave "
@ -5779,9 +5775,8 @@ S(" (%1 more digits)", " (jeszcze cyfr: %1)")
S("see how it ended", "jak się skończyło")
// other missing/new things
S("\n\nOrb unlocked: %1", "\n\nOdblokowana Sfera: %1")
S("Orb unlocked: %1", "Odblokowana Sfera: %1")
S("\n\nSecondary orb: %1", "\n\nDodatkowa Sfera: %1")
S("Secondary orb: %1", "Dodatkowa Sfera: %1")
S(" to submerge", " do zanurzenia")
S(" to surface", " do wynurzenia")
S("%The1 says, \"not this place, it looks even worse...\"",

View File

@ -342,7 +342,7 @@ S("Your score: %1", "Ваш счёт: %1")
S("Enemies killed: %1", "Врагов убито: %1")
S("Orbs of Yendor found: %1", "Собрано сфер Йендора: %1")
S("Collect %1 $$$ to access more worlds", "Соберите %1 $$$, чтобы открыть новые земли")
S("Collect at least %1 treasures in each of 9 types to access Hell", "Соберите хотя бы по %1 сокровищ %2 разных типов, чтобы попасть в Ад")
S("Collect at least %1 treasures in each of %2 types to access Hell", "Соберите хотя бы по %1 сокровищ %2 разных типов, чтобы попасть в Ад")
S("Collect at least %1 Demon Daisies to find the Orbs of Yendor", "Соберите %1 адских ромашек, чтобы найти сферу Йендора")
S("Hyperstone Quest: collect at least %3 %1 in %the2", "Миссия Гиперкамня: соберите %3 драгоценностей в %abl2")
S("Hyperstone Quest completed!", "Миссия Гиперкамня закончена!")
@ -688,8 +688,8 @@ S("A typical monster from the Graveyard, who moves through walls.\n\n"
S("Necromancers can raise ghosts and zombies from fresh graves.",
"Некромант может призывать призраков и зомби из свежих могил.")
S("A creepy monster who follows you everywhere in the Graveyard.",
"Пугающий монстр, вечно преследующий Вас на Кладбище.")
S("A creepy monster who follows you everywhere in the Graveyard and the Cursed Canyon.",
"Пугающий монстр, вечно преследующий Вас на Кладбище.") //TODO UPDATE
S("People worshipping Cthulhu. They are very dangerous.",
"Люди, поклоняющиеся Ктулху. Они довольно опасны.")
@ -1263,7 +1263,7 @@ S("You trick %the1.", "Вы победили %a1.")
S( "A Witch with a Flash spell. Very dangerous!\n\nLuckily, she never uses the spell if it "
"would kill her friends. She could destroy an Evil Golem, though.",
"Ведьма с заклинанием вспышки. Очень опасна!\n\nК счастью, она никогда не использует "
"заклинание, ели оно убьёт других ведьм. Но големов она может и уничтожить.")
"заклинание, если оно убьёт других ведьм. Но големов она может и уничтожить.")
S("Your Aether powers are drained by %the1!", "Твоя эфирная сила была уменьшена %abl1!")
S("As you leave, your powers are drained!", "Покидая землю силы, Вы теряете магию сфер!")
@ -1355,7 +1355,7 @@ S("The Grimoires contain many secrets of the Great Old Ones. "
"You hope to read them when you return home, and to learn many things. "
"The knowledge is valuable to you, but it is rather pointless to try to get "
"several copies of the same Grimoire...",
"Гримуары содержат много секретов Великих предков Каждый новый круг Храма Ктулху содержит "
"Гримуары содержат много секретов Великих предков. Каждый новый круг Храма Ктулху содержит "
"новые тома с новыми секретами. Вы можете принести их домой, прочитать и узнать много вещей."
"Знание ценно для Вас, но Вам не нужны копии одного Гримуара... "
)
@ -1420,12 +1420,6 @@ S("Cannot teleport on a monster!", "Нельзя телепортировать
S("Cannot teleport on an item!", "Нельзя телепортироваться на предмет!")
S("Cannot teleport here!", "Нельзя телепортироваться сюда!")
//S("You cannot teleport that far away!", "Вы не можететелепортироваться так далеко!")
S("You cannot target that far away!", "Nie możesz celować tak daleko!")
S("You cannot target that close!", "Nie możesz celować tak blisko!")
S("Cannot cast illusion on an item!", "Nie możesz rzucić iluzji na przedmiot!")
S("Cannot cast illusion here!", "Nie możesz rzucić ilzuji tutaj!")
S("Cannot cast illusion on a monster!", "Nie możesz rzucić ilzuji na potwora!")
S("Cannot throw fire there!", "Nie możesz tego podpalić!")
Orb("the Dragon", "Дракона")
@ -1542,7 +1536,7 @@ S(
"The forests of Caribbean are too dense to be traversed by humans, "
"and they are hard to burn. Many colorful parrots can be found there.",
"Карибские леса слишком плотны, чтобы сквозь них мог пройти человек, "
"и их трудно поджечь. Много разноуветных попугаев живёт здесь.")
"и их трудно поджечь. Много разноцветных попугаев живёт здесь.")
S("Ye wonder where did th' Pirates find all these riches...",
"Интересно, где Пираты нашли эти богатства...")
@ -1813,14 +1807,14 @@ S(
"Perhaps there used to be a forest here?",
"Во время отлива на гиперболических берегах можно найти прекрасный Янтарь. "
"Може, здесь когда-то был лес?"
"Может, здесь когда-то был лес?"
)
Orb("Air", "Воздуха")
S("This Orb allows you to blow your enemies away.\n\n"
"Click a monster to blow it one cell away. It cannot be used against mimics, ghosts, sharks and other monsters restricted to a specific terrain, and multi-tile monsters.",
"Эта сфера позволяет Вам сдуват врагов вдаль.\n\n"
"Эта сфера позволяет Вам сдувать врагов вдаль.\n\n"
"Нажми на монстра, чтобы сдуть его на 1 клетку. Невозможно сдуть мимиков, духов, акул и других монстров, живущих на определённой территории, и монстров из нескольких частей."
)
@ -2097,13 +2091,13 @@ S("Wherever this powerful being goes, the living fjord "
N("Garnet", GEN_O, "Гранат", "Гранаты", "Гранат", "Гранатом")
S("Vikings believe that garnets improve their strength.",
"Викинги верятЮ что гранаты дают им силу.")
"Викинги верят, что гранаты дают им силу.")
Orb("the Fish", "Рыбы")
S("This Orb lets you dive into the water. While diving, you are able to see and collect underwater treasures, "
"while being invisible to monsters yourself. You are afraid of jumping into the water straight from a boat, so usually you won't do it.",
"Эта сфера позволяет нырять. Когда Вы ныряете, Вы видите и можете собирать подводные ценности, "
"а враги Вас не видят. Но Вы боитесь прягать из лодки прямо в воду.")
"а враги Вас не видят. Но Вы боитесь прыгать из лодки прямо в воду.")
S("%The1 is washed away!", "%a1 смыло водой!")
S("%The1 is extinguished!", "%1 гаснет!")
@ -2396,7 +2390,7 @@ S("This is the biggest Hypersian Rug you have ever seen! "
N("Prince", GEN_M, "Принц", "Принцы", "Принца", "Принцем")
N("Princess", GEN_F, "Принцесса", "Принцессы", "Принцессу", "Принцессой")
S("%1 takes %his1 revenge on %the2!", "%1 будет мстить!")
S("%The1 takes %his1 revenge on %the2!", "%1 будет мстить!")
S("\"That should teach you to take me seriously!\"",
"\"Относись ко мне серьёзно! Будет тебе наука!\"")
@ -2651,7 +2645,7 @@ S(
"эксперименты в покое и уединении. Они изменили направление силы тяжести, "
"чтобы сделать попадание сюда труднее.\n\n"
"Гравитация работает так: клетка нестабильна, если она пуста, и "
"поле под ним не содердит стены. Нельзя перейти с одного нестабильного поля "
"поле под ним не содержит стены. Нельзя перейти с одного нестабильного поля "
"на другое, иначе как вниз."
)
@ -3465,10 +3459,6 @@ S( "This Orb makes you stunningly beautiful. "
S( "A big, beautiful, magical flower.", "Большой прекрасный магический цветок.")
S("Don't be fooled by beauty, or you will be stabbed if you come too close!",
"Не будьте обмануты красотой, если не хотите получить удар в спину!")
S(
"Each eight turns, each rosebush at distance at most 5 from you will "
"release a wave of alluring scent. Creatures on the frontwave "
@ -3481,7 +3471,7 @@ S(
"волну манящего аромата. Все монстры на пути двигаются к кусту, даже если "
"им приходится атаковать союзника или прекрасное существо, пойти в воду, огонь, пропасть "
"или в шипы куста. Это не действует на призраков, плющи, каменных змей и "
"и монстров, ограниченных своей землёй.")
"монстров, ограниченных своей землёй.")
S(
"This land is filled with beautiful, but dangerous, creatures and plants.",
@ -3555,7 +3545,7 @@ S("\n\nA Ghost never moves to a cell which is adjacent to another Ghost of the s
S("You cannot attack diagonally!", "Вы не можете атаковать по-диагонали!")
Orb("Energy", "Energii")
Orb("Energy", "Энергии")
S( "This Orb halves the power usage of orbs which cost some "
"charges with each activation. It even affects the "
@ -3606,7 +3596,7 @@ S("key Orb power", "клавиша для силы сферы")
S("Orb power (target: mouse)", "активировать сферу")
S("Orb power (target: facing)", "клавиша для силы сферы")
S("You cannot go against the wind!", "Nie możesz iść pod wiatr!")
S("You cannot go against the wind!", "Нельзя ходить против ветра!")
N("warp gate", GEN_F, "врата искривления", "врата искривления", "врата искривления", "вратами искривления")
@ -3741,7 +3731,7 @@ S("Branches here could bear your weight easily.",
N("weak branch", GEN_F, "тонкая ветка", "тонкие ветки", "тонкую ветку", "тонкой веткой")
S("Branches here will bear you weight, but if you use them to move (not fall) to an unstable place, they will break.",
"Эти ветви выдерживают ваш вес, но если из использовать, чтобы пойти (не упасть) на что-то неустойчивое, они сломаются.")
"Эти ветви выдерживают ваш вес, но если их использовать, чтобы пойти (не упасть) на что-то неустойчивое, они сломаются.")
N("canopy", GEN_F, "листва", "листва", "листву", "листвой")
@ -5844,9 +5834,8 @@ S(" (%1 more digits)", " (ещё цифр: %1)")
S("see how it ended", "смотри, как всё закончилось")
// other missing/new things
S("\n\nOrb unlocked: %1", "\n\nОткрыта сфера: %1")
S("Orb unlocked: %1", "Открыта сфера: %1")
S("\n\nSecondary orb: %1", "\n\nДополнительная сфера: %1")
S("Secondary orb: %1", "Дополнительная сфера: %1")
S(" to submerge", " на погружение")
S(" to surface", " на поверхность")
S("%The1 says, \"not this place, it looks even worse...\"",
@ -6793,7 +6782,7 @@ N("Jelly Kingdom", GEN_N, "Желейное Королевство", "Желей
S("Some of the Slime Beasts have decided to revolt against the color rules in the "
"Alchemist Lab. They have changed their shape and consistency, declared independence, and established their own Kingdom.\n\n"
"Jellies switch between being a wall and being a monster after every treasure you pick.",
"Jellies switch between being a wall and being a monster after every treasure you collect.",
"Часть Живой Слизи выступила против правил цветов в Лаборатории. "
"Они изменили свою форму и густоту, провозгласили независимость и образовали свое Королевство.\n\n"

View File

@ -322,7 +322,7 @@ S("Enemies killed: %1", "Öldürülen Düşmanlar: %1")
S("Orbs of Yendor found: %1", "Bulunan Yendor Küresi sayısı: %1")
S("Collect %1 $$$ to access more worlds", "%1 $$$ toplayarak başka dünyalara eriş")
// S("Collect %1 $$$ to access R'Lyeh and Dry Forest", "60 $$$ toplayarak R'Lyeh ve Kara Ormana eriş.")
S("Collect at least %1 treasures in each of 9 types to access Hell", "%2 hazine çeşidinin hepsinden %1'ar tane toplayarak Cehenneme erişebilirsin.")
S("Collect at least %1 treasures in each of %2 types to access Hell", "%2 hazine çeşidinin hepsinden %1'ar tane toplayarak Cehenneme erişebilirsin.")
S("Collect at least %1 Demon Daisies to find the Orbs of Yendor", "%1 Şeytan Papatyası toplayarak Yendorun Kürelerini bulabilirsin.")
S("Hyperstone Quest: collect at least %3 %1 in %the2", "Aşkıntaş Görevi: %2'de en az %3 hazine topla.")
S("Hyperstone Quest completed!", "Aşkıntaş görevi tamamlandı.")
@ -645,8 +645,8 @@ S("A typical monster from the Graveyard, who moves through walls.\n\n"
S("Necromancers can raise ghosts and zombies from fresh graves.",
"Ölüçağıranlar mezarlardan hayaletler ve hortlaklar çağırabilirler.")
S("A creepy monster who follows you everywhere in the Graveyard.",
"Seni Mezarlık boyunca takip eden ürpertici bir canavar.")
S("A creepy monster who follows you everywhere in the Graveyard and the Cursed Canyon.",
"Seni Mezarlık boyunca takip eden ürpertici bir canavar.") //TODO UPDATE
S("People worshipping Cthulhu. They are very dangerous.",
"Cthulhu'ya tapan insanlar. Çok tehlikeliler.")

View File

@ -186,6 +186,7 @@ EX void showOverview() {
else checkmove();
cheater++;
};
dialog::bound_low(0);
}
}
else if(udiv == 3 && umod < walltypes) gotoHelp(generateHelpForWall(eWall(umod)));
@ -398,7 +399,7 @@ EX void switchHardcore() {
else if(hardcore && canmove) { hardcore = false; }
else { hardcore = true; canmove = true; hardcoreAt = turncount; }
if(hardcore)
addMessage(XLAT("One wrong move, and it is game over!"));
addMessage(XLAT("One wrong move and it is game over!"));
else
addMessage(XLAT("Not so hardcore?"));
if(pureHardcore()) popScreenAll();

View File

@ -593,8 +593,12 @@ EX void wandering() {
else if(c->land == laDragon && (items[itDragon] >= 8 || items[itOrbYendor]) && wchance(items[itDragon], 20))
c->monst = moFireElemental;
else if(c->land == laRedRock && wchance(items[itRedGem], 10))
c->monst = (hrand(10) || peace::on) ? moRedTroll : moHexSnake;
else if(c->land == laRedRock && wchance(items[itRedGem], 10)) {
if (hrand(10) || peace::on)
c->monst = moRedTroll;
else if (!pseudohept(c))
c->monst = moHexSnake;
}
else if(c->land == laCaves && wchance(items[itGold], 5))
c->monst = hrand(3) ? moTroll : moGoblin;

View File

@ -116,7 +116,7 @@ EX vector<orbinfo> orbinfos = {
{orbgenflags::S_NAT_NT, laElementalWall, 1500, 4000, itOrbSummon},
{orbgenflags::S_NATIVE, laStorms, 1000, 2500, itOrbStunning},
{orbgenflags::S_NATIVE, laOvergrown, 1000, 800, itOrbWoods},
{orbgenflags::S_GUEST, laOvergrown, 1000, 800, itOrbLuck},
{orbgenflags::S_GUEST, laOvergrown, 1000, 0, itOrbLuck},
{orbgenflags::S_NATIVE, laWhirlwind, 1250, 3000, itOrbAir},
{orbgenflags::S_NATIVE, laHaunted, 1000, 5000, itOrbUndeath},
{orbgenflags::S_NATIVE, laClearing, 5000, 5000, itOrbFreedom},
@ -240,11 +240,6 @@ EX eOrbLandRelation getOLR(eItem it, eLand l) {
if(it == itOrbDigging && l == laKraken) return olrUseless;
if(it == itOrbIllusion && l == laKraken) return olrUseless;
if(it == itOrbSlaying && !among(l,
laMirror, laHell, laEmerald, laDryForest, laCamelot, laPalace, laStorms, laRose, laTortoise, laBurial, laDungeon, laReptile,
laPrairie, laBull, laVolcano, laTerracotta, laRuins, laVariant, laEclectic, laBrownian))
return olrUseless;
if(it == itOrbYendor && among(l, laWhirlwind, laWestWall)) return olrUseless;
if(it == itOrbLife && (l == laKraken)) return olrUseless;
@ -276,6 +271,8 @@ EX eOrbLandRelation getOLR(eItem it, eLand l) {
return olrUseless;
if(it == itOrbLuck && l == laMountain)
return olrUseless;
if(it == itOrbLuck && l == laWestWall)
return olrUseless;
if(it == itOrbLuck && l == laCamelot)
return olrUseless;
if(it == itOrbLuck && l == laHaunted)
@ -298,6 +295,11 @@ EX eOrbLandRelation getOLR(eItem it, eLand l) {
if(isCrossroads(l) || l == laOcean)
return olrHub;
if(it == itOrbSlaying && !among(l,
laMirror, laHell, laEmerald, laDryForest, laCamelot, laPalace, laStorms, laRose, laTortoise, laBurial, laDungeon, laReptile,
laPrairie, laBull, laVolcano, laTerracotta, laRuins, laVariant, laEclectic, laBrownian))
return olrUseless;
if(l == laCocytus)
if(it == itOrbDragon || it == itOrbFire || it == itOrbFlash || it == itOrbLightning)
return olrDangerous;
@ -326,6 +328,14 @@ EX eOrbLandRelation getOLR(eItem it, eLand l) {
return olrUseless;
}
if(it == itOrbWoods && (l == laWarpSea || l == laWarpCoast))
return olrDangerous;
if(it == itOrbWoods && !among(l,
laDryForest, laWineyard, laCaribbean, laOvergrown, laHaunted, laHauntedWall, laHauntedBorder, laTortoise, laFrog, laEclectic,
laVariant))
return olrUseless;
if(it == itShard) {
if(l == laDesert || l == laIce || l == laJungle || l == laGraveyard ||
l == laRlyeh || l == laHell || l == laDryForest || l == laWineyard ||
@ -395,6 +405,9 @@ EX eOrbLandRelation getOLR(eItem it, eLand l) {
return olrForbidden;
}
if(l == laTerracotta && it == itOrbFriend)
return olrDangerous;
return olrPrize25;
}

View File

@ -1039,10 +1039,10 @@ void poly_attack(cell *dest) {
eMonster orig = dest->monst;
auto polymonsters = {
moYeti, moRunDog, moRanger,
moDesertman, moMonkey, moCultist,
moMonkey, moCultist,
moFallingDog, moVariantWarrior, moFamiliar, moOrangeDog,
moRedFox, moFalsePrincess, moResearcher,
moNarciss, moJiangshi,
moNarciss,
};
int ssf = 0;
eMonster target = *(polymonsters.begin() + hrand(isize(polymonsters)));
@ -1189,7 +1189,7 @@ EX int check_phase(cell *cf, cell *ct, flagtype flags, cell*& jumpthru) {
forCellCM(c2, cf) {
if(isNeighbor(c2, ct) && !nonAdjacent(cf, c2) && !nonAdjacent(c2, ct)) {
jumpthru = c2;
if(passable(ct, cf, P_ISPLAYER | P_PHASE)) {
if(passable(ct, cf, flags | P_PHASE)) {
partial = 2;
if(c2->monst || (isWall(c2) && c2->wall != waShrub)) {
return 3;
@ -1246,7 +1246,7 @@ EX eItem targetRangedOrb(cell *c, orbAction a) {
if(rosedist(cwt.at) == 1) {
int r = rosemap[cwt.at];
int r2 = rosemap[c];
if(r2 <= r) {
if(r2 <= r && !markOrb(itOrbBeauty)) {
if(a == roKeyboard || a == roMouseForce )
addMessage(XLAT("Those roses smell too nicely. You can only target cells closer to them!"));
return itNone;
@ -1574,7 +1574,6 @@ EX int orbcharges(eItem it) {
return inv::on ? 150 : 50;
case itOrbWinter: // "pickup-winter"
return inv::on ? 45 : 30;
break;
case itOrbBeauty:
case itOrbEmpathy:
case itOrbFreedom:

View File

@ -1744,7 +1744,7 @@ EX namespace patterns {
try {
return ep.parse();
}
catch(hr_parse_exception& ex) {
catch(hr_parse_exception&) {
return 0;
}
}

View File

@ -1497,7 +1497,8 @@ EX void swordAttackStatic() {
EX int plague_kills;
EX void spread_plague(cell *mf, cell *mt, int dir, eMonster who) {
if(!(who == moPlayer ? markOrb(itOrbPlague) : markEmpathy(itOrbPlague))) return;
if(!items[itOrbPlague]) return;
if(who != moPlayer && !items[itOrbEmpathy]) return;
forCellEx(mx, mt) if(celldistance(mx, mf) > celldistance(mx, mf->modmove(dir)) && celldistance(mx, mf) <= 4) {
sideAttackAt(mf, dir, mx, who, itOrbPlague, mt);
}

View File

@ -183,6 +183,7 @@ EX void initgame() {
if(firstland == laOceanWall) firstland = laOcean;
if(firstland == laHauntedWall) firstland = laGraveyard;
if(firstland == laHaunted && !tactic::on) firstland = laGraveyard;
if(firstland == laMercuryRiver) firstland = laTerracotta;
if(firstland == laMountain && !tactic::on) firstland = laJungle;
if(firstland == laPrincessQuest) firstland = laPalace;

View File

@ -840,7 +840,7 @@ EX slide default_slides[] = {
QUICKFIND {
return (l == laBurial && !items[itOrbSword]);
};
SHOWLAND ( l == laCrossroads || l == laBurial );
SHOWLAND ( l == laRlyeh || l == laCrossroads || l == laBurial );
}
},
{pcg+"Periodic patterns", 30, LEGAL::UNLIMITED | USE_SLIDE_NAME,

View File

@ -724,4 +724,19 @@ EX void open_url(string s) {
#endif
}
const char *urlhex = "0123456789ABCDEF";
EX void open_wiki(const char *title) {
string url = "https://hyperrogue.miraheze.org/wiki/";
unsigned char c;
for (size_t i = 0; (c = title[i]); ++i) {
if (('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '_' || c == '-')
url += c;
else if (c == ' ')
url += "_";
else
url += string("%") + urlhex[c/16] + urlhex[c%16];
}
open_url(url);
}
}

2
vr.cpp
View File

@ -1336,7 +1336,7 @@ EX void show_vr_settings() {
"If the pointer length is 0.5m, the object pointed to is 0.5 meter from the controller. "
"This is used in situations where the controller is used as a 3D mouse, e.g., "
"the drawing tool in three-dimensional geometries. When pointing at two-dimensional surfaces, "
"this is not relevant (the pointer is as long as needed to hit the surface.)."
"this is not relevant (the pointer is as long as needed to hit the surface)."
));
});