Noteable Posts

Tuesday, February 25, 2020

OLD EDWARDIAN MIND SPORTS CLUB NAMES ITS COMMITTEE FOR 2020

Colin Webster, three times world wargames champion, is chairperson of the Old edwardian Mind Sports Club.
The Old Edwardian Mind Sports Club (OEMSC) was founded in 1982. Originally known as the Johannesburg Wargames Club the club moved to the Old Edwardian Society in 1989. As such OEMSC is the oldest member club in Mind Sports South Africa (MSSA) and is probably the oldest club in the world that caters for board games, esports, and wargames.

The club has produced a number of Protea team members as well as having produced four world champions.

Thus a club steeped in history and excellence remains at the cutting edge of development of esports in South Africa - and the world!

At OEMSC's recent Annual General Meeting (AGM), the following were elected into office to steer the club forward:

  • Colin Webster - Chairperson
  • Terence Allwright
  • Donald Mullany
  • Desmond Schoeman
The committee can boast of having over 82 years of experience between the four committee members. The experience is tempered with knowledge at all levels from grass-roots through to international.

OEMSC is determined to emba
rk on an exciting programme to add value to all the games which it hosts.

For further information, you may contact the club on wargames@iafrica.com or on WhatsApp on 073 593 9451.


Also read:

Monday, February 24, 2020

Tech Book Face Off: How To Design Programs Vs. Structure And Interpretation Of Computer Programs

After reading and reviewing dozens of books on programming, software development, and computer science, I've finally come to a couple of books that I should have read a long time ago. I'm not quite sure why I didn't read these two books earlier. Distractions abound, and I always had something else I wanted to read first. I still wanted to see what they had to offer, so here I am reading How to Design Programs by Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, and Shriram Krishnamurthi and Structure and Interpretation of Computer Programs by Harold Abelson, Gerald Jay Sussman, and Julie Sussman. As I understand it, these books are meant to introduce new students to programming so not reading them until now will probably make it difficult to accurately critique them from the perspective of the target audience. I'm still going to give it a try.

How to Design Programs front coverVS.Structure and Interpretation of Computer Programs front cover

How to Design Programs

While I have read many programming books as ebooks on my Kindle, this is the first book I've read as an online book. It's available in print version, but the online version looked nicely formatted and was heavily cross-linked, which was quite helpful. Also, since the book was right alongside my code editor, I could easily try out the problems and copy-paste code into the editor to run it.

The programming language used in this book as the vehicle for learning was a variation on Scheme called BSL (Beginning Student Language) that had heavy restrictions on the language features available for use. For example, lists could not be constructed with (list <list of elements>) or '(<list of elements>), instead needing to be built up from (cons <element> <list>). These and other features were added with BSL+, ISL (Intermediate Student Language), and ISL+ as the reader progressed through the book.

I was not a big fan of this approach, since it was tedious to learn the wrong way first (or at least the way nobody actually writes code) and then learn the right way that also makes more sense. Starting with the reduced forms of the language didn't add anything to the explanations, and it mostly served as a point of frustration as the reader was forced through unnecessary tedium until the nicer language features were introduced. It was also not clear by the end that ISL+ was equivalent to the full Scheme programming language, so by the time the student reached the end of the book, they wouldn't even be sure that they had learned a real programming language.

The book was quite ambitious, since learning how to design programs starting from square one actually involves learning three almost distinct things at once: the syntax of a programming language, how to write code, and how to program. The first task is about learning what a programming language is, what keywords and punctuation are available, and what it all does when put together in the correct structure. This task alone can be overwhelming for the new student. Then, the second task, learning to write code, involves taking a small, well-defined problem statement, thinking up a solution to it, and translating that solution into code that can execute in the newly learned programming language. Normally, once some part of the language has been learned, the first two tasks can be done together, and they support each other as the student practices them both.

The third task, learning how to program, is a much deeper activity that takes a much longer time to become proficient. Learning how to program is not just about solving bigger problems that may not be self-contained or well-defined. It's about learning how to organize all of the required code to solve the problem in a way that makes that code easy to understand, is less likely to suffer from bugs, is testable (and tested), and hopefully is flexible and extensible. I'm not convinced that this book taught this much more advanced skill, or at least not thoroughly.

The book starts out with a little prologue chapter entitled "How to Program." It gives a short introduction and a few examples of how to write some simple programs in BSL, and here the authors try to get the reader excited about what they'll be learning in the rest of the book. I had some misgivings about it. They have a strange way of trying to connect with the reader by disparaging various subjects that the reader is likely taking in school, or at least has fresh memories about, like physics:
Physics?!? Well, perhaps you have already forgotten what you learned in that course. Or perhaps you have never taken a course on physics because you are way too young or gentle. No worries.
I don't understand this kind of writing. It's not cool and it's not helpful to pretend to joke along with students about how much physics or mathematics or any subject sucks. It drives me nuts. Why can't we encourage students to take more of an interest in these subjects by showing how the knowledge can be useful, interesting, and dare I say, fun?! Thankfully, these comments don't continue in the rest of the book, but it's still irritating that they subtly perpetuate this anti-learning bias. It ended up coloring my opinion of the book in a negative way.

The rest of the book is split into six major sections with "intermezzos" between each section. I'm not quite sure why the intermezzos are there because they just seem to continue on with more topics that would fit in as additional chapters within the six sections, but that doesn't matter much. The first section introduces BSL features in more detail than the prologue, and it also lays out the recommended steps of a design process in chapter 3. These steps are touted as the steps for how to design a program, but they're really steps for how to design a function. The process is fine as far as it goes, but it doesn't really scale to large programs. This process is used and refined throughout the book.

The first section only introduced language features that allow for fixed-size data, so the next section introduces lists and recursion. It's a whole five chapters on lists, including basically a whole chapter of problems for the reader to solve. I don't remember lists being quite so hard to understand that it would require five chapters to adequately get the point across, especially with lists being a fundamental data structure of Scheme. Sorry, BSL+. Part of the problem is that the authors seem to explain things in as many words as possible. The text ends up plodding along with slow, tedious explanations, some of which don't even make much sense.

Another part of the problem of understanding in this book is the poor choice of variable names. When the authors are not using single-letter names (shudder), they're using names like alos. What is alos? Is it like, "Alos, poor Yorick! I new him, Horatio?" No, that's not right. That would be 'alas.' Instead, alos means "a list of strings." But why not just use list-of-strings, or even strings if you're into the whole brevity thing. The point is, these super abbreviated and truncated variable names make things more confusing than they need to be, because you have to keep the translation to the full name in your head along with the meaning of the variable and the rest of the code. Using full words for variable names makes the code so much more readable and understandable. It's not like we're working under any space constraints with the text of the code, except for the constraints of our own working memory.

The third section goes into detail on functions and how they enable abstractions that will make the programmer's life easier. Abstractions allow the programmer to solve low-level problems once and then think about harder problems from a higher level. It's a critical programming skill to learn. This section follows a similar format to the last one, with four chapters on functions done in excruciating detail, one of which is full of problems for the reader. We also advance to ISL for this section, and near the end we achieve the final level up to ISL+. Yipee! I remember hating when textbooks would introduce one way of doing things and then later contradict themselves and reveal the real way of doing it. This failing is worse with simplified languages, so I'm pretty tired of "student languages" by now.

The next section covers intertwined data, which is a convoluted title for a section that doesn't have a strong theme. The chapters in this section range from introducing trees to building a simple interpreter to processing multiple lists in parallel. The fifth section focuses on recursion for five chapters, and here they make the distinction between structural recursion, which is based on scanning lists, and generative recursion, which is more general and doesn't use lists as the looping mechanism. The final section discusses accumulators that are used with recursion to enable calculating properties of data that requires keeping track of additional state during the recursion. It's basically passing extra state variables in the recursive call in order to calculate aggregate or cumulative values on the data. All of these sections continued to have chapters near the end that were filled with extra problems for the reader.

This book was super long at nearly 750 pages—one of the longest programming books I've read in a while—and it did not seem like it covered enough ground to warrant that length. There were also 528 problems in total, so a huge amount of practice if the reader worked through all of the problems. Most of the problems were pretty decent, and they stayed relevant and reasonable for the material covered beforehand. But the book as a whole didn't hold up to its goal of teaching the beginner how to design programs. Learning how to program is a huge undertaking, and I don't believe it's possible to adequately cover that whole process in one book. On top of that, the level of discussion in much of the book was too complex for the beginner, and it would just as likely serve to confuse them as to teach them. Conversely, it doesn't seem to work well as a second programming book, either because it is so slow and tedious and long. By the end all we've learned is the basics of Scheme, lists, functions, and recursion. The Little Schemer taught much more in a more entertaining way in less than 200 pages. I can't recommend slogging through this book instead.

Structure and Interpretation of Computer Programs (SICP)

This book was the textbook for the entry-level computer science course at MIT for a number of years. I, unfortunately, was unaware of it until after I had finished college (not at MIT) and had come across it mentioned in a blog post by Steve Yegge, I think. Ah, yes, here it is. Apparently, that's also where I got the idea to read How to Design Programs, but fortunately, SICP was a better recommendation. I also didn't have the same issues with the book's humor that Steve did. I didn't mind the silly names of the students in the exercises, (you always know that Louis Reasoner got it wrong; you just have to figure out how) and some of the other jokes were actually kind of funny:
In testing primality of very large numbers chosen at random, the chance of stumbling upon a value that fools the Fermat test is less than the chance that cosmic radiation will cause the computer to make an error in carrying out a "correct" algorithm. Considering an algorithm to be inadequate for the first reason but not for the second illustrates the difference between mathematics and engineering.
I mean, come on. That's not half bad for a computer science joke. The majority of the book was not about fun and games, though. It's a serious book on introducing the computer science student to how programming languages—particularly Scheme—work.

SICP is split into five fairly balanced chapters. Each chapter starts off easy with an introduction to the material covered in the chapter and more detailed explanations of the mechanics of Scheme or the interpreter or whatever is the topic for the chapter. As things develop, the difficulty ramps up until near the end you can feel your brain going numb and draining out of your ears. Then you get a breather at the beginning of the next chapter with another gentle introduction.

The first chapter starts off with the requisite intro-to-the-language stuff that every book for a new programming language needs. After covering Scheme's operators and primitives, we move on to functions and immediately jump into recursion. By the end of the chapter we're learning about how to pass functions around as arguments and return values, and I wonder how an entry-level student could really grok all of this in a semester course. This is just chapter 1!

Chapter 2 teaches us all about how to structure and process data in Scheme. Since the fundamental data structure in Scheme is the list, this means we're going to get very comfortable with list processing (which is how Lisp gets its  name, see?). Between these first two chapters, we gain a thorough understanding of the foundations of Scheme and how to put together Scheme programs to do interesting things with data. Even after reading so many books on programming and practicing it in the field for a couple of decades, I was quite enjoying this "beginner" programming book.

Helpful exercises are interspersed with the text throughout the book, generally at the end of each subsection, and they are quite well thought-out exercises. With 356 exercises in all, they provide a ton of practice to ensure that the reader is understanding the material. At first they seem to be somewhat random but standard fare, asking the reader to solve programming problems with rational and complex numbers and other such mundane mathematical problems. Then, near the end of chapter 2, we learn how to implement generic arithmetic operations that can automatically promote and demote arguments from one class of number to another. It's pretty slick, if somewhat impractical. I can't think of a system where this behavior would be necessary, but it's cool to get it working nonetheless.

The next chapter kind of let the wind out of my sails a bit. The previous chapters had really exemplified the elegance of Scheme with beautiful functional programming, but now we had to learn about the mucky reality of objects and mutable state. This chapter introduces the set! operations that allow variables to be changed in place instead of creating and returning new variables that are set with the define primitive. The allowance for changing variable values enables the creation and maintenance of objects with state, and this complicates the analysis of program execution because now we have to deal with side effects. The authors did a nice job of explaining when objects are useful, because we don't want to use them for everything:
The object model approximates the world by dividing it into separate pieces. The functional model does not modularize along object boundaries. The object model is useful when the unshared state of the "objects" is much larger than the state that they share. An example of a place where the object viewpoint fails is quantum mechanics, where thinking of things as individual particles leads to paradoxes and confusions. Unifying the object view with the functional view may have little to do with programming, but rather with fundamental epistemological issues.
The second half of the chapter continues on from objects with concurrency, which does not play nice with mutable state at all, and introduces streams in order to deal with that problem. Streams are a mechanism that enables lazy execution of functions on lists. Instead of performing all of the computations on a list at the time the processing function is called, the function will return another function that will do the computation on its corresponding list element at the time that element is needed to be read. It's wild and confusing at first, but working through the exercises helps clarify how it all works.

Chapter 4 tackles the task that all Lisp books seem to reach eventually, and that is to write an interpreter. How to Design Programs did it. The Little Schemer did it. SICP does it to, but it doesn't simply stop with one interpreter. No, after the basic interpreter, we go on to write a lazy interpreter that does delayed evaluation. Then, we write another interpreter that does ambiguous evaluation, meaning the programmer can specify a problem and an input range for that problem, and the interpreter will perform a search to find a solution (or every solution) that satisfies the constraints of the problem. Think that's enough? Not now that we're on a role! The final interpreter extends Scheme to be a logic language similar to Prolog. You would think the previous ambiguous interpreter would be a good basis for this extension, but the text uses the lazy interpreter as the base instead. Extending the ambiguous interpreter is left as an exercise.

Things are getting pretty mind-bending by now, so why don't we finish things off with something truly warped. The last chapter goes through implementing a register machine model in Scheme. What's a register machine? It's basically a model of a computer that uses fixed registers, a load-store memory model, and low-level operations to execute an assembly language. Then we need something to run on this register machine, so we modify the interpreter to run on top of this assembly language. Now let's step back and think about what we've done. We now have an interpreter that takes in Scheme code, spits out assembly code, and runs it on a model of a computer (the register machine); and this is all done inside another Scheme interpreter running on a real computer. Wat? Let's think again about what we've done:
From this perspective, our evaluator is seen to be a universal machine. It mimics other machines when these are described as Lisp programs. This is striking. Try to imagine an analogous evaluator for electrical circuits. This would be a circuit that takes as input a signal encoding the plans for some other circuit, such as a filter. Given this input, the circuit evaluator would then behave like a filter with the same description. Such a universal electrical circuit is almost unimaginably complex. It is remarkable that the program evaluator is a rather simple program.
It's mind-blowing, really, but we're not done. The last part of the last chapter walks through building a compiler so that we can compile Scheme functions down to the assembly language of the register machine, and modify the register machine so that it can run the assembly code directly instead of it being fed from the interpreter. If that's not enough, the last two exercises are simply about writing a scheme interpreter in C and a compiler in C instead of what we just did in Scheme. Easy-peasy, right?

While these last two chapters were fun and fascinating, they were quite a stretch for one book. The first three chapters plus the basic Scheme interpreter would have been enough for the learning experience. I'm not sure how much practical knowledge readers would get out of the rest of the interpreters, the register machine, and the compiler. The explanations became very mechanical and it felt like a major effort just to fit in the code listings and brief descriptions while still keeping the book around 600 pages. Beyond the issue of cramming a bunch of complex stuff in the last chapter and a half of the book, there are much better books out there on compilers and interpreters, like the dragon book or Writing Compilers and Interpreters, that go into more detail and explain those details more thoroughly. Likewise for machine languages and computer architecture, if you really want to understand the underlying machine language and hardware, Computer Architecture: A Quantitative Approach is excellent. Although, for a lighter introduction, Computer Organization and Design might be a better place to start.

That criticism notwithstanding, SICP is an excellent book on both how to write programs in Scheme and how to write a Scheme interpreter. It's a solid textbook for a second course in programming, but not a first course. I can't imagine most entry-level students would grok everything this book tries to present, so it would be good to have some other programming language under your belt before tackling this beast. Given its age, it's still surprisingly relevant as a programming textbook, and quite enlightening.


SICP is far and away the better book in this face off. True, How to Design Programs is meant for a less technical audience, but I'm not convinced that it would be an appropriate book for non-programmers, either. Scheme is just not the right introductory language, and something like Python or Ruby would be a much better learning language. Taking that consideration out of the equation, SICP packs a ton more content into 150 less pages, and it goes in much more depth on both basic programming concepts like lists and functions, and advanced concepts like streams and interpreters. Did I mention it also uses way better variable names? The code is much easier to understand as a result, and it's only the complexity of the concepts later in the book that make that code difficult.

Definitely pass on How to Design Programs, but if you're in the mood to level-up your fundamental programming knowledge, give SICP a look. If you're so inclined to read it online, check out this version at Sara Bander's GitHub site. It's rendered in a beautiful Linux Libertine font that's an absolute joy to read on a screen, and the footnotes come up in text boxes when clicked. It's the best experience I've had reading an ebook.

Friday, February 21, 2020

TOP 10 GAMES OF 2019


So, after my massive movie breakdown a few days ago, we finally get to the games. I actually got to sample a larger number of releases this year compared to previous years, though I can't say I've completed a great many of them. Read on to find out my thoughts.

Read more »

UCLan Games Design Experience Of WIG Conference 2019

Two of our lovely Games Design students, Catarina Martins and Stacey Satchell were at the Women in Games Conference 2019 last week.
Here's what they had to say about the experience :)




Catarina:

"Can't put into words how inspiring and amazing those couple of days were in London at the European Women in Games Conference. The gaming industry is filled with strong and talented people and I had the absolute pleasure of meeting some of them. Also managed to make really good contacts with very helpful and super nice people which I hope to see again soon!
Now is time to take all the knowledge and inspiration I received and start applying for jobs. Let the new adventure begin!"






Stacey:

"Women in Games was such a wonderful event full of uplifting and talented people from a large variety of backgrounds and roles. From Keynotes that inspired me as a women in the community to panels that taught me so much about the industry as a professional. I left with amazing advice, a positive attitude and plenty of new friends. 
Looking forward to it again next year!"
















And here's some of the photos they took at the event.
Thanks for sharing, Girls!




























Recreating Classic Puzzle Mechanics In A Very New Shape

One of the most classic puzzle mechanics that we can find in games (specially in mobile games) is to push certain elements to the right places; sometimes the movements are limited, so we need to carefully study the challenge, sometimes we have unlimited movements, but usually get an element stuck in a place, so we need to start over again.



Push Maze Puzzle and Rebuild Chile are excellent examples of this gaming mechanics (by the way, the last one was used in a social campaign to earn donations for earthquake victims in Chile few years ago). Below, you can check out the gaming trailers to understand how this kind of puzzle game works:





This is a very traditional puzzle mechanic and, what we regularly see in many games, is the change of elements: sometimes we need to move rocks, other times we need to move boxes, plants, zombies, elephants and (fill the blanks).

However, recently I played one interesting game that caught my attention completely: Baba is You. The game has the simplicity of this previously discussed pushing mechanics, but you can interact with elements and words; when you interact with words, you can change the order of some phrases and affect game's ecosystem and dynamics. Check the trailer below to understand this clever idea:



Baba is you reaches a new level of experimentation and recreation of a classic mechanic. This game is an excellent example of how we can (re)think something that, apparently, was exhausted in terms of innovation. By using words as a key to the puzzle design, Baba is you invites the player to use his mind in a creative way. On this subject, Koster (2005, p.152) reminds us that the "toughest puzzles are the ones that force the most self-experimentation. They are the ones that challenge us most deeply on many levels – mental stamina, mental agility, creativity, perseverance, physical endurance, and emotional self-abnegation".

#GoGamers



Reference:

KOSTER, Raph. A theory of fun for game design. Arizona: Paraglyph Press, 2005.

Thursday, February 20, 2020

Game 357: The Dungeon Of Danger (1980)

The game efficiently blends its title screen with character creation.
         
The Dungeon of Danger
United States
Written and published as code in the Mostly BASIC series by Howard Berenbon
Versions released in 1980 for the Atari 800, 1981 for the Apple II and TRS-80, 1983 for the Commodore PET, 1984 for the Commodore 64
Date Started: 7 February 2020
Date Ended: 7 February 2020
Total Hours: 1
Difficulty: Very Easy-Easy (1.5/5)
Final Rating: (To come later)
Ranking at Time of Posting: (To come later)
           
And here's a final (for now) quick entry to clear up another "game" that made its way onto MobyGames recently. We already had a discussion, relative to The Devil's Dungeon (1978) as to whether a book of type-it-yourself code constitutes a "game." Having not reached a satisfactory conclusion, even in my own mind, I decided I might as well play this one.
                     
Yep, another one of these.
          
Dungeon of Danger is a lot simpler than even The Devil's Dungeon, and to be honest I think I could argue that this lacks enough elements to be considered an RPG. The problem is that to investigate a game this simple is the same thing as playing it, so I figured I might as well toss up an entry. Putting a "rejection" in the status column isn't satisfying to anyone.
             
A random encounter with a good wizard offers the only graphic in the game.
          
You start the game. You enter a difficulty level. You enter your name. You get dumped into a two-level dungeon with 64 rooms per level arranged in an 8 x 8 grid. Your goal is to collect as much gold as possible and get out. You do that by finding your way to one of the stairway squares on Level 1. The rooms are randomized between north-south passages, east-west passages, caverns, and chambers. Any one of them might contain one of a couple dozen monster types and a couple hundred pieces of gold. You can fight or flee them.
          
Killing a dragon and getting its gold.
         
When combat comes, you and your enemy exchange blows until one of you is dead. The rolls are all randomized (roughly 1d8). You start with more hit points than any enemy in the dungeon and you can replenish them with healing potions and encounters with a friendly wizard, so you have the edge. You need to find enchanted keys to climb levels and a map on each level to actually see the 8 x 8 grid, which reminds me a bit of The Wizard's Castle from the same year.
         
A map of the level. The fuzzy bit in the seventh column is my current position.
         
There are some special encounters in the dungeon:
            
  • Rooms with pools of water that might freeze you, do nothing, or burn you
  • Thieves who may steal your gold or drop theirs
           
That could have been worse.
          
  • Vapors that might knock you out, causing you to awaken in a random part of the dungeon
  • Trap doors that might dump you to the next level (or into a pit if already on Level 2)
             
All of these events are delivered with maddening pauses between short bursts of text, as if the entire game were narrated by William Shatner. 
           
Every one of those sets of ellipses is accompanied by a pause as the text loads.
       
If you make it to the exit, the game gives you a score based on your gold, how many enemies you killed, and how long it took you. It took me less than an hour to get the highest level (Dungeon Master) on "expert" difficulty. 
            
I won. I hope someone, somewhere, is happy.
          
The Dungeon of Danger appeared as 12 pages of code in a book series called Mostly BASIC by Michigan hobbyist Howard Berenbon. It specifically appeared in the "Book 2" volume for each platform. The earliest seems to be for the Atari 800 in 1980; editions for the Apple II, TRS-80, Commodore PET, and Commodore 64 followed over the next four years. 
            
The initial lines of code for The Dungeon of Danger.
        
There's no character development, combat is based on random rolls and not any intrinsic attributes, and there's no inventory, meaning that the game fails all my criteria for an RPG. (Frankly, it fails MobyGames's definitions, too, but it's easier to write an entry than to get them to change incorrect information.) It thus earns only a 5 on my GIMLET.
         
That catches us up to where we were before someone with too much time on his hands decided that The Devil's Dungeon, Knight's Quest, and The Dungeon of Danger needed to be preserved in our memory. Back to Ragnarok and the final entry on Blade of Destiny.

****

Note: An earlier version of this entry, accidentally published before I was ready, was a lot angrier. I was trying to make a joke by which my entries got progressively more ranting and incoherent over the last three games, culminating in my basically frothing at the mouth on this one. I had scheduled all three games a few days in advance. I later decided that people wouldn't get the meta-joke, which was only a little funny in the first place, and removed the setups from the first two entries but neglected to edit the third before it automatically published yesterday. I quickly took it offline to edit out the more irate language. Sorry if you got the premature edition; it would have been confusing.
        

Ragnarok: Temple Of Doom

You win some, you lose some.
           
Ah, roguelikes. There's no other sub-genre in which this kind of narrative makes any sense:
           
When I walked into the room, I saw a deadly asp on the other side of it. I didn't want him to get too close, so I killed him with my shurikens. I wanted to eat his corpse to get intrinsic poison resistance, but I didn't have any artificial resistance, so I knew trying would kill me. I had three unidentified rings, one of which might have been a Ring of Immunity, which would have protected me from poison while I ate him, but I only had one Scroll of Identification, and I was hoping to hold onto until I found a Scroll of Blessing because blessed Scrolls of Identification identify everything in your pack. I tried one of the rings blind, but it turned out to be a Ring of Relocation, and it teleported me to another part of the dungeon. While I was trying to make it back, I stepped in quicksand and started to drown. The only thing I could think to do was drink an unidentified potion, hoping it was a Potion of Phasing, but it turned out to be a Potion of Lycanthropy, and my character dropped all his stuff when he changed into a werewolf, then ran around the dungeon killing everything he encountered for a few minutes. Eventually, he turned back into a man, but I got killed by another deadly asp before I could get back to my equipment. C'est la vie.
                
There's so much to learn, and enough that works differently from NetHack that I'm not sure if my previous NetHack knowledge is a blessing or a curse--an apropos phrase, as I spent forever trying to figure out how to use Holy Water to remove curses and/or bless things before coming to the conclusion that it simply doesn't work that way in this game. As far as I can tell, Holy Water just increases your luck. You have to find Scrolls of Dispel Hex and Blessing to do the other things. But if you do find a Scroll of Blessing, a good use for it is to bless your Scroll of Identification, because blessed Scrolls of Identification identify all your items, not just several as in NetHack. To find monsters on the level, I don't want a Potion of Monster Detection; I want a Potion of Depredation, which sounds like a bad thing. If you do find any "bad" potions, don't save them to throw at enemies because that doesn't work here.
          
And maybe stay away from mushrooms entirely.
            
The worst part is the monsters. While NetHack and Ragnarok have a lot of overlaps in terms of equipment, the bestiary is almost entirely new. It makes good use of Norse mythology, yay, but I've got to learn every enemy's special attacks and weaknesses again. I started keeping a list of enemies to particularly avoid, but it ended up including almost all enemies. Jacchuses give you a disease that prevents you from healing. Kalvins pluck your eyes out. Pale Mosses destroy your brain tissue, which causes you to forget potions, scrolls, and such that you've already identified. Ramapiths toss fireballs. Red oozes devour your weapons and can't even be killed by regular weapons. Ulls disorient you; Predens give you fevers; Retchweed makes you hungry; Gas balls deafen you; Pelgrats suck charges from wand that you carry. I've barely gotten started.
           
I had lycanthropy for a while. It was worse for the other creatures in the dungeon.
          
I've spent a lot of time debating whether to try to eat slain enemies or not. Ragnarok doesn't seem to have as many enemies whose corpses give intrinsic protection, but they're definitely there. The aforementioned asps will give you poison resistance if you can survive eating them. Fire dragons confer fire resistance. I haven't found much else. What I can tell you is that troll corpses do not confer regeneration, wight corpses do not give you experience, and giants do not give you strength.

Ragnarok seems to offer more items and monsters that rearrange the physical environment than other roguelikes. In NetHack, you could take a pick-axe to just about every solid part of a level, and you can do that here, too, but there are also traps that fill rooms with water or lava, cause the ceiling to collapse, or replace all the external walls with monsters. There's a scroll that summons lava, and another that randomly plants trees wherever you are. There's an artifact called a "disruption horn" that you can use in the doorway of a room to cause the ceiling to cave in, killing whatever monsters are there (you get the experience!). A creature called a "mudman" leaves gobs of mud everywhere. There's a wand that just blasts the hell out of everything you point it at, including floors, walls, and anything in between.
          
Using my horn to collapse the ceiling on a roomful of deadly moss.
           
I spent seven hours exploring the dungeon beneath the forest, and I have nothing at all to show for it yet. It's three levels with nine maps per level--as big as Rogue by itself. Commenters were right: the game got a lot harder once I left the forest. I've been trying not to abuse the backup system too much, but thank the gods it's there. Some of my more amusing deaths include:

  • I stepped on a mist trap, which confused me. Confused characters in this game sometimes randomly use their items, and in this case, I ate a mushroom that turned the whole world hallucinogenic before killing me.
  • I ate some creature that turned out to be made of lava.
  • I stepped on a trap that turned all the surrounding walls into wizards, who quickly surrounded and killed me.
           
At least the hill giant probably won't make it out, either.
         
  • The one below didn't kill me, but it made life hard enough that I reloaded.
         
What kind of potion was that!?
         
One of my most heartbreaking deaths came late in this session, when I had just come across a Wand of Wishing. These are as useful here as they are in NetHack except I don't really know the specific names of the best equipment to wish for. Since I'd already activated the first wish by using it at all, I wished for one of the only high-level items whose name I reliably knew: Mjollnir. For some reason, I got a sword instead. Before I even had a chance to investigate it, a bartok came wandering into the room and killed me with a sonic wail. My previous save was well before this area was seeded with equipment. Lesson learned: save after you find Wands of Wishing.
           
In retrospect, the best answer would have been: "I wish I wasn't so excited about having found a Wand of Washing that I'm failing to notice the dude coming up from the southeast."
       
A lot of my woes are equipment-related. I'm constantly over-encumbered, made worse by the fact that I don't understand how a lot of stuff works. But there are good things to report. I have a full set of armor, including a "holocaust cloak," which protects against fire and I think is an homage to The Princess Bride. I have both a Ring of Locus Mastery and a Ring of Relocation. This means that every 12-100 rounds, I get teleported, but I can direct my destination location. It gets me out of a lot of fights and traps, and if I don't want to move, I can just specify the next square I was going to walk into anyway. It would be nicer to have these powers as intrinsics, but with the ability to equip 8 rings, you don't feel like you're wasting a slot as much as you do in NetHack.
           
Thankfully, my Ring of Translocation will eventually get me out of here.
         
In other good news, a blessed Scroll of Enhancement empowered my silver sword up to +9. In bad news, a red slime then ate the sword. Then I found another blessed Scroll of Enhancement and got a spear up to +15. You have to roll with the punches in roguelikes.

Two Scrolls of Knowledge bestowed my character with the "Terraforming" and "Identification" abilities. I haven't tried the former yet, but the latter seems to render Scrolls of Identification moot. I wish I'd known to wish for Scrolls of Knowledge back when I had that Wand of Wishing.
           
That's one logistical concern I no longer have to deal with.
           
On Level 2, I found an enemy named Scyld, who was so powerful that I assumed he must be some kind of "level boss" and likely in possession of one of the quest items. I reloaded half a dozen times before I finally killed him, but it turns out he didn't have anything special.
            
This seemed like a unique enemy, so I thought there would be more to him.
          
The real conclusion of the dungeon came via a hole I found on Level 2, which led to some kind of temple, preceded by a title screen. The game strikes a good balance between random level generation and some fixed level content, as this particular level shows. Its enemies are chiefly "guardians," who root in place unless you walk next to them, at which point they become hostile and generally kill me in two or three blows. My teleportation abilities plus careful navigating led me to avoid most of them.
          
Entering the temple. These special screens help create an atmosphere lacking in a lot of roguelikes.
            
I soon encountered a warrior named Hrethel, standing on a stump with a noose around his neck. He pleaded for freedom, but I had options to kick out the stump and do nothing instead of setting him free. (Note that the developers, finding no good way to operate this encounter with the usual game commands, just provided a special options menu. In both this and the graphics, the authors of Ragnarok show more flexibility than a lot of roguelike authors.) Of course, I chose to free him. The grateful Hrethel joined my character, but before I had a chance to figure out what that really meant, the god Vidur attacked and killed me instantly.
           
I like that the game supports these special options in addition to the usual plethora of roguelike commands.
           
In subsequent trials, I learned that Vidur always gets angry and appears if you rescue any of the three captives on the level. If I chug a Potion of Speed, I can act as often as Vidur and can wound him, but he always pounds away my hit points in two or three turns. My Orb of Imprisonment doesn't work on him. Neither (it seems) do several wands. He has no special attacks (so far), but his physical attacks are devastating. I'm going to roam around the dungeon some more and try to build my resources before giving him another run, as I have several unexplored screens on Level 3.

I'm still enjoying Ragnarok, but I have a feeling it's going to be way too long. I also forgot how exhausting roguelikes are. You have to watch every step, pay attention to every message, and stop and think before every combat. Life and death can hinge upon whether you take a beat before entering a room, or whether you take a corner using a diagonal movement key or two lateral movement keys. NetHack taught me to stop, pause, and think between moves, which serves me well here, but it also means that it seems to take forever to get through a level and yet you still have to pay rapt attention.

The lack of permadeath helps, of course. I'm quite careful to save every 200 turns and usually glad that I did. It means that I have a reasonable chance of getting through the game without having to look at spoilers, since underestimating an enemy or misdiagnosing a piece of equipment doesn't meant that I'm starting over from scratch. But 200 turns are more to make up than they sound, and it's especially jarring when, thanks to the nature of randomization, the same stuff doesn't happen the second time.

Because of reader comments, I never did switch to the Valhalla version of the game. It's a more apt name, since far more of my characters will have ended up there than at Ragnarok.

Time so far: 10 hours

Friday, February 14, 2020

Brave Browser voted the best privacy-focused product of 2020



Out of all the privacy-focused products and apps available on the market, Brave has been voted the best. Other winners of Product Hunt's Golden Kitty awards showed that there was a huge interest in privacy-enhancing products and apps such as chats, maps, and other collaboration tools.

An extremely productive year for Brave

Last year has been a pivotal one for the crypto industry, but few companies managed to see the kind of success Brave did. Almost every day of the year has been packed witch action, as the company managed to officially launch its browser, get its Basic Attention Token out, and onboard hundreds of thousands of verified publishers on its rewards platform.

Luckily, the effort Brave has been putting into its product hasn't gone unnoticed.

The company's revolutionary browser has been voted the best privacy-focused product of 2019, for which it received a Golden Kitty award. The awards, hosted by Product Hunt, were given to the most popular products across 23 different product categories.

Ryan Hoover, the founder of Product Hunt said:

"Our annual Golden Kitty awards celebrate all the great products that makers have launched throughout the year"

Brave's win is important for the company—with this year seeing the most user votes ever, it's a clear indicator of the browser's rapidly rising popularity.

Privacy and blockchain are the strongest forces in tech right now

If reaching 10 million monthly active users in December was Brave's crown achievement, then the Product Hunt award was the cherry on top.

The recognition Brave got from Product Hunt users shows that a market for privacy-focused apps is thriving. All of the apps and products that got a Golden Kitty award from Product Hunt users focused heavily on data protection. Everything from automatic investment apps and remote collaboration tools to smart home products emphasized their privacy.

AI and machine learning rose as another note-worthy trend, but blockchain seemed to be the most dominating force in app development. Blockchain-based messaging apps and maps were hugely popular with Product Hunt users, who seem to value innovation and security.

For those users, Brave is a perfect platform. The company's research and development team has recently debuted its privacy-preserving distributed VPN, which could potentially bring even more security to the user than its already existing Tor extension.

Brave's effort to revolutionize the advertising industry has also been recognized by some of the biggest names in publishing—major publications such as The Washington Post, The Guardian, NDTV, NPR, and Qz have all joined the platform. Some of the highest-ranking websites in the world, including Wikipedia, WikiHow, Vimeo, Internet Archive, and DuckDuckGo, are also among Brave's 390,000 verified publishers.

Earn Basic Attention Token (BAT) with Brave Web Browser

Try Brave Browser

Get $5 in free BAT to donate to the websites of your choice.

Brave Browser voted the best privacy-focused product of 2020

Out of all the privacy-focused products and apps available on the market, Brave has been voted the best. Other winners of Product Hunt's Golden Kitty awards showed that there was a huge interest in privacy-enhancing products and apps such as chats, maps, and other collaboration tools.

An extremely productive year for Brave

Last year has been a pivotal one for the crypto industry, but few companies managed to see the kind of success Brave did. Almost every day of the year has been packed witch action, as the company managed to officially launch its browser, get its Basic Attention Token out, and onboard hundreds of thousands of verified publishers on its rewards platform.

Luckily, the effort Brave has been putting into its product hasn't gone unnoticed.

The company's revolutionary browser has been voted the best privacy-focused product of 2019, for which it received a Golden Kitty award. The awards, hosted by Product Hunt, were given to the most popular products across 23 different product categories.

Ryan Hoover, the founder of Product Hunt said:

"Our annual Golden Kitty awards celebrate all the great products that makers have launched throughout the year"

Brave's win is important for the company—with this year seeing the most user votes ever, it's a clear indicator of the browser's rapidly rising popularity.

Privacy and blockchain are the strongest forces in tech right now

If reaching 10 million monthly active users in December was Brave's crown achievement, then the Product Hunt award was the cherry on top.

The recognition Brave got from Product Hunt users shows that a market for privacy-focused apps is thriving. All of the apps and products that got a Golden Kitty award from Product Hunt users focused heavily on data protection. Everything from automatic investment apps and remote collaboration tools to smart home products emphasized their privacy.

AI and machine learning rose as another note-worthy trend, but blockchain seemed to be the most dominating force in app development. Blockchain-based messaging apps and maps were hugely popular with Product Hunt users, who seem to value innovation and security.

For those users, Brave is a perfect platform. The company's research and development team has recently debuted its privacy-preserving distributed VPN, which could potentially bring even more security to the user than its already existing Tor extension.

Brave's effort to revolutionize the advertising industry has also been recognized by some of the biggest names in publishing—major publications such as The Washington Post, The Guardian, NDTV, NPR, and Qz have all joined the platform. Some of the highest-ranking websites in the world, including Wikipedia, WikiHow, Vimeo, Internet Archive, and DuckDuckGo, are also among Brave's 390,000 verified publishers.

Earn Basic Attention Token (BAT) with Brave Web Browser

Try Brave Browser

Get $5 in free BAT to donate to the websites of your choice.