Since my very simple proof of concept of King Under the Mountain last weekend, I’ve been continuing to work on the game. I can’t promise a releasable version in the near future because this is still a side project of mine, but I’d like to have a playable alpha as soon as possible, so you can pick it up and give me your thoughts.
I am currently experimenting with Unicode support. I have a build option set up that currently toggles this behavior, and I’ve doubled the X width of each display character to accommodate. Surprisingly, this looks great in both modes! But, there’s a problem.
Certain fullwidth characters, such as Emoji, behave badly with my terminal software. Rendering Apple Color Emoji, for example, has a transparency channel that makes Terminal.app look like Swiss cheese, as each character cuts a transparent region out of the back of the window. I haven’t yet found a good way to reconcile this, though it does look substantially better in other terminal software that doesn’t use Apple’s full color equivalents.
That’s my current quandary. My next steps after this are to rewrite the UI and make characters able to interact with one another.
Are these dev posts interesting to you all? I’d love it if you let me know.
For the last several weeks, I’ve had a game idea bouncing around my mind. So, taking the excuse of this weekend’s Ludum Dare game design competition, I decided to start writing it:
King Under the Mountain* is a text-based roleplaying game where you play as a dragon. Not content to simply pillage and burninate the local villages and farms, you also take up the wing of politics, toothily coercing neighboring peoples to champion your cause. This plays out similarly to Dwarf Fortress, except with loftier goals and a bit more political intrigue in mind.
Written in C using ncurses**, this game is in very early alpha and isn’t yet playable. Most of the game exists as notes and code snippets I’m still in the process of writing, but world generation is far enough along that I can at least post the teaser above.
Like Dwarf Fortress and Nethack, this game is designed to be a roguelike with primarily procedurally-generated elements guiding play. Certain elements will be mutable to the player from the start, such as their name, gender***, and specific world characteristics. Of course, randomizers will be available if one prefers to start playing immediately.
I’ve found writing this to be surprisingly therapeutic. I’d missed this level of ultra-simplistic, low-level coding in time spent in higher-level languages such as Python and Go. In a way, getting back into C feels like rediscovering my roots.
Would you be interested in this game if I ever released it? Since it’s a terminal app written in C with low-spec systems in mind, hitting all major OSes wouldn’t be especially difficult.
* I had considered this name before the competition’s theme, “Beneath the Surface”, was announced. It’s a double entendre cited here, referring both to the dwarven ruler, the King of Erebor, and to the dragon, Smaug. Get it?
** I had originally planned to use this to study the Go programming language. However, this plan ground to a halt when I discovered that no complete terminal UI library existed for the language. So instead, I settled for using ncurses directly, taking many stylistic, code layout, and presentation decisions from Nethack.
*** This will be substantially more open-ended than binary. I’m thinking free input for all pronouns, up to some number of characters apiece. It doesn’t fit everyone, but it should serve the needs of the gamut of genders people express in my audience. I intend to make all text conform to these, too, which will make localization difficult. I’m still ambivalent on how to translate this, if I ever get that far along.
Two days ago, I flew as a dragon in immersive 3D. As otherkin, this satisfied a personal goal of mine, and it was wonderful.
This bears some explanation: I recently acquired a copy of the Oculus Rift Developer Kit 1 from a good friend of mine. Hooking this up to a copy of the CtrlAltStudio’s modified Firestorm Viewer for Second Life, I then proceeded to buy one of these to fly around in:
Seawolf Dragons have a bit of personal history for me. Specifically, they’re based on (and were eventually endorsed by the developers of) the dragon models from Horizons: Empire of Istaria (now Istaria: Chronicles of the Gifted). Istaria was where I flew as a digital dragon for the first time, albeit while watching a third-person render of my dragon protagonist moving through the skies as I played via mouse and keyboard.
At the time, Istaria was important enough to me that I had gotten in on its initial closed beta nearly a year prior to its official launch. When the first Adult Dragon Rite of Passage went live on all shards on March 12th, 2004, I pulled an all-nighter to be among the very first group of dragons to attain flight on the Life server cluster.*
The Rite of Passage succeeds as a soaring spiritual experience for fledgling dragons, and that tradition continues even today, as YouTube attests. For the young dragon, it’s a graduation ceremony to (literally) bigger and better things. I, of course, immediately used this to fly up along the game’s trademark sheer cliffs and jagged mountains to surprise crafters whom, alarmed by seeing a huge dragon flying towards them for the first time, cheered me on once I’d landed in their midst.
By contrast, this flight was quiet and personal, but just as moving. I watched through my avatar’s eyes as I flew, looking down on a tiny facsimile of the Istaria I knew and loved a little over a decade prior. As I twisted and tilted my head to see the digital equivalent of a rising sun, I could crane my neck to look and fly wherever I wished to go. Even though my primary controls remained mouse and keyboard, the verisimilitude was beyond incredible.
To fly as a dragon has been one of my goals for most of my life. It’s why I chose to program in the first place, why I’m a technologist and computer scientist, and why I pursue 3D and game design as my occasional trade and hobby. Being able to achieve it in such a simple and mundane way elates me, and makes me wish for VR to only continue to succeed. Not bad for a tiny video monitor and accelerometer connected to a set of fancy goggles.
I just hope that Facebook doesn’t ruin this for everyone. I am convinced that everyone, otherkin or not, should be able to experience this.
* Technically second; our party leader ascended first.
It’s 1:30 AM, and I am reading a Charles Stross novel through a tiny monitor hovering precariously in front of my face.
I do not know what convinced me to illicitly load a copy of Kindle Cloud Reader onto Google Glass. At first glance, it didn’t seem like a sane idea: I expected the font to be terribly maladjusted, the display to contort itself awkwardly, and the viewer to spin 90 degrees on its side, as if I was attempting to divine the complete works of Geoffrey Chaucer from a bowl of alphabet soup stapled to my face. But after a few burps and hiccups, it works startlingly well, offering its now-sepia-on-black rendered text in crystal clear, paragraph-length bites. I click a small mouse in my right palm to turn each page; they haven’t gotten the input model down for this app just yet.
Most readers have probably noticed that I’m a huge nerd. It’s actually a bit more than that: I’m a posthumanist mad scientist.
I’m not saying this because I’m evil, build deadly robots, or have an iron-clad plan to take over the world (though that would be incredibly cool). A more useful metaphor might be one of the Red Mage: I dabble in the margins, connecting the disparate sciences together to see what sticks, without the devotion of complete study. The results are oddball, bizarre, and categorically insane, and I have journals, disks, and reams of unsorted media filled to the brim with experiments and thought logs.
This dabbler mindset is incredibly useful, because my diverse creative interests gives me good predictions of what people will invent next. It also gives me tremendous versatility, which I find value in every single day. But, it also results in shallowness and lack of depth for any specific topic. For this reason, I rarely clear the top rungs of any given vocation. (If I somehow do so accidentally, I will actually move on, so I can keep learning.)
I’m this way, in part, because I greatly enjoy being a tourist in any given field. I especially enjoy the process of rapid study and reverse engineering; to me, it’s a puzzle. To a lesser extent, this tourism writ large has generated in me an obsession with creative autonomy and self-sufficiency that gives me this strangely seductive sense of ownership over the bizarre ideas that pass between my ears.
I call myself a posthumanist mad scientist because, while so many of my projects are whimsical and short-lived, this agenda isn’t: I have a long-standing goal to transcend humanity. Maybe it’s strange that this is so immutable and matter-of-fact for me. This manifests itself as small snatches of disconnected ideas and obsessions about virtual worlds, augmented reality software, and modes of expression that let me be the charming, shiny creature that I wish to be. But they want for more cohesion, which I suppose I’m working on.
I’m not really going anywhere with this, I just wanted to share. Even though tinkering with technology and ideas is what I do, it feels so far off the right end of self-actualization that it makes me deeply self-conscious. I guess I’m still figuring out how to manage that.
So, let me tell you about Hearthstone.
As a long-term Magic: The Gathering geek, I have sort of a strong opinion about this game. It takes many of Magic‘s core mechanics: mana, creatures, spells, planeswalkers, enchantments, and keyword effects, and simplifies them into a game that is fast-paced, streamlined, and internally consistent within the properties of its universe. Wizards of the Coast tried to do this with their Duels of the Planeswalkers (hereafter, “DotP”). I’d argue that Blizzard managed this better.
For those of you that have never played Hearthstone (but have possibly played Magic), here is a very quick summary of its standard rules at this writing:
- Each game contains exactly two players in competitive 1 vs. 1.
- Each player selects a hero to represent themself. These heroes have cards and abilities associated with them. More on this later.
- Each hero starts the game with 30 life.
- Each deck contains exactly 30 cards.
- The hand size limit is 10. Any cards drawn over this limit are immediately discarded.
- Players take turns, with the first player being selected randomly.
- The first player receives three cards from their deck, any of which they can choose to replace with another random card from their deck. The second player receives four cards and the same mulligan opportunity.
- Once both players finish selecting their hands, the second player receives “The Coin”, a 0-cost card that gives them one extra mana crystal for a turn of their choosing.
- Every turn, a player draws a card and receives one permanent mana crystal that they can “use” each turn, up to a limit of 10. This is the primary currency used to pay the “mana” costs of playing each card.
- A player, on their turn, may choose to play a minion, a spell, or a weapon from their hand, or use their hero power. Usually, these cost some number of mana. Occasionally, other costs (such as life) are included.
- Play continues until one hero reaches zero or fewer life after all actions are resolved. If this happens to both heroes simultaneously, the game ends in a draw for both players. Otherwise, the surviving player is deemed the winner.
In practice, it’s actually fairly straightforward. Turns and gameplay happen rapidly. Gameplay is well thought out and documented on its wikis. Each card is readable at a glance for its cost, strength, and durability (when applicable).
Most of the complexities of Magic, even DotP, have been streamlined or removed in some way. Examples:
- There are no turn “phases” to consider, other than beginning and end of turn.
- There are no “resource” cards other than those which give you additional mana crystals.
- For patent reasons, there is no concept of “tapping”. Creatures that can attack are directly highlighted by the game with an aura.
- All elements on the “stack” resolve in gameplay order. Card effects are simplified to accommodate this.
- The maximum number of minions a player can have at a time is seven, which fits neatly into short-term memory. Extra creatures over this limit simply do not spawn.
- The attacker chooses which creatures (or players) to attack unless stated otherwise, even in combat.
- Players only act on their respective turns. There are no interrupts or instants, but there are counterspells and surprises in the form of “Secrets”, spells that are played face down and revealed when a condition is met.
One of the biggest draws of Magic is the concept of different colors of mana and their archetypes. In Hearthstone, these are replaced by classes that are defined by your hero. These give access to (and conversely, restrict) some of the cards that you can place into your deck.
Each class fits a particular theme that is ostensibly balanced for gameplay, with some classes forming deliberate rock-paper-scissors relationships. In no particular order:
- The Mage focuses on spell damage and board control. Their hero power deals 1 damage to any character (minion or hero).
- The Paladin focuses on protection. Their hero power summons a 1/1 minion token.
- The Warrior focuses on combat damage. Their hero power adds 2 armor, which are essentially bonus health.
- The Warlock focuses on manipulating life essence. Their hero power draws a card at a cost of two health (plus the mana cost).
- The Priest focuses on healing and keeping minions alive. Their hero power heals a character for 2 health.
- The Hunter focuses on creatures and combo engines. Their hero power deals 2 damage to the enemy hero.
- The Rogue focuses on evasion and board control. Their hero power equips a 1 damage, 2 durability dagger for direct combat.
- The Druid focuses on ramping and creature enhancement. Their hero power gives their adds 1 attack and 1 armor.
- The Shaman focuses on defensive lines of powerful creatures. Their hero power summons a random totem, usually 0/2 with an ability.
The idea here is that these pre-defined “classes” would substitute for the flexibility of Magic‘s archetypes in two colors. However, this falls somewhat flat: because the class-specific cards are so good, each class becomes very predictable to play against. This holds especially because all “unaligned” cards (cards usable by any class) are creatures only. This unfortunately gives a fairly accurate picture of how a match-up will go the moment you see whom your opponent is playing.
There is also a significant advantage to players who have paid into the game. Such “pay-to-win” mechanics are not unheard of, but they are especially relevant in Hearthstone: because of the stability of cards in the set, many paid, class-specific cards are strictly better than others. This feels unfortunate in online matchups, when my “free” deck fails to survive against decks at strictly higher power levels.
There is an option to alleviate this, forming sort of an analog to Magic limited play. In Arena mode, you select a class, then select one of three randomly generated cards until you have a deck of 30. These cards are “virtual”: they are yours until you win twelve games or lose three with that deck, whichever comes first. However, class selection once again determines which cards are in the pool, and this leads to games that are still predictable (if a bit more random) in practice.
In summary, I like what Blizzard has done here. They’ve constructed a game that appeals to an audience interested in light strategy, without mucking too much into the details. I will be preferring Magic over this only because Hearthstone isn’t exceptionally deep at this writing: it holds attention primarily through random rewards and the promise of chase rares that are required for optimal deck construction in a very stable metagame. Fun for a few days, but not something I want to invest significant time into.
Still, I recommend giving it a spin, especially once the iPad build comes to your region.
One of the biggest problems I’ve had with maintaining a blog is allowing myself to just being conversational. I tend to obsess over keeping things just to the high points — big ideas, big projects, things I’m working on that are relevant to other people’s lives — without really discussing the small things.
But, as close friends repeatedly inform me: those small things are meaningful. They capture sort of a slice-of-life that gives progression and context, making the person at the other end of the wire feel that much more real. This is the essence of what has become digital watercooler conversation: these little scraps of vicarious life are what makes other people just seem less alien.
So, I’m going to give it a shot and see if I can maintain anything resembling momentum.
Let’s start with some random Goldkin facts you probably didn’t know about me that you might find interesting:
- If you’ve been reading some of my other pages, you know that I’m a dragon. Did you know that I’ve been stating this openly for over twelve years? It’s kind of scary to think about, in hindsight.
- My birthday is February 19th. These means that, in addition to being born roughly one month before Spring in the shortest month of the year, the modern zodiac has a hard time classifying me. I have sort of strong opinions about how confirmation bias is responsible for most of modern day astrology, but I never could figure out if I was supposed to be an Aquarius or a Pisces. They’re kind of fitting to my demeanor, though.
- You’re not getting the year or how old I am, other than “late 20s”, however. See my previous post for why I’m kind of touchy about giving out my full birthday.
- Many people know I’m a software engineer from my public profiles, but did you know that I’m also a security engineer? I have sort of a longstanding history reverse-engineering viruses, malware, and exploits, though I’m a bit rusty these days for wearing so many hats where I work. You should ask me about it sometime, though. I love talking about it.
- Before getting into security, I was very big on virtual reality. I still am. I have ambitions of making a virtual dragon avatar that is just like I envision me to be. It’s why my 3D modeling skills are as good as they are, even though I post my work sparingly. (This is also something I enjoy talking about!)
- That I am writing this post at 2:47AM on a work night and really should go to bed?
Actually, that last part is what will cut this short for now. I just want to try something informal and sort of see where things go from there.
So, I’m starting yet another blog.
Doing so is a concession: every blogging platform I’ve tried to share long-form thoughts on has failed me in some critical way. I am exasperated that I need to write this, because I don’t find the problem terribly hard: I just want to write unbounded text to a URL on the Internet and discuss it with the people I enjoy talking with.
Here’s where the services I know and love have failed me at this:
- Twitter and Tumblr are too uncategorized, noisy stream-of-thought for me to organize any ideas effectively, full stop.
- Medium has this beautifully simple content editor stapled to a terrible website for discussion. I also feel miscategorized and misrepresented when using their service, as if any post I make gets lost in the existential angst of first-world problems that I don’t fit into especially well.
- Facebook and Google+ fail to represent me as anything other than this false wallet-person that they really want me and all of my friends to be. To say this has a chilling effect on everything I write to these services is a dramatic understatement. No thanks.
- LiveJournal and Dreamwidth haven’t aged especially well. Fractured communities and poor, bug-riddled mobile posting prevent me from sharing the ideas I’d like to from anywhere, with the people I’d like to share them with. Which is a shame: both services gave me hope and worked pretty well in earlier days of blogging.
- Newer microblogging services like ThoughtStreams miss the point of deeper thought and prose entirely, by assuming thread-organized stream-of-thought substitutes for editorial quality and nuance. These fail to allow me to tell a story that isn’t a stream of consciousness Joyce or Hemingway narrative.
Now, I’ve spent an incredibly long time thinking about this. In order for me to be satisfied with any blogging platform these days, it needs to meet these basic criteria:
- Accessibility: I want to read it and write to it from anywhere. Don’t ever force me to log in to read a public post. I want your site to degrade gracefully when I ask you to serve it from Chrome for Mobile or, heaven forbid, Mobile Safari. Don’t give me this basic app that’s hideously buggy and call it good.
- Community: I want people to actually be able to reply to my posts. I don’t especially care where they reply from, but I’d like this process to be as painless as possible. If there is any barrier to them doing so other than a single login prompt, I won’t be using your service. If my readers are directly shamed by interacting with your service in any way or suffer side effects from logging in (I’m looking at you, Facebook and G+), I won’t touch you with a ten-foot pole.
- Durability: I want my posts to stand the test of time, as representational snapshots of my thoughts and discussion. I want to link to them. I want a way for me to keep my old posts organized in my mind, so I don’t have to constantly repeat myself when the same discussion comes up. I don’t want these to somehow age off or disappear into the ether without warning. Give me tags and a pithy, human-readable URL that I can always refer back to and I’m happy.
- Security: I want my blogging platform to treat my private information as private. Don’t give me every assurance that my information is secure and fail to meet them in your code. Don’t default what I consider private information to public and start building tools that compromise my identity. Don’t tell me that my private posts are private when anyone with a passable experience with Metasploit can read them. And don’t you dare store my password without taking proper precautions.
- Representation: For quite a few reasons, I represent myself as a dragon on the Internet. More than half the services I use shame me for this, ranging from indirectly (who is this one nutjob that isn’t using a selfie in their profile and has all photo tagging disabled?) to egregious, service-breaking, open shaming (hi Facebook, hi Google+). This isn’t about hiding from “polite conversation”. I’m not trying to be “anonymous” so I can say “mean things” about people on the Internet. It’s about representing the identity I choose for myself without giving access to people that actively wish to do me harm.
Actually, that last one is kind of a big topic, so let me expand on it here: I don’t give wallet information to anyone online unless I have a business reason for doing so. This is just good practice: my wallet name, address, phone number, credit card number, email, and SSN are all privileged information that can be used singularly or in aggregate to access services other people shouldn’t be touching.
Try this exercise sometime: call up your bank, broker, cell phone provider… any arbitrary service provider, really, and step through their assisted process to recover from a lost a password. Phone assistance is critical here, because it’s usually the weakest link in the chain. Just listen. Note down the information you used to verify your identity. Then realize: this very same set of information can be used to steal your identity.
And this is in the best case: there are plenty of examples, far too many to list, about people who have suffered from active vendettas for having their information disclosed to the wider Internet. I just want none of that.
So, to service providers that should know better, please understand that I never want this information about me visible to the wider Internet. Ever. It’s a simple matter of good hygiene, and I really don’t care what your marketing objectives are. Don’t share it. If you do, I’m not giving these to you, and I’m very likely to take my business elsewhere. End sidebar.
Anyway, I’m selecting WordPress today because it fits my criteria reasonably well:
- Accessibility: I can read it and write it from any of my devices. Links to my posts just work. The mobile site is fully-featured and works decently well, even though the apps aren’t great.
- Community: I feel comfortable linking to and discussing WordPress posts. Accounts are free, advertising is less egregious and easily blockable, and I don’t anticipate side effects like a deluge of spam about what all your friends are doing if you decide to log in and reply.
- Durability: I can link my posts with text, tag them responsibly, and tolerably expect them to still be here years from now. That’s all I want, really.
- Security: Given the exploits that crop up in custom installations and so many third party plugins, I’ll stick to hosting with the website. I have substantially more confidence in WordPress than LinkedIn in the event of a breach, and I expect my blog would survive one intact.
- Representation: At this writing, WordPress is one of the few services that doesn’t care that I’m a dragon on the Internet. It also isn’t predisposed to telling me which content is “right” for its blogging platform and community, outside of TOS and applicable laws that I have no intention of violating. That counts substantially in its favor.
So, I’m going to give this a try and see if it fits my ideas well. I guess I don’t have terribly high expectations, but as long as I can just throw links to this at people and not expect terrible side effects, I’ll be happy.
(In which some of you will see an ad below this post. Sorry about that. If I end up liking this service, I’ll do the responsible thing and actually pay for it.)