Engine graph // Reward production update
about 3 years ago
– Sun, Jun 04, 2023 at 08:55:05 PM
OK I promise that someday these updates will start showing gameplay and not just graphs + product updates... but we're not quite there yet. 😅
Burn it down, start again
Step #1 of post-Kickstarter production was to start over in a new codebase. If we're going to be spending the next ~2-3 years on this, I want the foundation to be rock-solid. We can borrow a lot of the logic from the demo so it will go a lot faster the second time, but the the new structure 100% needs to be rebuilt from ground up. The demo did its job; it got us over the finish line; it is now time to burn it down and start again.
Behold! A chart!
And it's going great! I've been quietly plucking away at it since the start of the Kickstarter, and this chart shows the current state of that foundation. I might be getting ahead of myself but I'm super happy with how clean it is. Godot 4.0, which officially released on the same day our Kickstarter launched, gives several critical tools that makes this architecture possible; most notably custom resources and the "await" keyword.
There are three main layers to this organization.
The top layer is composed of stateless resources with predefined stats and functions. This is where most of the logic for lancer's rules live — stats for weapons, scripts for tech actions, the sequence of an attack. For example, an assault rifle attack action up here can be given an attacking unit and a targeted unit and will carry the attack and do the appropriate amount of damage to the given target. But when it's done, it forgets everything; this is what "stateless" means. If it ever needs some kind of decision from the player, such as whether to consume a lock-on, it simply broadcasts a signal via a bus and "awaits" a response, pausing its execution until a signal comes back from somewhere that a decision has been made.
The middle layer is composed of lightweight resources that hold any kind of state that we want to persist between scenes or in a save file. A pilot's name, the gear they have equipped, ammo remaining, or a mech's hit points all live in the "cores". Their task is only to hold and organize data — running logic to change data values (such as doing damage) is the job of the top layer. A core wants to be able to be plugged into anything on the bottom layer and provide everything that node needs to show it off.
The bottom layer is, generally, stuff that you can actually see. It has tons of temporary state information like which pixel to draw a sprite at or whether a dialogue window is open or closed — nothing that we'd care about storing to a save game file. When an action broadcasts a signal asking for a choice to be made, it's some UI element down here that will wake up, show itself, and respond with its own signal broadcasted back up into the sky. The UI down here can also read the available actions from the middle layer and are what kick off events and actions in the first place.
If I may speak poetically for a moment, each of the layers have very different feelings when I work with them. The stateless resources up top layer feel ethereal and heavenly, unmarred by the march of time. The nodes at the bottom feel solid and earthy — they're temporary, but handle all of the dirty business of being a player's interface. The stateful resources in the middle feel like souls or ghosts; unlike the other two layers they have long memories, but by themselves they are inert and unchanging.
Unit + integration tests
Putting the above together, I've had my head in code-land; most of my work the last few weeks have been in the middle and top layers. Without a bottom layer, there's not much to actually see. How can we tell the the whole thing is working as intended? As you might guess from that header text, the answer is by using unit + integration tests.
These are bits of code that are just there to automatically run parts of the engine and check to see if they behaved as expected. I've never written them for a game before now (in favor of just running it and testing stuff manually) ... and even just two weeks into having tests, I take back everything I ever said about them not being needed for games. They rule, and will be especially helpful for such a rules-heavy system like Lancer.
I'm getting ahead of myself. This is what a basic test looks like:
- set up a dummy target with the properties we're interested in testing (in this case, armor)
- check that it starts with full health
- make a test attack against it
- check that it took some damage
With this in place, from now to the end of the project we can can confidently make changes to the engine and be sure that it won't secretly break the the ability of armor-piercing weapons to ignore armor. When you have enough tests that check other situations (for example, one where a regular weapon does not ignore armor), you can catch bugs before they even really become bugs.
Thinking about how many tests to write and what they're testing is a whole skill in of itself, but even covering the basic actions of the engine mean that I can say with a high degree of confidence that the whole engine up there is working before we've drawn a single mech on the screen.
Coin
We got a coin prototype!!!
It's a lot heavier and thicker than we were expecting — to the point where it being too dangerous to flip because it'll like crater someone's table is an ongoing concern.
After some field testing / asking uninterested parties, we're going to get a second proof made with some changes:
- Plating it in antique silver rather than copper, just to see how it feels.
- Increasing the size from 1.25in diameter to 1.5in diameter. This increases it to the size of coin that is flipped at the start of sports matches, so flipping should still be possible... if dangerous.
- Substantially altering how the Lich appears. Our focus group thought it was some kind of spaceship cresting over a cliff with the sun in the background (primed with the star-trek-like logo). I've redesigned it so more of the figure is visible and it's less of a blobby silhouette (this is only possible with the increased diameter, as well):
The focus group also couldn't decide between which side of the coin was heads vs tails, so I hope that the increased difference in background/foreground area between the Lich and Horus logo helps to distinguish the two sides. The turnaround on these prototypes seem to be about a month and a half, so that's probably when we'll see how this next one turns out.
Sticker Tweaks
There's a few more changes I'd like to see for the stickers, as well — getting the SSC moth kaliedoscope to be full-bleed rather than having a solid yellow line around the edge, and adding a bunch more faint computery greebles in the background of the Horus one. I'll post pictures when I get the new ones in hand.
Shipping Update
We're still talking to shipping/fulfillment companies. It's looking more and more likely that we'll have to settle for shipping the stickers and coins separately — it would cost more to ship them together and combine them than just have a company handle the coins and pack the stickers ourselves in our living rooms. If the company stuff totally falls through, we may end up doing both ourselves, though.
Moving + Travel
Finally, I have a day-job workweek coming up next week, and then will be busy moving houses for the back half of June, so development is going to be slow this month. It also looks like I'll also be visiting Berlin / UK / Ireland in September... anyone know of any cool rocks to see there?
🌺 Olive
Sticker Proofs! (and fill out your surveys)
about 3 years ago
– Mon, May 15, 2023 at 12:06:17 PM
The stickers have arrived!
The test batch has come through ~ beautifully ~. The IPS-N one feels like a starry night leading you home, SSC's evokes a sense of fractal computational mystery, HA is huuuuge and in-your-face, and the trans dabbing goblin is just having a great time.
Honestly, looking back on the HORUS design, the glow-in-the-dark is a neat trick but I feel like it's pretty clear it was the first of the batch. I think the design could be spruced up a little to match the level of visual interest of its newer compatriots. So I'll be likely doing some light revisions there before putting in the full order. Between that and a few other notes (I think the SSC outside yellow ring could be shrunk to make the inner design larger), I expect to be putting in the full sticker order by the end of the month.
Other project updates:
- We're at 87% survey completion; if you haven't done so, please check your email for a message from Backerkit! You can always change your address later if you need to.
- We've placed an order for a proof of the metal coin. No ETA on that yet.
- In talks with fulfillment companies to get quotes and time estimates on possible shipping solutions.
- We've spent the last month doing pre-production work: sketching out timelines, spreadsheets, etc.
As an example of this set-up work, I spent the weekend setting up our system for managing localizations and text. If you think you might ever possibly want to localize your game into different languages, this is absolutely something you have to be prepared for from the start. Nobody wants to have to hunt through a finished game's files for every bit of hardcoded text.
After consulting with friends and peers who have done this before, I ended up with a system that downloads keys + translations from Google Sheets and compiles them into a single big .csv for the engine to populate the game with. It can also scan the project for anything that looks like a translatable key and upload them back to the appropriate page in the sheet. It might not be flashy, but I think it's super nifty and is going to make our jobs a lot easier in the long run.
Commission info for custom mech/pilot art
about 3 years ago
– Mon, Apr 24, 2023 at 11:53:55 AM
This post is for backers only. Please visit Kickstarter.com and log in to read.
Backer surveys going out soon
about 3 years ago
– Mon, Apr 24, 2023 at 11:48:53 AM
This post is for backers only. Please visit Kickstarter.com and log in to read.
Dia Lacina will be writing the second campaign! // Stream Q&A // Hi-res sticker files
about 3 years ago
– Mon, Apr 24, 2023 at 11:46:04 AM
Dia Lacina!
I'm pleased as punch to announce that Dia Lacina has agreed to write the second stretch-goal campaign!
Dia Lacina is a writer, photographer, and cultural critic living in Philadelphia with her partner and over 100 plants. She's previously been published in WIRED, Waypoint, Wireframe, and elsewhere, and is a frequent contributor to Paste Magazine. When she's not writing she can be found guesting on podcasts and recording Let's Plays.
You can follow her on Twitter @dialacina and her other platforms here.
Stream Q&A
Here are the questions and answers from the campaign's closing stream that I promised to write up summaries for!
Sagarmatha / Chomolungma / mechs from other supplements?
If we end up running into easy pick-me-ups (like the Kobold already being mostly done) we're likely to do them, but I continue to wielding the sword of "that's out of scope! no promises!" with extreme prejudice. We're going to focus on the core game first and do our best to leave the door open to further expansions rather than bite off more than we can chew all at once.
Most annoying mech to program? Funnest?
We spent a long time talking about this on-stream, but the one that has stuck with me really has gotta be the Death's Head. Its damn +1 to attack rolls is the only time a build-specific bonus like that ever shows up and means we need to account for that possibility in a general sense throughout the whole attack roll subroutine. All for a dinky little +5% goodie bag.
The funnest thing to program... I'm hoping will be the drone-bonanza that comes with the Hydra. That seems like it'll be one of those emergent-property things where we set the base rules and there'll be cool and complicated gameplay implications that kind of grow out of it.
Large text // accessibility options?
Yes!! Adding as many accessibility options as we can is a cornerstone of our project pillar of making this game as queer as possible. I'm no expert, but I frequently refer to these game accessibility guidelines. Curb-cut effects also rule.
How did I come to like Lancer enough to make a game?
Pandemic campaign, baybeeee. It's also the first TTRPG that has really filled the mix & match mechanic hole in my heart left by MtG since I had to go cold turkey on that.
Speedrunning?
It's sometimes fun to think about how a speedrunner might approach a scenario after the fact, but we're not specifically designing for them. In my understanding, designing for speedrunners kind of undermines the philosophy of them pushing the game to its unintended limits.
What would be your favorite mech to pilot?
My answer to this will change depending on whatever build/OC I'm fixated on at that point, but currently I've got a special place in my heart for a defender Duskwing/Saladin. I just wanna fly around and be a master of airspace kinetics.
Why did we show the stats & analyses behind the campaign?
It's a habit I've picked up during my previous campaigns and my creative peers. Being transparent helps everybody; doing writeups a practice helps me process and understand what happened, provides Content for the Content mill, and I think can be genuinely interesting and valuable to read as a backer. It also helps set a tone of getting folks a realistic view of what goes into making games, which means that if/when unexpected things happen and we need to make adjustments to what we're going to deliver, folks are better situated to understand.
Also, it's like the least I can do if we're gonna be engaging in this shadow market of user tracking and advertising!! It would feel weird to me to have that kind of tracking data and keep it hidden? ALSO since people were kind enough to fill out the "how did you get here" surveys, I feel like it would be rude to not close the loop on that and share how it turned out!
How do you feel about the success of the campaign? Unexpected?
"Well, I guess that happened, neat! Time to roll up our sleeves and get to work."
The biggest "oh heck" moment was the day before we went live when we got 700 signups to be notified on launch after a tiny announcement post. It became clear there was a Hunger for this and we battened down the stretch-goal hatches just in time to make absolutely sure we'd be able to pull them all off.
Modding / custom tilesets?
Modding is an unofficial goal! I think it's essential for the long-term health of the project, but since we haven't done it before in Godot I'm just very skittish about promising it as part of this initial chunk of work.
Prefer to be pilot or GM?
Playing as a pilot is definitely less responsibility! I've learned to enjoy GMing as kind of a zoomed-out separate game where I'm trying to maintain an even amount of mechanical pressure rather than pushing my mech to its absolute limits.
How do you find the time to do this?
I've lucked into a great day-job situation where I have enough flexibility to work on side-project like setting all this up while also making rent. Motivation-wise, I dunno, something something hyperfixation and working on projects like this is what I've spent the last decade setting up a lot of my life and habits to support. My brain really likes latching onto projects where there's always more stuff to do, so a lot of that habit-work has been setting up structures to be able to do that sustainably & healthily.
Programming languages?
Mostly gdscript! It rules. C# for performance-dependent things like line-of-sight algorithm.
How to handle Brace / Swallowtail core?
Good question! We may end up tweaking how they work mechanically, such as having brace only trigger on being structured, which is where you see it applied like 85% of the time anyway. One of the few TBD mechanics that will require tweaking in the port.
Community page or discord?
I hella don't want to do more community management work than I have to, so unless we start making hire-a-community-manager money, the PilotNET discord and the itch.io forums are going to be the primary community focal points.
Digital sticker designs
As promised, here are hi-res digital versions of the four corpo stickers, released here under the CC BY-NC 3.0 license. (The trans dabbing goblin isn't included because it's not my art or design.)