Tuesday 18th February, 2020

For the first time in a couple of weeks, I made almost no progress on BotLG today; I just couldn’t seem to settle on anything, and everything felt very unsatisfying.

I made a little progress on adding keyboard controls. So far everything is mouse-driven, so things work equally nicely on mobile. But when playing on a desktop machine, it would be really nice to be and to use the keyboard. I’ve got it so you can move around, and start and stop interactions, which is 90% of the game, but I need to go back to the pop-up/overlay system and make sure all the dialogue boxes can be controlled and navigated with the keyboard, too.

This afternoon — and let’s be honest, most of this evening, too — I ended up in a YouTube black hole of watching GDQ speedrun videos. I watched Doom (2016), the entire mainline Fallout series as a marathon, which was very impressive, and then a random-seed Minecraft run. I haven’t touched Minecraft in a while, but I think I’ll get it reinstalled; it’s always fun to noodle around in there for a while, and there’s so much content that’s been added since I last played.

Hopefully tomorrow I’ll be a bit more productive. There’s dungeons to build, NPCs to write and new items to impotent. I want to get a “version 1.0” out by the end of next week.

Monday 17th February, 2020

I’ve had a really great, productive day today. This morning I implemented account-wide storage, so players can keep items and money safe in chests — doing the money side of things was way more complicated than I expected, due to my dogged insistence on having copper, silver, gold instead of just one number. Obviously I only store one number in the background, but the UI had to allow for all the coins the player is used to seeing. It was a bit of a pain, but it’s working now.

Then this evening I did a bit of work on the procedurally generated dungeons. I want them to be the main focus of the game, really, so it’s worth investing the time in them. As usual, I was using the Rat King’s Lair as my development ground, and it’s looking pretty good now. It starts out as a dark, wet cave, with lots of mushrooms and water — with plenty of mushrooms for the player to harvest to make potions, and water to fish in for food — and then progresses into a more traditional rooms-based dungeon, with carved walls, but still with water and rubble, making it look run-down and badly constructed.

Because of the new, more damp and fungus-y environment, I added a new monster, the Sentient mushroom. It’s pretty easy to kill (about on par with a regular rat) and drops loot from the same pool as harvesting mushrooms. It also has some fantastic attack verbs. Splorp splorp splorp.

This only leaves account-wide progression through retirement left to do, and if I’m honest, I’m not sure it’s needed now that the game is more active and less idle; I’ve been having second thoughts about it for a few days now. I think I’m going to spend the next few days pushing out new content — there’s a great new starter map I’m working on — and see how I feel.

Sunday 16th February, 2020

It’s late and I’m listening to the second episode of I Only Listen to the Mountain Goats, which might be my new favourite podcast. I get through a lot of podcasts.

Tried on a couple of leather jackets today, and didn’t particularly like either of them; one too large and one too small (which was horrific). I do really want to get one, though. I used to have a really nice leather coat, which was my father’s, and now I don’t. I can’t remember what happened to it, which really kind of upsets me, if I’m honest. I wish I still had that.

No BotLG progress today, but instead I did some work on my own homepage. I mainly use it to have a published list of links and videos I want to remember and return to; I guess it’s a web log in the oldest, grognardian definition. I updated the stylesheet a little and then wrote a little tool for adding new entries to the JSON file that populates it. And that’s it for today.

Saturday 15th February, 2020

Took the cat to the vet for his yearly checkup and booster shots. He’s doing fine, and still charming around strangers. In fact, to quote the vet, “he’s so handsome he doesn’t even have to try, does he?” He’s a good boy.

When I got in, I spent a little time on BotLG — the “have a break from development at the weekend” rule has now well and truly gone out the window. Discovered that having monsters stop wandering around when the player is nearby is working out pretty well, but it does rather lead to them mobbing you if you stand still for a long time. I think I’m okay with that; it makes exploring areas infested with beasties a bit more perilous, and stopping to harvest materials is now something to actually think about. Plus, actually catching them to initiate combat is much easier, which was the primary goal of this change.

Later I did a little recreational spreadsheeting, and worked out some prices for items. I’m reasonably happy with what I came up with, but I’m sure they’ll end up being tweaked over time. Additionally, and even more experimentally, I made the amount of XP you earn for completing a gathering or crafting action related to the value of the item gained; in theory crafting higher-level and more valuable items will level you up quicker, which feels about right. I just have to get the amount of XP needed to level each time right, and make sure none of the skills feel better than others — I think hedge magic being the only source of quaffable potions is a little overpowered, and a quick look through my new spreadsheet shows mining could be a little too profitable, but we’ll see. I’m genuinely not too bothered about balancing. Old-school D&D never felt particularly balanced and (in my opinion) didn’t suffer for it. Let the players find their own routes.

The 2020 7-day roguelike challenge starts in a couple of weeks. Unfortunately, it starts right as I am resuming full-time employment, worse luck. I was considering giving it a go, with a focus on some aspect that BotLG lacks, so that I could port over anything interesting that I came up with, but I’m not sure I’ll have the time or energy for it now. We shall see.

Friday 14th February, 2020

I’m back on my Vaporwave vs Outrun bullshit again (I’ve discussed ~aesthetics~ on this blog once before), thanks to Pinkas:

I don’t know why but the YouTube algorithm brought this vaporwave classic video back onto my home page, so of course I ended up watching it again. While I was watching, I made some notes on how it applied to BotLG. I set off on this project with the vague intention that it should look like a vaporwave product. I haven’t 100% succeeded, but I’m still still pretty happy with the way it looks.

While both vaporwave and outrun use a lot of neon colours, outrun tends to be darker, and vaporwave often lighter, with more pastels alongside the neon. In this regard, BotLG is definitely more outrun; this is the color palette I’m sticking with throughout:

Outrun is the idealisation of the future from the past. Vaporwave is the idealisation of the past from the future.


For everything else though, I’m pretty on track: fonts inspired by old technology plus classic serifed ones, and a chunky pixel art theme that harks back to the home computer movement of the late eighties and early nineties.

Merchants, items and inventory

Two major things and a whole bunch of polish this week. I wrote earlier about improving procedural dungeon generation, so I won’t rehash that; the other big feature this week was getting merchants and shops into the game.

I now have the ability to add buying and selling as actions when interacting with an NPC. Each NPC merchant will (currently) buy any item, and has a list of items that they will sell to players. Heavily inspired by old console RPGs like Final Fantasy and Pok√©mon , there’s also a shop location. I can alter this on a case-by-case basis, to customise the merchant themselves, the products they have on display, and the crafting workstation on the left.

I think I’ve got all the bugs, exploits and edge-cases worked out (like adding an item to your sell list, then consuming it in another window, then completing the sale of the now non-existent item, for example), but it’ll be interesting to see what players come up with. Buying and selling are kind of an important, potentially economy-breaking feature if there’s any horrific item and/or currency duplicating bugs left in there, so I’ll be keeping an eye on it for a while.

Because I’d spent so much time working with merchants and therefore items, I also made some improvements there. Can you believe BotLG contains 57 different items already (and I feel like I haven’t really even started on generating item content yet)? First, I consolidated the item types into a much smaller set — With that done, I added a dedicated inventory screen, which can be filtered by these new categories. Then, as a last bit of polish, I made it so that wherever an item is displayed, it shows an icon next to the text label. I’m really happy with how it looks, and now the console looks a bit more exciting while you’re gathering resources:

So this leaves me with just two major mechanics to implement: account-wide storage and account-wide progression through character retirement, which I’m hoping to get done next week. After that it’s just bug fixes, content and polish. I really want to completely revamp the starting area, so that players can get into a dungeon much quicker — and a more exciting one than the pretty trope-heavy Rat King’s Nest. This week (and last) have introduced a lot of new stuff, and the current maps don’t really show them off to the game’s best advantage; I actually think I’m going to hold back on making these things live until I have some shiny new locations in place.

This week’s changelog

Here are the edited highlights from this week’s changelog. You can view the whole list here.

  • As usual, BotLG is a little less idle and a little more roguelike. Every type of gathering node is now a limited resource. To compensate for limited resources, lowered global action duration to 3 seconds (from 8 seconds)
  • New skills: gathering, hedge magic, mining
  • New items: plum-nose mushroom, gorgeous plum-nose mushroom, myconic essence, myconic potions, part I, rough stone, copper ore, iron ore, silver ore, lump of coal
  • New recipes: distill (gorgeous) plum-nose mushroom into myconic essence; brew small healing potion from myconic essence
  • NPCs can now buy and sell items
  • Looking at a skill’s details (click the name of a skill from the skills panel) now shows which recipes you both know and have yet to learn. Learning a recipe now grants the corresponding skill at level 1 if you do not already have it.
  • The inventory panel now only lists the most recent items received, but contains a link to browse your entire inventory, which is filterable. Players can click an empty equipment slot to open their inventory filtered for items suitable to equip there
  • Each floor of a procedurally generated dungeon now requires a randomised quest to be completed before you can descend to the next floor. Closing the page or refreshing while in a dungeon will cause you to lose some of your inventory
  • Location name and difficulty is now displayed as the minimap window title
  • Consolidated item types down to: accessory, armour, bones, component, drink, food, ingredient, junk, potion, quest, recipe, weapon
  • Wherever an item name is displayed, its icon is also shown
  • Monsters now slow down when the player is chasing them, and will pause if they end up adjacent to a stationary player

Thursday 13 February, 2020

Had my regularly scheduled fortnightly evening with Simon, my friend and official BotLG playtester, explorer and rubber duck. Like me, Simon is a professional web developer and video game enthusiast, so it’s always good to get his opinion and have a second set of eyes look things over.

As usual, he left me with a pile of bugs to fix and visuals to tweak, which will keep me busy tomorrow. We also discussed combat balance, item design and the way the game is steadily becoming less idle and more roguelike over time, and that perhaps it’s time to just finally embrace that. I’m going to set the global action duration really small (perhaps 2 seconds) and see how that feels.

After a couple of hours dissecting the game, we ordered Chinese and watched a could of episodes of Inside No. 9, then agreed to meet up again next week, ahead of it usual every-other-week schedule. By then, I’ll be just about to head into my last week of development before returning to the world of full-time employment, so hopefully everything will be finished (mechanics-wise) and I’ll be focusing on adding content.

Simon has really been invaluable to this project; he’s played every major iteration, has found javascript bugs, recommended changes and pointed out issues and exploits; so I’m super-happy to have him listed on the colophon/credits page. Cheers, dude!

In other news, I felt like I wasn’t making too much progress this afternoon, so around 4pm I closed PHPStorm and booted up Monster Hunter World: Iceborne. Look, it counts as research, right? Since starting on the Iceborne campaign I’ve switched from my usual longsword and started to use the hunting horn; I’m now up to a hunt for Glavenus, and I feel like it’s starting to click. Obviously it’s great in groups when I can doot away playing songs and providing buffs as I hit the monster about the head, but it’s also really fun solo. I had thought it might be a bit lacking solo, to make up for it’s obvious group benefits, but it turns out the hunting horn is just all-around great.

I’ve got to add to musical instruments to BotLG. Murder-bard should definitely be an option…

Wednesday 12th February, 2020

Had a bit of a tough day today. I woke up late, felt rough, and for the first time in a while wondered if all the effort I’ve put into BotLG was worth it.

A merchant in his shop

I played around with the display of items, so now they have their icon next to their name wherever they appear, which looks good, and then made a shop interior location to house my newly coded merchants. I can configure the merchant NPC, plus the goods displayed alongside him, and the crafting station, so I can reuse the same basic map for multiple shops. I like it; it’s reminiscent of the shops in the early Final Fantasy games, and if it’s good enough for FF, it’s good enough for me.

From my checklist of mechanics to implement, there’s only account-wide storage and character retirement left to do, and then it’s all adding new content: locations, monsters, items, crafting recipes. I’m looking forward to that part. I want to completely reinvent the starting area, so players can get into a procedurally generated dungeon much quicker, and I can push the roguelike aspects heavier.

I hope it is worth it. I’m still quite proud of what I’ve made, and I think it looks pretty good for a browser-based game. I’ve spent a lot of time on it, but today at least, I can’t shake the feeling that the time might have been better spent.

Tuesday 11th February, 2020

I said yesterday that I was going to be busy today, and unlikely to get any game development done; that turned out not be entirely true.

I was busy. I spent most of the day with my stepfather helping out with some DIY — planing and rehanging doors, putting up shelves, drinking coffee — that kind of thing. It was nice to get to hang out with him for the day, just the two of us. Normally I only ever see him along with my mum, and often I only see them together with my sister, so it was good to share some time that was just us — even if we did spend it humping doors about. Doors are surprisingly heavy.

We were done by about 5:30pm, which left all of the evening free.

The Rat King as his retinue

First, I made a sprite for the Rat King, the end boss of the first dungeon. I’m no pixel artist, which is why I’m using Quale’s Scroll o’ Sprites, but I was able to make up something by merging together a couple of existing sprites from the sheet. I’m pretty pleased with it.

After that, I started work on turning NPCs into merchants who can buy and sell items. I honestly expected this to be more complicated and time-consuming than it turned out to be, but it’s finished now after only an evening’s work. I guess I had a solid foundation of item-management methods, and the years of experience writing e-commerce software didn’t hurt either. I’ll save the details for a proper dev post at the end of the week.

I’m going to bed happy and tired.

Monday 10th January, 2020

I’ve had a very productive day of coding today, most of which is covered in a post I published earlier and the changelog, so I’m not going to repeat myself here. Suffice it to say, dungeon generation is looking good, and I’m happy to have a few more recipes and skills implemented.

Instead I’m going to talk about some podcasts. I started the day by listening to the latest episode of Rule of Three, featuring Robert Webb on The Young Ones, which was excellent, as Rule of Three always is. I’m a bit of a comedy nerd; I enjoy seeing the nuts and bolts of why something funny works, and Rule of Three manages somehow to dissect the frog without killing it.

There’s also a new podcast I’m looking forward to diving into, Lore of Yore, which covers tales from old school gaming. It’s produced by Danny “Austerity” Nissenfeld, who is one half of the fascinating Titans of Text podcast, so I have high hopes. I’ll probably listen to that tomorrow.