Archive

Monthly Archives: March 2016

EveHeader

This week I developed a very simple but powerful addition to the tile editor: Channel toggles. Each tile in a level holds three values, the collision shape of the tile, the graphics bank to draw from, and the index of the tile to draw from the graphics bank. Now that I have channel toggles, I can choose to only draw over one of those at a time in the level editor. Why is that so powerful? Let’s look at a few test cases.

Say, for instance, I want to create a secret passage. This would look like a normal chunk of level, but have a different collision body than the graphics would suggest. Before, i could do this by going in and replacing each tile individually with the same tile with a different collision value – not a big deal if all the tiles are the same, but a huge pain in the butt if it’s a bunch of different tile shapes that I need to select, modify, and set again individually. Now, I can just turn on only the collision channel and erase just the collision value of all the blocks in the passage, and pretty much instantly have something serviceable. A similar variant on this process has already come up: After a bit of testing, I realized that the grass tiles I’ve been working on would actually look a lot better if the top surface was offset a tile or two from where the top tiles look like they are, so that it looks like the character is running through the grass rather than on top of it. Using channel toggles, I could just toggle only the collision data, select the top of the grass, and move everything down one tile and instantly achieve that effect.

That’s just the collision channel. The secret tunnel problem could be solved in reverse as well, if I have an existing tunnel that I just want to make secret, by turning off the collision channel and leaving the other two on while I draw detail over the tunnel entrance. By using just the tile bank channel, I can quickly change the look of an area: With one draw I can change a section of grass to dirt, or dirt to stone. There are probably more applications of the tool that just aren’t occurring to me now. For a relatively minor change to the tile editor, this makes a big difference.

I’ve also started work on a pattern fill tool, for filling in big areas with a repeating fill of similar but different tiles so that I can avoid just using one tile over and over and looking too repetitious. If it goes well then it should be done later today, if not then tomorrow or something.

Aside from changes to the editor, I’ve been working on the grass tileset again. This may not actually have been a great tileset to focus on for my first one, because it’s turning out to be weird in a lot of ways. I’ve created a set of sort of pseudo-foreground tiles now that really help give the impression of rolling hills, and which there probably won’t be anything analogous to in any other tileset. Between that and the overall softness of shading and jaggedness of outline, there’s a lot of special challenges and special tricks to overcome those challenges with this tileset that, while educational, probably constitutes a very different process to that I’ll be using on other tilesets. Anyway, it’s getting very close to finished now, and along with the collision tweaks and foreground tiles mentioned above is starting to look pretty cool I think.

GrassTiles00

Still not perfect, but getting there. I’ll probably leave it basically here for a while and try to get the other area 1-1 tilesets done: Dirt, stone, and wood. It’s also probably getting to be time to start considering creating final animations for the player character, though I still need to do a bit of debugging on AnxEdit before I’ll be completely comfortable using it for important game work.

Since I had AnxEdit at a pretty good stopping point and since it’s been something I wanted to do for a while, I spent some time this week getting a new website up and running. I’m not quite ready to take it live yet, but eventually it will replace this site as my primary host for all of my writing and other media. Though there’s not a lot to say about it here, getting this site made is actually where I spent a lot of my effort over the last week, along with finally getting my code hosted on an external repository (on gitlab.com) so that even if I lose my laptop or something I don’t have to worry about losing progress on the project.

All in all, pretty good progress. Next week, more tilesets, finish up all the most worrisome bugs and missing features in AnxEdit, and get the website live.

But-nobody-came

I played Undertale and I’m not sure if I’m going to actually be able to write about it. It’s a remarkable game, but I don’t know what to remark. I guess I’ll try, even though I’m sure people have written a gajillion essays and I’ve probably totally missed the boat.

After getting the ‘good’ ending, I started a new run through the game to see what was up with the, um, less good endings, and was disturbed enough by the process that I just aborted my run and looked up what happens, which revealed to me both that I hadn’t been nearly brutal enough to get the darkest ending and, moreover, confirmed to me that I wasn’t willing to be that brutal.

Despite containing no blood or explicit violence, this weird indie RPG gets closer to the truth of violence than any other game I’ve seen. The reality of violence is that someone who was there isn’t there any more, that the world becomes deader and quieter because you’ve fundamentally broken a part of it that worked before… Yet violence is also intrinsically appealing, because it’s a way to push against the world directly, a way to effect change regardless of whether it’s acceptable to others, a way to feel strong, a way to overcome concrete challenges. Simple solutions to complex problems, cutting knots, not actually easier but stronger, more decisive, more quantifiable.

A weapon is one way to change the world, it just usually does so by making it emptier.

Sometimes that’s the way it goes anyway. Sometimes violence is necessary. Sometimes there’s no time, or communications break down, or it really is you or me and it’s not gonna be me. Not often, not nearly as often as we like to pretend it is, but sometimes. That’s just how it goes. But it’s nice to at least acknowledge, for once, that our violence has effects beyond the immediate, that our world is impoverished by the absence of a living, breathing, thinking process that once inhabited it. Maybe that seems trite, but if it’s so trite then why do I so rarely actually see it in the stories we tell about violence?

Anyway.

It might be a parable about violence and its consequences, or it might be not about that at all. It’s not really a game about violence, just a game that responds to violence in an uncannily truthful way. It’s no more about violence than it is about cool skeletons or fish lesbians or fear of the unknown or the anger of the oppressed. You can make it about those things, I suppose, but that’s just as much what you take with you as what’s there.

And that’s just it. Undertale is expansive, it pushes against its boundaries in surprising and unexpected ways. It’s a short game, but packed so full of detail and possibility that it’s hard to pick any one thing to really talk about. No other experience has taken me on this ride from hilarious character-based comedy to deeply unsettling introspection to alternately intriguing and terrifying blurring of where the boundaries of the game lie. It’s…

Well. It’s really something. I guess that’s all I can say, though I’m sure it will come up in other specific contexts later.

It’s not an experience I’ll be forgetting any time soon, that’s for sure.

EveHeader

This week was mostly just working on the grass tileset, small tweaks to make the transitions seamless, big tweaks to give more of a sense of light and atmosphere. While I had directional lighting in mind a bit with the previous versions of the tileset, I became dissatisfied with the look of them since the difference between the tiles that were supposed to be facing the light and those that weren’t were so subtle and, well, kind of boring. Pretty much all of the tiles have been redrawn, now, to provide a stronger sense of directional light and dark. One of the interesting results of this is that I need more transitional tiles for one side than I do for the other now, which left me with whole blocks of tiles in the template that are now basically open for me to do whatever I want with, something that will probably be very handy indeed as I create additional tile sets.

To help me develop tilesets, I’ve created a little chunk of level I call the Rude Lemon:

RudeLemon02

I created this to be a chunk of terrain that contains every different kind of slope and transitional tile, and ended up with a kind of amusing shape just by happenstance. Here you can see the changes I’ve been working on: As I said, much stronger directional lighting coming from the upper right, with cyan highlights that give a kind of surreal otherworldly feeling I rather like. There’s a few seams visible if you look closely, and the repetition of the tiles in the filled in areas is a bit noticeable, but I have some ideas as to how to approach those problems. Now that I’m getting the hang of this light/dark/shadow/highlight breakdown through the tileset, I’m working on copying this style back to the template set so that I can easily maintain consistency through to the other tilesets.

On the more technical side, I used AnxEdit’s new recompiler tool to rebuild all of the main character’s animations into sprite sheets. Unfortunately this didn’t translate into the much faster start times I was hoping for: Though it does mean the animations load faster, it turns out the requests for the graphics assets are just as responsible for the slowdown as the actual loading, and that remains an issue whether it’s requesting a thousand different image resources or requesting the same image resource a thousand times. There may be a way to make requests process faster, or to make it so they don’t all happen at once and the less vital requests can be deferred long enough that they don’t slow things down, or possibly a way to shortcut unnecessary redundant resource requests, but in the meanwhile the game still takes 10 seconds or so to start up – not terrible, maybe, but long enough to bog down rapid iteration when there’s something I need to test.

The recompiler tool is functional, though it seems to be slightly buggy: Some of the created animations are generated with an extra, empty frame. Whether that frame is empty because the data it’s supposed to contain got cropped out of the generated image or because it was created extraneously is something I’ll have to dig in and find out pretty soon, since a chopped out frame is much harder to fix than an extra frame that I have to delete. With that tool basically working, though, I went in and got undo/redo functionality all set up, though it too awaits further testing before I can confirm it as entirely reliable. I had originally planned on having an export to animated gif function as well, but the more I think about it the more that feels like a waste of time, since the only reason I’d want them is to post them online and since I’ll probably be drawing the animations in other programs which can export gifs much more easily, there’s really no reason to have support for that in this tool itself. Since it turns out I don’t want to bother with that shit, AnxEdit is basically feature-complete now. As mentioned last week, that doesn’t make it done: I’ll probably be spending another 2-3 weeks fixing bugs, improving the UI, and testing it out, but it is basically complete. So that’s good.

The next week will be more work on the template to get it to match the lighting model of this grass tileset, some more time polishing and detailing the grass tiles (they look alright now but not quite up to the standard I want to set), and a few improvements to the tile editor that have been burning a hole in my brain pocket. If all that goes well, I may start in on the stone and dirt tilesets as well.

bread

We’re surrounded. Surrounded by art, ambushed by narrative, pinned in place by poetry. Art in the age of mass production has become ubiquitous, and in its omnipresence has become invisible. We tell stories – yes, through novels and through television shows, but also through the news and through math textbooks and through the tales we tell ourselves about how the world really works.

We’ve become very good at it.

We’re very convincing.

Very compelling.

Through practice, we’ve mastered certain formulas of narrative. Heroes’ journeys, struggles of good against evil, sex and violence, truth and beauty. They’re the stories we know, so they’re the stories we tell, whether or not they’re accurate. And all that would be fine, except we’ve lost track of where they start and end. We need to tell each other things, to communicate, so we can survive, but the guiding form of our narrative structure shapes those words out of our mouths, adds an element of aesthetically pleasing but ultimately distracting noise. Modern televisions, with their up-scaled resolutions and noise reductions making everything look too smooth, too pretty, too waxy, subtly wrong in ways so common that they become right, supplanting our images of what our skins actually look like.

We have people who think that because they’ve beaten a hard video game they know what it is to overcome adversity, people who justify war crimes based on scenarios they saw on television, people who believe the best will happen, the worst will be avoided, because the world is written to have a happy ending. We’ve created fake challenges, fake justifications for fake violence, fake saccharine happiness, and these things are fine and they serve a purpose but they cannot be all we get, we cannot live on bread alone. No matter how you shape bread, it’s still just bread.

Even though we all have, to varying degrees, felt real terror, felt real oppression, real pain, real sorrow, so often we turn these into stories, narratives about who we are and where we’re going, the ultimate triumph of justice, our undeniable status as the heroes of our story. Sometimes it’s necessary, sometimes we need to wrap the fresh wounds in a bandage of narrative – but we lose flexibility. It becomes easy to mistake the crutch for the leg, and go on limping long after we might have healed.

Maybe this is just the new outfit of an old habit. Perhaps the news and the movies and the games and the novels are just a new way of telling ourselves the same reassuring stories we always have, supplanting oral traditions and religious teachings, shaping for us a story of the way to be, the way to struggle, the way to transcend. Maybe this is just a new way to tell an old story.

But this time we want a happy ending. We want clear heroes and villains and we want a nice three act structure. We want meaningless sex and justified violence. We want it all wrapped up, nice and tight, nix the begats, forget the boring stuff. Just bread, please.

EveHeader

This time last week I was adding detail to areas, trying to build out something that felt kind of finished and polished. This week I found out why you don’t want to do that until you’re working with at least somewhat finalized assets! Basically, after some time developing the first grass tileset, I came to understand some big limitations in the way I’d laid out the tile template. Unfortunately, since the collision system for the game is supposed to match the template, that meant I had to spend a few hours tweaking the template, then some time updating all the collision data, then update the levels to match the new tiles. Well, I didn’t actually do that last one yet, since I don’t want to make the same mistake twice: I’m not going to try to build finished levels until I’m sure I have a tileset that will work.

The good news is I think I’m getting close to one.

tiletest0100

So there’s still a few issues, but lets look past them for a moment. The most important point with this tileset is that it’s generally separated out into light areas and dark areas. This is a way to make the playable area visually distinct from background areas – or, actually, foreground areas I guess. The tricky part is that now, rather than just making a nice grass texture for all the tiles, I need to consider how it transitions from light areas to dark areas. I’m still working on this to some extent, but certain rules start emerging: First, the two brightest shades of green are only for use on actual external collision blocks, the ones the character is likely to actually make contact with. This means that all of the internal collision blocks are either transitional blocks, partially light and partially dark, or entirely dark. These rules had to be established before I could do anything close to a finished tileset. What’s interesting is that, though I’d planned all along to have transitional tilesets for interactions between dirt and grass, grass and stone, etc, it turns out pretty much all of the tilesets are going to be transitional, just transitioning between different focus layers of the same material.

There’s still some problems. If you look closely there are sections that clearly don’t transition well here, and the solid area of non-playable grass at the bottom shows a lot of obvious tiling, but that’s all stuff that I can address by tweaking the specific tiles. It’s, honestly, probably going to be a lot of work: I expect I’ll spend most of next week working on this tileset, tweaking, improving… Not just building graphics assets, but building the rules I’m using to create the graphics assets. It may take a while, but the work I’m doing here isn’t just for grass tiles, it’s for all the tiles in the game.

Meanwhile, AnxEdit is progressing quite rapidly. The image importer is basically done, though the UI could use some improvement

AnxEdit10

The recompiler is also progressing quickly, almost complete already: Probably another day worth of tweaking and debugging will finish that part of the project. After that I just need to create the export functionality and get undo/redo functionality working and AnxEdit will be pretty much feature complete. That doesn’t mean it will be done: The UI still needs a lot of work, and there are probably still some bugs in there, but the end of the road is in sight now. I think there’s a good chance I’ll be done with this side project by the end of the month! Which is excellent news because, as mentioned last week, it’s become clear that inefficiencies in the way the game’s animations are currently saved are causing the game to start very slowly, which is taking a toll as I restart to test changes.

Anyway, I’ve got my work pretty much cut out for me here. All that’s left is, you know, actually doing that work.

TVRoom2013

We often think of art as having its meaning baked into it by the artist, of having a shape entirely formed by intent, and that the role of the audience is to simply partake of that message. The meaning of art isn’t really intrinsic to its form, though: it is contextual, interpreted, a relationship between the artist and audience. The consumer, by defining the boundaries and methodologies of their consumption, define their final experience as much or more than the artist does. The act of interpretation is thus  not a secondary experience to the appreciation of art, not a self-indulgent path for critics and academics, but the core of the experience. Those who wish to write essays and reviews expanding and expounding upon those interpretations aren’t engaging in a fundamentally different method of appreciation than the ‘common’ consumer, but merely formalizing and notating their experiences.

To a certain extent we acknowledge the contextuality of art. We go on quests to consume art in the perfect way, to create a space free of spoilers so that we will be just surprised enough, to ensure the room is quiet and dark so we can create the perfect atmosphere. As with all attempts at perfection, this creates a kind of tyranny, the perfect the enemy of the good, so busy trying to find the right way to experience things that we forget to experience anything at all. We believe so fervently in the wrong and right way to experience art, but gainsay the glaring fact that beyond right and wrong there is an infinite tapestry of ways art can be experienced, too many to count, too much to control, flavors that influence flavors. The entirety of our lives forms the context in which we play, read, watch: Should we try to empty our lives and make them bland so that we can taste the ‘true’ flavor of art? What makes us believe that such an unattainable ‘pure’ experience is more valuable?

It becomes difficult to evaluate art when the audience always has the option to refuse to engage. Even the most brilliant work won’t reach someone who doesn’t want to be reached. To some extent, art has to communicate the methods of its consumption before it can be enjoyed – its language, its rules, its values. This is part of why we have genre. This also constrains the possibility space of popular art, of what art can be popular: Not only is a game that pushes the boundaries of how we play difficult to appreciate, it’s difficult to even understand how to appreciate it. We’re beginning to see this problem crop up frequently, now, as more people try to push that possibility space – as we question whether a game needs certain traditional game-like elements, as we invent new ways to engage with games or reinvent old ones, we leave the interactive language established by decades of genres behind, and cut ourselves adrift from those who have a more old-fashioned understanding of what a game is or can be – those who don’t even understand that there’s a language they can’t understand, much less expend the effort to learn it.

It’s fine to like what you like and dislike what you dislike – but is it because you expect it to be something it was never trying to be, and aren’t even trying to understand what it is?

EveHeader

It’s weird how quickly time passes when I’m working on these levels. In some ways it’s hard work, and I often feel quite tired afterwards, but in the moment the hard work is effortless, an endless series of tiny changes that see hours pass me by. What’s a bit frustrating, though, is that I know that this work is impermanent: I’ll have to redo a lot of what I’m doing now as I develop the tilesets and figure out what works and what doesn’t. Well, if it wasn’t a bit stop and go and trial and error it wouldn’t be educational. I’m sure I’ll get the hang of it as I go.

As I build out the first really interesting and detailed area of the game – the first couple screens are just an introductory area without much action – I’m taking notes on changes to make to the programming and how to approach the tilesets. The first area is detailed enough at this point that I’ll probably spend a lot of this week working on tilesets, mostly just trying to get some really nice looking dirt and grass for the first areas. I can already tell that this is going to require a lot of back and forth, tweaking the level then the tileset, the editor then the level, the tileset then the editor, until I feel like I have everything lined up to go basically the way I want. It feels like progress, though.

I also spent some time fixing bugs with navigation map saving and loading, and I finally got around to fixing the bug that was causing each level to load multiple times. I spent a little bit of time exploring why the game takes a while to start up, and have more or less conclusively determined that it’s because I’m loading way too many files, and even though they’re tiny the overhead of loading them all is slowing the program down. This is actually good, because I have a solution nearly ready to go: Rather than importing individual frames of animation, I can create tilesheets. This is usually how it’s done anyway, and it’s mostly laziness on my part that’s taken me this long.

That actually brings me pretty handily to the subject of AnxEdit, since one of the primary tasks I’m creating the editor to help with is quickly and easily converting between individual frames and tilesheets. I created most of the frame importer this week – in fact, I would have likely finished this morning if I hadn’t run into a very frustrating problem. This problem was so frustrating, and I found so few resources for how to deal with it in my searches, that I’m going to go to some extra trouble to emphasize it here in case anyone else is running into this problem.

For anyone using Haxe or AS3 and having trouble with Flash/AIR’s File.getRelativePath() function returning null

Before you call getRelativePath(), call the canonicalize() function: This will ensure that the path you’re trying to source from is accurate to the actual file structure, which apparently is a big enough deal that getRelativePath() completely breaks if you don’t do it.

There. I hope you can avoid the frustrations that plagued me this morning.

Anyway I’ll try to get some screenshots and maybe a bit of animation up next week. Things are kind of right in between places where they’re interesting to show off.