Tuesday, 31 October 2017

HyperRogue 10.2: More Geometry Experiments!

While this update probably does not add much for the "normal" players (except some minor bugfixes), it greatly extends the possibilities of experimenting with various geometries and tilings. HyperRogue started with the "hyperbolic soccerball" tiling; further versions have added Euclidean geometry (to see why it matters), heptagonal tiling, spherical tiling (as used in the Halloween minigame), and several quotient spaces. However, this was not enough -- for example, you could not recreate Escher's Circle Limit series in the built-in vector graphics editor because it used a different symmetry than HyperRogue, and other tilings are also definitely useful for educational purposes, and applications of hyperbolic geometry (such as visualization). Therefore, this update adds quite a lot of new geometries to play with! [Still no square grid, though :)]



This picture shows all the tilings/geometries you can select in the Geometry Experiment menu in HyperRogue 10.2. The first two columns show the truncated (more precisely, truncated dual, or chamfered) and non-truncated variant of each basic tiling. Some of these look the same; this is because the image also shows some quotient spaces -- look for the player character appearing in multiple places :) These are available in all lands -- as shown in the two columns on the right, using the Red Rock Valley as an example. There are more tilings available, but only in particular lands -- we already know the Warped Coast (fourth column), and the new land, the Crystal World, uses the dual tiling (we could previously play in the dual tiling in the Graveyard, but the Crystal World is much more explicit). (The Crystal World does not appear during the normal gameplay -- it is very simple and designed rather for geometry experiments.)

On the Steam forum, players have already started creating ideas about the possibilities for new lands specific to the octagonal tiling. Have fun!

Saturday, 14 October 2017

HyperRogue 10.1: four new lands!

HyperRogue version 10.1 is released on Steam and itch.io! It includes four new lands, and many gameplay, user interface, and graphical improvements.
The volcanic activity in the Volcanic Wasteland is extremely unstable. Lava is too hot to walk on. It cools quickly, but another flow will come soon...

The Emperor's mausoleum. The army of Terracotta Warriors is supposed to protect him in his afterlife, while the traps are to protect the treasures in the mausoleum from thieves. Will you be able to avoid waking up the Terracotta Warriors, and use the traps for your own benefit?

The Zebra is a mixture of the Land of Eternal Motion and... well, this new basic land is the answer! A very simple land, where you can learn the basic skills of fighting in open space. Many of these skills only work in the non-Euclidean world of HyperRogue!

Once in the past there lived a tribe whose prophets warned about the great Blizzard that was to come and freeze the world. They thought it was the wrath of the gods, so they put some altars, so that the gods could hear their pleas. The mighty golems guarded those altars, making sure nobody steals the jewels, because a robbed god is a angry god. Unfortunately winter has come (maybe because only the monks knew how to stop the golems, and they were said to had escaped earlier with some of the jewels). The tribe has frozen to death, altars got covered with snow and ice. Only ice golems still guard them waiting for the spring.

See the changelog on Steam forums or the website for more details. Also follow @ZenoRogue on Twitter -- pics of the new lands have been previewed there :) Features of these lands have been inspired (more or less directly) by ideas of Kojiguchi Kazuki, Snowyowl0, SurelyYouJest, tehora, and wonderfullizardofoz -- thanks to them! Android and iOS versions should be updated soon; updating of the free versions with these additions is delayed this time. Have fun!

Wednesday, 13 September 2017

Losing is fun

This is a response to Christopher Walker's post Implicit vs. Explicit Failure for Educators and Game Designers. The post makes a distinction between two types of failure: explicit ("you have lost") and implicit ("you have not succeeded yet"), and argues that explicit failures are overused in games and education. I think that the post presents a very interesting point of view, and is well worth to read and think about.

However, roguelikes and similar games are based on a completely different philosophy. Losing is an integral part of the game. The unofficial motto of Dwarf Fortress is Losing is fun. This is based on the principle is that it is the journey that matters, not the destination (a similar thing was said by Gauss about mathematics) -- many players find roguelikes fun even if they have no hope of ever winning. Games such as Dwarf Fortress or Tetris do not even have a winning condition -- you will lose eventually. Other games do have winning conditions, and winning such a game after hundreds of failures is a great feeling.

HyperRogue mixes these two designs -- the winning conditions exist (or you can set ones for yourself), but on the other hand, you are allowed to continue the game after winning, but the game gets harder and harder, and you will have to lose eventually. HyperRogue has some puzzles which test your navigational skills in hyperbolic geometry (Princess Quest, Galápagos, Camelot, Yendor Quest). These do not need the component of losing the game explicitly -- however, they would not fit the rest of the game without it, so they also get harder and harder, and one can lose the game while doing them.

Recently, a peaceful mode has been added -- in this mode, the players can solve the failureless versions of these puzzles, or ignore all the challenges and just explore the world. This was intended to make the educational component in these puzzles more accessible to players who are less used to the brutal difficulty typical to roguelikes, and prefer puzzles that you can only win -- especially important in the case of live presentations. However, our experience from such live presentations shows that the standard game is generally much more exciting, especially for younger players.

I think that the dichotomy between explicit and implicit failures presented in the post is a bit exaggerated. In most games, you can try again after you lose; therefore, in a way, all failures are implicit. I think that, rather than avoiding losing conditions, we should teach that losing is not a failure, and minimize the psychological distress caused by it. According to a Go proverb, one should lose their first 50 games as quickly as possible; losing is not a failure, it is simply finding a way that does not work, and everyone needs to lose a lot before they master a subject. It is inevitable that one will "fail" in many situations during their life, that everyone fails, and I believe games to be a great opportunity to teach one not to be discouraged by this.

The post gives an example of a game about Greek mythology where you could lose, causing the chapter to restart, and the player to hear the 30 seconds of narration again and again. From this description, it appears to me that the main problem with the game was not the failure condition, but the fact that they forced the player to watch the story again when they lost. "Well, we need to have some kind of challenge. Otherwise it's not really a game, is it?" Well, maybe it is not really a game, but this does not matter -- not everything needs to be a game to be fun, and many games would benefit if the "challenge" was removed from them. Story and challenge do not mix. If the point of the game is to tell a story -- no challenge is necessary. A challenging game benefits from the story, but only as long as it does not get in the way. Well designed roguelikes usually keep their stories to minimum, or to pieces of lore that you can read if you want. They also rely on randomization, so that every new game will be different and interesting. This randomization sometimes causes the player to lose because of pure bad luck rather than bad decisions -- well designed roguelikes try to avoid this, however, from the "life lesson" perspective outlined in the previous paragraph, it is important to learn that losing is not always your fault.

The post also mentions the problems with stressful mathematical exams, where a single mistake with the execution of the solution makes the whole thing wrong (especially ones where the answer is a single number). Roguelikes also have this property, and there are also many real life situations where it happens -- real research in mathematics, working with computer security systems, etc. While mistakes are costly in all these situations, often there are actually parts of the work that remain valid (completing half of the game, proving useful facts on the way, code often becoming correct after fixing just a single character, etc.), and this should also be reflected in the way the exams are graded. As for games -- aren't they a great way to get one used to this, and reduce the stress?

Thus -- losing is not a failure. Losing is fun. It also makes winning even more fun. Have fun!

Friday, 25 August 2017

Sources of HyperRogue, part V

This is the fifth post in the series, describing new lands in versions 9.x. We will start with the three lands added in 9.0, all of which have a significant Norse theme.

If you are learning about hyperbolic geometry from popular mathematical sources, one of the first things you learn is how the sum of the angles of the triangle is less than 180 degrees. This affects the gameplay -- in fact, this is the reason why the world is often rotated differently when you return to the same location -- but for a long time I wanted to create a land which requires a bit more understanding of this phenomenon, where the player has to learn how to calculate the defect quickly. Burial Grounds is such a land. The original inspiration for the theme was the Barrows from Lord of the Rings; however, we have read that the Barrow Wights here were inspired by Draugar from the Norse mythology, and we have decided to use Draugar directly. Draugar were also one of the interesting monsters in Ragnarok/Valhalla.

One more ingredient is missing here -- since the land requires Orb of the Sword, how does one obtain it in the first place? This is solved by another land, the Kraken Depths. The idea of an underwater land where Orb of the Fish is necessary to do anything comes from the ideas thread (Fulgur14's post, I think there were also similar ideas by other people). The Kraken appears to be the widest creature that can move in the hyperbolic plane in a reasonable way, and its movement foreshadows the Orb of the Sword. Krakens come from the Norse legends, thus making the Living Fjord, Kraken Depths, and Burial Grounds a sequence of lands which are different, but yet thematically and mechanically related.

It was previously said how the Elemental Planes were designed because there were already several Elementals of various kinds. Trollheim is the same, but for Trolls. Some time in the future we might see a land of birds, a land of canines, or a land of sharks. :) In many lands, the Trolls are monsters which aim to hurt the player, but they usually end up actually helping them; again in Trollheim, you have to use the Trolls' special wall-creation property to your favor. The name Trollheim is made to sound typical to Norse mythology (like Jotunheim, the land of giants). We have been searching for an appropriate "troll treasure" but we could not find anything too exciting -- one weird idea was to have "golden crowns", inspired by a popular Polish song which says "twelve heavy crowns of pure gold adorn my head" -- ultimately we have chosen the "golden eggs", referring to the first troll treasure you find (Gold); people who have played Colossal Cave Adventure should also notice and understand another reference.

Some time after version 9.0 has released, I have received an information from Steam about the Halloween sale event, aimed at the games with Halloween-like themes. At first, I did not want to participate in this -- HyperRogue had some monsters which fit the theme, but this was not the general theme of the game; adding a Halloween land would be redundant and probably not that exciting from the event's point of view. However, I was working on the spherical geometry mode at the time. Spherical geometry is very different from hyperbolic -- it is bounded, which allows interesting resource management -- and I thought that a new land specific for this geometry would be great; and Halloween fit perfectly, with the natural motivation for being played on a sphere (surface of a jack'o'lantern).

The Dungeon is based on a post of wonderfullizardofoz, to get more mileage of the new 3D perspective in the gravity lands. It takes the general idea of a gravity trap land, skeletons, and ghosts; also Slime Molds as a treasure (a reference to a food item in Rogue -- I had no other ideas for treasure anyway). Banshees were replaced by my own idea (bats, which I have invented some time earlier as a weaker version of Eagles, but I had no good idea where to put them). Since Skeletons were there, this made sense as an extension of the Palace (with some influence from an earlier idea of Fulgur14) -- especially that the mechanics of pressure plates from the Palace could make an interesting return in a gravity land. The Orb of Recall comes from the first post in the Orb idea thread, by wonderfullizardofoz and Fulgur14. (Ideas for new orbs and enemies are welcome, not only for lands!) As a fan of Steven Universe, Fulgur14 expected Amethysts in HyperRogue since Pearls and Garnets were there -- but gem names are just gem names, mostly.

The general idea for the Mountain comes from the same post of wonderfullizardofoz. Before implementing these two lands, I have already implemented the Orb of Nature, and I wanted to put it in some land. Since wonderfullizardofoz's idea already included the Eagles, I have decided to include Ivy too (and make it possible to use the dormant Ivies to climb the mountain), and make it a subzone of the Jungle.

Long time ago, tricosahedron posted his idea of a land inspired by Reptiles by M.C. Escher. The idea was very interesting, but I did not believe that Escher's pattern could be adapted to hyperbolic geometry -- it seemed that something had to have a threefold or sevenfold symmetry, and thus look nothing like a reptile. Some time later, tehora said she wants a land where reptiles rise from the floor as in Escher's work, and I have decided to try harder -- and obtained quite a nice reptile tesselation -- with some gaps with threefold symmetry as expected, but still, they did not make the tesselation bad. To the surprise of tehora, the release post listed this as based on an idea of tricosahedron (I thought she was referring to tricosahedron's idea, but apparently she had the same idea independently). Reptiles by M.C.Escher depicts not only the Reptiles themselves, but also many other interesting things; probably the most interesting one is a dodecahedron, so it has been chosen as the treasure of this land. (We also collect dice -- from the standard ones based on Platonic solids, to more exotic ones -- so collecting dodecahedra feels very nice to us.)

Contrary to HyperRogue, David Madore's hyperbolic maze does not take place in the full infinite hyperbolic plane, but rather a finite part of it (of size of 88110 tiles) whose edges has been stitched together, to make a space without boundaries; stitching is done in a very regular way, based on matrices over a finite field. For 9.4 I have decided to implement something similar to Madore's method -- even though the most unique things about HyperRogue is its infinite and exponentially expanding world, a special geometry where the world is actually finite could make for an interesting educational feature, and it could be also used as a pattern -- similar to the existing Vineyard, Zebra and Palace patterns, but very huge compared to them (huge, yet highly regular, though in a rather incomprehensible way). The pattern of 5676 heptagons (18920 cells in total) was big enough to fit large circles and multiple non-crossing straight lines -- so for the first land based on this pattern I have decided to use wonderfullizardofoz's idea of Amazon River, where you have to cross a river without touching the crocodiles in it, who just go with the current without pursuing you, unless you are on adjacent cell; however, I have decided that a river land with objects moving with the current felt too similar to the Whirlpool, so I have rethemed it as the Prairie, where you have to get on the other side of a herd of charging beasts. Of course, both ideas -- crossing a road filled with cars, and a river filled with crocodiles -- have been used in the classic game Frogger (hotdogPi also had a similar idea, but when Prairie was already there.) Previously I was thinking to do this not on a bundle of straight lines/equidistants, but on a bundle of randomly generated adjacent curves -- maybe such a land will be added in the future. The regular pattern turned out to have one more interesting property: after placing the charging paths and the Great Walls (also incorporated in the pattern), it allowed yet another straight line, which was far away from both the charging paths and the Great Walls. I have tried to put another charging path there at first, but this did not work well because of a different structure of the central straight line; thus, since this line was separate from everything, I have decided to make it a "safe spot", with no monsters appearing, an alternate source of Orbs of Safety, and an interesting property that these Orbs of Safety throw you into a location which looks exactly the same. And what kind of treasure could one find in the prairie, on the other side (of the herd of bulls)? Of course, the grass is always greener on the other side.

Yet another idea that many different people came up with independently was a land based on the Boulder Dash game from 1984 (some readers might know newer games heavily inspired by Boulder Dash, such as Emerald Mine or Supaplex, or their open source combination, Rocks'n'Diamonds). Like roguelikes, Boulder Dash is grid based and turn based -- however, turns happened automatically and very quickly, making it more about timing the keypresses precisely (like a very fast version of Crypt of the NecroDancer...). One of the iconic features of Boulder Dash were Butterflies, who did not pursue the player -- they simply moved along the walls -- and turned into a 3x3 square of Diamonds when killed by a falling boulder; I thought that an interesting HyperRogue land could be based on this, and so thought CtrlAltDestroy and Simon Clarkstone. However, it was not clear how should the gravity be implemented (like in Ivory Tower or like in Dungeon? where should the boulders fall if there are multiple choices? how should this work in the HyperRogue grid in general?), so I have decided to replace gravity with charging bulls -- together with the Prairie, the 9.4 update was all about Bulls. A later update added a special tiling, heavily inspired by Butterfly (No. 70) by M. C. Escher, and its hyperbolic version by Doug Dunham -- however, the butterflies had to be "broken" a bit to make the lines separating tiles clear. Since "diamonds" were already taken, another gem name had to be chosen -- the name spinel comes from the Latin spina (arrow), but sounds a bit like the English word spin too, so spinels are appropriate for gems obtained by shooting bulls at the spinning butterflies.

The Crossroads V are also based on an old idea -- this time an idea of Fulgur14, so old that it was called Crossroads III at the time. :) Not sure why this was not used immediately.

Some people consider HyperRogue to be a hard game. I think that HyperRogue is as hard as it needs to be -- if it was easier, it would not force the player to learn. When Ptolemy I asked Euclid if there was a shorter road to learning geometry than reading Euclid's Elements, he replied that There is no royal road in geometry; I believe the same is true not only with mathematics, but also with games such as Chess, Go, or HyperRogue. Furthermore, just as most players of Chess or Go player do not have hope to every beat the grand master, many people play difficult roguelikes without caring about whether they will ever win -- this is because the point of roguelikes is not necessarily to win, but to have fun while playing a complex game, and getting better and better in it. This is similar to what Carl Friedrich Gauss said in a letter to Farkas Bolyai: It is not knowledge, but the act of learning, not possession but the act of getting there, which grants the greatest enjoyment. Gauss and Bolyai have been discussing the nature of parallellness, and whether it is possible ot prove Euclid's fifth axiom from the other ones, for a long time without success; many years later, Bolyai's son, János, has discovered the hyperbolic geometry, and then they learned that Gauss has discovered the same things on its own, but he did not publish the results. Hyperbolic geometry was also independently discovered by Nikolai Lobachevsky, who is quoted to write There is no branch of mathematics, however abstract, which may not some day be applied to phenomena of the real world -- and indeed, non-euclidean geometry has found many applications, for example in physics, and more recently in art (M.C. Escher), game design, data visualization and social network analysis; and even HyperRogue itself can be applied as a powerful engine to work with applied hyperbolic geometry (see RogueViz). Speaking of M.C. Escher, here is a quote of him: We live in a beautiful and orderly world, not in a chaos without norms, as we sometimes seem to, which is also relevant to HyperRogue -- as an important thing that sets it apart from other geometrically weird games, such as Antichamber or Monument Valley, is that HyperRogue's geometry, although weird, is completely logical, and can be reasoned about; and gaining a deep understanding of this geometry is important for the game, and why it needs to be hard. In our opinion, Monument Valley is very easy compared to HyperRogue, but also it is more shallow mathematically, which does not prevent Monument Valley and Escher's works it is based on to be great works of art. Which brings us back to the start of this long paragraph.

Since all these classic quotes not only come from people whose work was very important for the development of HyperRogue, but are also very relevant to the game itself, they have been added as the Knights of Camelot's lines in HyperRogue 9.1. (Interestingly, if you want to get from A to B in the world of HyperRogue, there is a "royal road", one such that every other path is significantly longer than it...) It was not mentioned in the last part, but since 8.3, the Knights end their speech in the way similar to one used by Sprite Guard in his YouTube channel. It is not known what new features will be added in versions 10.x and described in the next post in this series. So, until then, thank you very much for reading, and have a great rest of your day!

Sunday, 23 July 2017

HyperRogue 10.0 is released!



HyperRogue version 10.0c is released! You can download the packages for Windows and OSX, and source that compiles on Linux. You can also buy HyperRogue on Steam for typical Steam features such as automatic updates, online leaderboards and achievements. (The Android gold version should be available too, and the iOS version has been already sent to review.)

The picture above shows the Hall of Mirrors, which replaces the Mirror Land, and features long straight mirrors, revised mimic movement rules, and new monsters. Mirroring is now much more interesting! :) Thanks to tehora and wonderfullizardofoz for ideas for this land.

The world of HyperRogue is larger than anything Euclidean, with over 10200 cells in 1000 steps from the starting point. By design, the classic version of HyperRogue has no equipment or consumables -- if it had, the players could grind this practically infinite world, in order to always have their consumable inventory full, and best equipment possible -- quite boring for gameplay. This significantly reduces the resource management aspect compared to many classic roguelikes and other computer RPGs; furthermore, randomly placed temporary orbs introduce their own form of grinding -- when you travel the world looking for a specific set of orbs. There are also players who are unhappy with having to start a new game after a single mistake.

The Orb Strategy mode has been introduced for players who are not happy with these aspects of HyperRogue. It solves the problem of grinding by limiting the number of Orb uses by your collected treasures; as usual, the more treasures you collect, the harder the land becomes, so getting too many orbs of a single type should be impossible. The Orbs no longer appear randomly (except some specific cases) -- but you can use the orbs from your inventory ('i') whenever you want. Orbs allow you to escape situations which would be deadly in the classic mode (although which orb to use to escape the given situation is an important part of the strategy) -- thus, the unlocking requirements in this mode are significantly higher, and you get to face difficult combat situations more often than in the classic mode. The quests have been adjusted to give extra bonuses, and the Hall of Mirrors grants powerful Orbs of the Mirror, which let you gain copies of your chosen Orbs -- this is analogous to character specialization in classic roguelikes.



One more small addition -- in the peaceful mode, there is no combat. You can solve various navigation puzzles in HyperRogue without facing enemies, play the memory game and see from what distance you can return to the starting point, or simply explore the world (only the more peaceful lands are available here). This mode is intended as a way to show the geometrical aspect of HyperRogue to new players quickly without the necessity of learning the combat strategies, or possibly to people who are interested in hyperbolic geometry, but not necessarily in the difficult challenges typical for roguelikes.

This version also includes many graphical and user interface improvements. Local scoreboards are now more useful, lines look significantly better now, and the mission screen (obtained by pressing Esc or by being killed) now displays hints about the basic rules of the game, hyperbolic geometry, or suggests trying special modes. The full changelog is available here.

It appears that having the full version free (on some platforms) does not reduce sales significantly, and it has many positive effects -- so I have decided to add the newest features to the free version quickly this time. You can also support HyperRogue on Patreon or buy T-shirts on TeePublic or RedBubble. Have fun!

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!