Updates: Mostly Graphical, Some Audio, Some AI

A summary of the updates to Feast for the Senses from the past month. If you have been following along my Twitter, then most of this might already be familiar to you.

The Full Gathering of the Senses

So I finally got off my butt and finished implementing all five sense monster classes: Sight, Hearing, Taste, Smell, and Touch. I renamed the Bearer-class (who’s only job is to hold items until the player destroys them) to “Pain-class” to fit it in with the whole sense theme. Each class of monster now has their own set of vocalizations. I’d like to thank the contributors at freesound.org for letting me demonize their voices. ūüėõ

Monster 2
Rogues gallery

Each monster type has it own way of detecting its victims, so they all have their unique behaviours. I will go into more detail in a future post:

Oh, that video also spoils the next two things I want to talk about:

Weapon Wheel

As I have been adding more and more weapons and items to the game, I found it awkward to switch between them using the d-pad. I know and played a few games that do this out of necessity because the right stick is mapped to a more important function, but then I realized I wasn’t using the right stick for anything. So, I changed the weapon/item selection system to a weapon wheel.

weapon wheel 30
Click for a slightly better version

Since now every weapon and item is access via the weapon wheel, there is no longer any distinction between main and sub weapons, but since only a handful of people actually playtested the game during that phase of development, we can pretend it never happened. ūüėČ

Refined Tileset

I also redesigned my tilesets to remove or tone down the detailed skeuomorphic elements, which were clashing with the simpler flat elements. Something bugged me about how I designed my tileset for a long time, and I think this might be the reason why. I also bumped up the vibrance of the colours a bit too, as I thought the levels were looking a bit too dreary, and that I know has been bugging me recently.

Grassy tileset
Marble tileset

And for comparison, the old Grassy tileset…

…and the new Grassy tileset…

At first I was worried that having the grass as huge areas of flat green would make it look boring or make it hard to get a frame of reference when moving, but those grass tuft tiles that hug the sides walls, ground tiles and randomly strewn around everywhere really help make it look much better.¬†Curiously, I don’t have any good screenshots of the old Marble tileset. They’re all either too small or animated GIFs. Because of that, I can’t do a fair¬†comparison of the old and new Marble tilesets. Oh well.

A Gift of GIFs

I was planning on putting out a demo of Feast for the Senses last week, seeing how it was Hallowe’en and all, but there was a lot more to be done than I previously thought. Now I’m not sure when the demo will come out. In the meantime, here are some GIFs of some new stuff.

When you move behind a wall or certain obstacles, an outlined sprite of your character now appears over it.

This solves a lot of the visibility issues in cramped and narrow spaces that made me favour putting a lot of open areas in my levels. The method used is basically a hybrid between the techniques of drawing silhouettes behind walls and drawing outlined text, combined with my lighting engine.

I added gate sprites for the marble + glass tileset (which was missing when I showed it last time) and also refined their opening animations:

I think I’m getting addicted to using sinusoidal interpolation over linear.

As I’ve been playtesting, I’ve noticed that placing powerful ammo (i.e. shotgun, grenades) behind locked doors wasn’t a big enough incentive for my playtesters or even myself to waste spend valuable time finding the keys to unlock them in Arena mode. That’s went I realized that I need to up the reward. Up the ante.

So I began to place these behind the locked doors.¬†What’s inside the box?

If you’re more of a dog person, don’t worry, you won’t be left out. ūüėČ

As mentioned earlier, draw the player’s outline when they are behind walls now makes navigating small spaces less frustrating. Because of that, I had been holding back showing one of my levels until now. It is made entirely out of narrow, twisty passages. I found this level to be more action-packed than the more wide-open levels since its labyrinthine quality makes most of the enemy encounters up close and personal.

Eaten by Some Linux Redux

One day as I was switching between build targets in GameMaker: Studio, I noticed that an entry labeled “Ubuntu (Linux) (YYC)” was on the list of targets. I have exported previous projects to Ubuntu before (e.g. Gonna Catcha) and have been building Feast for the Senses with the Yoyo Compiler whenever I go out to show the game and playtest it with other people. But doing both at the same time? Do I dare to cross these categories? The answer was “yes”.

Come to think of it, I don’t¬†even know when this option (and the “Mac OS X (YYC)” target) was released. I must have missed the memo.

Anyway, I was eager to try it out, since I do want to eventually¬†distribute Feast for the Senses on multiple plaforms and tests have shown that it¬†does benefit from being built with the YYC (e.g. it gets a higher max framerate, so¬†less chance of slowdown or needing cap the framerate at 30 on lower-spec¬†machines). First, I tried to build and run it on my Linux Mint virtual machine, but the compile would failed every time. I eventually learned that the YYC wasn’t supported on Mint¬†and that I should be using¬†plain old Ubuntu.

After creating an Ubuntu VM and much “sudo apt-get”ing, I finally got it to work:

Full-sized screenshot:

The game seems to run fine, though¬†sometimes it can’t maintain 60fps, but that just might be the fact that it’s running on a low-spec VM.

I also got a bricked SteamOS VM out of the experience, but that’s another story. And by another story, I mean:

Next on the agenda, I’m working on a new tileset, because the grass maze tileset is starting to wear out its welcome. This one uses various layered tiles…

…and animated tiles.

It’s still a work in progress, as the tileset has many clashing elements to its design. (Note to self: get new interior decorator.)

Lastly, I’ve implemented areal dialog triggers. This enables R√©ilt√≠n to comment on areas she enters:

Something’s askew here…

A week ago, I had a bug-free, perfectly-good platforming engine. But then out of a whim, I decided to mess around with it and added support for sloped platforms.

Aside from a few bugs with the player or enemies occassionally getting caught in the slopes, it seems to be working just fine:

Implementing the code to make objects moving up slopes was¬†the easy part. However, in the method I’m using, it initially caused objects to “float” above the slope, with only one corner touching it tangentially.

This looks particularly bad if the sprite is wide, (which kitty is in my case).

The first¬†solution to this problem I considered was to make the object’s collision mask¬†narrower than the actual sprite. However in my case, this would have caused another problem: kitty would have been able to walk partially through thin walls, which would have messed¬†with the gameplay.

The solution I ended up using was to give the object two collision masks: a narrow one (coloured orange in the image below) for detecting the contour of the ground (and ceiling) and a wider one (blue) for detecting walls and everything else.

Now some of the “floatiness” has been transformed into “phase-through-the-ground-ness”, which I think is more¬†tolerable. Both become less noticeable when the slope grade is reduced:

Foreground scenery (red) can be used to hide the remaining floatiness.¬†In “Cat Project”, the fuzziness of the carpet platforms does this somewhat.

A challenge with implementing this within GameMaker:Studio is that it only checks for collisions automatically in each step once, with only one collision mask, and fires off Collision events accordingly. After doing a bit of searching on the Game Maker Community¬†forums, I found that a way to get around this one-mask limit is to cycle through a list of masks, manually recheck for collisions between each mask change and execute the appropriate code for each. Essentially, you’re implement additional Collision events inside another event (usually a Step event).

My GM48 10 submission: Fodder Cannon

Out of the blue, I decided to participate in the GM48 10 game jam held on r/gamemaker on Reddit. The theme was “Guns that don’t shoot bullets”. So I decided to make a game with guns that shoot minions at your opponent, and kick them into submission. Here is the result: Fodder Cannon.

You can download the game from itch.io.

Kick, punch. It’s all in the mind.
I regret nothing!
It’s been a long day.
Sometimes you just can’t win. ¬Į_(„ÉĄ)_/¬Į
And here’s a time-lapse video of the process:
And here is the brief post-mortem I posted on r/gamemaker:
Did you succeed with your plans?

Finishing a full-playable game? Yes. Finishing absolutely everything I wanted to do? No. I wanted to implement a single-player option in my game but didn’t have the time.

Did you come up against any obstacles?

The only obstacle I came across was a technical one. I had been testing my game on both the Windows and HTML5 platforms during the jam so that I could release a standalone and a web version of it afterwards. During the last hour of the jam, the health and ammo meters stopped working in HTML5 for some unknown reason, so I decided to drop it for the jam since I figured my time was better spent on polishing the Windows version.

What did you think of the theme?

This was the theme I wanted to do most. I was pleasantly surprised when it was actually chosen.

Did you learn anything new?

  • When I don’t filter character and graphical designs in my mind and just draw whatever I feel like, things get a little bizarre.
  • I can compose something resembling background music in as little as two hours. I think it still needs a lot of work, but it turned out better than I expected.
Copyright © Quadolor Games. All rights reserved.

This game plays so good, it plays itself.

Welcome to the first post of 2014! I’ll been working on the autoplay system (for the “How To Play” segments and the attract mode) for Gonna Catcha since the last time I posted. And since it’s also been a while since I uploaded something on my Youtube channel, let’s make it a twofer; here’s a short video of it being tested:


As I was coding this, I realized that creating the autoplay system would have been a lot easier if I was using Game Maker 8.1 instead of GameMaker:Studio to make this game. That’s because games made with Game Maker 8.1 could be coded to be dynamic at runtime. That is, you could add, remove or change graphics, sounds, rooms and even code while the game is running.

So what does dynamically-generated game assets have to do with the game playing itself? Well, the assets of interest in all of this are timelines, a series of code snippets that are run at assigned steps in time. Once a timeline is assigned to an instance and is set to run, it will automatically fire off the code snippets at their predetermined times. If I was using Game Maker 8.1, I could record player input to a file and then save it to the disk. Later, when I want to play the input back for demo purposes, I could read the data from the file, translate it into a dynamically-generated timeline and let Game Maker (and my player input code) handle the rest.

Unfortunately, due to cross-platform incompatibilities, the ability to dynamically add and change game assets at runtime had been restricted in GameMaker:Studio. In particular, most of the dynamic coding functions are gone. Fortunately, the all of the dynamic timeline functions survived the cut; well, all of them EXCEPT the function that allows you to ADD new code to a timeline. Without this function, this function, it is impossible to created new timelines with new code from scratch on-the-fly, pretty much destroying the above method of creating an autoplay system with a surgical strike.

In light of that, I tried to think of other ways to do this. First, I tried to record the player input into a human-readable format then manually translate and hardcode it into a timeline. However, this method was too tedious and took way too long to do, and if I wanted to re-record a play session, I would have to retranslate everything from scratch. Next I tried to build the timeline from scratch, but it was also too tedious since it was too hard to predict NPC movements, even though the random seed was fixed.

In the end, I decided to create my own timeline system. It’s not as through or functional as GameMaker:Studio‘s native timeline system, as it can only take control of the player characters, but it’ll do.

Copyright © Quadolor Games. All rights reserved.

High five! I mean, ten!

Last week, I updated Gonna Catcha to v.0.7.4. It was pretty much a knee-jerk response to some issues I encountered when playtesting it last night at Bento Miso. It added an option to toggle a fullscreen mode, to hide your desktop and other windows behind black while you’re playing, and a few bugs fixes. Unfortunately, being a knee-jerk response, I didn’t test it properly and there are a couple of bugs with the fullscreen mode, though the bugs don’t interfere with normal game operation.

In addition to fixing these bugs, the next version, v.0.8.0, will replace the single high score of the current version with a high score table (or two). Here is a screenshot of what it looks like so far:

In addition to keeping track of the top ten scores, it will keep track of the other standard high score information: player initials and the highest round reached. I am considering a second, separate high score table for co-op mode, which will also keep track of which character the player used.

Well, that’s all I can do to make this sound bigger and more important than it really is. I’ll be doing another meatspace test this Friday. I should really try to finish this before then.

In other news, when I woke up today, I was greeted by this on /r/gamemaker:

As someone work mainly works with vectors for higher-resolution artwork (i.e. not low-res retro sprites), I am pleased by this turn of events.
Copyright © Quadolor Games. All rights reserved.

Greetings from Gamercamp!

It seems like a long time since I last wrote a post. Since I’ve released the beta demo of Gonna Catcha, I have been less compelled to write about it since it’s much easier to learn about the game by playing it than sitting here reading about it. Also, I was going to post about the International Archaeology Day playtest session with Rise & Fall, but the post ended up being not very interesting on it own, so I’m going to combine it with the Gamercamp playtest session post I’ll write about after Gamercamp, which is happening right now. Yay.

In the meantime, I suppose I can talk a bit about what was added to Gonna Catcha since it’s release. Aside from several major bug fixes that somehow slipped through my keen eye, the biggest update to the game is the inclusion of several new options in the game’s Service Mode (fancy arcade talk for “Options Menu”).

Well, there’s your problem.

I feel like I’m being very thorough with the amount of customization you can do with the game, and I haven’t even put in the sound test or let the player customize gameplay settings yet.

During the development of the co-op mode, I had difficulty deciding how to bind the controls to what keys on the keyboard without the two player bumping their hands into each other. Also, what might be the ideal key bindings for co-op might not be for single-player mode and everyone has their own preferences on what the best key bindings are. In the end, I decided to let the player(s) figure out what controls work best for them and put in a key configuration menu.

UNLIMITED POWER!

This is the first time I’ve made a key binding system for a game and it turned out to be less trouble and error-prone than I imagined. GameMaker: Studio has built-in functions for rebinding keys, but I ended up creating my own solution.

With great power comes great responsibility.

I have received some feedback from people who played the demo. Aside from pointing out the bugs, most have praised the retro arcade art style and audio of the game, saying that it’s quite accurate and devoted. One thing that came up was some people had trouble getting the game started because they couldn’t find the “Insert Coin” key. So to help new players, I added “key reminders” on the title screen to help them get started.

I don’t understand your crazy
moon controls!
I also made the list of default key bindings clearer in the manual (if people actually read that thing). for those acquainted with the controls, there is an option in Service Mode that allows you to turn the reminders off for a more authentic arcade experience.

Oh man. *tap* *tap* Which button is it?
*tap* *tap* *tap* *tap*
What would make it even more authentic is an entire arcade cabinet, but let’s not get ahead of ourselves.
Copyright © Quadolor Games. All rights reserved.

Where Is That Thing You Were Working On Several Weeks Ago Now?

Okay, I’ve held off publishing this post for two days now, time to stop writing and actually do it.

(But there just this tiny little thing I want to ad-)

Nope. We’ve live. Wait, who are “we”? I’m talking to myself again. Anyway…

On this episode of Where Is That Thing You Were Working On Several Weeks Ago Now?, or W.I.T.T.Y.W.W.O.S.W.A.N.? (“Witty Woss Wan”?), we have a gander at Rise & Fall. You know, the thing I worked on as part of the team Robots Mashing Keyboards for the ROM Game Jam. (Oooh, that thing.)


Quite a few things have been added or changed since the ROM Game Jam prototype. The biggest change is the inclusion of jump-through platforms (i.e. platforms that can be passed from below but not above). The original prototype only had completely solid platforms, but to have a greater number and density of platforms in the level, my team decided that we need to have jump-through platforms as well. Seeing how something like this should be Game Programming 101, I should have learned how to do a long time ago, but never did until now. Still, I had to learn it from the source code of this demo by Bill23. Even then, it took me two attempts to get it working right. Other changes are relatively minor, such as adding mercy invincibility, or bug fixes. We will also be changing up some the graphics and adding more levels before the playtest session at the ROM on October 19.

During the development of Rise & Fall, I had encountered the weirdest glitch I’ve ever seen in all my time using GameMaker, even weirder than the ones I’ve seen while working on Gonna Catcha. Furthermore, I don’t think it was (entirely) my fault:


It looked as though GameMaker didn’t rebuild the asset cache after I deleted some objects from the project, so the game ended up drawing the wrong sprites and even creating the wrong objects (i.e. the projectiles seemed to have been replaced with experimental wall section object I had been working on). Clearing the asset cache and rebuilding the game once more fixed everything.

Speaking of Gonna Catcha, nothing visually interesting has happened with it since the last update, so no video or screenshots for you. However, I did completely overhaul how the game handles round progression, now incorporating the NPC speed multiplier I talked about last time. Alright, that another task down for Gonna Catcha, what left? I really should make a list of these things.

Copyright © Quadolor Games. All rights reserved.

They’ve gone to plaid!

Today is the Mid-Autumn Festival and also various other full moon-related holidays in other parts of the world.  I thought it would be appropriate to post something about Gonna Catcha today because:

Mid-Autumn Festival –> harvest festival –> harvesting of souls –> psychopomps –> Pohena and Donum
Full moon –> werewolves –> wolves –> Pohena and Donum
Q.E.D.

Actually, I lied; this has nothing to do with any holiday, it’s just a coincidence. Anyways…

A week ago I posted a video of gameplay from the playable alpha of Gonna Catcha, and since then I’ve gotten some useful feedback and suggestions. One of them was the to increase the speed of the spirits and pretas as the game progresses. I thought this was a good idea, so I did just that: put in some code that allows the game to scale the enemy movement speeds:


16x speed is the maximum the game can handle; any higher will cause the spirits and pretas to break free from their imprisonment of the maze and shoot off into oblivion. However, anything higher than 2x just becomes too difficult and frustrating to play (even 2x was pushing it for me).
With this, I now have two ways of increasing the difficulty of the game:

  1. Increasing the speed of NPCs, and 
  2. Increasing the number of NPCs required to be captured and avoided in a round.

With the former, I think I won’t have to rely on the latter as much to scale the difficulty as the game progresses, I can ramp up the latter much quicker and make the early rounds less boring.


P.S.  On a serious note, today is also a sad day with the passing away of former Nintendo president Hiroshi Yamauchi: http://www.bbc.co.uk/news/technology-24160150
As someone who started gaming on the Famicom and Game Boy and now the owner of a Wii U and 3DS, this news hit me hard. May he rest in peace.

Great, now I feel awkward for publishing this post today.

Copyright © Quadolor Games. All rights reserved.