Hello, hello, hello all! This is Gaian, back again with another Month in Review. While I definitely wrote the last one like, last week, I actually wrote it a month ago!
What a month it was. Half killed me, very productive, half killed me more.
So, let me do my thing of actually checking what I did this month, because as far as I know, I did like 2 things yesterday and that was it for my month…
This Very September: In Review.
I cracked into this month reviewing the last month in review before landing at some real work: Soundtracks for the GS_Audio system. It was much like the sound effects, but a little simpler in some places, with a scaffolding for much more complicated things to do down the line. For now, we can play music!
This day was a very marked day of the month… Really, of the entire year of working on the GS_Play Gameplay Framework.
With the incredible help of my colleague Nick, fussing moment by moment over my Data Assets, we finally breached where I was getting an aggravating issue: After you edit an asset, it will not propagate to my GS systems without an editor restart. This has been plaguing me for months, consuming enormous time, or not allowing for any fine tuning of the data held in any of the assets. This has been driving me crazy for forever, and has cast a dark shadow on the usability of the GS_Play tools down the line when we finally open it up for consumers.
It is done!
There were 2 possible routes to solve it, but I chose the direct bruteforce, “Make it happen”, option. Using a proper request for the file at a component’s startup, and replacing the old copy that it had as a reference from when it last saved. It’s not optimal, but it works every time. Optimization can come later. I’m freee.
Oh my, what a productive month.
Moving on, I started tackling one of the most significant pieces of our early goals towards making a small, compact game: Dialogue.
I had already mocked together a data structure for storing the dialogue that will then be loaded/processed for actual dialogue playback, but with many of the feature sets coming around, I had no other options but to just get after it.
To start, I got the data loading into something that playback could actually present, then quickly brought together the presentation features. Using commands within the dialogue text, you can change how the dialogue appears in the final presentation. Tackled: Bold and Italics, Colour, Speed, and Skipping. It looks really good with that already!
Soon after, I got different dialogue types. Dialogue Options are a common staple; I also introduced Random. Both are “selection” type dialogues where they can route to different outcomes based on how they go. On top of that, I pulled together a “Condition”. A gate that allows or prevents a dialogue node from being accessible by the selectors.
It also works out great! Although at this point I was having an annoying issue with rendering the UI elements after toggling them off and on rapidly. Frustrating as it totally borks the otherwise perfectly functional system when I show it off.
I then broke out to tackle some side tasks looming over me for some time.
I dove into figuring out shader/rendering pass features in O3DE. There’s a lot that goes into play for those, but we broke through our blockers that were stopping us in place at the time. Did not break through to a render pass yet, though…
BUT TALKING OF TOTALLY NOT THAT. I tackled a renewed “Getting Started with C++” set of videos. The original was extremely long, was riddled with assumptions that ended up being wrong, which I corrected in the following weeks. It was something that was constantly giving me guilt due to leaving it as the sole resource for getting O3DE C++ started with VSCode in Windows.
But they’re done!
Getting back to my core work, I started blasting through more features. This month was a blur with how densely I was pulling features together.
Next on the list: Babble.
Made a simple babble firing component that actually responds to the speaker’s name, allowing you to set up a library of babble voices and simply have them fire automatically, matched with their target speaker. Our speaker today has gravel step voice.
In the same day I set up custom Interact cursor settings on a target-by-target basis. Migrated the cursor itself to in-world UI, then I update the cursor icon with the Targets target icon, and unique colour. Gets the job done. Gotta make it face the camera next.
Next… oh boy.. next…
This month was most notably a month of figuring out some of the most complicated systems that I’d been kicking down the road due to not having a plan visualized for how to actually accomplish them. However, in tandem with that was soo much programming gaslighting. Like.. SO.. SOOOO. SOOOO.. MUCH GASLIGHTING… HOURS. TENS OF HOURS.
Today’s Gaslighting special?
The lovely ampersand. In C++ it means a “reference to”. Without? You’re taking a copy of whatever it is, in this case, a ui animation.
Cue 10 hours of refactoring, debugging, profiling, tiny one-line changes, single value changes, rebuild after rebuild, engine load after engine load.
ALL THE OUTPUT WAS VALID. ALL THE ANIMATION WAS RUNNING. BUT WHY COULDN’T I SEE IT?!?!?!?
Because the animations were running on copies that pointed to nothing and were destroyed in the next frame.
Yuh.
HOURS. HOURS UPON HOURS. DOUBT, FEAR, RAGE.
But look!
One horrific day down… so many more to go…
On to the NEXT horrific day!
Quickly rolled off that UI Animation victory and capped it off with a little extra work to make it a bit more feature-complete. Most notably: being able to point some of the aim effects to other things. This was to make the Button text change colour and size. Primo. Done at the very beginning of the day.
Unfortunately, the UI system as a whole had not been met with much attention lately, and was one of the first GS_Play featuresets I had made… Well it really showed, in that it was completely broken and a total mess.
Well, as a good developer, I might as well tackle it right away. If you can’t draw hands, you should be drawing hands all the time.
Oh my… oh my… I have gone 6 months without a day being a complete unmitigated loss.
I had been going after the UI stuff for the entire rest of the day. Only to find that one of the massive issues that was happening was that, unbeknownst to me, I had used a “Broadcast” event for a feature that uses an “Event” event to call it. The difference being that a Broadcast signals the entire game world at once, while an Event says: “Hey you, YOU do event.”
That’s not what was unbeknownst to me, though… What I had no idea was that you CAN broadcast to an event, it just makes EVERYONE “Hey you, and you, and you, and you… YOU do event.”
No errors, no crashes, just a silent: “No matter what window you tell to show/hide, all of them do it simultaneously.”
That day ruined me.
After a long ranting passion tak with a friend about how much fun I’ve been having with O3DE and C++ and my own capacity to program and develop features and tools I decided to chip out a victory. So from Midnight until 2:30, I put together…
An Intermediary Dialogue Editor!
This came to me a few days prior, but I had told myself. Well, just get this UI stuff together and you’ll be doing this dialogue thing tomorrow. For like 3 days by that point.
With this feature, it was so clear what I could do.
Rather than writing all the data by hand. A tedious, confusing, and horrifically inoptimal process.
I could handle most of it automatically, and just worry about LINKING the nodes together by hand. Far simpler to just say “uhh what node number is that one, 30? Okay, link to 30.” than manually typing the entire thing.
That ended my week, so what a relief that I had at least SOMETHING to feel accomplished from. I was definitely completely totaled over that weekend, that’s for sure.
Returning back to it the next week.
I tackled adding the scaffolding for an “Effects”, and “Performance”, node. Nothing from them to show yet.
That day, I also had a eureka about how to prototype features that require two feature sets simultaneously. The core of how the GS_Play system works, is that each feature set is meant to be isolated in order to ensure modularity. Letting you toggle on and off any feature you want without any rats nest of code causing a crisis.
This, however, meant that when you need to make a basic feature that, say uses interaction and fires a sound effect, I was using Script Canvas within the project itself to accomplish it.
Now? The GS_Complete gem.
While we proof things out, the GS_Complete feature set can now exist to carry the “it’s dependent on EVERY GS feature” needs we have in proving out the full range of features necessary towards making a complete and well-made game. Primo x2.
So, as a reward, I thought I’d destroy myself for another 10 hours. Yaay.
I returned to the UI mess that I had left the week prior. A good dev definitely doesn’t destroy a feature even more than it was before and then let it lie. But… well.. yeah… Time to hurt myself again!
FOR HOURS. FOR HOURS AGAIN!!! HOURS AND HOURS AND HOURS!
But I did it. I did it all.
- I fixed the windows not rendering sometimes.
- I fixed the UI system.
- I fixed the unique things needed for the Options window, using those fixed UI systems.
- I got my Authored Dialogue assets actually loading into the Dialogue system.
- I got my Dialogue System to START a dialogue by sequence name.
- I solidified the logic around repeated calls.
- I made a GS_Complete “Interact fires Dialogue” trigger.
And LOOK! It’s been did. So completely did.
Phew, hours upon hours of programming gaslighting done.
Ha ha, no!
Changing levels no longer works. Makes sense, I added so many new things to the game. It’s just a matter of shoring up those new features and then it should go back to working out like before!
Haaaaaaa ha ha ha haaa…
Sure, there were definitely things to shore up, systems to make work with the level changing… I did tackle those, and without those fixes, nothing would have been fixed, so that’s definitely good.
But, everything is blowing up. Like complete and utter collapse.
And just this cryptic message.
Exactly the same every time, no discernable way to identify what was going on. But, changing the level is making something go away that instantly makes all these other things fail. Guaranteed.
Guaranteed loss of 82557326-4AE3-416C-95D6-C70635AB7588, guaranteed failure of those 8 things.
Ohhhhh boooy.
Ohhhhhhhhhhhh booooooy…
Guess what?
FOR HOURS… FOR HOURS!
I DID EVERYTHING I COULD THINK OF. MULTIPLE TIMES OVER!
I investigated hunches, and could not prove them right.
FOR HOURS.
It had to be when I delete my duplicate GS_GameManager. But if I change the level the GameManager gets destroyed immediately, and if I wait 5 minutes, then change the level, this unknown thing gets destroyed and then everything fails. What else could be going on???
HOURS. HOUR UPON HOUR UPON HOUR.
Maybe it’s that my main Game Manager is being destroyed instead of the duplicate? No.
Maybe somehow the Game Manager that’s being destroyed is still somehow calling “End the Game Because I’m being ended” even though it’s not supposed to be able to. No.
Well that’s it… It’s 11:30. I’ve been after this for sooo many hours…
I’m talking to my partner about how completely defeated I am, that nothing I’ve been investigating is making it work. Sometimes it changes levels like 20 times, sometimes it crashes on the 2nd level change…
So then. One last possible thought.
Instead of destroying the duplicate Game Manager, I’ll just make it inert, disable it’s events and stuff, and just leave it.
It should get destroyed with the level when it changes…
It worked.
IT WORKED.
AHHHHHHHHHMMMMMGGGRRRRRR AAAAHHHHHHH RRRRRRRRRGHHH RRRRRRR!!!!!
It turns out. Whatever may have been happening with the Game Manager destroying itself, destroying the level was making them both conflict and one way or another, the Game Manager system was being completely dropped. Making my operating Game Manager stop being able to exist… And with all the Game Managers failing, the various GS System Managers were failing too.
I did it.
I DID IT! LOOK!
Finally. Finally, the Programming Gaslighting ended. This time for reals.
I SWEAR!
So I got to move on. Actually aim my targets on things, see them through, and end my days at a time that wasn’t 2 seconds before lying down to sleep.
I tackled some Loading Screen things. Started some Pause Menu things.
I put together some O3DE feature requests and github issues.
I actually investigated the Ui navigation input system and came up with a pretty solid solution for making it customizable, which it currently is not.
And then! To stop myself from doom scrolling online. I ended up updating a free Material Colours set that I made last month! It now has primary colours, a range of browns, and even some emission materials. This should really satisfy most needs in blocking out game worlds and making simple details. I’ll be very excited to put it to use when working on our game project!
You can grab it here: https://github.com/GenomeStudios/O3DE_BasicMaterialColours
Capping off this month, I actually have been doing a bit of contracting work.
Very unlike me, but it’s nice being able to make some money, and also flex my professional muscles.
I spent 2 days tackling a mock demo to showcase the gameplay and provide some nice scenic gameplay visuals for further pitching and promotion.
I have to say, I might actually be a capable game developer! Whaaaaa??? No way.
And it was pretty fun!
But get this: I made it in Unity, using my Unity tech that is the fore-father of the GS_Play Gameplay Framework. And holy cow have I been improving on that featureset in GS_Play since stepping away from Unity. Building it from scratch from the ground up has allowed me to make the systems far more generalized and primed for being used for making many kinds of games, instead of the one.
Additionally, Unity, like most programming, uses references to things to work. This means that if a reference fails to be made, everything fails.
O3DE uniquely is based on events, which can be fired onto nothing, and nothing fails; the event just doesn’t happen. While it can be hard at times to know you did actually fire that event, you can also just blanket fire those events, or, like I mentioned above, Broadcast it to the entire system to respond to. That seamlessness is incredibly intuitive when you’re just kinda… throwing game elements at each other. Game Development is an inexact science, and being able to fudge some of it can be an incredible value.
All in all, I was sincerely so impressed with the foundation that this new GS_Play toolset is capable of. It may not be as fully featured as the tech I had was, but it’s thousands of times more concrete. And with every triumph over 12 hour gaslighting by the features we’re making, it gets ever more solid.
I am truly excited to get into the making of games part with it!
Making Games? That beeeing said…
That dev work actually broke up some real barnacles I had going with me the past few months, which has been that I’ve been in a problem solving, making systems, mindset. The creativity of making play was scarily absent from me and was driving me to try and tackle only systems until I could regain that creative flow.
Well, with that demo aside… My creative juices started flowing, and I have actually capped this month off with a tiny breach into the game-making side of things.
So I left the Pause Menu broken and alone, and started working out some game things!
I broke out my Inn level into it’s own level. (Which I can now actually travel to…) And started putting together the additional spaces of the level. Starting with Jorje’s room.
This stoked some now immediately needed features:
Level teleportation. Not just Level Changing.
And one that I hadn’t been able to figure out in my entire life of Game Development: Snapping the camera placement and rotation to the end point after a level change.
And I got it!
I am very excited to further get into development and really flesh out some space in the game world!
Wrapping Up
This month was work-dense for me, but really accomplished. Our work is definitely manifesting into some great stuff, and I’m very eager for us to get further in.
I am really happy to have more confidence in doing some designer work, which should mean that we can get into the game stuff far more substantially. Having the Dialogue ready for some character and world building, along with full-fledged UI and UI animations, should mean that we can pave forward with little pause.
I think with that, this month has been thoroughly reviewed!
Here’s to one more!
Thanks for reading along.
Want to keep track of all Genome Studios news?
Join our newsletter!