Categories
Ambience Dev Diary

Dev Diary #16: This Week At A Glance (Plus A Video!)

Here’s a quick glance at what I got up to this week with gamedev:

  • Updated dungeon appearances and colour palettes for several areas.
  • Updated sandstorm effect with some cool rolling clouds.
  • Implemented and tested some gameplay-relevant weather effects. I also tweaked the procedural generation algorithm for dungeons – can now generate rooms with central “pools” of water or sand, as seen here.
  • Gameplay re-balancing for both dungeons and bosses.
  • Finally, I started playing around with video capture to see if I could get some videos made of Ambience gameplay, rather than just silent GIFs. I’ve been working a fair bit on the game’s OST and have been looking to show it off for a while. However video export to Twitter always seems to result in poor quality so here y’all go, you can have this little clip instead… 🙂
A glimpse of the first boss encounter in Ambience. Complete with soundtrack!
Categories
Ambience Dev Diary

Dev Diary #15: Ten Things I Did This Month

Just as a reminder (to myself, mostly) that I’m still making good progress on Ambience, here’s ten things I got up to over the past month:

#1: Added randomly-generated quests. This turned out okay in the end, and in general it doesn’t do anything too stupid (like giving the player a Surefire Flower in exchange for a Surefire Flower – see below). I’m also still not sure if I should add story-related tasks to the in-game quest list, or if that’d make things too confusing.

#2: Improved the user interface and menu appearance. I wasn’t really happy with the UI in the above picture – to me it seemed a bit empty and disorganized with text just floating around. So I added some background boxes to compartmentalize it a bit and make it a bit more ordered (and nicer to look at – see the GIF a little further below). I also set a limit on the maximum length of the option boxes, so that they didn’t overlap with the info boxes at the right like in the screenshot above.

#3: Added some post-game content. I added a new sidequest where you collect pieces of a mythical whistle, the Skywhistle, for an itinerant piper. This allowed me to add some more dungeons, items, and even a few short bosses.

#4: Added lots of new items. Cloaks, swords, breastplates, potions… and of course, the aforementioned Skywhistle, which emits a piercing shriek when used and shoots quavers as projectiles.

The Skywhistle and improved UI in action.

#5: Added lots of new enemies: snakes, spiders, turtles, humanoid golems… you name it! (Me as I’m typing this: Wait, did I really add turtles to the game? Let’s see… oh, I did! I completely forgot to add them to the new dungeons I made! Oh, well, better do that now…)

#6: Added some new dungeons as well. This is where things became interesting. I started to play around with dungeon restrictions to make the experience more like a roguelike – for example, limiting the number of items the player can take with them into the dungeon, or temporarily reducing the player’s level to 1 for the dungeon. With those changes, Ambience really exhibits a greater range of flavors. The game transitions from a pleasant little dungeon-crawler in the early dungeons to a monstrous game of survival and chance in the post-game.

#7: In my downtime I spent a little while watching some YouTube playthroughs of Shiren the Wanderer and Pokemon Mystery Dungeon, two of my favorite roguelike-related franchises. It’s always interesting and useful to see how other people (especially professional companies) approach the roguelike genre and how they keep gameplay interesting, tell a story, etc.

#8: In the midst of my procrastination, I also watched a couple of scenes from Neon Genesis Evangelion (one of the very few anime series that I actually watch and kinda like). In the end, though, this turned out not to be completely unproductive – I got some excellent inspiration for a cutscene towards the end of the game, which I rewrote to be much darker and more psychological.

#9: Completed mugshots for all the main characters, including several minor characters. I don’t know why, but it always takes me ages to add things like mugshots, sprites, and dialogue for Foss, the scientist who’s studying the Ambiences. In any case, that’s all done now – phew!

#10: Finally, I changed some aspects of the game’s final boss, introducing a new area-of-effect attack and adding some particle effects and rumbling thunder to the introducing cutscene. I don’t really want to spoil too much, but suffice it to say that the boss fight is much more impressive and challenging as a result.

Categories
Ambience Dev Diary

Dev Diary #14: An Itch That Must Be Scratched (More on Line of Sight!)

Just a quick little rant from me this time:

For some reason, line of sight and fog algorithms have just been an itch I always need to scratch. I’ve lost count of how many times I’ve revised that algorithm (but hopefully I’ve done so for the last time now!)

In particular, over the past week I began to notice that the line of sight would take a little while to update when moving from a corridor to a room, or vice versa. This caused a little bit of lag with each step. It wasn’t intolerable, but still noticeable when playing and so definitely not ideal.

After spending several hours tweaking and fine-tuning the line of sight updating algorithm, I figured out and managed to solve the problem. For some daft reason, I had originally told the game to update every tile on the screen with each step, which was slow and computationally intensive – hence the lag. So I re-designed the system (again!) to do what I should have done in the first place – only change the tiles that had actually changed visibility with that step. And, as expected, it worked! Walking smoothly through a dungeon corridor has never felt so good.

Moral of the story? Do things right the first time (if you can), so you don’t spend hours later down the track trying to fix up bugs from poorly implemented code.

(Incidentally, the function that was chewing up most of my processing time was the function used to find the ID of a tile on a particular layer. Which was unexpected, and a bit annoying…)

Categories
Ambience Dev Diary

Dev Diary #13: Pathfinding, Line of Sight, and More

I wasn’t really sure what to call this post, since I’ve been working a lot on tidying up Ambience but haven’t really been particularly stuck on one single thing to write a “gamedev grievance” about! So I figured I’d write up a short summary of the many things I got up to this week:

  • Fixed pathfinding. Well, sort of. I noticed that in large rooms, the game would sometimes lag at the start of a turn if the A* pathfinding algorithm couldn’t find a valid path to the player. One way of fixing this would be to run the A* algorithm branching from both the player and each enemy simultaneously, but this would require rewriting a lot of my code. Instead, I modified the code I already had to make it work a lot faster and more efficiently when finding a path. For example, I changed one of my data structures from a list to a map, which runs much faster in GameMaker: Studio. There’s still a bit of lag sometimes, but only in large dungeons with lots of enemies, and even then it’s nowhere near as bad as it was.
  • Fixed the battle log. I finally decided to implement turn announcements in the battle log, so the player has a better idea of what happened when (and also to give the game a more rogue-like feel overall).  My approach was a bit unconventional – since there are a variety of ways a turn can start in Ambience, I added the announcement for a new turn at the end of the previous turn – which made things a bit tricky. In the end, though, I think I got it working okay.

  • Modified room and dungeon layout. Now floors are bigger, with more rooms and more enemies – which means more fun!
  • Improved graphics – including several mugshots and the Cactus Crawler sprite. I’ve been meaning to fix up the latter for quite some time, but again only got around to it now.

    A wild Cactus Crawler appeared!

    Fixed the line of sight algorithm… again. I implemented the system I’m currently using a while ago, but I’m still having to fine-tune it occasionally. Specifically, when the player activates an Ambience and modifies the map – say by drying up pools of water using the Ambience of Sun – the game unnecessarily modifies some of the “corridor cells” to become “room cells”, giving the player too much line of sight extending into adjacent rooms. The solution: don’t change those cells into room cells. Easy!

  • The playthrough continues… I’m playing through the game as an ordinary player would to get an authentic idea of the game’s difficulty at each stage of the game. Along the way, I’ve discovered that Ambience is actually fairly challenging – even for me as the developer. At any stage, the player could go from being perfectly fine to on the brink of defeat in as little as one or two turns. I don’t mind the challenge, though. It’s all part of the roguelike nature, after all.

Categories
Ambience Dev Diary

Dev Diary #12: The Hard Work’s Finally Paying Off!

It’s been a verrrrrry long time since I’ve posted here… but I’ve made it through another semester of uni, got back to programming and things are really starting to look good!

Even though it’s been quite a while since an update here on this blog, I’ve been working on a ton of stuff Ambience-wise. Here’s a quick overview:

Proper text and storyline!

One of the things I’ve been busying myself with lately is doing some proper storytelling. Initially I shovelled a whole heap of placeholder text into the game just to get the basic cutscenes working properly (see below), but now I’m replacing it all with proper text.

Placeholder text lol

It’s amazing how much of a difference that makes. Now when I playtest, the story and the characters feel so much more alive, and even the gameplay feels smoother and more polished. In other words, it feels much more like I’m actually playing a finished game rather than searching some crappy application for bugs. I dunno. It’s exciting to see how two years of work on Ambience is finally starting to pay off.

Pathfinding that actually works!

Yeah, I’ve been meaning to fix this one up for quite a while now. The original pathfinding algorithm I implemented in Ambience wasn’t very intelligent at all – it basically involved enemies either wandering around randomly, or walking in the player’s general direction and hoping it didn’t run into a wall. Which was fine, when it worked. (Which was not very often.)

But it was a start, and, well, the algorithm stayed. For a year and a half.

But now things have changed, as I’ve brought out the big guns with a brand new A* pathfinding algorithm. And, oh boy, does it work. I even had to tweak the first dungeon quite significantly since the (formerly daft) Henchmen became so good at finding the player that the whole dungeon became way too hard.

https://twitter.com/RhombusGameDev/status/942183691727519744

More shaders!

I added a sepia shader for showing a flashback from an earlier part of the game. And what’s more, I also got the game to display multiple shaders at once. Yeah, that was a proud moment.

Sepia… and swirls.

New Guardians!

I also finally upgraded the sprites for all four Guardians, which I think turned out quite well – at least, better than the previous sprites, I’d say. On the topic of sprites, I also changed Zephyr’s outfit from a full-length dress to a simple top and skirt, made her outfit a little brighter and her hair a little darker.

New music!

I’ve made some tracks for the final boss of the main story – two, actually, depending on a decision that you make earlier in the game. I also managed to put together a fitting encounter theme for Foss – again, something I’ve been putting off doing and have finally done.

Post-game content!

I’ve toyed with the idea of putting in some post-game content for a while, and now I’ve decided to take the plunge and do it. The main emphasis will be on exploring some challenging dungeons, true rogue-like style, as well as liberating Foss’s few remaining prisons (if the player’s left any) and taking on Foss one last time. I might also expand the Vulcan-Zephyr subplot a bit here as well, but we’ll see.

So, what’s next?

The plan is to finish fleshing out the story, add post-game content, and – finally! – start thinking seriously about release. I also need to stop putting off making blog posts about my progress! It’s easy to think I’ve done very little work, when in reality I’ve actually done a lot and I haven’t really paid too much attention to how much I’ve done. For now, I’ll make sure to post semi-regularly (at least once a week), and especially when I’ve got something new and exciting to show.

For now, though, merry Christmas and I’ll be back soon!

Categories
Ambience Dev Diary

Dev Diary #11: Stories, Speed, and Shaders

Hello everyone! It’s time for another week’s progress report! (Rather than just calling it another progress report, I’ve decided to give these posts the more interesting name of “Dev Diary” entries.)

Recently I’ve been making solid progress on Ambience. I don’t know if I mentioned this before, but these past few weeks I’ve been keeping a changelog documenting everything I’ve done each day. It’s actually been really surprising to see how much progress I have been making!

Most of the entries in the changelog (with a few exceptions, of course) tend to fall into three main categories:

1. Story-telling.

I’ve spent the last two days or so writing up the dialogue for a fairly important cutscene, which happens at around the two-thirds mark of the main storyline. The reason why it’s taken that long is because the dialogue (and in fact the entire subplot) depends on the player’s previous interactions with the other characters. I don’t want to spoil too much, but I think I got the atmosphere of the scene about right in the end – which is tricky to do when you’re juggling about fifty different possible text combinations.

2. Shaders.

Yes, I finally decided to return to the world of shaders for the first time in about a year. This time, instead of simply changing the hue of text, I applied a warping effect to the game’s application surface (the surface which stuff gets drawn on) to illustrate the player’s nauseous response to a disturbance in the Ambiences.

Now, I’m no expert in OpenGL, so again this process was kinda long – but once it worked, it worked well. What was most frustrating was actually getting the effect to work in both fullscreen and windowed modes without having the application surface drawn somewhere completely different on the screen.

3. Speed mechanics.

I recently implemented a new mechanic where Ambiences could affect the movement speed of the player, allies, and enemies. For example, when the player activates the Ambience of Wind, they can take two turns in the time that enemies can only take one – making this a neat way of escaping from groups of enemies when you’re in a pinch.

Debugging, however, has been a nightmare. To give you an idea of the sorts of strange results I had to fix, here’s a copy-and-pasted extract from my changelog:

  • Fixed a bug where Ambiences wouldn’t properly affect speed when used on the first turn
  • Fixed stuttery movement in dungeons where out-of-sight enemies had higher movement speed than the player
  • Fixed a bug where having an enemy with higher speed present would prevent ambush battles from being activated
  • Fixed a bug where opening and closing the menu would make enemies with higher speed take extra turns
  • Fixed a bug where enemies with higher speed wouldn’t use up thrown items properly, causing them to throw a single item multiple times…

You just can’t make these things up sometimes.

Gamedev can be a bit like building a house of cards – one tiny slip, whether intentional or not, could throw everything into disarray. I’ve found this is especially true when implementing new mechanics. Just when you’ve put a new mechanic in place and you think everything’s all right, suddenly you find yourself facing yet another strange bug – at which point you sigh, roll up your sleeves, and fix it.

And then you find another.

And another…

Categories
Gamedev Grievances General

One Year of Gamedev Grievances: The Top Five

Just last week I hit a big milestone – one year of blogging my experiences in developing Ambience! It’s been a really exciting, rewarding, and sometimes frustrating journey so far, and I’m sure that’s set to continue. As I reflected last week, it’s amazing to think how far things have come since I started working on Ambience.

Over the past year I’ve also chronicled many of the biggest hurdles I’ve overcome during my gamedev experience. And so, for my one-year bloggiversary, I decided to go down memory lane and pick my personal top five “Gamedev Grievances”.

This was actually a really hard list to compile, simply because there were so many potential contenders for the top spots! But in the end, I finally managed to pick out five grievances I look back on with pride. (Or dread.)

5. Dynamic Terrain (GDG #20)

In Ambience, players have the ability to manipulate weather conditions to dry up rivers, blow away leaves, and open up new passageways and shortcuts. I’m actually kinda proud of how this mechanic opened up so many new gameplay possibilities and made Ambience just that extra bit more interesting to play. That being said, however, it was somewhat of a pain to implement – especially in tandem with my line of sight algorithms (but more on that later.)

4. Would the Right Data Type Please Stand Up? (GDG #9)

Every time I look back on this one, I can’t help but smile wryly (while screaming internally and wishing I could bash my head against a wall). The goal: implementing a new menu system. The problem: activating Ambiences simply wouldn’t work after the new changes. After hunting through my code for a while, I eventually found it by accident: GM:S was treating an integer argument as if it were a string! 

What’s even more interesting is that after I published that post – complete with my rant about dynamic typing in GML – I received a bunch of messages from people telling me about all these other programming languages that also use dynamic typing. (Python! JavaScript!) This led to the unexpected, and very valuable, realisation that I could learn a lot from the broader community of game developers as well as from my own experiences.

3. Sword-Swinging Maths (GDG #12)

As an engineering student, I love it when I get to use maths in my gamedev stuff. One notable example was when I was designing the attack animation for characters with hands. I spent a lot of time (and had a lot of fun!) working out how to make the player’s hand travel along the loop of a polar curve. I also varied the angle of the held weapon as the hand swung along its trajectory to make it look more like a vicious slash.

Not only was this really fun to implement, but I’m still using this fundamental code in the current version of the game as it stands now. (And it also showed that the maths you learn at school and uni can come in handy, after all!)

2. Pixel Art By A Non-Pixel Artist (GDG #14)

If there’s one thing I keep saying on this blog, it’s: I Am Not A Pixel Artist!” Needless to say, as a solo indie game developer, pixel art eventually becomes a necessity to get a game up and running. So when I decided it was time to make some new mugshots to suit my new character designs, I decided to document the results and evaluate how I, a non-pixel artist, fared doing my most dreaded past time: pixel art.

The resultant write-up became my most viewed post of all time.

I’m not quite sure why this post became so popular. Most likely, people just wanted to see how I went – or more realistically, how badly I did. The funny thing, though, is that I don’t think I did that bad a job. Even the above screenshot of Zephyr’s mugshot, which I’ve since improved quite a bit, didn’t turn out as horrendously as I thought it might.

In any case, the readers seemed happy, and I was happy. Win-win.

Now, before I announce the number one gamedev grievance of the past year, I also thought I’d draw some attention to another very popular post:

Bonus: “I’m an Indie Game Developer, and I’m Proud”

Though not a Gamedev Grievance, I thought this post also deserved to be on my list of highlights. At first I always found it a bit weird telling people that I’m an indie game developer, but over time I’ve come more to terms with that idea and am more comfortable talking about it. You can read more about it in the original post (link above).

Now, without further ado, the award for number one Gamedev Grievance goes to…

1. Clearing the Fog (GDG #20)

Oh, man. This thing practically gave me PTSD – especially when it came to the days and weeks of debugging that followed.

The aim was to design a line of sight algorithm that could reliably deal with non-rectangular rooms in dungeons. I eventually came up with an algorithm that worked by drawing expanding concentric rings around the player, which generally worked okay…

Okay, that is, with the exception of a million bugs and some very strange results that appeared in room after room after procedurally-generated room…

And then, when I implemented dynamic terrain and had to work out a way of integrating it with the line of sight algorithm, things became even messier…

Procedural generation can be both a blessing and a curse. It’s a blessing when it gives the player a huge range of different scenarios to handle, keeping gameplay fresh and exciting (and also making the whole “level design” thing much easier). It’s a curse when it gives the player such strange results that gameplay becomes confusing, frustrating, and at worst unplayable.

As the game developer, the power of proc-gen is in my hands – and with it, a great and terrible responsibility has fallen on my shoulders. That responsibility is, simply put: “Don’t mess up.”

It’s harder than it sounds.

Categories
Ambience Dev Diary General

Dev Diary #10: Nearly One Year of Blogging!

Hello everyone!

Had my last exam today (hooray!) and I’m pretty exhausted, so this’ll be a real quick post before I have an early night. Three main things to say before I get off my soapbox:

  1. Over the next month or so I’ll be working on Ambience at pretty much full steam. That means cleaning up the storyline, tweaking the new crafting system, plenty of play-testing, and finally working on some of the graphics stuff I’ve been putting off due to study. One thing I did manage to get done before the break was make one of the areas deep in Foss’ Fortress look a lot nicer (though there’s still a bit of work to be done):
  2. In terms of planning, though, I’m not sure exactly what I’m hoping to achieve over the next few weeks I have off. Plans are good, of course, but right now I’m just hoping to make as much progress as I can towards making Ambience a finished game. (Or maybe I’m just tired and can’t be bothered making plans at the moment. Did I mention I’m exhausted?)
  3. It’s hard to believe I’ve been blogging for almost a year now (my first post was published on the 27th of June, 2016!) It’s also hard to believe how much Ambience has improved over that time. From this:

    Very circle. Much pixel.

    To this:

    (Yeah, okay, so the sand background and textbox arrow are the same as before, but pretty much everything else is new!)

    I’m thinking maybe next week I’ll compile some of my personal favourite “Gamedev Grievances” from the past year and relive those experiences (horrors?) once again to commemorate one year of blogging. Stay tuned!


Well, that’s pretty much all for the moment, though I’m sure there’ll be more to say once I start making some serious progress on Ambience again. Oh, actually, a quick bonus: I was fixing up one of the cutscenes this afternoon and unwittingly made Vulcan very dizzy. Or maybe that’s just Vulcan being Vulcan. I don’t know.

Vulcan, are you okay?

Take care, everyone. 🙂

Categories
Ambience Dev Diary

Dev Diary #9: Demos, Deutsch, and Dangerous Bats

Hello everyone! Here’s a snippet-style update on what’s been happening with me lately:

  • After a couple of weeks of solid preparation, I finally did a fairly important exam today! I was worried it would turn out to be harder, but it went okay in the end. Of course, there are still a few assignments to be done and so on, but for now I’ve finally reached a small lull in the student-life action. (You know what that means… finally some time to work on Ambience again!)
  • Added a new enemy to the game, the Monster Bat. I’ve noticed a distinct lack of diverse enemies in Ambience at present, and I’d like to change that if I can to make gameplay a bit more interesting. On that note, I also recalled some feedback I received a while ago to make the range of weapons available to the player a bit broader as well, especially early on in the game. That, too, is in the works.

  • Text fixes. Lots and lots of text fixes. Making dialogue punchier, more engaging, more interesting; fleshing it out in places, cutting it back in others… working on writing has honestly been a lot more work than I anticipated. But it’s getting there! I’ve also finally moved on from the Mudreed Marsh mission (after a long time in a state of writer’s block) and am working on the rest of the story – hooray!

Well, if you’re saying I’m the legend, Vulcan, then yes, they most certainly are.

  • I’ve also been reconsidering the wisdom of releasing a demo before the final release of the game. If anything, having a completed game as the final aim, rather than a semi-completed demo, gives me a lot more motivation to finish the game. I think I’ll work on finishing the whole game for now before I start thinking about demo releases.
  • Finally… I think I may have mentioned this before, but I’m learning German at the moment and have decided to continue learning the language for the rest of this year and beyond. Just like my gamedev chronicles, I’ve found that learning a new language has been a really fun and interesting journey. With that in mind, I’ve been considering making the occasional German-learning related post interspersed amongst the gamedev posts for a bit of a change in pace.

    (Just to clarify: the blog will remain primarily gamedev-related, of course, but just for a change I might make a post about my German-learning progress once in a while and see whether anyone finds it interesting. Mal sehen!)

Categories
Ambience Dev Diary General

Dev Diary #8: Rhombus Returns!

Hello everybody! That’s right, Rhombus has finally emerged, battle-weary from an onslaught of exams, and is ready to dive back into some gamedev! Yeah, the past few weeks have been pretty tough study-wise, but I’m glad to say that the worst of it seems to be over (at least for now).

It’s easy for me to think back over the past action-filled weeks and think that I haven’t made any progress on Ambience at all. Thankfully, that’s not entirely true. A little while ago I had the idea of keeping a personal log of all the gamedev-related things I worked on, just to remind myself that I’m still moving forward. Progress is progress, no matter how seemingly small or insignificant.

Here’s a few things that I achieved:

  • Line of sight. Tweaked the line of sight scripts a bit more (and hopefully for the last time). Changed the line of sight in corridors from a square region to a more natural-looking circular one.

  • Drowning enemies. Worked on “drowning” enemies in marshy terrain. Significantly nerfed experience yield from drowned enemies to prevent the mechanic from being abused.
  • Items. Tweaked the items menu so that healing items can now be used on team members! (I was fairly proud of this one, actually – it’s something I’ve had in mind for a while, but haven’t really got around to actually implementing it.) Ally characters also visibly sweat when their HP or SP is low, which has already proven useful for me in my playthroughs.

  • Music. Remade a battle theme for Clarissa from scratch (I wasn’t particularly happy with the one I had before, although I’ve kept it and might still use it.) Also tweaked the “prison liberation” theme slightly.
  • Text updates. Had a long spell of writer’s block re. the second boss battle; eventually decided to leave it for the time being and work on something else. Added exclamations from Vulcan when the player activates their Ambience powers. Also added a joke which was deliberately meant to be lousy, but in reality is so lousy that I’m considering changing it. (Or not.)
    Went back to the boss battle, tweaked the cutscene slightly, and re-wrote the dialogue once more. It’s fairly short and punchy, and sets up the ideological clash between the Renegades and Foss’s Henchmen fairly well. I think I’ll leave it for the time being.

I’ve noticed that I’ve been lingering around the Mudreed Marsh mission for a bit too long, and I think it’s time to move on to bigger and better things. I’m definitely continuing the personal log, though – it makes writing progress posts like these much easier. It also makes gamedev much less overwhelming when you realise that you’ve been making more progress than you think.