Blog

  • cyberpunkdreams, Software Systems Design, and Division of Labor

    Or: Everything’s an Inventory Item? Why?

    Or: Speculation on How a System was Designed to Allow Writers to Effectively Define Software Behavior

    cyberpunkdreams is a free-to-play RPG with mechanics similar to Fallen London. I’m only a little ways into it, but I’m liking what I’m seeing so far.

    But what I really want to talk about is the way there’s sort of like two levels of game mechanics here, one implemented on top of the other; I think it’s really neat! While Fallen London did something similar, I think cyberpunkdreams pushes the concept a bit further.

    (I will note that I haven’t actually seen the code of this game, so what I’m going to talk about is 100% speculation based on the user interface and my own general knowledge, rather than any specific knowledge)

    It seems that basically everything in this game is tracked as items in your inventory. You’re living your life in a city and things open and close at certain times, you need to be dressed for the temperature, you have relationships with various groups and people, you make progress in your quests, you can be in certain moods or have certain status effects, and all those things seem to be, at a basic level, considered to be items in your inventory.

    A tooltip from the game:
Time of day
Requirement not met
You need to be outside a min of 2 and a max of 7. You have 5 (the time is roughly 5am, and it's a Friday).

    “You have 5” meaning that the current time for your character is 5am is interesting wording, and definitely not intuitive on its own. But it’s very revealing when you start seeing this same sort of wording elsewhere. Of course, this is the same sort of wording you get when talking about how much money or other resource you have for an action that will spend it. It’s also the wording used when there are requirements in terms of a relationship, quest progress, or level of familiarity with the local area. Equipping certain items adds or subtracts certain values like “Outfitted/Work” or “Style/Cybergoth”, which seem to also be treated as their own inventory items (and act as modifiers on random checks or gates to certain actions)

    So basically, there’s this one core mechanic: you have items in your inventory with certain quantities and these quantities can change. And it’s really quite impressive how much game has been built on top of that!

    Now other RPGs are implemented in ways that are somewhat similar, of course. For instance, in Skyrim your quest status is tracked as a number, and the game looks up text to display in your quest log based on what status number is associated with that quest for that character. But still, in most RPGs, quests, items, and character status are just fundamentally different things. Meanwhile, in cyberpunkdreams, those all seem to be handled the same way, with similar UI elements for displaying progress towards increasing values and current values, and similar language for displaying required values for certain actions or the impact of these values on success chances.

    The quests page in cyberpunkdreams. The quests are organized under various headers and are displayed with icons and names. For most quests, a brief description of the current status is also displayed, but a few just have a number in place of the description. In the top right there's a text box for entering a filter, labeled "Filter items".
    The progress screen. This has the same layout as the quest screen, along with some values having quantities and others having descriptions. Again, the filter text box is in the upper-right.
    The inventory screen. The sections look similar to the Quests and Progress screens, though the individual items only have their icons displayed, with a quantity in small text in the corner. The standard "Filter items" text box is there, along with a "filter by effect" text box and a few other buttons.

    Now, aside from the minor detail of the inventory screen not displaying the item names, and all the values being numbers in the corner, the inventory screen is basically the same as the quests and progress screens (and other screens I didn’t show).

    Besides just finding it striking how regular/consistent this mechanic is, it also, to me, implies a certain division of labor. Basically, this is on the simple side in terms of how the underlying software works; a character is a sequence of values, each value associated with a particular type of thing; that thing might be “Ohio Dollars” or “Lethargy” or “Time of day”, it’s all the same to the underlying system. Then, on top of that, there’s the system which builds a game and story on top of that. This action requires “Familiarity / Slums” to be at least 3 and “Time of day” to be between 9 and 17. That action requires “Outfitted/Party” of at least 5, “Under the influence/Alcohol” to be no more than 5, and “Ohio dollars” to be at least 10.

    (Now here’s where I get really deep into somewhat-informed speculation)

    Basically, somebody who may not be as proficient in writing actual software can still essentially program in quest requirements, checks, and effects given by events by interfacing with a fairly simple system. And I do find it pretty impressive how much game is able to be built on top of this system. Like, you would be mad to build a tabletop RPG like this, but this is perfect for a software system that supports a large amount of scripted content made by people who don’t need to know how the software system works.

    The credits page for cyberpunkdreams. Most of the sections, particularly the technical and leadership ones, have just one name: "Rob Chant". The "Additional Writing" section has 5 names: "Ayrton Taylor, Chris Hall, Eduardo Carmo, Harry Black, Kati Ecker"

    So I took a look at the credits, and yeah, that’s about what I thought. All of the technical work is credited to one person (holy shit that’s impressive, Rob Chant!). And there are 6 people credited for “Additional writing”. I’d bet that these writers do need to have some idea of how to think about concrete requirements (in terms of game actions), but I’d also be willing to bet that they don’t need to worry so much about the differences between looking up a character’s stats, looking up what’s in their inventory, or looking up quest progress. Or of modifying any of those things. Basically, the software development side seems to have created what is likely a rather simple core system and restricted set of operations that others can use in a flexible fashion to come up with a broad array of meanings. And I think that’s just really neat!

    Anyway, if you want to check the game out (which I do recommend), it’s free on Steam. And if you’d like, you can add my referral code once you’ve made an account: Qol6D8vJ – I know you’ll get a choice of equipment once you do so, and I presume it’ll give me something too.

  • Password Managers

    Just last week, I changed my personal password manager. It wasn’t a significant change in terms of workflow or effort of migration (KeePass to KeePassXC), but it was significant in that I’ve been sticking with one password manager for nearly 20 years, and finally decided to start using a new one.

    What’s a password manager?

    A password manager is a program (or browser plugin or built-in feature, or some other piece of software) which stores your passwords for you in an encrypted form so that they’re (hopefully) impossible to see without the right credentials.

    In the bad old days before good password managers, people were expected either to simply remember their passwords, or they’d write them down on some piece of paper or in an unencrypted digital document; all of these solutions leave much to be desired for a number of reasons, generally boiling down to a lack of security.

    Local vs Cloud Password Managers

    Now why would I stick with KeePass for those nearly 20 years? Sure, it’s been actively developed and updated over that time, but there also have been other password managers which achieved great popularity over that same time span. For instance, I’ve used LastPass at a previous job, and currently use Bitwarden for my work password manager. The main reason is that I prefer KeePass’s security model.

    Many other password managers also handle synchronizing your data between devices. KeePass, however, just stores your password database as a file. While the former behavior is more convenient, it also requires more trust than the latter. If one product is handling both encryption and synchronization, I need to be sure that I trust that they are keeping the data encrypted in a secure fashion in transit and on their machines. With a password manager that doesn’t handle synchronization, I simply need to trust that whatever is saved to disk is encrypted; even if I don’t trust whatever service I’m using to synchronize the file between devices, I can still feel fairly secure even if I believe that service to be actively hostile.

    This might seem overly paranoid, but LastPass recently suffered a breach in which hackers managed to extract data that was stored in vaults. They didn’t get the passwords themselves (since they were encrypted separately), but they did get URLs and notes, which a user could, and I’d argue should, reasonably expect to have the same level of security as the passwords. In some cases, these notes can be just as sensitive as a password (or are practically an extension of the password), so they should have the same level of protection.

    In my view, the best way to guarantee that you’re not using a service where an employee can be tricked or enticed to give your private data to somebody hostile to you is to make use of the technology at your disposal to ensure that no such employee could theoretically obtain the private data in the first place.

    KeePass vs KeePassXC

    A year or so ago, I got a new laptop which came with Windows 11. I very quickly discovered that it was extremely pushy about getting me to tie a Microsoft web account to that computer. I managed to get the computer set up without doing so, but it required both driving out of range of my home’s WiFi (since I had made the mistake of trusting Windows 11 enough to allow it to connect to the Internet during setup) and looking up an unintuitive and undiscoverable process to avoid this anti-feature.

    In the time since, I’ve heard plenty more bad news about Windows 11. And with end of life for Windows 10 coming up, I’m preparing to switch away from the Microsoft ecosystem for my personal computers. For a while now, I’ve mostly been using Mac or Linux OSs for work, and have gotten more comfortable in that ecosystem (Mac isn’t Linux, but if you’re on the command line there’s a lot of similarity). And with Valve’s Proton building on top of Wine, my main barrier to the Windows to Linux migration is crumbling.

    Unfortunately, KeePass is a Windows-first application; it’s built on the .NET Framework and can be run under Linux via Mono, but I wanted to at least try out an alternative that specifically targets Linux in addition to Windows. KeePassXC works pretty much the same as KeePass, even working with the same file format, but there are a few things that I like about it more than KeePass.

    First, it has a dark mode UI by default. This might seem like a small thing, but when basically everything else on my screen is dark, having a large white rectangle is jarring and, at times, painful.

    Second, it has its own browser integration. With KeePass, you would have to install a third-party plugin to let the database communicate with a browser, and a third party browser add-on (which, incidentally, recently started offering its own paid service). Just installing the KeePassXC-Browser add-on, changing an easy-to-find setting in the application, and linking the two together was pretty easy, comparatively speaking.

    My Recommendations

    Overall, I’m loving KeePassXC. KeePass is also very solid, and if it suits your needs I still wholeheartedly recommend it. With either of these, any sort of file syncing service will do fine; DropBox, Google Drive, or Microsoft OneDrive, for instance.

    If you do want a solution that handles both password storage and syncing, I’d recommend BitWarden; they have applications for every platform, promise end-to-end encryption, and have opened their source code for inspection, which is generally a good sign for security software. This isn’t a recommendation against other services, but I don’t know enough about those to speak on them.

  • Introducing Mimir (the Cat)

    In 2023, I came back from a vacation to a wonderful new housemate; a cat who had been found in a parking lot by a friend who discovered that his owners were unable to keep him. My friend had called him Mimir after the figure from Norse mythology because he had responded well to them making “mimimimi” sounds.

    A grey kitten standing on a hardwood floor.
    Mimir a few days after he came into my life.

    He’s still rather skittish, often startling himself when he accidentally knocks something over. Though he is remarkably well-behaved for a cat; he’s never stolen any of our food, he’s very good about not going onto surfaces he’s not allowed on, he doesn’t try to bolt out when we open doors, and he’s generally very careful about not knocking over items on surfaces he’s allowed on.

    A photo of Mimir (the cat), lying on his back. He's looking at the camera, mouth open, and his head is blurry, suggesting a sudden movement.
    Mimir (the cat) lying on top of a printer, his head very close to the camera.
    Mimir spends a good deal of time on top of my printer, since it’s a good spot from which to watch me while I’m on the computer.

    When he’s not taking one of his many naps, he can pretty reliably be found either next to one of his humans or staring out a window. If somebody’s moving around, he’ll often follow along, tail happily raised with a curved tip. And he’ll generally find a nice spot to lounge wherever he can hang out with one of us, whether that’s on my printer, on the arm of a couch, or on a spare chair.

    Mimir lying on a chair, paws on a windowsill, looking out over a snowy yard.
    He really enjoys getting to watch the outdoors.

    He’s surprisingly easy to train, polite, and considerate. The one difficulty has been trimming his claws, but I’ve been working on getting him more accustomed to having his paws handled, so I’m hoping the claw trimmings will be less of an ordeal over time.

    Overall, he’s been an absolute delight, and I don’t think I could have hoped for a better cat.