Category: Games
Sifu and a state of flow
It’s not a hot take that I really like Soulsbourne video games: games like Dark Souls, Sekiro, Elden Ring. There are many reasons behind my appreciation for the titles: fascinating lore delivery mechanisms, selfless multiplayer cooperation, or thought provoking art direction.
But one faucet of these games ties together the experience: combat. Tight, responsive, and unforgivingly difficult. And mainstream critical success of these games is what allows us to see publishers take more risks with difficult games.
And nothing makes this more apparent than a game stripped down to its core: Sifu. Okay, bear with me - Sifu has nothing to do with the Dark Souls franchise, and the small French Sloclap studio is as far away as you can get from the now behemoth of the industry From Software.
But Sifu is just that: a responsive, fluid, and unforgiving combat experience masquerading as a game. Sifu is a revenge story set in modern-day China, that sees you play through through five levels, each of which culminates with a boss fight.
There’s a twist: every time the character dies, they get older - increasing their damage and reducing their health. Once you go past 80 - it’s game over. This forces the player to master each level, as the player is incentivised to finish each level at the youngest possible age.
The game’s final boss - a man who killed the protagonists’ teacher is hands down one of the hardest boss fights I have experienced in the video games. He’s immune to every cheap trick you might have in your sleeve, attacks relentlessly, and leaves nearly no room for error.
And it’s this boss fight that really made me aware of the state of flow difficult combat forces the player into.
State of flow, or the feeling of “being in the zone” is a state of intense concentration, a perfect balance of difficulty and skill. State of flow is immensely satisfying, and time flies by in an instant while you’re in the zone. And difficult games force the player into the state of flow to progress.
State of flow has many benefits: increasing concentration, creativity, problem solving abilities, and even boosting self esteem. Among many benefits, state of flow helps to reduce stress and anxiety: it’s an inherently relaxing and enjoyable experience, and is one of the main reason I like playing difficult games, even if I’m exhausted after a long day. I can rely on an induced state of flow to help myself relax.
Back to Sifu’s final boss.
The only way I was able to defeat the final boss in Sifu is by sitting back, relaxing, and letting the built up muscle memory take over. It’s a beautiful experience akin to playing an instrument - something that requires the right amount of concentration: too much focus would make you get in your own way, too little would allow you to get distracted. It’s a state of flow, which I immensely enjoy, and which games like this help me enter.
But it isn’t until a second playthrough, which the game encourages you to take to experience the full story, that you’re able to appreciate all the progress you made, and reenter the state of flow for the duration of the full playthrough. Because you’ve already completed the game, there’s confidence in mastery of the game’s systems, but the difficulty and unforgiving nature of encounters still keep the game a challenge.
I think this applies to many games that are built with high difficulty - be it platformers like Celeste, or even tactics games like XCom. In fact, I’d be really curious to see how more cerebral video games get the player into the state of flow - I might dig into that someday.
One page TTRPG prep
I’ve been running table top role playing games for over a decade on and off, and I’ve settled into a prep routine. It’s heavily borrowed, if not outright stolen from other GMs on the Internets, and I encourage you to steal and adapt what I’m doing as well. If I had to guess, this way of preparation is stolen directly from the Lazy GM’s table.
I’ve learned that in order to run a successful session, I need to prepare the following:
- Discoveries: What my players need to discover.
- Scenes: Where things happen.
- Clues: Some thoughts on how to expose the discoveries.
- Key NPCs: Some names and primary aspects of non player characters.
- Enemies: A few stat blocks or references to enemies.
And all of the above fits on a single page: I find it enough to run the session while providing player freedom without having to completely invent everything on the fly.
Here’s an example for a Numenera game I ran a few weeks ago, where I adopted the idea behind the “Mother Machine” module from “Explorer’s Keys: Ten Instant Adventures for Numenera”:
In this example, the village under players’ protection is attacked by “tarza”, never before seen monsters. For historical reasons, my players are initially expected to blame a neighboring tribe of abhumans for the attack. The monsters are in fact part of a defense mechanism which is attempting to exterminate so-called “cinomar”: doppelgangers who are impersonating some of the villagers.
Discoveries
This section cover key information and plot twists, and it’s the one I start with. I use it as a tool to outline the adventure, and it’s helpful to refer to if I get stuck.
These are the details players should unravel throughout the session, and I usually check them off as the players find them. In fact, you’ll see I check off most bullet points on the page as the session plays out.
Although, now that I’m looking at the example I provided, the discoveries are not marked. I guess I’m not very consistent.
Scenes
This is the primary tool I use during the game. Scenes outline encounters - be they social, exploratory, or combat related. Scenes help me form a general idea about locations the adventure will be taking a place in, as well as some of the key action sequences.
I often use scenes to help me control pacing: If I’m running a 3 hour game with roughly 5 scenes planned, I know to hurry up if I haven’t gotten to any of them at a one hour mark. It’s often a good time to narrate a time skip, tie up an ongoing investigation, or suggest a direction for the party to move in.
Now this doesn’t mean that the adventure is limited to these scenes. If (or more accurately “when”) the adventure goes off rails, I reskin these scenes or use them for an inspiration to quickly throw together a new scene.
Clues
Clues are ideas for how to surface discoveries. These are not strictly necessary if you’re really creative, but if you’re anything like me - these are a godsend.
Clues are concrete ways for players to discover plot points outlined in “Discoveries”. “The assassin had a letter signed by the big bad”, or “The drunken sailor lets slip about a cult in the town”. I aim for one clue per discovery, but it’s not a hard rule.
The list should not be exhaustive, and should not be strictly followed - I treat this section as an exercise in creativity. I find it more impactful to try to come up with clues as I play – players often search in places I haven’t thought of - so I place the clue to a discovery wherever the players are looking.
Key NPCs
This is a list of key non player characters relevant to the game. I try to keep number of named NPCs low to help my players remember them better, and I try to use as many recurring NPCs as humanly possible.
I usually add an aspect for each of the NPCs - a short description in a few words, something that makes them stand out in some way.
This list doesn’t have to be exhaustive – you’ll probably want to use the running list of NPCs for your campaign as a supplement for unexpected recurring characters, and a list of pre-generated names for unexpected encounters.
Enemies
The last thing is enemy stat blocks for quickly referencing if (again, “when”) a combat breaks out.
For Numenera, these are not particularly complex - most enemies are described by a single number and a few key things about them. I’d imagine for D&D and other combat focused systems you’d want to put a bit more effort in making sure you’re building balanced combat encounters, so that would warrant a section of its own.
I tend to spend a little under 20 minutes on all of the above, and I get to use it in three out of four games – the fourth one tends to go off the rails completely, and I’m okay with it. Without investing as much time into prep, it’s easy to be taken on a ride by the players.
Numenera for D&D DMs
We’ll be having our 12th Numenera game later this week, and ultimately Numenera proved to be easier to run compared to Dungeons and Dragons. I just wrote about teaching Numenera to my D&D Players, and it’s worth sharing my own experience getting familiar with the system as a GM.
Story is the king
As a soft tabletop role playing system, Numenera focuses on storytelling over the rules. Every dozen pages or so the rulebook tirelessly reminds the reader: “if rules get in the way of having fun or creating an interesting story, change them”.
Depending on your DMing style and party’s needs you can get away with a lackluster D&D story: even if the party is saving the world from the evil wizard for the umpteenth time, there are decently fun board game mechanics to fall back to. Monster Manual and Dungeon Master’s Guide provide hundreds of fun creatures and straightforward rules for building balanced encounters, and there’s plenty of clearly laid out tactical choices and fun abilities to play with in combat. Take out the story telling, and you’ll have a pretty fun tactical game (isn’t that what Gloomhaven did?).
But there really aren’t enough rules in Numenera to make combat engaging without additional emotional investment from the players. This makes building something people care about paramount to having fun with Numenera. The usual storytelling rules apply: build a compelling story and let the players take you for a ride if their story is better (and it often is).
You don’t need combat encounters
Numenera supports a breadth of combat options only limited by players’ imagination, but many of them are not immediately obvious, and newer players will struggle to utilize the full spectrum of abilities available to them. Combat uses the same rules as the rest of the game, and is not more mechanically complicated (you decide what you want to do, you try to beat certain difficulty, you fail spectacularly).
Because of this combat is completely optional in Numenera. Don’t force the players into combat if they find a way to avoid it. Make them feel great about their cunning victory! We’ve had great and satisfying sessions without a single thrown punch.
That being said, it does not mean Numenera combat can’t be fun. One of the most engaging sessions we had consisted of a single battle – when a monster hunter delve decided to hunt a morigo – an enormous beast whose entire purpose was to scare the players from entering an area. The fight was deadly and arduous, but the characters triumphed against all odds.
You still need to know all the rules
Latest edition of Numenera consists of two books, titled Discovery and Destiny – both targeted at the game master. The two tomes combined clock in at a whopping 800 pages of reading material. However only 29 of the lavishly illustrated pages outline the rules. The rest provide supplemental material: character customization options, the setting, realizing the world, building compelling narrative, and so on.
But because of this it’s even more important for the GM to be intimately familiar with the rules. Since there was so little to learn, the group of players I’m GMing for decided that it’s not worth reading the rules. Thankfully Numenera rules are easy to teach, but you still need to know the rules.
A lesson in assertiveness
When playing D&D, I’d often outsource dealing with the rules by designating a rules arbiter from the player ranks. This doesn’t seem to work in Numenera. There rules are guidelines, and logic dictates how each situation is resolved. GM has the fullest picture of the situation in their head, making it crucial for them to adjudicate.
It certainly took me time to get used to putting my foot down, even if the players might not always agree with the decision. I found myself frequently making snap judgements, and following up with any adjustments after the session – rpg.stackexchange.com turned out to be a great resource for asking questions about the spirit of the rules.
Don’t dungeon crawl
“And then you enter another room which contains X, Y, and Z”. That’s the line I kept repeating during our weakest session to date. Numenera does not land itself well to a typical dungeon crawl.
Monte Cook published a few sets of fantastic adventures which require little to no prep to run. Weird Discoveries and Explorer’s Keys let you run adventures with minimal prep. But it doesn’t help that these come with standard dungeon-style maps.
Turned out a more engaging way to describe locations is: “Over the next few hours you explore the obelisk, and within the maze of the corridors you note a number of places of interest. There are…”. The rulebook has my back on this too.
Bring out the weird
The most difficult part of running Numenera games was highlighting how weird the Ninth World truly is. My players kept falling back into thinking of Steadfast as a standard medieval fantasy setting, and that’s in many ways because I kept forgetting to tell them how weird everything is.
How a mountain in the background is a machine from the prior world. How the water in the swamp was a conduit for some unimaginable device. And how none of it should make sense.
In earlier games, I had explanations ready for everything odd occurring in the world. I’ve been slowly making an effort to make the world more mysterious, more unexplainable, and more weird. This seems to be the key to running a successful Numenera game, and I’m still trying to find the balance between a consistent, but weird world characters live in.
Numenera for D&D players
Before COVID-19 shelter-in-place order came to be, I played Dungeons and Dragons on and off for the past 10 or so years. I unfortunately don’t have the patience to be a great player, but I enjoy running the game – being a Game Master constantly engages me, and I love seeing players have fun and overcome obstacles together.
Having to stay inside I had a prime opportunity to try something new, exciting, and less rule heavy than D&D: that’s how I discovered Numenera. Well, I’ve been familiar with the concept for some time: I played Planescape: Torment – with Planescape being an inspiration for the setting of Numenera, and I’ve recently completed Torment: Tides of Numenera – a spiritual successor to Planescape, which used the Cypher System rules… I’m getting ahead of myself, let me back up.
Numenera is a science fantasy tabletop role-playing game set in the (oh so) distant future. The “Cypher System” is a tabletop game engine which Numenera runs on. The system is notorious for emphasizing storytelling over rules, and for usage of “cyphers” - a one time abilities meant to shake up gameplay. Want to teleport? You don’t have to be a level 10 wizard to that. Find the right cypher, and you can teleport, but only once. This keeps gameplay from getting stale, and provides players with exciting abilities from the get-go.
For the past few months I’ve been running Numenera campaign for a group of friends, and we’ve had a blast so far! We’ve been playing over Google Hangouts, without miniatures or services like Roll20: and the game held up well.
It took some time for players to get used to the differences between the systems – and some picked up the new mindset faster than others. Here are the key concepts one had to learn to get used to Numenera. This overview is not complete, but I think it helps.
Numenera, cyphers, and artifacts
Numenera is just a catch-all term for weird devices and phenomenon. Now you don’t have to say “that device and/or contraption” and say “numenera” instead. You’re welcome!
Cyphers are items that give characters fun and unique one-off powers. Cyphers are plentiful, and using them like they’re going out of fashion is the key to having fun in Numenera. It’s called “Cypher System” for this exact reason.
Artifacts are a lot more rare, and can be used multiple times (often requiring a die roll to check if they deplete).
Actions, skills, assets, and effort
Every task in Numenera has a difficulty rated on a scale from 0 to 10. Be it sprinting on the battlefield, picking a lock, convincing a city guard you’re innocent, or hitting that guard on the back of her head with a club. 0 is a routine action, like you sitting right now and reading this, or maybe going over to the fridge to grab a beer. Difficulty 10 is getting the Israeli prime minister to abandon his post, fly over to wherever you live, and serve you that beer. Oh and you’re in charge of Israel now too, your majesty.
Your GM will tell you the difficulty of the task.
The only die players use in Numenera is d20 - the trusty 20-sided die (and that’s already a lie - in a few cases d6 is also used). Multiply difficulty by 3, and that’s the number you’ll have to reach with your d20 roll. Juggling is a difficulty 4 task. This means you’ll have to roll 12 (4 * 3) or higher to succeed.
But what if I’m an experienced juggler you say? I’m glad you asked: you can be either trained or specialized in a skill, reducing the difficulty by 1 and 2 respectively. Juggling for someone who is specialized in juggling is a difficulty 2 (4 - 2) task. You can reduce difficulty by up to 2 levels using skills. There is no definitive list of skills in Numenera, and you can choose to be skilled in anything you want, be it mathematics, dancing, or magic tricks.
Are you juggling well balanced pins? That’s an asset, further reducing the difficulty by 1. You can apply up to 2 levels of assets to reduce task difficulty. Just like with skills, there’s no strict definition of what constitutes an asset. Be creative!
Finally, you can apply effort to a task. Expand effort, and the task becomes more manageable. Effort is limited by how advanced the character is, and starting characters can’t apply more than 1 level of effort.
Hence, a specialized juggler (-2) juggling well balanced pins (-1) and applying effort (-1) reduces task difficulty from level 4 to 0, making it a trivial task – no need to roll to succeed!
Stat pools, edge, and more about effort
Characters have three primary stats - might, speed, and intellect. There’s no health or other resources to track, but your stat pools do deplete. Did you get punched in the face? Deduct damage from your might pool. Exerted effort to concentrate on juggling? Pay the price through your speed pool. Trying to figure out how something works? Reduce your intellect pool.
You use the same resource to exert yourself and to take damage. As your pools deplete, your character becomes debilitated, and once all 3 pools drop to 0 - your character dies. There’s nothing more to it.
The stat pools replenish by resting, and you can rest 4 times a day - for a few seconds, 10 minutes, 1 hour, and 10 hours. When you rest - restore 1d6 + tier (1 for beginning character) points spread across pools of your choice.
Each character also has “edge”. Edge is an affinity in a particular stat, and reduces all resource cost in that pool. If you have edge 2 in might, each time you expand that resource, you reduce the cost by 2. Bashing with your shield costs 1 might? That’s dropped to 0 for you. Moving a tree blocking the road all by yourself will cost 5 might points? That’s now dropped down to 3.
This becomes particularly relevant when applying effort. Applying effort makes tasks easier, but costs points from a stat pool. First level of effort costs 3 points, and any subsequent levels cost 2. Say if you’re trying to climb a tree (difficulty 3) and want to expand 2 levels of effort to make the task easier. That would cost you 5 points from your might pool, and your edge 1 in might drops the cost to 4.
Don’t overthink it for now.
Tiers, experience, and GM intrusions
Every Numenera character has a tier, which is akin to levels in D&D. There are 6 tiers, with each more advanced than the last. However, unlike in Dungeons and Dragons, the tiers are not detrimental to character advancement: characters get just as much if not more utility from cyphers, artifacts, and the way they interact with the world.
Experience is given out by the Game Master for accomplishing narrative milestones. Experience is also given during GM intrusions, Cypher System’s signature narrative mechanic. At any point throughout the session, GM introduces unexpected consequences for player actions: a rope snaps, poisoned villain has an antidote, or a previously hidden enemy attacks a passing player. Each time an intrusion happens, the affected player gets 2 experience points - 1 for themselves, and 1 to give away to another player.
GM intrusions allow to adjust the difficulty of the game and introduce fun challenges on the fly. Many GMs already do this in their games, but the Cypher System awards the players experience when this happens, associating unexpected events with positive stimulus.
In Numenera, experience points are a narrative currency, and a way for players to influence direction of the story. Experience is often counted in single digits, and can be spent in various ways:
- 1 XP: re-roll a die, or resist GM intrusion
- 2 XP: gain a short term benefit, like learn a local dialect, or become trained in a narrowly applicable skill
- 3 XP: gain a long term benefit: make an ally, establish base of operations, or gain an artifact
- 4 XP: increase your pools, learn a skill, gain an edge, increase amount of effort you can expend, get an additional ability, improve pool recovery rolls, or reduce armor penalty
Once you’ve spent 4 XP to advance your character 4 times, you advance to the next tier. All of the above benefits are equally valuable for character progression - as a die re-roll at the right time, or an ally’s help can make all the difference in a tough situation.
A word about combat
You might notice that I still haven’t brought up combat. And that’s because there aren’t a lot of additional rules.
Just like in D&D, there are rounds. Combat initiative is a speed task, and turns are taken with as much structure as the group would desire. There’s often no need for precise turn order outside of who goes first – the players or the enemies.
Attacking is a task against GM-given difficulty. So is defending. Effort can be expanded to make hitting a target easier. Characters can expand effort to get +3 damage on their attacks per level of effort instead.
Distances are measured as immediate (up to 10 ft), short (up to 50 ft), long (up to 100 ft), and very long. Melee attacks happen within an immediate distance, traveling short distance takes an action, and traveling long distance within a round is a level 4 athletics task.
Combat-related tasks are only limited by imagination. You can distract your enemies, assist your comrades, or swing into battle on a rope yelling “Huzzah”!
Special rolls - natural 1, 19, and 20
To keep dice rolls exciting, Numenera extends the idea of critical success and critical failure.
Natural 1 allows for a free GM intrusion. Something unexpected happens, and you don’t get any experience for it.
Natural 17 and 18 provide +1 and +2 damage respectively when attacking.
Natural 19 gives the player an opportunity to come up with a minor effect (or inflict +3 damage): some minor advantage which usually persists for a round. Maybe an enemy is knocked back, or a merchant impressed by your bartering skills gives you an extra discount.
Natural 20 provides the player with a major effect of their choice (or up the damage to +4). The cutthroats in a bar spill the location of their next heist, or a enemy gets stunned in battle.
Stories, rules, and common sense
Finally, Numenera and Cypher System are focused on telling great stories, and many rules are deliberately vague and are left up to GM’s discretion. In Numenera, if you wonder if you can attempt some task – you most definitely can try, and good GM will help you fail in spectacular and most importantly entertaining ways.
Hackmud first impressions
My Saturday just disappeared, quickly, and barely with any trace. You could find leftover scripts all over my hard drive here and there, all pointing to Hackmud. One moment I had plans for the day, and the next it was well past midnight, I was listening to the 90s hacker movies inspired soundtrack while cracking locks and farming for credits with a script I crafted.
I’ve spent ten hours in game, and it was glorious.
Hackmud is a text-only MUD (multi-user dungeon) set in a not so distant future, where humanity was wiped out by a combination of Welsh Measels, killer rabbit outbreak, and multiple other disasters. All that’s left is a trace of old corporations, dead user accounts, and AIs roaming the net. That’s you, an AI.
Game has a heavy 90s vibe to it, and the atmosphere reminds me of Ready Player One. References to popular TV shows and dial up sounds included.
You start in a training area, a vLAN without access to the rest of the network and other players. You quickly learn all-text interface, and simple bash-like command line - it’s based on JavaScript, with a few syntax changes. Hackmud is very much a puzzle game, and lets you take your time with a tutorial: you’ll need a few hours to go through all the puzzles, cracking locks, installing upgrades, learning about security, and finally - escaping vLAN.
Here are some basics I picked up:
- You can have multiple user accounts within a game, and so can everyone else. Be on the lookout.
- “Locs” are account locations, something similar to an IP or a domain name. You can launch an attack against a user or a dead account if you know their loc.
- Scripts are just that - scripts written in JavaScript (outside of the game).
Hit
#help
and Google to get started, but at least some basic programming background is necessary here. - Locks protect accounts - one can be behind multiple locks. Lock usually requires you to guess the correct combination, like a color, correct lower order prime, or a keyword.
- Upgrades are installed on user accounts and include locks, script slots, character limits, etc.
At some point I successfully struggled through the tutorial and escaped vLAN. And that’s where the open-ended social nature of the game shines. You’re thrown into a global chat channel with users trying to trick you into running their malware, players and corporations providing banking services, selling breached account information, locks, and scripts.
The game encourages lying, betrayal, deception, ponzi schemes, money laundering
- you name it. And players take advantage of such freedoms to the full extent:
It looks rather confusing, but tutorial prepares you well for the chaotic flow of characters on the screen.
I really wasn’t sure what to do next. The tutorial taught me how to get money out of dead accounts, so I decided to try to find one or two. After asking about in the main channel and being offered a few dozen “risk free scripts to get locs worth millions”, I decided to set out on a search. I looked through a list of
scripts.fullsec
, and found a few corporations.After digging about in their files for a good few hours, I found a way to get to employee registry and get a dozen of dead user locs. The locs were protected by different kinds of locks, and I went through the first batch manually. It took me a long time to get all the combinations and pull out some cash out of the accounts.
I found my second batch of locs shortly after, and decided to try automating some manual attempts through scripting. After struggling with syntax and being aggravated by having only 120 seconds at a time to crack a lock (in line with the 90s feel of the game, one needs to be connected to a “hardline”), I wrote a first sample script, and started to play around with game concepts.
Hackmud is in no way an accurate hacking simulator, but it’s a really fun puzzle game, and it doesn’t make any outrageous mistakes. It allows you to write your own scripts to use in game using valid JavaScript with access to a game library. Game developer (it’s a one person project) implemented his own JavaScript interpreter, so it has bugs here and there - one should be careful using obscure language features.
The worst part about scripting was character limitations: one needs quite a bit of money to be able to install first upgrades, and default limit of one active script and 500 characters per script is straight-up rage inducing. Before getting my first 1MGC to finally upgrade my rig, I wrote a bunch of tiny scripts, one per lock type, struggling to keep to the character limit. I ended up with ugly monstrosities like this, manually passing results from one script to another when encountering multiple accounts:
function(o, g) { var a = {}, b = "ez_35", c = ["open", "release", "unlock"], d = "digit", r = "", s = false, t = g.target.call; for (var x in g) { if (x != "target") { a[x] = g[x]; } } for (var i = 0; i < c.length; i++) { a[b] = c[i]; r = t(a); if (r.indexOf(d) > -1) { for (var k = 0; k < 10; k++) { a[d] = k r = t(a); if (r.indexOf(d) == -1) { var m = b + ":\"" + a[b] + "\", " + d + ": \"" + a[d] + "\""; return { ok:true, msg:r + "\n\n" + m }; } } } } return { ok:s, msg:r }; }
It was really interesting working with the limitations:
- I couldn’t write scripts longer than 500 characters (spaces not included).
- I couldn’t have access to one script without unloading the other first.
- I had to debug and test the scripts within 120 second windows.
Few more batches of locs later, I was finally able to afford to initialize my system to tier 1 and install upgrades I bought and accumulated from hacking accounts:
Now I can write all the scripts I want! Excited, I built my first t1 (tier 1) lock breaker, which automatically cracks a loc with any number of t1 locks on it:
function(context, func_args) { // {target:"#s."} var digits = Array(); for (var i = 0; i < 10; i++) { digits.push(i); } var COLORS = [ "purple", "blue", "cyan", "green", "lime", "yellow", "orange", "red"], DIGITS = digits, LOCKS = ["open", "release", "unlock"], // ez_prime lock seems to only request low order primes, hardcoding this PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193]; var hackMultLevels = function(target, args, levels) { for (var i = 0; i < levels.length; i++) { var item = levels[i].item, itemDesc = levels[i].itemDesc, itemList = levels[i].itemList; for (var k = 0; k < itemList.length; k++) { args[item] = itemList[k]; ret = target(args); if (ret.indexOf(itemDesc) == -1) { break; } } } return ret, args; } var hackEz21 = function(target, args) { return hackMultLevels( target, args, [ { item: "ez_21", itemDesc: "command", itemList: LOCKS } ]); }; var hackEz35 = function(target, args) { return hackMultLevels( target, args, [ { item: "ez_35", itemDesc: "command", itemList: LOCKS }, { item: "digit", itemDesc: "digit", itemList: DIGITS } ]); }; var hackEz40 = function(target, args) { return hackMultLevels( target, args, [ { item: "ez_40", itemDesc: "command", itemList: LOCKS }, { item: "ez_prime", itemDesc: "prime", itemList: PRIMES } ]); }; var hackC001 = function(target, args) { return hackMultLevels( target, args, [ { item: "c001", itemDesc: "correct", itemList: COLORS }, { item: "color_digit", itemDesc: "digit", itemList: DIGITS } ]); } var hackC002 = function(target, args) { return hackMultLevels( target, args, [ { item: "c002", itemDesc: "correct", itemList: COLORS }, { item: "c002_complement", itemDesc: "complement", itemList: COLORS } ]); } var hackC003 = function(target, args) { return hackMultLevels( target, args, [ { item: "c003", itemDesc: "correct", itemList: COLORS }, { item: "c003_triad_1", itemDesc: "first", itemList: COLORS }, { item: "c003_triad_2", itemDesc: "second", itemList: COLORS } ]); } var args = {}, i = 0, locks = [ { name: "EZ_21", func: hackEz21 }, { name: "EZ_35", func: hackEz35 }, { name: "EZ_40", func: hackEz40 }, { name: "c001", func: hackC001 }, { name: "c002", func: hackC002 }, { name: "c003", func: hackC003 } ], ret = "", target = func_args.target.call, unlocked = []; ret = target(args); while (true) { i++; var flag = true; for (var k = 0; k < locks.length; k++) { if (ret.indexOf(locks[k].name) > -1 && unlocked.indexOf(locks[k].name) == -1) { ret, args = locks[k].func(target, args); unlocked.push(locks[k].name); flag = false; } } if (flag === true) { return { ok: true, msg: ret }; } if (i > 10) { return { ok: false, msg: ret } } } }
Rather rough around the edges, not easiest to read, but it works - and I was really proud of finishing it (and too tired to go back and refactor). With this, next dozen of t1 locs took me a few minutes to crack open. Success!
That was the logical conclusion of my Saturday, and left me feel really satisfied. The game is rough around the edges, and has numerous bugs here and there. But the text-only world of Hackmud is alive and atmospheric, and puzzles and exploration of the derelict world through randomly-generated documents pulls you in, making you lose track of time.