Wednesday, October 9, 2019

An Opportunity to Get Super Judgmental

Each year, the Annual Interactive Fiction Competition hashtagpublishes new, text-driven digital games and stories from independent creators. It relies on volunteer judges — have you got what it takes to be one?  

You totally do. Honestly, you just have to play and rate at least five games before November 15, 2019.


The competition also needs more people willing to share their thoughts in public. Right now, these sites are discussing IFcomp games: 




And I'm sure there are others that I missed.

Sunday, July 28, 2019

Interactive Fiction Bestiary

(Language Warning: I’m not using the word “Bestiary” correctly, but this is a post about the best interactive fiction. The best interactive fiction, right? Come at me, bro.) 

If you are interested in dynamic and engaging stories, then you should be paying attention to Interactive Fiction. If you are paying attention to Interactive Fiction, then you should be following the Interactive Fiction Community Forum.

Over on the forum, Victor Gijsbers has asked for a list of the best Interactive Fiction games. I've shared my list over there, but I'm also putting it here for people who don't know about either the forum or this specific discussion.
  • Trinity, by Brian Moriarty, has the #1 spot on my list. The Lost Treasures of Infocom games were a big part of the computer games I played in high school, but I'm naming Trinity as first among them. 
For the rest of my list, here are the parser games listed in alphabetical order:
  • Baker of Shireton, by Hanon Ondricek, is both straightforward and absurd. What if a single-player text adventure tried to simulate an MMORPG? It’s much more entertaining than the .hack Playstation games.  
  • Child's Play, by Stephen Granade, is all about emotional manipulation and cunning schemes. Because sometimes, justice demands it.  
  • Curse of the Garden Isle, by Ryan Veeder, is a peaceful, low-stakes exploration game. Well, the stakes are low for you, but not so much for the island’s former visitors. 
  • Diddlebucker!, by J. Michael, is a solid mashup of 80’s scavenger-hunt movies and Infocom text adventure classics. It’s very well done.  
  • Future Threads, by Xavid, is not quite about time travel, but it is about predicting the future. It includes an in-game map and direct feedback about how your actions will influence the game’s outcome.  
  • Holy Robot Empire, by Caleb Wilson, needs no explanation. It took me a bit to figure out that I was still supposed to be a human character, but I was determined to find the Robopope and then kiss its papal ring.  
  • Hunger Daemon, by Sean M. Shore, is a Lovecraft tribute with multiple endings. More importantly, it’s a self-aware Lovecraft tribute, which saves it from overwrought, needlessly elaborate prose that can infest other iterations.  
  • Kerkerkruip, by Victor Gijsbers, has the best combat system I have ever seen in a parser game. The setting manages to be familiar without existing as a stereotyped cliché.  
  • Oppositely Opal, Buster Hudson, is a game about spellcraft. And about friendship. And about making your rivals pay.   
  • Origin of Madame Time, by Brian Rushton, builds a detailed world full of super-heroes and super-villains. It’s fun, the puzzles are fair, and it gives you a choice of taking the easy way out or becoming a true hero.  
Here are the Twine games in alphabetical order:
  • Animalia, by Ian Michael Waddell, leans hard into combinatorial explosion and ends up better for it.
  • Beware the Faerie Food You Eat, by Astrid Dalmady, nails the atmosphere of a trip to the faerie realm.
  • Cannery Vale, by Hanon Ondricek, is a game of stories within stories.
  • and Seedship, John Ayliff is a game where you find a new home for the human race. Good luck! 
All these games are listed in the Interactive Fiction Database, which is another useful resource for finding dynamic and engaging stories.

Friday, July 19, 2019

Not Evil, but Spectacular

We should have a (spoiler-free) discussion about the song "Not Evil," from Lego Movie 2, because it is a triumph:

 

This song is an amazing success precisely because it's a ridiculous failure. Queen Watevra Wa'Nabi’s message is hopelessly broken.

  1. If the queen is good, skeptics will never take her word for it — she keeps talking about evil, imprisonment, and execution. 
  2. If the queen is evil, skeptics will never fall for her lies — she can't stop herself from talking about evil, imprisonment, and execution. 

In either case, her obsession with evil makes her more relatable. She's just like us!

Crafty rogues have entertained people for centuries, because being good is boring. The Book of Swindles was written during the Ming Dynasty in China. Reviewer Rob Moore wrote that “the success of the collection upon its publication in 1617 demonstrates that the author knew too well that the only thing better than alerting the reader to nefarious criminals is to let them in on the crime.”

Consider how many games let you be bad, knowing that your actions are wrong but letting you do them anyway. It can be as explicit as Grand Theft Auto, or as low key as a game like Donut County. The opening sequence of Donut County establishes that it is especially self-aware, as game designer Andrew Plotkin explained:

"it establishes right off that dropping people into holes is (a) wrong and (b) what you’re going to do all game long and (c) way fun. This is kind of brilliant." 

Back to Lego Movie 2. During the song, the queen engages in a bunch of questionable behavior that makes it impossible to tell whether she’s welcoming her guests or menacing them. (You can find similar behavior online: someone who is using the word “ally” to describe themselves hasn't made their creepy behavior any less creepy.)

Saying “This is X” is different from saying "This is not Y." What does “not evil” mean, anyway? In the classic D&D table of alignments, you’ve only ruled out three alignments, or less than half of the available options.
But it takes more than clever writing for the Lego sequence to work.

The conflicting messages would be a waste of time if they were delivered with less energy; it would fail if the “good” parts weren’t trying hard to be believable, or the “evil” parts weren’t appropriately suspect. Tiffany Haddish absolutely nails it at both extremes of the spectrum.

Listen to the (believably!) self-righteous way she announces “I never lie!” This is in the same song where she gives away an entire planet. Compare that tone to the way she lists off adjectives that people use to describe her. Ask yourself if someone completely innocent would have nearly as much fun reciting those words.

The whole thing is amazing.

Friday, June 28, 2019

Virals, Then and Now

From 2013: The timetable was off, but the idea remains valid. A gimmick that is overused will become ineffective. From a 2019 study:

We took a nationally representative sample of 2,102 British adults, and undertook an experimental evaluation of some of marketers’ most commonly used tactics. [....]

Two thirds of the British public (65 percent) interpreted examples of scarcity and social proof claims used by hotel booking websites as sales pressure. Half said they were likely to distrust the company as a result of seeing them (49 percent). Just one in six (16 percent) said they believed the claims.

The results surprised us. We had expected there to be cynicism among a subgroup—perhaps people who booked hotels regularly, for example. The verbatim commentary from participants showed people see scarcity and social proof claims frequently online, most commonly in the travel, retail, and fashion sectors.

And this entire thread is worth reading: Part of Twitter's problems stem from the fact that huge numbers of automated programs, and humans who act like them, are busy trying to generate social proof on behalf of their patrons. Even when the humans start seeing through it, the algorithms are still being refined to encourage it.

Friday, February 22, 2019

Is There Ever One Future?

Twitter thought that it was very important for me to see this:
So I read it. And I agree with this bit:

What made the virtual concert on Saturday afternoon so fascinating for me, was that this was the first time I really understood what some other commentators have already been saying. Fortnite is not just a game that kids play – it’s a place they go to hang out.

This article from Quartz compares the game to a skate park. Kids get home from school, log-on and hang out with their friends in a virtual world. The actual game aspect serves as the backdrop.

What I don't agree with is how the post goes on to make hyperbolic assertions that everyone will live in, and enjoy, this future. It's predicting a technological singularity for video games, snaring everyone in the same, homogeneous MMORPG. It's an investor's idea of what the future holds for gaming.

On the other hand, there's Jesse Schell, who has developed video games, written books about them, and teaches classes about new technology. He takes a more pluralistic view:

People always talk about platforms, platforms, platforms, but really it's about, "Where do you play?"

There's a reason we don't play MMOs in the living room. For like the entire history of MMOs, we've had one or two go to the living room, and they've all died. And they've all done really well at the PC desk.

So what I always say is, "houses have multiple venues." One of them is the hearth. And that's the living room. The family gathers together, and it's a group thing. And then you have the workbench. That's where usually the PC lives. It's a place you go privately, you do hard work, it's very lean-forward. Usually the PC's there.

That's from a Gamasutra interview with Schell where he discusses current applications for virtual reality. His book, The Art of Game Design, discusses these venues in greater detail, but the idea is that people have different reasons for engaging in play, and so they end up playing games in different places.

The problem with the Akre post is that it doesn't allow for that kind of diversity. It just folds everything into the Oasis from Ready Player One. And that brings its own set of issues. Vox has already tracked how attitudes have shifted since the book was published in 2011. (Some people still like it. And that's great! It's okay to like terrible things. It's less okay to declare that those terrible things will be the future for everyone.)

Overall, the tone of the post is consistent. It's a narrow view of a favorable future that is designed to appeal to people who like online games, esports, twitch streaming, Ready Player One, and the Super Bowl.

It's just weird that Twitter's algorithms thought I was one of those people.

Friday, January 25, 2019

Using Twine to Keep Score with Three Teams

The problem One of the problems with trying to learn programming outside of a formal computer science class is the amount of time I spend re-inventing wheels. 

This issue, which I spent two days struggling with, has probably been solved by other people. I bet they published solutions in academic journals, but they ended up with abstract names like graph traversal or Byzantine fault tolerance

I'm just trying to keep score when there are three different teams. The player can assign points to any team, in any order they choose. 

Let's call the teams Red, Yellow, and Blue. The world state should always indicate which team has the most points. 

A color wheel is going to be helpful here: 



The world state can change whenever a new point is awarded to one of the three teams. If the Red team is winning, then the world is red. If the Blue team is in the lead, then the world is blue. This helps because I can use green, purple, and orange to show when two teams are tied for points.

It seems like a network containing 7 nodes (six colors + neutral for a three-way tie), with each node connected to 3 other nodes. I need to write Twine code that 1) identifies which node was the previous world state, and 2) which node should be the new world state.

Stumbling towards an answer on my own, it looks like this:

When a RED point is added
If state is red, do nothing.
If state is orange or purple or neutral, move to red
If state is yellow, and $redPoints = $yellowPoints, move to orange
If state is blue, and $redPoints = $bluePoints, move to purple
If state is green, and $redPoints = $bluePoints, move to neutral
When a YELLOW point is added
If state is yellow, do nothing.
If state is orange or green or neutral, move to yellow
If state is blue, and $yellowPoints = $bluePoints, move to green
If state is red, and $yellowPoints = $redPoints, move to orange
If state is purple, and $yellowPoints = $redPoints, move to neutral
When a BLUE point is added
If state is blue, do nothing.
If state is purple or green or neutral, move to blue
If state is red, and $bluePoints = $redPoints, move to purple
if state is yellow, and $bluePoints = $yellowPoints, move to green
if state is orange, and $bluePoints = $yellowPoints, move to neutral

Writing out code in SugarCube, this part goes in the StoryCaption passage:
Ascore: <<print $aScore>>
Bscore: <<print $bScore>>
Cscore: <<print $cScore>>

<<if $worldState == "A">>Red
<<elseif $worldState == "B">>Blue
<<elseif $worldState == "C">>Yellow
<<elseif $worldState == "AB">>Purple
<<elseif $worldState == "CA">>Orange
<<elseif $worldState == "BC">>Green
<<else>>neutral<</if>>
It lets you see how many points have been assigned to each faction, and it shows the current world state. (I simplified the teams to be A, B, and C in the code.)

This part goes in the passage where Red gains a point:

<<set $aScore += 1>>
<<if $worldState == "AB" or $worldState == "CA" or $worldState == "N" >><<set $worldState = "A">>
<<elseif $worldState == "B" and $aScore == $bScore>><<set $worldState = "AB">>
<<elseif $worldState == "C" and $aScore == $cScore>><<set $worldState = "CA">>
<<elseif $worldState == "BC" and $aScore == $bScore>><<set $worldState = "N">>
<</if>>
This part goes in the passage where Blue gains a point:

<<set $bScore += 1>>
<<if $worldState == "AB" or $worldState == "BC" or $worldState == "N" >><<set $worldState = "B">>
<<elseif $worldState == "C" and $bScore == $cScore>><<set $worldState = "BC">>
<<elseif $worldState == "A" and $bScore == $aScore>><<set $worldState = "AB">>
<<elseif $worldState == "CA" and $bScore == $aScore>><<set $worldState = "N">>
<</if>>
And this part goes in the passage where Yellow gains a point:

<<set $cScore += 1>>
<<if $worldState == "CA" or $worldState == "BC" or $worldState == "N" >><<set $worldState = "C">>
<<elseif $worldState == "A" and $cScore == $aScore>><<set $worldState = "CA">>
<<elseif $worldState == "B" and $cScore == $bScore>><<set $worldState = "BC">>
<<elseif $worldState == "AB" and $cScore == $aScore>><<set $worldState = "N">>
<</if>>
I should probably leave this to the professionals, but I got this code to work after a lot of trial and error.

Image credit: By Jackelynelc - Own work, CC BY-SA 4.0, Link