I had a lot of fun last weekend with my game Cardinal Cell. It was pretty fun in the end but it was ugly enough to make babies cry because I cobbled together the art on my own. I could have maybe increased the quality another quarter-point on my own before finishing off the 48 hours… I could have chosen a style. I could have smoothed out the busy textures. However, I was focused on closing the book with features-features-features.
I’m pretty confident that it was a mistake on my part… while I go through other people’s games I constantly have to tell myself to not let an ugly game influence my assessment of its fun… or let a pretty game get away with dull gameplay. Maybe it’s not fair, but that’s the way the world works. Those of us with weaker art skills have a challenge to overcome.
Because the game looked so bad I did a quick reskin this weekend to use some pixel art and audio that I had handy. I think the gameplay stands well on its own, but the revamp makes a difference in my opinion. A friend offered up some real art and we’re going to rebrand it as… wait for it… Skate Knight.
If you’re interested in seeing what a few hours of stock graphics and sounds can do for a game, check out the game on itch.io below.
In a frenzied less-than-48 hours I cobbled together an entry into this weekend’s Ludum Dare. I’d been wanting to play with the idea of fantasy battles using the mechanics of 2048. The result isn’t pretty, but I do Ludum Dares primarily so I can doodle on an idea without giving a damn about how ugly it comes out. 🙂
After a night of heavy drinking in a foreign land, you are captured by local law enforcement and forced to stand trial for heinous crimes you have no memory of. You are sentenced to 24 hours in the CARDINAL CELL. If you survive, you will be set free. The help of your former drinking buddies is the only assistance you can hope for… because the Constable is rounding them up and throwing them in after you.
Click on the image to give it a shot and enjoy! Maybe even throw me a vote… 😉
Another big gap between the last update and this one. Part of it was a good thing (two-week vacation to Japan) and part of it was a bad thing (two weeks of airport-spawned sickness after going to Japan). Then for the last month I continued to purge that damn technical debt.
It turns out there were a lot of things that the game generated (including things I wrote this summer when creating the overworld) that was mired in sub-awesome way of storing things. I can’t say things are perfect now, but my Perforce tree is starting to fill up with all the datafiles I can now create, search and copy to my heart’s content.
The datafile system (again, inspired by the one used in Dungeonmans) allows me to use tables to reference other tables, as well as arbitraily roll dice for whatever I want. I still have entities to squeeze into the system but I think everything else is in a pretty good state. Now I just have to train Notepad++ to parse them just a hair better and I’ll be in a great place for editing.
One thing I won’t be converting into text files is the Patch System I wrote for my initial attempt to create cities. I wrote that system to integrate well into the entity editor, and I can drop in a bunch of tiles into an object and then drag the object right into an info panel to bake it out. I’m not great at tools but I’m pretty happy with that one. I’ve only just started to fill out variety with it but I think it can produce some really crafted setpieces in the midst of the pile of procgen that a Roguelike generally has.
Coming back to working on the generation of a quality city, I decided to double down on the value of Patches and try a generation system that capitalizes on it. We colloquially call it the “Crown Royal bag” method, once again inspired by Dungeonmans (Jim mentioned in his talk at last year’s international Roguelike conference). It was actually first written about by Mike Anderson on RogueBasin. The idea is to keep a list of all your legal walls that can hold doors in a list and draw randomly. Pick one of those walls and consider busting a door into the side. Then pull a precrafted “room” from your virtual Crown Royal bag at random and see if it fits onto that particular doorway. If it doesn’t fit, throw it out and start over. For hundreds of draws you might only place 40-50.
There are number of issues using this for a city. First of all, as you can see here, my tiles are created with entrances and exits built in… I had to create an entrance and exit tagging system to figure out what tiles were valid connections to each exit. That wasn’t too hard luckily, although I have to create connections now for single-lane roads and just plain asphalt and dirt, which are more interesting alleys and short cuts than the core big, two-lane roads.
Second, the technique basically creates a tree rather than a nice, playable dungeon with loops. I’ve got a ton of ugly dead ends and roads that lead up to other roads but don’t connect. It’s important for the proper feel that intersections look right and create nice setpieces with crosswalks and driveways and stop signs and such. To accommodate this I need a more sophisticated system, in particular a way to overlay roads onto other roads and have them convert to intersections. That actually means that I’d be heading into creating a road link system instead of relying on handcrafted patches, but I think I can integrate some smart tagging on my tiles to handle this.
The battle continues… Trust it’ll look better soon.
Yes, Technical Debt is still rearing its ugly head. One of the things that any procedurally-generated Roguelike has is a ton of different files that hold profiles that define how to generate cities, landscapes and enemy encounters. And tables, so many randomized tables!
During the 7DRL I found an expedient solution that worked for the challenge and a fair amount of time afterwards. I baked data right into each Unity scene that I saved out, imagining that I could just make a scene for each type of scenario or terrain profile I wanted. I could bake in components that had all the predefined information I needed and just load them as needed. I could even drag-n-drop the appropriate prefabs for everything I wanted to spawn. How simple. Sure, it nagged at me that it wasn’t super extensible, but scenes were cheap to make and I was interested in how far it could get me.
Wellll, it turned out it was pretty far, but eventually it started to haunt me. The more scenes there were, the harder they all were to maintain, even if all the common information was kept in Unity prefabs. Oh god, the prefabs… they are great sometimes, but they also can puke all over themselves if I moved files around or a metafile got invalidated somehow. Also, any time I wanted to choose something randomly, it felt like I was writing new code to deal with it each time.
I also used the serializer for a number of structures, but there was always a desire to have more flexibility when reading data.
Anyway, I knew I needed to up my datafile game. My friend Jim’s amazing RL Dungeonmans has something like 500+ datafiles holding anything from name generation to encounters to tile definitions, with weighted randomization tables and tables that reference other tables. How slick! He spent many years refining his data methods and he encouraged us to reuse his approach in our own games.
So last weekend I finally bit the bullet and built a datafile system around some of the same concepts and in the end my format is virtually the same as Dmans. This way I can build a sector with a pretty flexible format:
And these tables have some handy reference capabilities (recursing through each table referenced) and weighting for randomized results:
"The [t1] of [t2]" 10
"The [t3] [t1]" 10
"The [t1] of [t3] [t2]" 10
…and bingo, my world generation becomes 10x more flexible and powerful. I’m dyin’ to get back to the drive-shoot stuff, but this was so worth it.
The Unity Asset Store is a great temptation at all times, cleverly one click from my development environment. When you’re stuck in the dregs of some less-than-glamorous code snarl, it becomes the devil. An Asset Store 24-hour sale are basically late-night Ronco TV ads for game developers. Just 10 bucks for the next 2 days! 30% off! But hey, this might be just the thing your game needs to be awesome…
Recently I bought a Volumetric Clouds package, hoping that I could get some cool, turbulent cloud cover with shadows over my landscape as the player wanders around. Looks pretty good, but my poor frame rate just couldn’t handle it, especially at high resolutions.
The solution involves a sweet technique of rendering many layers of a noise texture so it piles into a volumetric shape. It seems to run pretty well for ground scenes looking up at the sky, but for my particular situation it didn’t quite fit. Maybe I can’t use it for Auto Fire, but it’s a clever enough solution that looks great in a lot of cases, so I don’t feel too bad supporting the creator.
I don’t want to obscure the map features anyway, so just shadows would probably do the trick. I might be able to do an extremely cheap version of the shadows with some some screen space projection instead… but there are a hundred other things to do first.
I stumbled on another Unity sale recently that dangled a plugin called Beautify in front of me. “Add a pro look! Punch up your colors! See the detail!” I couldn’t help but bite, because I’m always wondering what I can do to eliminate the muddiness that I sometimes get with Unity, especially when I shrink assets that are intended to be experienced at realistic sizes.
A good chunk of what Beautify does is apply a sharpen post-process, along with some LUT’s to enhance some coloring. I must admit there’s an appeal to seeing those shrunken assets appear sharper against the terrain or ground surfaces. (You’ll probably have to click to see the difference).
It punches everything up and everything gets a nice feel in comparison. However, it uses a sharpen filter, so I have to balance its use versus all the work built-in antialiasing does. So, while it helps eliminate some of the muddy appearance (something I equate with unpolished products), it adds a lot of shimmer and harsh pixels (something I equate with unpolished engines). In the end I probably just need some lighting help from a real artist. 🙂
Anyway, I can turn down the sharpen or nix it if I want, which is good because I like the results Beautify gives me with color. It’s also got sweet bonus night vision and thermal views.
Nonetheless, I’m still looking for the right combination of lighting and filters to attain the pro look I’m after. The quest continues… and my wallet fears the night.
I’ve had some pretty great results so far with generating my terrain and dynamically placing road decals as needed. The Easy Decal 3D solution ended up being pretty great. The folk at &u Assets were super-helpful, and with clever use of their baking and decal combine features my roads went from 20 fps to 200 fps. So, basically solved, and it’s worked out pretty well for putting interesting terrain features when staring down at splat-mapped Unity terrain starts to get tiresome.
I feel pretty good about the look and feel of my overworld, as well as the scale (which was a concern since it’s extremely exaggerated, even though I wanted a gritty feel). I still have a ways to go before I can finish up my core loop and release a build, but things have leveled up a fair amount.
I know it’s been a while since I’ve updated, but there hasn’t been a lot going on that’s particularly showable. My Perforce checkins show that in the past few months I have…
Used a landscape generation tool called Gaia to generate custom baked landscapes that I can use for specific locales or pre-constructed sections of the overworld.
Created a home base area for the player to start in.
Project movement grid information on the ground to help navigate some areas. I’ll still work on making sure that they are clearly traversable.
Added characters from Fuse in there, using some of the pretty good tools to grab some animations and basic clothing setups.
Enlisted the help of my wife Sandra to help get some characters together! Nice being able to construct characters as easily as you would in a game like Skyrim. And so far it’s free (knock on wood).
I’m still considering how I want to show characters in general. I liked having them when I had a 2D game because it was easy to see what everybody was, but by going 3D I’m going to have some trouble with parseability. I’m already scaling things up larger-than-life, but even more might be needed for humans.
Got together some basic quest granting, as well as a main stats screen for players to track the quests they’re on.
I also realized that I probably didn’t want a traditional quest system… I’m not out to make Wasteland 3 or anything. So, I’ve got the system but I’ll be working on evolving it to work even better with generated content.
Started thinking harder about the overworld experience. There’s a lot of back and forth that happened here… very briefly I thought about creating only one overworld zone and generating only content within. However, performance considerations, as well as the interesting gameplay that can happen in the overworld, I decided to break it into sectors that include both generated and prebuilt areas.
Started to move towards the exaggerated scale I want to hit with chunky buildings and roads, but areas on the map with interesting states to deal with.
Experimented with a number of ways to put roads on a generated terrain mesh, and so far have settled on Easy Decal 3D, which is a bit quirky but that’s pretty standard with Unity asset bundles. I think it has a good set of features and make it run performant, if I can just work around some of the funky bits.
I’m hoping this approach will work. It is the most dynamic, and would hold up best for generated terrain, but it’s also eaten a good chunk out of my frame rate and needs optimization.
This is all on top of investigation, data loading/saving, performance, and other things. Hmm. So yeah, I guess I was actually pretty busy over July. Still hoping to get back to working on city combat stuff soon.