Last Day in Paradise

We’re leaving Florida today, and it’s raining. That’s given me some time to get things together for the backpack quest, which I’d like to have “working” before I post the game. I made quick, temporary graphics for all the required items, and just wrote the code for the LockedOpenable, which is like an Openable but requires an item to open. This is what the branch-hook that’s holding your backpack is implemented as; it doesn’t really “open” like a cabinet, but the branch unfurling into the water and revealing the backpack works the same way - and it looks pretty good, if I do say so myself.

Sara’s going to work on sketches for the remaining two rooms, then she’s going to start trying to replace these test graphics. I still need to figure out how to submit things to itch.io, which is where I expect this to end up when it’s “done.”

Lofty Goals

When I originally pitched this project to Sara before the vacation started, I’d figured this kind of game would be a breeze to make, even in an unfamiliar engine and toolset. That hubris is comin’ round to haunt my now, as it’s clear this won’t be even close to finished by the end of Sunday. So.. here’s what I’m thinking.

Sara is excited for this project, and committed to finishing it. I am too; considering her work is so popular, this is a game people might actually play! So I’m going to post what I have done before the vacation is over, and then we’re going to keep it going and see what we can do, I think this has the potential to be a really awesome, if short, adventure game.

It’s not the first vacation project that I didn’t have time to finish, and it won’t be the last.

Items in Cabinets

Part of this game is going to be searching through the house for items, and as such some items will be contained within cabinets. I’ve added code to Openable to handle this; now, one item can be contained within an Openable, and will be revealed when it’s opened.

Unfortunately, Godot doesn’t handle propagation of click events in overlapping Area2D instances like it does other events; it looks like unless I write some code to handle that myself, I’ll need to make sure that Openables that have items in them don’t have a description of their own. I think that’s probably okay.

Locked Doors

Tomorrow is our last full day in Florida, and I already miss the weather. I’m sitting outside on the porch working on the game right now, as I have with many a vacation project before this one, and it’s a very comfortable 71, which is awesome in December.

To follow up on the potion quest, I added in the LockedDoor class; this class is maybe more generic than it needs to be seeing as there’s only one in the whole game, but what can I say? It is also the first piece of the “game state” tracking, currently being done with a Dictionary at MastterController.game_state that holds arbitrary values. I assume future classes that care about state will use this as well.

Potion Quest

Sara and I spent some time tonight finishing the quests and concept drawings for this project so she can finish the assets. Here’s the second quest:

Second
Quest

This quest happens alongside the remaining two - they can be taken in any order, and even simultaneously. They’re all to retrieve some item that you need in order to leave for your adventure - one of those items is a potion.

The potion is found in the cellar - you need to pilfer the key before you can even get in. Once there, a “grump” (some kind of creature) is drinking the potions, and you have to give him something else to drink to get the potion you want. That “something else” is some of Dad’s liquor, which is too high up on a shelf for you (a child) to retrieve on your own - so first you need a stool. Once the liquor is traded for the potion, this quest is complete.

This is the only quest that goes into the cellar, and the only time you need to interact with the grump, but hold on to that stool - it’ll come in handy in another quest later on.

In this update, I added the real rooms - we finished the entire outline of the game, so I now know where everything is and how it connects, and all I need is for it to all be created. Two of the four rooms still need a sketched out background, so they’re blank (but the doors exist at approximately the right place and work). I likely won’t be using these rooms for continued development, as I still need my test assets in order to finish the global game state.

Usable Items

Today, we kept up our New Year’s tradition of going to aquariums by going to see the manatees down by the TECO Electric Plant’s “Manatee Observation Area” (which is run in conjunction with the Tampa Aquarium so it totally counts). Wild manatees are drawn to the warm (clean) water the plant puts out, and so a small exhibit was built around it to allow the public to see them without interfering, and proceeds from the operation go to further help them manatees. Overall, a cool trip.

I added the ability to use inventory items; once clicked, the item follows your mouse, and the next click is “using” the item - either on something, or simply dismissing it. Again favoring simple interfaces, it takes one click to “grab” the item, then the next click does something with it (or “un-grabs” it if nothing was clicked). I also found out how to actually use dictionaries in Godot, which is good/bad; on the good side, they exist and work as expected (mostly), but on the bad side editing them in-editor is a huge pain. I think I can struggle through it for this project, but if I were to expand this to a larger game I’d have to find a better way of doing this. Anyway, that works well enough for now, and Clickables can respond differently when items are “used on” them. The final piece is triggering some outcome when an item is used on the right object, and tracking global state. Then we’ll have a game!

Early Morning Inventory Interactions

I’ve been a bit sick this whole time, and woke up in a coughing fit at around 5:30. After fighting being awake for a while, I finally got up and found everyone else asleep (except Sara who I’d awoken). Sounds like a great time for more Inventory work!

I redid the InventoryItem class as a scene so that it can have all of the nodes laid out without having to create them manually; Godot’s ability to use scenes both as rooms and as individual objects within rooms is super powerful. I moved the existing logic into a new script, added a new function to create the objects from the scene, and now I’m getting click events on my InventoryItems. I only need two more things: to make the item follow the mouse until your next click (to use the item), and to figure out how to map “item_id: resulting text” on Clickables so that items can be used on them (I expected this to be an export(Map, String, String) var responses kindof thing, but it’s not clear if Godot lets you do that.

Coffee Shop Inventory Moment

Having taken some more time to ourselves, we left the house in the evening to go work at a coffee shop, where I got the first half of the inventory system working (the part where you can collect stuff) while someone played their “chili song” on the acoustic guitar in the background. Clever diddy about how chili for supper is the true test of love. I’ve been to a few open mic nights, and this is amongst the better ones.

To keep the interface simple, Sara and I decided that items in the inventory won’t have a specific description; instead, you can (optionally) get a dialog when you collect the item, but that’s it - subsequent clicks on the item will use it. I think it’s important that this game is accessible to everyone, and I don’t want to bog it down in mechanics that don’t really add anything.

Someone else is on the mic now, and he’s really good.

A Wonderful Day Out

Sara and I got the chance to go out by ourselves overnight on one of the islands, and it was a great time. We got to walk the beach as the sun set over the gulf, have some tropical drinks, and spend some quality time together without interruption. It was awesome.

After getting back, I put in logic to handle “openable” objects; things like cabinets that can be opened to reveal their contents. I think it’s finally time I tackled the inventory, as that is needed for most of the rest of what I want to do.

Safe Travels

We made it to Florida yesterday, but it was a long day of traveling and visiting, and I went to bed early - no time to work on this at all. That said, the weather down here is beautiful, and before I head back down to the pool, here’s an update that adds arbitrary-length dialog boxes, broken into three-line segments.

I had some issues with GoDot’s limitations around export types - namely, I can’t define export dialog_lines: DialogTextPool as DialogTextPool is a custom type. I’d expected to be able to define exported variables in my custom class, but that’s not a thing. This is going to complicate conditional dialogs; adding a global game state is high on my list, and I was figuring on exporting a list of “(game state, dialog text)” objects for Clickable, but since I can’t export custom types I might have to be more creative.

Anyway, my son’s getting impatient, so I’ll think about it later.