Thursday, 25 May 2017

Programming language rant

Brian Bucklew, the developer of Caves of Qud (highest rated turn-based tactics game on Steam) and Sproggiwood (a casual roguelike very good both for beginners and for experts), has recently been involved in an external C++ project, and has tweeted a long series of rants about his hate of C++ from the point of view of a C# developer. Since Twitter is not a good medium for discussion, I am posting my thoughts on the subject here.

I will start with mentioning that I have no experience with C#. I have experience with Java. I consider C# to be an evolution to Java. Since I was not satisfied with Java, I am not interested in trying C#, since I believe it to be based on the same general rules. One reason why I did not like Java was too much focus on object oriented programming. The widely held belief is that it is good to learn as many programming paradigms as possible, as then you are able to use the good things about these paradigms in whatever programming language you end up working with. I consider OOP to be one such concept: something that generally every programmer should learn (ideally on a fully OOP language such as Smalltalk) but not something that everything has to be written in. I consider OOP to be a very useful representation of polymorphism. For example, in Hydra Slayer, there are multiple kinds of objects: hydras, consumables, and weapons. I can list all the objects in sight of the player, and then e.g. list their names. It is useful to call a name() method that will work correctly for all kinds of objects despite their different inner representations. But not everything has to be an object. This was the only use of OOP in Hydra Slayer (not including NotEye which does use OOP quite significantly), and HyperRogue did not use polymorphism at all until recently.

Oh my fucking god I have to make two fucking separate files for every fucking object. How can anyone like this language. C++, two pluses because you have twice as many files as the precise same thing architected in any other language. I really think C++ programmers are blind to how many incredibly annoying things you waste your time doing in C++. Ugh. It's so damn wordy.

This actually looks very similar to the issue I had with Java. Having to create a file for every single object; not only that, also a tree structure is forced. Furthermore, because of the lack of conditional compilation, I could not create a single version of the HyperRogue Android source that would compile as one of three packages depending on the compiler options chosen, and I had to create three copies of this source (this was done with a script, but still); maybe an experienced Java programmer would do it in some better way. I do not know to what extent C# fixes this. It does have conditional compilation, at least.

I hate having two separate files (.c and .h) too. But contrary to Java, the language does not force you to actually do this. In my biggest project (HyperRogue) the main file hyper.cpp includes init.cpp, which includes all the other cpp files in turn, from the most fundamental ones. When I want to call some function which was not yet compiled, I simply copy the declaration to hyper.h which is included first. But this comes up very rarely and it is far from a problem that Brian makes it to be.

It takes 10 seconds to recompile HyperRogue. Not ideal, but not bad either. If header files are necessary, generating them automatically does not seem to be a difficult task.

Like C++ guys think they have the ultimate concise low level language, but you basically have to write everything in two representations.

I consider the Google Code Jam statistics to be a good benchmark of conciseness. Contestants have to implement solution to algorithmic problems as fast as possible. It has to run fast, which hurts Python, but not languages such as C# or Java. Most contestants decide to use C++. From contestants who have passed to Round 2 (thus, no newbies), ones using C++ are also more likely to advance to Round 3 than ones using Java or C#.

Want to setup a map<> for something? Make sure you keep track of everything and/or iterate it when erasing so you can delete everything.

I do not understand what Brian is referring to here. Deleting every pointer in a map is simply for(auto& p: m) delete p.second;. In most cases, you do not even need that! I usually do maps of ints, pairs, strings, vectors, non-polymorphic types, etc. which do not require anything; and contrary to garbage collection, RAII will take care of cases which are more general than simply clearing the memory. If polymorphism is required, smart pointers will handle deletion.

bahahaha I forgot you can do multiple inheritance in C++ . . . . what a bad idea

Maybe nobody uses it, maybe people use it to implement something like Java interfaces (which were designed later), maybe it is used in the implementation of C++ itself. I do not care. I never use this and I have no problems with this feature existing. I consider the diamond problem to be an inherent to (class-based) OOP, especially in roguelike programming, when the hierarchical subclass distinctions are often very blurry (attack monsters with a cockatrice corpse? uh, it was first a monster, then it was food, and now it is a weapon?).

omg I forgot C++ can't compile circular references; so a child can't simply refer to it's parent without some sort of hackery like void* (I've written several million lines production of C++ in my life, for those concerned I have no clue what's going on with C++)

Simply use forward declarations, I do not get how Brian did not remember this.

Wow, c++ got a little unhinged with copy/move semantics since I last visited it, hu? I'm trying to imagine people with like less than 20 years of C++ experience writing correct C++ programs nowadays..."

Yeah, the copy/move semantics sounds crazy. But... what happens when you compile an older program with C++11? It compiles and works faster, because move semantics work behind the scenes. One only needs to understand it and care about it when writing extremely efficient programs.

...also not having introspection/reflection sucks a fucking A+ hairy nutsack.

For introspection (as in, checking what is the exact type of a polymorphic object) dynamic_cast is fine. As for reflection -- this seems to cure a problem that I do not have because I rarely use OOP. There is OOP in NotEye, and debug/save/load functions are case-by-case listings of all fields -- this is a place where reflection could be used, but I do not believe it would help that much because (a) this was trivial to write, (b) it appears easier to handle special cases, such as when new fields are added / class hierarchy is redesigned and the load function has to be adapted without breaking older saves. (Anyway, I have managed to implement a method executing a given lambda function with parameters (auto field, string name) for all fields of a polymorphic object in seven lines of C++ plus two lines per class, and creating objects by class ID in about ten extra lines; despite having to write a list of fields and subclasses for each class, I like my solution for efficiency and type safety.)

Coming back to C++ after such a long layoff it's amusingly clear just how much Stockholm Syndrome you develop with its language design.

There were several tweets like this. I know some legitimate criticisms of C++, but all Brian's criticisms appear to be caused by some kind of bias -- problems already solved appear easy, new problems appear difficult, or maybe self-confirmation, or working on some very poorly designed external project. It is hard to see what could be achieved by using templates, macros, RAII, and smart pointers when being used to OOP and reflection. Rather than accusing people of "Stockholm Syndrome", I suppose that some people think in this way, and other people think in that way, and everyone chooses the language which is better aligned with their way of thinking.

Friday, 24 March 2017

HyperRogue 9.4 is now available freely!

HyperRogue version 9.4c is released freely! You can download the Windows executable with source that compiles on Linux, the OSX package, the source, the Android version, or play the online version.

Compared to the previous free release of HyperRogue (8.3j) it includes the following new features:
  • Adaptative animations, 3D display, sound effects, and other user interface improvements.
  • Ten new lands, including Reptiles where the floor is made of reptiles, Burial Grounds where you have to use the curvature to gather treasures, and the Halloween mini-game where you have to use the limited resources in spherical geometry! See all lands in the HyperRogue gallery.
  • Geometry nerds can now experiment with spherical, elliptic, or quotient hyperbolic geometry, access new 3D models of the hyperbolic world, try cellular automata, or use HyperRogue as a visualization engine.
  • And tons of other minor improvements, such as turn-based multiplayer or changes to Orb frequency -- see the full changelog here.


As you can see, this is the latest version available at the moment; thus, the paid extras are only the social features (achievements, leaderboards) and automatic updates. We are tending towards changing the "previous major version is available for free" system a bit, as it has some disadvantages.
  • Bugfixes and interface improvements should be immediately available in the free version, as bugs or bad interface could drive the players away.
  • Having up-to-date source in the public repo would make it much more convenient to fork HyperRogue, as the improvements could be easily incorporated into the offical version. This would increase the probability of people contributing (so far there were only technical contributions, or ideas without code).
  • HyperRogue is a fun and challenging game, but it is also more than that. We believe it is one of the best ways to learn about hyperbolic geometry, and as possibly the richest hyperbolic geometry system currently in existence, it has other applications (such as data visualization). For such applications, it is beneficial if the free version is up-to-date.
Possibly the free version will be updated more frequently, possibly some more features will be added as paid extras. Please comment if you have any thoughts about this!

We would also like to note that although HyperRogue is currently one of the highest rated turn-based tactics games on Steam, it has almost no reviews on sites such as Metacritic. Please add reviews there!

Most importantly, have fun!

Sunday, 5 March 2017

HyperRogue 9.4: bulls everywhere

HyperRogue 9.4 is released on Steam and itch.io! (Android, iOS, and the online version will come later.)

You can find safety in some places in the Prairie, but if you want treasures, they can be found only on the other side of a giant herd of bulls.

Butterflies of Bull Dash don't pursue you -- unless you get next to them, they just spin around the obstacles. They cannot be killed conventionally, but you get treasure when a Raging Bull crashes into a Butterfly.

Crossroads V is yet another layout of Crossroads.

Some other changes:
  • Additional 3D options have been added to HyperRogue. The ball model and hyperboloid model can explain the 3D hyperbolic space used by HyperRogue. The new camera options could be used to obtain FPP or TPP view, although the models used by HyperRogue are not adapted to this.
  • A slight change in the generation of orbs, so that it is no longer optimal to avoid collecting more treasures after the 10 or 25 threshold. Orb spawn rate in the Crossroads is just 70% (relative to the spawn rate before the change) if you have 10 treasures, and rises to 100% when you have 25. Prize Orbs appear if you have 25 treasures, but their spawn rate is 60% if you have exactly 25, 100% if you have 50 (the spawn rate gets higher and higher as you collect more treasures, but the benefits are diminishing).
  • Two new geometries have been added (in the euclidean/elliptic menu). The Zebra pattern is a periodic pattern of 40 cells, in the Zebra quotient geometry, the space is warped so that repetitions which become exactly the same cell -- thus, you play on a torus with two holes. The field quotient geometry is similar, but it is based on the pattern which is used by the Prairie; this pattern has 132440 cells (39732 heptagons).
  • In the mobile versions, a compass has been added in the bottom left corner. It can be used for movement, so that your hand no longer obscures the view.

Prairie is based on wonderfullizardofoz's Amazon River idea, but rethemed to make it stand our more from Whirlpool. Crossroads V is an old idea of Fulgur14. Many people have had idea of a land inspired by the Boulder Dash mechanics (Z, CtrlAltDestroy, simon_clarkstone); Bull Dash has risen from these ideas, although the relationship is quite remote. The field pattern is inspired by the method used by David Madore in his hyperbolic maze.

More improvements and are reported in the changelog, and on the Steam forums. Have fun!

Thursday, 5 January 2017

HyperRogue 9.3: three new lands and an online demo

HyperRogue 9.3 is released on Steam and itch.io! (Android and iOS versions will come later.) This update introduces three new lands, and several other minor features and bugfixes.

Additionally, an online demo of HyperRogue has been created! This allows new players to try out HyperRogue's gameplay without downloading it.

These reptiles are quite strange creatures. They spend most of their lives sleeping, as floors that other creatures can walk on. Sometimes they wake up to hunt their prey, but they will happily go back to sleep if they happen to move into a hole on their way. Your attacks do not kill the Reptiles, but you can push and stun them.

Take the gravity mechanics from the Ivory Tower, but reverse it: you are going deep into the Dungeons now! This is combined with ideas from the Palace: use floor switches to open or close passages, and the Skeletons have to be pushed into holes, so that they won't be able to return. But be careful, and don't fall yourself!

Gravitational anomalies in the Jungle create mountains overgrown with ivies and bushes. Will you dare to climb the ivies to get the amethysts hidden above?

The Reptiles land is based on an old idea of tricosahedron, inspired by a print by M.C. Escher. Dungeon and Lost Mountain are based on ideas by wonderfullizardofoz. If you have more ideas for new lands, please share!

HyperRogue 9.3 also has several more improvements. Columns appear on the coasts of R'Lyeh so let you know that you are near. Slow monsters, Ivies, and Worms now use a specialized pathfinding algorithm, so they won't try to catch you through trapdoors or against gravity. Orbs of Yendor no longer block the player movement. See the Steam forums for more details.

Have fun, and a happy New Year!

Wednesday, 21 December 2016

Why am I not that excited about Jupiter Hell

The roguelike community was recently all over about Jupiter Hell — a roguelike with modern 3D graphics, which has recently run a very successful crowdfounding campaign. I am quite sure Jupiter Hell will be a great game — after all, Darren Grey and Kornel Kisielewicz are both working on its gameplay, and both are well known to create fantastic roguelikes. This post is a response to a post by Darren Grey, who believes that Jupiter Hell is a gateway for our beloved genre to get its deserved mainstream acceptance.

I tend to play mostly indie games: roguelikes, roguelites, some other games too. Occassionally I do try big mainstream hits, but I am rarely satisfied with them. For example, Witcher II. I have been playing mostly for the story. Most of the game was fighting, exploring, and collecting items. Fights were irrelevant (lack of permadeath!) and boring, and were an obstacle in the story, rather than the fun part. The game would be better without them. And without walking around and collecting items. One could say that it was still better than games that I could not play at all, but this does not change the point: I feel that it would be better if all the game — all the boring 20 hours — were removed, thus leaving just a nice two hour long movie. Diablo II is mostly a real-time roguelike, but I have found no point to try it with permadeath, as I have found it much more boring than roguelikes. I have similar feelings with other RPGs. First person shooters are not interesting at all. I have a relatively good chance to like mainstream strategy games, but I am often annoyed by too much micromanagement, or by animations which I have to watch again and again — when working on the animations in NotEye (for ADOM), I have taken care to have them so that they don't slow a fast player down, and it is great that JH goes the same route with its adaptative animation system.

On the other hand, a big part of the roguelike culture is its wonderful community. Barriers between creators and players are lowered. Players are encouraged to report bugs, provide their own ideas, and even learn programming and create their own variants or games in events such as the 7DRL challenge. This leads lone passionate developers working in their spare time to create awesome games (ADOM, Dungeon Crawl, Spelunky, DRL). Often playable for free — the motivation for creating these games was the fun of creating great games, games they would like to play themselves, rather than financial gains. These games won't have good graphics or polish,but are much better than the mainstream in my experience. I find the roguelikedev communities much more appealing than the general gamedev ones, which IME tend to concentrate on graphics and monetization too much.

So I would like more people to see that games with low production value / free / created by lone developers can be much better than the current mainstream games. Why people don't see this?

Maybe gamers in general believe that a game without high production value, or a free game, cannot be good? By a game with high production value I mean one which has, or appears to have, lots of money poured into its creation: complex graphics, cutscenes, professional voice acting, general polish, trailers, and so on. Will Jupiter Hell be really able to compete with popular AAA games on these grounds? And if it will, I do not see how would such players join our creative community, or try the relatives of Jupiter Hell — all the other great roguelikes — which do not have this production value.

Or maybe the contrary is true: popularity is actually not about 3D graphics? Angry Birds do not have 3D graphics, indies and roguelites neither, and they are quite popular too nowadays — not sure how good measure of popularity this, but by the number of Steam reviews, FTL is roughly on the level of popular strategy and RPG games. Ragnarok and JauntTrooper: Mission Thunderbolt were both awesome roguelikes, and they appeared to have features to appeal the mainstream — quite good graphics for their time, mouse control, permadeath only as an option. Still, they have failed. On the other hand, the insane success of Minecraft, despite being started by a lone developer inspired by ADOM and NetHack, and not having high production value, is a huge surprise. What was the cause of this? Marketing? Simply luck (what becomes popular and what not, actually depends largely on random factors, and Notch seems to agree)? Whatever the problem is, will Jupiter Hell avoid it?

Maybe the roguelikes are not popular because is just hard to explain what they actually are? I think I have that problem with HyperRogue — its defining feature is that it takes part in the hyperbolic plane. Unless you are interested in mathematics, you won't know why would that be interesting — things like "a roguelike in the DOOM universe" or "a vampire roguelike" are easier to explain (assuming that you know what "roguelike" is), so people looking for new roguelikes would probably be more likely to try these. We call these games roguelikes precisely because they are so hard to explain — after all, other genres are named after their features, not after a notable game in that genre :) People are afraid of trying new things. I have updated the homepage of HyperRogue so that it explains the point of the game to new players, without scaring them off with difficult words such as "roguelike" or "hyperbolic geometry".

The Kickstarter page for Jupiter Hell explains that it is a "turn-based sci-fi roguelike/RPG". I think that categorizing roguelikes as a subgenre of RPG might contribute to the obscurity of roguelikes. The success of the Witcher series suggests that fans of RPGs do like games like this: nice story, gameplay not getting in the way. Maybe they do not get what they expect when trying roguelikes. Such people would be put off by permadeath, and the low focus on story typical to roguelikes. I have seen opinions that Diablo is not a RPG — and Diablo is quite similar to roguelikes, so I guess we would see such opinions on roguelikes too if they were more popular. On the other hand, a strategy fan would be much more likely to understand the point of procedural generation and permadeath (strategy games are often procedurally generated, and even if they don't usually feature permadeath, it is quite clear that this is the noble way to play). I am of a strong opinion that roguelikes are actually closer to strategy games than RPGs, they actually are turn-based tactics games. XCOM does have important RPG elements (story, character advancement, inventories) yet it is not seen as an RPG. Maybe we should rather market roguelikes as single-character turn-based tactical games, and emphasize the benefits of being single-character to players of XCOM and such (more action, more detailed characters, less micromanagement).

Or maybe we should try to find new players even further. Most people are not gamers, and I have a feeling that a popular opinion is that intelligent people do read books, or play games such as Chess, playing boardgames is cool, but playing computer games is a stupid thing to do. Such people would not care about graphics that much — everybody knows that a book is not to be judged by its cover, and Chess is the same game, whether you play it with beautiful pieces or not. Andrzej Sapkowski, the author of the series of books that the Witcher game is based on, said "I don't know many people who have played that game, because I tend to with intelligent people". I have watched Evelyn Lamb's talk Visualizing hyperbolic geometry. I think HyperRogue is a great tool for visualizing hyperbolic geometry, but it is only mentioned on the last slide (about minute 33): "I am too scared to do it, because I might like it, and then I won't ever do any work again". It appears that she had experiences with computer games similar to my experiences with Witcher, i.e., that they are a waste of time, and she was afraid that HyperRogue would be like this too. Whenever I see a game described as "addictive", I think it is not a good thing. Far too many games demand the player's time without giving anything in return. Skinner boxes, grinding, free games which allow you to use money to speed things up, unlocks which make the character stronger. Well designed roguelikes don't. In HyperRogue, even the Hyperstone Quest, which is considered very hard, can be done in just about two hours by a skilled player. Obviously getting that level of skill might take lots of time, but the game does not slow you down, only your own ability to learn new things. And learning is fun.

Maybe such non-gamers would be actually put off by the graphics of Jupiter Hell? I have read somewhere that all popular games fall in one of just three graphical styles. Jupiter Hell looks like a quite generic photorealistic violent game. Roguelikes are to a big extent a computer version of board games, and when watching the animations in the Jupiter Hell teasers, it has struck me that it does not look like a board game, thus confusing the potential players about the point of the game yet again. HyperRogue has recently received 3D graphics and adaptative animations too, but our design goals were different. Recently I have received a spam e-mail offering 3D models. I have looked at the (still 2D) screenshots of HyperRogue and decided that, even though the graphics in HyperRogue are nowhere as good as the art by M. C. Escher which inspired it, it is unique and thus looks much better than any generic 3D models. The new animations are consciously made to be not realistic — to emphasize that battles are to provide challenge for the player, as capturing the opponent's pieces in Chess, not meaningless violence for its own sake.

Obscurity of roguelikes is a big mystery for us roguelike fans, we could only guess the reasons. This post turned out very long, and yet it does not cover everything. Roguelikes have evolved in a completely different way than the mainstream games, and I think that we should be proud of that, instead of seeing it as an disadvantage. Please share your thoughts in the comments, or just play the most satisfying games in existence :)

Thursday, 8 December 2016

Sources of HyperRogue: part IV

This is the fourth post in the series, about the lands from versions 8.x.

There is not much to say about Wild West. Revolvers, and hunting outlaws for bounties, are among the most common tropes in westerns. It does not really match the rest of the game, so it is available as the bonus land only.

Snowyowl0 had an idea on the HyperRogue forum about a land called "The Eternal Storm", which was a land with strong winds, and with Fulgurite as a treasure. I read what Fulgurite was — a mineraloid created when lightning hits sand, and also a nice reference to Fulgur14, one of the most prominent members of the HyperRogue community — and found it more appropriate for the land that I had rough idea for since some time, where you had to kill monsters by creating electric connections out of them. So that's how the Land of Storms was created. The monsters you created electric connections of had to be something metallic (so that it is a conductor), slow (so that you actually have time to create connections), and heavily armored (so that it cannot be destroyed in normal way). My first drawing of the Metal Beast created something like a Trilobite, and they remained like that. They were joined by Storm Trolls, since it was interesting to also have monsters creating conductible walls when they die.

Ivy was one of the first monsters unique to HyperRogue, but now I have invented a potentially more interesting variant of it, growing much more quickly. I found the Mutant Ivy work well in two cases: in a forest (where you could chop down trees to reach the root), and in the open space, where it moved only on hexagons. I have restricted the movement of the Mutant Ivy to hexagons outside of the Overgrown Woods, so we have both cases in the same monster. You could cut trees to get access to the root, but it was also useful to be able to restrict the growth by placing barriers too — so the Mutant Ivy was joined by yet another Troll. Thus, the Trolls in the Living Fjord, Land of Storms, and Overgrown Woods (and to lesser extent Red Rock Valley) are all primarily intended not as something that can kill you, but something that helps you — as we say with Princess Tehora, "the trolls only want to help". The Orb of the Overgrown Woods is the Orb of Luck, which notably loses some charges when you kill an Albatross, as a reference to the superstition that killing albatrosses brings bad luck, as suggested by simon_clarkstone.

And the hex-restricted Mutant Ivy grew quite nicely in the open space, covering everything nearby — this was used in a Yendor challenge, but also a special land, the Clearing, was created for it. Fighting an infinite monster gives me a very epic mental image, especially when you notice that, when you move towards the root, you actually destroy trillions of Ivy leaves with a single strike (even though the game does not count that). Giant Fox was an appropriate monster here — as a omnivore it could both eat the mutant fruits and attack the player character, and there were already some canines (I like reusing families of monsters, like birds and Trolls). Orb of Freedom is a reference to the description of the Giant Fox, which is quite hard to see, since it is hard to actually meet a Giant Fox — even though it has no special properties, in combination with the giant Mutant Ivy I believe that it actually makes the land much harder, so you won't actually meet them unless going for high score.

Haunted Woods are based on an idea of wonderfullizardofoz. The general idea, shape, and location of the Haunted Woods are taken directly from this idea. No specific ideas about monsters, treasures and terrain features were given, so I have decided to make it Haunted Woods, a forest filled with Ghosts, inspired by a card in the Dominion deck-building game, which also gives a mental image of being lost in the woods, and the treasure name is inspired by the most expensive card in the famous collectible card game Magic: the Gathering. The Friendly Ghosts created by Orb of Undeath were initially greenish, but in 9.2 they were recolored on tehora's request to match the Playmobil toy (video).

As I have mentioned, Snowyowl0 had an idea about a land called "The Eternal Storm" — the Land of Storms took the name and treasure from this idea, but not really the general idea (land with strong winds), or the monsters (crows and air elementals). Windy Plains are based on these remaining ideas. I wanted a treasure which would be carried by the strong winds, and a feather was a natural candidate yet again (after the phoenix feather from the Land of Eternal Motion). White dove feather as a reference to the song by Bob Dylan, Blowing in the Wind. Tehora helped with the color scheme.

She has also helped a lot with the Rose Garden — here is her story: "There were multiple sources of idea of Rose Garden — probably the most personal land in the game. The earliest I recall was when Zeno made few buttons and fridge magnets with HyperRogue theme. I told him that HyperRogue lacked in a land that would have been incredibly light, pastel, sweet and pink. A bit disturbing and psychedelic. I do not remember who came first with the exact name of Rose Garden — probably me after Zeno told me about one of his favorite roguelike monsters — the nicely smelling rosebush from Alphaman. I got extremely excited with that idea, even more because I personally dislike roses, so they made perfect "monsters" for that land. And then I populated Rose Garden with False Princesses and Princes — a delicate reference to "The Little Prince" by Antoine de Saint-Exupéry and the related Polish song by Kasia Sobczyk. There has been already lost Princess/Prince, that was a real love of our Rogue, but... how to love only one person, when there are many other appealing? This loosely reflects my personal demon, too — to me every other girl would be a better match for Zeno. Digging further in the love-theme, we introduced the Rose Beauties and Handsome Gardeners who would be "too pretty to be killed" — I suggested them during a walk in the break during our friends' doctoral defenses. Actually, the suspenders of Handsome Gardeners were inspired by the outfit of one of our friends on that day. I liked Rose Beauties, because of association with my original understanding of The Sick Rose by William Blake. The very first time I heard this poem in Protagonist's song (thanks KosGD!) it triggered an image of an extremely beautiful but coldhearted evil lady, that nobody expects to be dangerous (of course, many years later I encountered so called "proper analysis" of this poem, but I reject it!). Gardeners tend to be "default lovers" in fairytales — e.g. we thought about Muzzy in Gondoland where the Princess ran away with a Gardener — a cartoon from our childhood. And the last fun fact — when I urged Zeno to create new appearance for Rose Beauties our first attempt ended up as the new look for Witches... And the tiling for that land was prepared to satisfy my moaning that Zeno made a great tiling for Galápagos, and Rose Garden had an inherited one. The initial orb's name suggested by Zeno was Orb of the Skunk and I strongly disliked it. We spend reasonably too much time discussing it, and eventually ended up with Orb of Beauty with the same effect, although motivated differently (gives you stunning appearance, not stink)."

In roguelikes such as Zaga-33 and Ending, the concept of "parity" is crucial — if you have four way movement on a chessboard, and skipping turns not allowed, it is predetermined whether you hit the monster first or it hits you, unless you find some way to disrupt the parity. IMHO games centered around parity get old quite quickly, but I have found it quite fun in Crypt of the Necrodancer — as you have to deal with parity only for a very small number of monsters here — so I have decided to do a bit similar in HyperRogue — have a single land based on parity. The usual HyperRogue tiling has no parity, but it could be recovered by forbidding movement between hexagons, or even better, using another tiling equivalent to such a rule. The intended solution to the problem of killing an incorrectly aligned monster has been influenced by the CotD solution. When showing an early draft to Fulgur14, with trees, lakes, and monsters temporarily named Sloths, he has noticed that the "warped tiling" actually had straight lines, and suggested that they could be used for shorelines — which was a very nice idea, so it turned into a Warped Coast. A new sailor creature was required (after Pirates and Vikings), and Ratlings (from ADOM) were chosen, because of the association of rats with ships and pirates. Their suspiciousness of enemies who do not move was a result of my e-mail discussion with Michael Brough, the author of Zaga-33, about the parity rule. In the first version, the land was solved far too easy by killing Ratlings on a sea boundary, so we have decided with tricosahedron that Ratling Avengers would be created when a player tries to abuse that strategy — and Fulgur14 and tehora wanted them to have capes, because Avengers always wear capes. Corals are a reference to the crochet coral reef project.

Also, the Crossroads IV were created, to reuse the straight line separating Warped Sea and Warped Coast in other situations. Wonderfullizardofoz had this idea too.

Fulgur14 had the idea of a gravity-based land with infinite trees. I think he has suggested apples as treasure, as a reference to the apple which, according to the legend, fell on Isaac Newton's head and thus influenced creation of the theory of gravity. But how to name yet another land of trees, after Jungle, Dry Forest, Overgrown Woods, and Haunted Woods? I remembered that Manic Miner, a classic platformer from 1983, had a level named Endorian Forest. The theme is a result of merging all three themes — Manic Miner's Endorian forest (EF for short), wizardry theme of Ivory Tower, and the theme of research. The land is named Yendorian Forest, as a reference to EF and the Wizard of Yendor in NetHack. EF had green (stable) and red (crumbling) branch platforms, and thus the Yendorian Forest has strong and weak branches. Sparrowhawk is simply a bird who likes to catch prey on trees; tehora did not like using the default bird shape for them, with their "shanks" sticking out, so she was forced to draw a new shape. It is not completely clear what the creatures in EF were supposed to be (probably EF is a reference to the Endorian Forest in Star Wars, and the creatures would be Ewoks, but still, they look different), and how they look from the above — tehora interpreted them as wearing hats similar to ones worn in ancient Aztec reliefs, so that's what we see in HyperRogue. Their bright saturated colors are also a reference to EF. Their name is a reference to Isaac Newton's gravity research, and "infinite trees" in their description are one of research subjects in theoretical computer science.

As mentioned in the first post in this series, originally I had a different idea for the main quest in HyperRogue — every place in the world had environmental/civilizational parameters (temperature, humidity, whatever) which slowly changed as you travelled, and you had to find the location with specific parameters, and probably come back. I did not have a precise idea about how to implement this, and I found that even simpler ideas are fun enough in the hyperbolic plane anyway. At that time, I had no good idea about how to develop this, but when I have mentioned this in that post, I thought that it would be fun to try this now, with all the new experience. I wanted slow creatures whose properties would adapt to the changing environment as you were travelling. This reminded me of Galápagos — tortoises in different islands have different properties to adapt to their environments, which was noticed by Charles Darwin during his Beagle trip, and contributed to the theory of evolution. The land could be called "Land of Tortoises", but Galápagos means "tortoises" in Spanish, so it is better. The text message you get when you find a Baby Tortoise ("Aww, poor Baby Tortoise.") is a reference to Penance, the roguelike webcomic.

A long time ago, Fulgur14 had a idea of a worm-like Dragon, who would be killed by damaging all its segments. I wanted to implement Dragon Chasms some time ago, but the idea for generating it (horocyclic chasms) turned out to be more appropriate for an archipelago, so Caribbean was created instead. Environmental parameters introduced for Galápagos had another application, of creating procedurally generated height maps — so I have decided to create Dragon Chasms with a new algorithm, where chasms were based on such a heightmap. It was quite lucky that Galápagos and Dragon Chasms were created together — I had no idea who would steal Baby Tortoises from their families, and how the Dragons could do anything evil despite being so slow — and making the Dragons steal Tortoises solved both problems! Fire Elementals were added as a simple monster to complement the Dragons — they were already in the Elemental Planes and they should appear somewhere else, and Dragon Chasms sounded appropriate. One bad thing about that is that all other Elementals are very strong in their lands (but weak in the Elemental Planes), and Fire Elemental is still rather weak in the Dragon Chasms — maybe something will be changed in the future. The Orb of Domination has its own story... when we have been showing HyperRogue to one of our friends a year ago, he went to the Desert, and he said "Wow, a Sandworm! Is it possible to ride it?!". It was high time to actually implement Sandworm riding.

This is all in HyperRogue 8.x. The next episode will be about HyperRogue 9.x, and it will take some time — it is still not known what will be there! :)

Thursday, 1 December 2016

HyperRogue 9.2: 3D hyperbolic animations!

HyperRogue 9.2 is released on Steam and itch.io!


This is again a release with no new lands -- however, it includes several upgrades aimed at making HyperRogue look more like a modern game.
  • Three dimensional view. How would the world of HyperRogue look if viewed from above? You can witness this yourself now! See legs of monsters, when looking from an angle, sides of walls, and chasms. For hyperbolic geometry nerds: this view is roughly accurate if we assume that the surface is actually an equidistant, not a plane. ("Roughly" because formulas are not yet perfectly adjusted for stacking items (e.g. Dragon riding or climbing Red Rock), and sizes of objects are arbitrary.) The 3D view is the default setting now, if you have saved your configuration in an older version, you have to set the "wall display mode" and "monster display mode" to one of the 3D modes.
  • Movement animations. Monster movement is animated now. You can watch these dogs run! Also particle effects when things are destroyed.
  • Sound effects. When a dangerous enemy such as an Eagle comes, you can hear it now! There are also sound effects when you fight, colelct items, and in several other situations. Some sound effects are still to be recorded :)
As usual, the full changelog and further minor updates are reported on the Steam forum. Mobile versions will be updated later. Enough talking, let's play. Have fun!