1 Year In Development
Posted on May 11, 2017 at 09:20
I looked at my phone yesterday evening and saw a calendar reminder for today. Today is the day that I made my first commit on my project last year. Holy shit. Granted, I've only been working on some nights, mornings and weekends, but so much has been done over the past year.
First off, it hasn't felt like it's been a year. Life really starts to cruise by when you're working full time. I've been trying to combat that by being generally more present in the moment, but even so, you look back and it's all gone by so quick. Luckily, still full of lots of good!
I wanted to do something momentous for today, to celebrate the occasion. Something like truthfully announcing the project publicly. I thought it would be a fun thing to do, but I also still don't think the project is ready to be announced, at least not just yet. I also don't want to rush the announcement, I'd rather have something fun to show alongside the announcement.
Thank you to everyone who participated in the playtest. I got some seriously valuable feedback from you, and I'm taking it to heart as I move forward. It was heartwarming to see that everyone who played it enjoyed it (at least in some capacity), and that most everyone realized something early on in the playtest: this game will fuck you right up.
I don't want to make the game inaccessible, in fact, I want to make sure the player feels that they have complete control, but the original spark of inspiration for this game was one thing: if you step outside of town, you better damn well be prepared to fight for your life.
I think I've captured that to some degree, albeit some tuning is needed. I'm excited to have surmounted the foundation of the game. It's on to content creation now. I've set up useful tooling, both in and out of game, to allow me to get going in full force on making towns, quests, enemies and people. Now it's a matter of hunkering down, and coding / writing / spriting / composing as hard as I can. I have a long way to go, both in terms of where I want the game to be content-wise, and where I want it to be graphics-wise. I've never been strong with the art side of things, and this project will, hopefully, be the one to push me past my limits.
Thanks again to everyone for your support. I hope to have a page on itch.io or something soon. I'm so tired of referring to this project as "my game," but I'm not quite ready to put it out there yet either. Good first impressions, and all.
More to come, as always. Until I have an actual devlog somewhere, 64D will remain where I put the first looks at what I'm doing. Even then, I'll still drop the good stuff here :D
Next blog I do will probably be about an awesome setup I've made recently for writing dialogue trees. If that interests you at all, stay tuned.
Side Project, New Tech
Posted on April 24, 2017 at 08:15
With the playtest for my game out there and in the hands of a small group of people, I've been working on a side project to fill the time while I wait for feedback. I'm still doing a little bit of work on the game, identifying a few bugs and making a bit of a smoother experience based on immediate feedback, but overall I am waiting to hear back from more people so I can compile a full feedback list.
The side project is a pretty simple website, but I think it will be a fun experiment. I've been really enjoying Keybase
recently, for its personal identification, shared filesystem and chat. One of its cooler features, to me, is that you can have your public shared folder in Keybase, which is signed by your key, served through a shell website called keybase.pub
, which will render markdown files automatically, and acts as a dumb web server.
My page there as an example:
I am drawing inspiration from this to make a tiny platform where you can claim an "identity" (effectively, an account, more on that soon), and create posts just written in markdown, which become available at a short url, similar to the way keybase.pub works. The goal is to allow for a frictionless place to plop posts, which isn't quite as demanding as a blog, and isn't quite as in-depth as Medium. Something simple and quick. Let me just post some thoughts and have it out there.
There won't be much in the way of logging in. You'll identify yourself with your name and passphrase at time of writing, but otherwise, not much in the way of account management. You'll be able to write a bit of a bio by writing a topic about yourself, and visiting the root page at your subdomain will list your bio and all things you have written about.
I might take it a step further and allow posts-as-replies, which I think would be a fun way to add a little bit of depth to the service without making it complicated or spread out too thin. Writing, and posting. That's it. No bullshit.
for the frontend, which is a tiny, 3kb implementation of the core API of React. It is good for building dynamic frontends which span multiple pages, rather than one big webapp like React prefers.
I am also using a new-to-me database which I've had my eye on for a while, LevelDB
. It is a simple key-value store, with not many bells and whistles, but boy is it fast. I will probably be writing a small abstraction layer on it, which I may open source. LevelDB is the foundation for a lot of other database projects, just because it is so simple and quick, and it's JS api can have the backend swapped out for other connectors, which is pretty sick.
Overall excited to work with these techs, and hopefully I can product something nice. My free time is dwindling, though, and most of it is spent relaxing in the evening, or working on the game. Hoping I can find time to finish this project.
That's all for now.
realizing this is about the closest I could get to twisternet 2 without raising alarm bells with legal at my job
The Littlest Keyboard
Posted on March 23, 2017 at 09:16
This is going to be a hard one to type. I say that because I'm typing this on a 40% keyboard, which I just plugged in this morning to my computer for the first time. I have virtually no idea how to touch type on this thing when not just typing letters, which, by the way, is exquisite on these cherry mx browns, which actually feel a lot better on this board than on the other board with browns that I have.
If you're not indoctrinated into the wonderful world of mechanical keyboards, this will all be gibberish. Actually, it won't be, this isn't actually complicated.
I bought this keyboard
and it arrived last night. late
last night. So, I picked it up this morning and replaced my old board with it. I say "old", but really it was just a few months, which my fiancee pointed out quite a few times.
To give a sense of just how little this thing is, here's a picture of my pasty white hand in comparison to it:
Anyone else here got a fun keyboard to share?
Posted on March 21, 2017 at 09:23
Let's see if I can crank out a decent enough post in the next 10 or so minutes before I head to work.
I got a switch launch-week. Very lucky after not pre-ordering to find that a coworker pre-ordered two, just to be sure. I bought his second one from him, and we did this dead-drop situation where he left it at his desk over the weekend in the office for me to pick up. Covert ops.
Of course if I got a Switch, its because I wanted to spend too much money on a Zelda machine. I'm looking forward to the lineup of games coming down the pipeline, but for now, yeah, Zelda (and snipperclips!) machine. Snipperclips is actually very fun and you should try it, though.
Zelda is amazing. I'll not just sit here and add to the swirling river of praise this game gets, but I will say it is well deserved. I want to talk briefly about something else that really makes me just love the switch: speed.
I'm not talking about processing power here, because it could for sure use some more of that. What gets me is that when I turn on the switch, I get right back into the game in single-digit seconds. This may not sound impressive, but it feels so good when I pick up the controller, press Home to turn on the console, then press "A" and I'm right where I left off in my game. It acts similarly to the 3DS, where when you close the lid, it just state-pauses. Only, this feels like a home console, not just a handheld.
I find it to be a killer feature, really. Its obvious that both this console, and Breath of the Wild, were designed to respect the fact that Nintendo's playerbase have largely grown up and have other responsibilities, or limited time. I can get into the game in notime, play for as long or as little as I'd like, then put the console to sleep without having to go through a save process, and knowing I can just resume immediately the next time I swing by it.
If you haven't played with a Switch yet, be sure to see this for yourself. It is much more impressive in person.
Who else has a Switch by-the-by? Are we in need of a "share yer friend codes" blog or do we have one? Don't put your codes here though, since this is a public facing blog. We can set up something more official if there is a desire.
edit: Ayy, 7 minute writing time. I did it. Off to work.
Posted on March 20, 2017 at 09:16
I made the first commit of my game in May 2016, so I'm coming up on a year of development time here soon. In some ways, it doesn't show. For one, I haven't spent all of that time working solely on the game - I've taken long breaks, and even when working on it, I only have the time that is outside my normal working hours.
In other ways, it definitely shows. In the codebase itself, I've formed a foundation which is a joy to work in. The majority of the time spent over the last year has been engine and toolchain development, both internal to the game code and external.
Some of the work I've done in the realm of "foundation" is already open source. gdash
, which I've already posted about here a while back, is an open source gml package with a bunch of very useful data manipulation functions that are either missing or sub-par in GML. While it isn't rampantly popular, it has 13 stars as of today, which is actually pretty good for a GML repo on Github.
The GameMaker community isn't exactly the most technically advanced bunch on the whole, but at least from my vantage point, it seems like there is a shift in the wind. With the release of GM:S2 and what seems like a renewed focus on making GameMaker a really nice utility, I've been tinkering with the idea of packaging up a lot of the foundation work I've done as an open source project, so that others may get going quickly with a project idea they may have.
The foundation work I've done is largely game-agnostic. I purposefully kept it so while writing it so that I could re-use it in other projects. It covers things from data manipulation (gdash), to game state management, to saving/loading, to custom event and timer implementations to provide an alternative to GameMaker's frame-focused timers. Not to mention just a big folder of scripts that are basically my answer to "how the hell does GML not have this function?" Examples include "ds_list_add_map" and "mouse_is_hovering".
My current proposed toolchain would be a handful of GML packages that work well in tandem to make for a better starting point inside of GameMaker. No game logic, just tools to help make the game happen. I've spent a year building these tools, which is a year of time not
spent building content. Luckily, I'm on the content building phase now, and thanks to a great foundation (which does include game-specific tooling as well, not to be included in this proposal), I can sit down and crank out new content in short bursts, rather than having to build endless situation-specific code.
If this is something at all interesting, I'd like to know. I've been on the fence about this for weeks. I'd like to gauge general interest vs preferring to roll your own solution. Though, I just realized this is absolutely the wrong community to ask the question do you prefer to home-roll solutions
Posted on February 24, 2017 at 08:19
I got a few requests in IRC yesterday to talk about how I structure my GM:S projects. My current project has a whole lot of resources, and needs to be able to have a whole, whole, whole lot more resources while still being manageable. I'll go over my general process, and talk a bit about other relevant subjects as I see them fitting in.
The first, and probably most difficult resource type to manage is objects. You generally need a lot of them, and sometimes they don't quite lump together in the same way that, say, sprites would lump together under a given purpose. That said, there are still plenty of ways you could try to lump together your objects.
In my project, I have the following top-level object structure, all of which are groups:
walls and objects
I see these as the highest level of taxonomy in my game. Under each is either the terminal of the resource tree with leaves being objects, or more directories to more objects.
Beyond grouping into these lumps, alike objects are named with a deterministic naming pattern, such that when I am searching for one type of object, anything related will show up as I search. GM:S2 has a GoToAnything search (Ctrl+T by default) to bring up any resource that matches your string. This is immensely useful in general, and naming with a solid schema helps here as well. Let's dig down into spells -> elemental -> ice spike, one of the lower level spells in the elemental category in my game.
In there, I have the following objects:
Everything is prefixed with "obj_spell_ice_spike_". This pattern is the exact same for every spell in my game. I know to search "obj_spell_" to list out every possible spell related object, then its just a matter of narrowing down what spell, then what part.
This pattern is similar everywhere that I could make it in my project. NPCs are all "obj_npc_whereTheyAppear_npcName". This way, I can look up all the NPCs in a given location.
When you start to use this namespacing pattern, natural groupings will appear. From there its just preference how much you want to chunk down into groups.
My project increasingly relies on scripts to do almost all of the heavy lifting. I've built myself up a really strong foundation to manage save/load, world data, item lookups, inventory management, npc movement, spellcasting, hud management and so much more. As much "business logic" as possible is done in scripts. This lets me re-use them anywhere, and write out good documentation in the heading of the script, so that GM:S2 displays context completion when using them.
I name scripts in such a way that they would feel like any other gml function. I see it as "adding on" to gml to create a GameMaker specifically for my game. With that in mind, my naming schema for scripts is:
Breaking this down:
Let's look at a group of scripts I have: data management. I'll use the script that generates the controls data. The system name here is "data". Everything with the prefix "data" will relate to ephemeral, modifiable data in my game's runtime.
What is this script doing in the system? Well, I'm initializing data, specifically controls data. So, my directive is "init".
Now we have "data_init_".
Finally, this script is initializing controls data, as we've said, so, "data_init_controls" is the final name of the script. Along side that script, I have:
Sometimes you need an action as well. Often this is something like "get" or "set" or "delete". The action should go last
. Some examples:
Keeping the order to further specify the system you want to leverage, working you way to the action you want to take can not only help keep you sane when coding, but make it that much easier to just change the last word should you need to refactor.
This is very similar to the object structure, though with a focus on namespacing scripts that work in the same "system". Keeping to this structure means you won't have confusion with name collisions when you've got a bunch of scripts, and as I'm typing a script name, my suggested completions are only related scripts, not something that happens to have the same start to it.
This may all seem super basic, but its something I've learned from previously structuring projects with no real regard for the long term. Being mindful about naming resources has lead to a very nice time expanding the resource tree. The rare cases that don't follow these patterns get me every time.
With these concepts, you can probably structure any resource type. I do a very similar pattern for rooms as I do with objects, only using "rm_" instead of "obj_" as my prefix. I do not use prefixes for scripts, to keep with the concept from before of trying to "extend" gml.
If anyone found this helpful, let me know. I'd be happy to also do a write-up about object structure, going over how I manage data between objects and the save system, and how I handle local variable structure and code structure within objects vs scripts.
Minor Gameplay Videos
Posted on February 22, 2017 at 08:30
I've been posting a few small gameplay videos to twitter recently, and figured it'd be fun to post them here too.
One-shotting a weaker enemy with one of the core light spells, Smite
Healing from a water source with the right passive skill applied (passives are the circular icons in the bottom right corner)
Setting a town as "home" by lighting a beacon. Press the assigned hotkey at any time to teleport home after 5 seconds. If you get hit, you'll be interrupted, so don't expect to escape fights!
Going to try to keep these little videos coming. Easing myself in to a true announcement :D
Edit: I've linked to the videos directly as well, in case your browser is incompatible, or in case 64Digits' css was written literally years ago.
Posted on February 21, 2017 at 08:30
A large focus of my game is writing. The save system requires the player character to make some sort of written impact on the world. If you die, the death screen tells you about the last known writing about you. There are books about the world for your reading pleasure, either to give you the edge on a particularly difficult opponent, or to recount the history of the town you're visiting.
Beyond literature, the conversations with NPCs are written in such a way that I am trying to convey feelings, thoughts, hopes, goals and fears from these characters.
Every NPC in my game has more than just a line to say. They have hopes, hurts, goals and loves.
My goal is to provide a world to the player that isn't just full of NPCs that stand around and spew the same, irrelevant-after-first-interaction lines. Even the ones that are currently just standing around all day have some kind of integration into the town they live in. They have some connection to the others in the town, be it family, deeds or shop ownership. The shopkeepers aren't open at your leisure - they go home to get some damn rest after dealing with you trying to sell them 100 suits of armor all day.
Here's a few examples of the NPCs you may meet in your journey:
Ellis and Henry Lanwell
This couple runs a tavern in a town that relies heavily on traffic to it's arena. The tavern isn't the biggest in town, but it's the first most people see when the come in from the south or east. In that way, they hope to catch thirsty travelers.
They have two divergent approaches to business, however. Henry is upset about their situation - competing with a bigger tavern near the arena means they can hardly afford their house. Because of that, he tries to upcharge on most pints - jacking up prices and taking that money from unaware passers-by. Ellis, on the other hand, tends to drop prices down a bit, in the hopes to make a good reputation for the bar.
The two haven't talked to each other about this, probably because they spend all day working. They each take 10 hour shifts, just barely passing each other on the walk to and from work (see linked screenshot at the top of the post).
It is my hope that they'll rekindle their love.
Do you love books? Alaina loves books. She loves books so much that she wants the world to be reading.
Also pictured above, Alaina runs a small bookstore in the same town as the Lanwells, though her business skills are lacking. She encourages her guests to read freely, but has a hard time securing an actual purchase.
If you watch her go about her day, you may notice that at night, she has to retreat to the local bunkhouse, a shoddy building for those unfortunate enough to not afford any other bed in town. Regardless, she goes on with a smile, hoping that someone in town will find a book worth their time.
It will be rough to write all these characters. While I'm hopeful that every character can have something
of interest, I know it will be a long journey. Between this, writing a D&D campaign for my group, taking debugging notes on my game, and a couple of other side projects, I find myself in a flurry of half-written documents. Because of this, I've been toying with an idea for a more human-like note-taking system. I've tweeted about it recently, but I'll save that for another post, when I have more of it to show. The goal being to let me just use one document and jump around as-needed. I'm excited about the progress there.
More to come soon. Started real work on the game's website last night. Once that is finished, it'll be a bit of branding work before I can really announce the game in full.
Music and Sound
Posted on February 15, 2017 at 07:35
This past weekend, I focused a lot more on the music and sound work in my game. Up until now, its only had two tracks, which, given the limited world size right now, didn't get too much in the way. Though, I realized that I wanted to begin to give areas more definition, and one of the best ways to handle that is music.
The track above is titled "The Stories Woods can Tell." Much of the inspiration for this game, and previously Elicti, were the woods behind my house growing up. My room's window overlooked a forest that went really far back, into a preserve. During the spring and fall, I'd leave my window open to smell the fresh air from the woods, which always gave me a rush of inspiration to work on whatever my current project was.
That hasn't changed still. Fresh air in a breeze through the window still puts me on cloud nine.
The game begins in a very small town, borderline an outpost in the forests. You can head in most directions if you can navigate the forest and end up in a larger town, but starting you off in a slow-paced village, surrounded by woods full of mystery makes for a nice introduction to the world. The more extreme ends of the map will contain significantly harder terrain, enemies, quests and events, but to ease you in, you'll begin by seeing a small town go about their business, unhooked from the rest of the world.
Music plays during daytime hours, and you'll be greeted with a quiet, darker ambiance at night. During the night, as darkness encroaches, it becomes dangerous to travel without torches, or a spell to help illuminate your path. Enemies may jump you out of the veil of darkness. Travelling at all is a difficult task, and travelling at night is a borderline death sentence. The sound design of the game needs to convey that.
As I begin the foray into sfx and more music, I'll post more tracks and concepts as they come. Excited to be working in the music space again, and hoping I learn more as I go to make an inspiring soundtrack to explore the world with.
Posted on February 11, 2017 at 21:45
Reaching the right level of mechanics in my game has been an interesting ride so far, and I'm nowhere near a "done" state. I started development with the ideas in mind on how things would interact, and how the basic gameplay would work. Beyond changing up controls, I've been tweaking mechanics to make sure they work how I'd like.
I still have a lot to do, especially towards creating enemies and environments that cultivate a game that is fun
and not just a giant cheesefest. I want to ensure that the mechanics of the game, combined with the level design, enemy design and spell design work together to create a system where the player is always enjoying their time playing against the game. Turns out that is real hard to do.
There are some high level mechanics decisions, like "what kind of power will spells give?" or "what can items do?" as well as some more niche things, like "what should the inventory size be such that its just restrictive enough to require some thought?"
Then, there's even deeper mechanics decisions. I'm talking stuff about the nearly-invisible-to-the-player restrictions that make the game work a certain way. A good example for this kind of decision I've implemented in my game are cast durations.
If you've played a game like DotA, you may be familiar with Cast Animations. A cast animation is, funnily enough, not an animation, but the amount of time it takes for an ability to be used. An ability may take .1 seconds to activate, then have a .6 second "backswing" time where you also can't perform anything. This helps to balance things out such that you aren't able to just drop four abilities down in one frame and wreck face.
At first, my game allowed for just that. I found myself strolling around, dumping out spells like a fountain. Beefing up enemies didn't make my time in the game more enjoyable, it just made me find more ways to run in circles casting the same spells for longer.
To mend this, I've implemented slight windows where no spells can be cast after casting a given spell. It differs for each spell, based on the power of the spell, what it is even doing, and if there is some kind of prolonged effect. The goal being to give some sort of meaning to pressing the "cast" button. I need to be sure about what spell I want to use. Beyond putting it on cooldown, I need to know that if I cast this spell, I will have a few frames of total vulnerability before I can do something else.
To the 99 percent of people who would play this (oh man, I'd love for 99 people to play it ever
), the concept of cast animations would be totally invisible. If I did my job right, it just looks natural and nobody would think anything of it. But I hope that someone out there who would play this game will enjoy this small addition for what it adds to the game: pace in fighting, and more dynamic spell loadouts.
More to come soon. TM.