OreolekA personal blog on IF and RPG games.http://en.oreolek.ru/2017-10-08T00:00:00+07:00OreolekIFComp '17: Insignificant Little Verminhttp://en.oreolek.ru/2017/10/08/insignificant-little-vermin/2017-10-08T00:00:00+07:002017-10-09T00:37:26+07:00OreolekMassive spoilers.
<p><em>Massive spoilers.</em></p>
<p></p>
<p><center>Game: <a href="https://egamebook.com/vermin/v/ifcomp/" rel="nofollow">„Insignificant Little Vermin”</a> — Filip Hracek, 2017<br>
<a href="https://github.com/filiph/edgehead" rel="nofollow">(source code available)</a></center></p>
<p>I play as a gender-ambiguous slave named Aren, there’s my buddy Briana, we fight and fight and eventually escape the orc lair with some weapons and maybe something that qualifies as loot. This is fun!</p>
<p>What bugs me is the gameplay.
The platform is named “eGamebook”, but it is no <em>Fighting Fantasy.</em>
The game obscures most of the mechanics and choices; even the inventory is hidden from the interface.
That’s a very broad definition of a <em>gamebook.</em></p>
<div class="leftimage">
<a href='/images/2017-10-08-insignificant-little-vermin/choices.png' target="_blank">
<img alt="The many choices" src="images/2017-10-08-insignificant-little-vermin/choices.300x300.png" />
</a>
</div>
<p>The fight system is cool but it packages a very complicated system into
something that’s just as complex <em>and</em> obscure.
I’m not even sure how many hit points my character has.</p>
<p>Screenshotted: to make a good decision, I have to check <em>every</em> question mark on every choice.
Every “?” explains the corresponding action like this:</p>
<blockquote>
<p><em>[Throw spear at the goblin or the orc]</em></p>
<p>The enemy is far enough for you to throw a spear at them and ready your other weapon before they close in.</p>
</blockquote>
<p>This is practically useless.
I have to visualize the battle and see that throwing would have a probability of <em>“Possible”,</em> and if I look at the source code I can tell that the “Possible” word means “somewhere between 40% and 49%”. </p>
<p>Why do I have to decipher this?
It’s supposed to be a fun quick battle, not a painful guess-in-the-dark.
I’m not even sure what’s the difference between the goblin and the orc: is the orc easier to hit? How many hit points do they have? Does it actually matter?</p>
<p>The worst offender, in my opinion, is this excerpt from the info section (emphasis mine):</p>
<blockquote>
<p><strong>Sometimes,</strong> when you fail a roll, you can spend a resource you’ve acquired to re-roll. </p>
</blockquote>
<div class="centerimage">
<a href='/images/2017-10-08-insignificant-little-vermin/failure.png' target="_blank">
<img alt="Failure" src="images/2017-10-08-insignificant-little-vermin/failure.500x500.png" />
</a>
<div class="caption">
By the way, the game has no manual saves or UNDOs.
</div>
</div>
<p>Giving me only two precious rerolls and then taking them away for <strong>some</strong> of the choices is cruel with an extra spike on top.</p>
<p>About halfway in the story the hero suddenly says “I am not a farm boy”, so he’s not genderless.
(I guess I could pay more attention to the male hand on the illustrations, but
seriously, the illustrations are just: a hand and a sword. Not even a background.)
He’s not nameless, at least, though the game (and his partner) constantly refer to him as “You” as if he’s a true <a href="http://ifwiki.org/index.php/AFGNCAAP" rel="nofollow">AFGNCAAP.</a></p>
<p>The ending gives another plot twist, but I didn’t care at that point.</p>
<p>Because I won a cool dungeon crawl.</p>
Played: Rage Quest: Disciple of Peacehttp://en.oreolek.ru/2017/10/04/rage-quest--disciple-of-peace/2017-10-04T00:00:00+07:002017-10-05T00:06:15+07:00OreolekMinor spoilers.
<p><em>Minor spoilers.</em></p>
<p></p>
<p>Ignore the game title. It’s awful and doesn’t have much in common with the game.</p>
<p>In the game you must balance your <em>Rage</em> against the <em>Discipline</em>.
There is no Peace parameter in-game, but Discipline <em>sorta</em> represents the inner peace…
it’s a small stretch but still needs some explanation.
You can abandon the mentioned <em>Quest</em> several times in the story, and one of the play styles contradicts the <em>Disciple</em> word.</p>
<p>So what happens is this: the game barely sets up the scene
and the first choice is to run away or stay. This is all I have to rely on:</p>
<blockquote>
<p>What is left of your memory is slipping away. You do not know where your brothers and sisters are going, but you know that there will be no return.</p>
</blockquote>
<p>The lack of context is a recurring theme. I have to guess about the effects of my actions as far as I can spot fantasy clichés.
If my guess is right, it’s boring. If I guess wrong, it’s disappointing because maybe I wanted to do something else.</p>
<p>The choice phrasing is odd. Here’s an example (click to reveal):</p>
<div class="spoiler">
<div class="spoilertext">Say you support the general.</div>
<div class="spoilerbody"><blockquote>
[…]
“My brothers and sisters! In the monastery I was taught to suppress my violent urges—but those teachings did not save us from the human raiders. Now I will return to the true orcish ways, embrace my rage, and destroy those who wronged me. Of you I ask only one more thing—let me tear out the throat of the human leader myself!”
[…]
</blockquote>
<p>It’s so sudden I had to stop and replay that bit again to catch if I understood
the word <i>“say”</i> right.</p>
</div></div>
<p>The presentation is decent, and it works on mobile phones.
The cover art, though, is about as helpful as the game title.</p>
<p>Once I went past the first third of the story, the game became much better.
The mechanics are easy to understand and fun to control, and the story went past “what I’m doing here” to a branching “let’s crush our enemies, yea or nay?”</p>
<p>It was entertaining until the end where a single vague phrase ruined my whole playthrough.</p>
<p>I think <em>RQDoP</em> would be a good game – but only after a session with a demanding editor.</p>
<p><a href="https://ifcomp.org/ballot?shuffle=1&personalize=1#entry-1650" rel="nofollow">Link to the comp entry</a></p>
Cloak of Darkness (2017)http://en.oreolek.ru/2017/07/31/cloak-of-darkness/2017-07-31T00:00:00+07:002017-08-01T12:15:03+07:00Oreolek
A game from 90s, reimagined in 2017.
<div class="leftimage">
<a href="https://oreolek.itch.io/cloak-of-darkness"><img width="416" height="650" src="images/cloak_of_darkness-012fe9c8.png" alt="Cloak of darkness" /></a>
</div>
<p>A game from 90s, reimagined in 2017.</p>
<p></p>
<p>Well, you probably know this game.
The foyer of an elegant opera house, the cloak.
It’s a tiny “Hello, world!” of IF.</p>
<p>I made a new version of “Cloak” in my Salet engine.
It’s a hybrid take on a familiar game: there are verbs and objects but there is no parser.
You can even lose the game, which is rare for non-parser versions.</p>
<p>The game is bilingual (English and Russian) and it has a cool cover image (the artist is <a href="https://vk.com/album-85784960_210422982" rel="nofollow">Maria Filippova</a>).</p>
<p>But it’s 2017! The Future! So I added a bunch of <em>modern</em> features:</p>
<ul>
<li>Tablet-optimized, mouse-accessible responsive interface</li>
<li>Now you can navigate these three rooms with an interactive automap! Why bother walking from cloakroom to the bar when you can open the map and <strong>teleport</strong> there?</li>
<li>Night mode - for people who play these games only during long nights</li>
<li>Multiplayer! Play this game with online friends! Get lost in three rooms and two objects - <strong>together!</strong></li>
<li>Autosaving and autoloading (caution: don’t try to use in multiplayer of 2017. The current version of The Future is not ready for loading multiplayer games without other players)</li>
<li>Multiplayer chat with voice! Why? Why not!</li>
</ul>
<p>The game should work in any browser issued in 2015 or later.</p>
<p><a href="https://oreolek.itch.io/cloak-of-darkness" rel="nofollow">Play</a> - the page weighs about 1.4 Mb</p>
<h3>The engine progress</h3>
<p>It’s an engine demo, so it’s appropriate to talk about the engine for a bit.</p>
<p>Salet is going great. I just updated the code with TypeScript definitions <a href="https://gitlab.com/hogart/salet-ts" rel="nofollow">(written by @hogart)</a> and source maps. The current version is 1.8.4 and the changelog <a href="https://salet.su/ru/changelog" rel="nofollow">(link in Russian)</a> is <em>long.</em></p>
<p>I found that it’s published <a href="https://cdn.jsdelivr.net/npm/salet@latest/" rel="nofollow">on a CDN</a> so you can use it even without installing.</p>
<p>The API is fairly stable around the CYOA needs <em>but</em> this game and the feedback from other authors showed me that the world model can be improved. The verb model <a href="https://gitlab.com/oreolek/cloak-salet" rel="nofollow">in the source code</a> from Cloak is just a small step in making a better universal system. I encourage readers to read and comment on what <em>could be</em> the future default behaviour.</p>
<p>Again, the links:</p>
<ul>
<li><a href="https://oreolek.itch.io/cloak-of-darkness" rel="nofollow">The game</a></li>
<li><a href="https://gitlab.com/oreolek/cloak-salet" rel="nofollow">The source code</a></li>
</ul>
The progress on Salethttp://en.oreolek.ru/2016/12/20/salet-progress/2016-12-20T00:00:00+07:002016-12-20T20:50:41+07:00OreolekIt’s been almost a year since I started working on Salet, and I think it’s time
to tell about my progress.
The current version number is 1.6.14 1.6.15.
It’s a forty-third release, a result of one hundred and fifty-six git commits.
<p>It’s been almost a year since I started working on Salet, and I think it’s time
to tell about my progress.</p>
<p>The current version number is <s><em>1.6.14</em></s> <em>1.6.15</em>.
It’s a forty-third release, a result of one hundred and fifty-six <code>git</code> commits.</p>
<p></p>
<p>Admittedly, that’s not much; there are many cool new features but mostly I focused on
polishing and documenting everything that I already had and loved.
Salet is a great multi-genre tool suitable for complex puzzle games as well as kinetic novels.</p>
<p>And you can go crazy with it.</p>
<hr>
<p>I made Salet because I wanted to do whatever.
The engine has <a href="https://salet.su/en/api/view" rel="nofollow">only eight assumptions</a> about the game interface,
and six of them are there for you to break.</p>
<p>This approach means, among other things, that Salet has a ton of things and affordances
to make portable objects and player inventory but offers no default way to present the inventory itself.
That’s an intimate piece of a game, a thing that is a part of the whole design.
Should the inventory include a short summary on the character’s stats or a spell list?
Should it be a special room or an interface block?
Should it change the page layout to something entirely different?
I’m not the one who makes these decisions.
The game author does.</p>
<p>And let’s not forget about having the right amount of puzzles and linearity
without sacrificing the visual design.
My latest Salet game is <a href="http://ludumdare.com/compo/ludum-dare-37/?action=preview&uid=108735" rel="nofollow">a Ludum Dare piece</a>
that jumps from a one-room puzzle game to long-scrollback dialogue sections and back again.
<small>(It’s also full of bugs and broken Engrish until I finish the post-comp update)</small></p>
<p>The library is now <a href="https://www.npmjs.com/package/salet" rel="nofollow">packaged for NPM</a> and that’s
the easiest way to get it - just <code>npm install salet</code>.
There are automated tests to ensure the engine always behaves as intended.</p>
<p>I might be ready to call it 2.0 but I feel like I need to write more documentation.
I translated <a href="https://salet.su/en/api/start" rel="nofollow">the API docs</a> to English but the user guide is still not there.
I’m not even sure it’s worth translating because… well, no one used it and some sections
are just explaining the API but in a different way.
Maybe a post like “How to display the inventory” would be better, but - again, I have no idea at the moment.</p>
<p>So, about the new features. Let’s start with my favorite and the oldest one (March or April).</p>
<h3>Saving API</h3>
<p>Autosaves were there since version 1.0;
Salet automatically saves the game whenever the player enters a new room.
When the player returns to the game, it automatically continues as if nothing happened.</p>
<p>But now there can be rooms that won’t be autosaved.
Like an “inventory” or an “options” room that is not diegetic, so it doesn’t even exist in the plot.
It allows me to put a “Go Back” button in it - another new feature - and gives more control over the
automatic saving.</p>
<p>There’s still only a single save slot but I hadn’t much time to look into that.
But I wrote manual loading with delayed game initialization in case you want to have a
welcoming menu thing (“Play game - Load game - Options”), so that’s something.</p>
<h3>Scene transitions</h3>
<p>Remember the eight assumptions?</p>
<p>Well, there is nothing against changing the whole HTML inside the <code>#page</code> block.
One minute you have some block above the text, and then you can swap that for a
three-column layout.</p>
<p>I tried that on a shared project where the game went right to the world map after
the character generation, but unfortunately the project is not public yet, so I can’t show
that in action.</p>
<p>This is not a core feature <em>per se</em> because it’s always game-specific.
The themes can be simple strings or complex functions, and they can be international too.
I wrote three different implementations for theming.
But the general idea is universal and it’s already supported.
You’re free to make anything.</p>
<h3>Timers</h3>
<p>The player activates something that’s going to pop five turns later.</p>
<p>This feature is not tied to objects or rooms, it operates on functions.
The function would be called before the turn but Salet will write its output after the turn,
so that it could affect the room description but not be affected by it
(some rooms clear the text before printing their descriptions).</p>
<p>And it’s a hell to debug in the game, so I suggest you look at <code>test</code> folder in Salet’s sources,
because now you have an object, an action, an immediate effect and a delayed effect.
And you’ll have to catch the actions between the immediate and delayed effects too.
and some rooms can delete whatever there was before entering them, so you can miss some text.</p>
<h2>Plans?</h2>
<p>For now, there are no plans for the new features.</p>
<p>Hell, I <a href="https://git.oreolek.ru/oreolek/salet-module/issues/1" rel="nofollow">still have a small Undum feature</a> to backport.</p>
<p>Or shall I say it like that: there are no more features from my games that I feel
like would be general enough to introduce to the core. There are <a href="https://salet.su/en/examples" rel="nofollow">more than enough code examples</a>, so…</p>
<p>Make anything.</p>
A planetary magic systemhttp://en.oreolek.ru/2016/09/15/-geomancy/2016-09-15T00:00:00+07:002016-09-15T13:23:05+07:00OreolekCredit to this post (in Russian) by Roger for bringing that up.
Let’s construct a planetary magic.
Everything on this planet is connected, and “butterfly effect” is a Universe Law.
For example, at 9:02 AM someone kisses a blonde under the Triumphal Arch,
and at the same time some other person boards a steamboat on Rhine river and releases a white pigeon.
After about five minutes a third person, in Shanghai, should topple a rice bowl to the ground.
That’s it, the spell is ready, now the mage activates it.
He throws a rose into a fire, and by some mystic causality an unbreakable shield forms around him.
<p><em>Credit to <a href="http://duat.asia/blogs/roger/magiya-s-vovlecheniem-drugikh-igrokov" rel="nofollow">this post</a> (in Russian) by Roger for bringing that up.</em></p>
<p>Let’s construct a <em>planetary</em> magic.
Everything on this planet is connected, and “butterfly effect” is a Universe Law.</p>
<p>For example, at 9:02 AM someone kisses a blonde under the Triumphal Arch,
and at the same time some other person boards a steamboat on Rhine river and releases a white pigeon.
After about five minutes a third person, in Shanghai, should topple a rice bowl to the ground.
That’s it, the spell is ready, now the mage activates it.
He throws a rose into a fire, and by some mystic causality an unbreakable shield forms around him.</p>
<p></p>
<p>It’s important that the actions are precise and mundane, and the result <em>can</em> be
precise and is <em>certainly</em> supernatural.
When the spell is ready, the mage <em>feels</em> it’s time and he can activate it.</p>
<p>This magic has to be born in collaboration with other players.
The mage is not an alchemist mixing magical components, he’s not a scholar reading boring text books;
he’s an <em>organizer</em>.
His task is to arrange other people to do precise actions at a strict time, in
accordance to the mystical “butterfly effect” plan.</p>
<p>This is perfect for LARPS, where we get a lot of players involved in a strange
and incomprehensible process.
As a bonus, our mages would look either like creeps, or heist masterminds, or both.</p>
<p>I imagine the IF variation of this system would be hard to keep from falling into
<a href="http://ifwiki.org/index.php/Soup_cans" rel="nofollow">“soup can”</a> territory, but it’s worth to try.</p>
<p>A <em>variation</em> of this idea is to give the mage a spell book.
He has to write down every action he encountered or caused while playing:
<em>who</em> did <em>what</em> and <em>when</em>. (This falls definitely on the “creep” end of the spectrum)
Then he can use this list for the magicking.</p>
<p>Of course, like every magic system for games, this idea can be expanded and changed.
Which would be only for the best.</p>
Analytics in web games and how to cook themhttp://en.oreolek.ru/2016/05/04/analytics/2016-05-04T00:00:00+07:002016-05-05T11:30:46+07:00OreolekWhat feedback options do you have when writing in Inform, or Undum, or Twine, or any other popular IF engine?
You have betatesting, some player reviews on IFDB and some critique articles on IF Planet blogs.
If you’re lucky, there can be Twitch streams and Youtube too.
Web games can have more than that.
<p>What feedback options do you have when writing in Inform, or Undum, or Twine, or any other popular IF engine?</p>
<p>You have betatesting, some player reviews on <a href="http://ifdb.tads.org" rel="nofollow">IFDB</a> and some critique articles on <a href="http://if-planet.org" rel="nofollow">IF Planet</a> blogs.
If you’re lucky, there can be Twitch streams and Youtube too.</p>
<p><center> <strong>Web games can have more than that.</strong> </center></p>
<p></p>
<h4>Just the basics</h4>
<p>The easy way is to just install some plain analytics script and be done with it.
The analytics scripts are very powerful nowadays.</p>
<p>You will learn about the devices your game starts on. Tablets? Mobiles? Desktop computers with 1024x768 EGA monitors? Who knows!</p>
<p>Maybe your script will tell you that your Sci-Fi Pulp Erotic Lesbian Adventure attracts
mostly Canadian bearded males in 14-40 age range… okay, scratch that.</p>
<p>You can view what sites give you more players, what sites give you most devoted players (look for average playing time).</p>
<p>But this is dancing <em>around</em> the game. What happens inside?</p>
<p>We have to dissect the game to dissect the audience.</p>
<p><a href="/images/analytics.png" target="_blank"><img width="1470" height="596" src="images/analytics-c0a096e9.png" alt="Analytics" /></a>
<div class="caption">Click to enlarge.</div></p>
<p>It’s a screenshot from my Piwik installation, stats for one of my <acronym title="work in progress">WIP</abbr>s.
The only person playing the game is the author, that’s why the stats are so low.
But they are live, the game collects and analyzes them.</p>
<p>Piwik thinks these are pages, but in reality there are only “rooms”, or smart passages.
Every room has an internal title, and Piwik treats it as a separate page.</p>
<p>What do I get out of that?</p>
<ul>
<li>“Pageviews”: how many times people entered this room</li>
<li>“Unique pageviews”: how many people entered this room</li>
<li>“Exit rate” shows how many people gave up and closed the game standing in this room</li>
<li>“Bounce rate” shows how many people did it right after entering (15 seconds or fewer)</li>
<li>“Avg. time on page”: how much time people spent in this room</li>
<li>“Avg. generation time” is not useful at all because the game is 100% client-side,
so every room loads almost instantly.</li>
</ul>
<p>Now, how to do it with <a href="//git.oreolek.ru/oreolek/salet" rel="nofollow">Salet.</a>
(These recipes should be good for Raconteur too but you’ll have to tweak the syntax a bit.)</p>
<h4>The recipe: passage analytics</h4>
<div class="highlight"><pre class="highlight plaintext"><code>croom = (title, salet, options) ->
options.before = (salet) ->
_paq.push(['trackPageView', title]) # <--- THIS IS IT
return room(title, salet, options)
croom "begin", salet,
tags: ["start"],
optionText: "begin_title".l()
choices: "#start2"
dsc: (salet) -> "begin".l(salet)
</code></pre></div>
<p>Obviously, you have to connect Piwik too (the usual way, just add <code><script></code> tag somewhere)</p>
<p>I’ll try to be short with the technical explanation: in this code block I make a new room type,
<code>croom</code>, and construct it with custom <code>before</code> callback that calls Piwik API.
Then I use it. The <code>l()</code> functions are for localization (my games are bilingual).</p>
<p><em>UPD:</em> when using this code, you will not be able to set <code>before</code> callbacks anymore.
It’s not a big problem in Salet, you still have <code>enter</code> functions.
If you are on Raconteur, though, you’ll have to be careful with that, maybe define a new
<code>realBefore</code> property or something.</p>
<p>Okay, this is cool, but I’m not finished yet.
For my <a href="http://ifdb.tads.org/viewgame?id=fahhbyoj5vgtndeq" rel="nofollow">shooting</a> game, I wanted to have
Telltale-like graphs, like “5% of people shot that robot”.</p>
<p>And this is why I recommend Piwik over Google Analytics, Yandex.Metrica and other solutions.
It’s super easy to do this:</p>
<p><a href="/images/analytics2.png" target="_blank"><img width="960" height="620" src="images/analytics2-e9d55933.png" alt="Analytics2" /></a>
<div class="caption">Click to enlarge.</div></p>
<p>It’s not a perfect chart, because you have to know that 0 stands for “No”, 1 stands for “Yes” and the “Value not defined” stands for “The player blocked the analytics gathering somehow
or did not play long enough to view that event”.
But it’s <em>easy</em> enough to make.</p>
<h4>The recipe for custom charts</h4>
<p>First, you have to <a href="http://piwik.org/docs/custom-dimensions/#installing-custom-dimensions" rel="nofollow">install the Custom Dimensions plugin</a> on your Piwik instance.</p>
<p>Then you create a Custom Dimension.</p>
<p>Scope <code>"Visit"</code> is for something that you want to track once per playthrough, like “found the key” or “finished the game” are things that won’t change after the player got them.
They are <code>NOT TRUE</code> on the game start but become <code>TRUE</code> later on, and you want to track that change.</p>
<p>The <code>"Action"</code> scope is for something that you want to track in all possible states for all playthroughs. You can use that to track room views too, but I didn’t test that.</p>
<p>Then you do something like this:</p>
<div class="highlight"><pre class="highlight plaintext"><code>before: (character, salet) ->
salet.character.shot_pacifist = 1
_paq.push(['setCustomDimension', 2, salet.character.shot_pacifist])
</code></pre></div>
<p>Hmm. I guess I could use “true” and “false” instead of “1” and “0” but– oh well.</p>
<h4>Now what?</h4>
<p>You can these tricks in betatests or releases.</p>
<p>You can look at your branches and see what choice is more popular.</p>
<p>You can look at your puzzles and see how many people get stuck at what point.</p>
<p>So I trust you to check this pulse of your game and get better with it.</p>