Sunday, 31 October 2021

The Halloween PBR Special

 Hey kids, wanna see something really scary this Halloween? Caution, it's not for the feint hearted!

https://www.usdebtclock.org/world-debt-clock.html

 If you have fully recovered from that horrifying experience, let's talk PBR. But first ...


Not really that different, but my aeronauticals/dogfighting game is on haitus. After working on it for a full year, I have moved back to my previous game of catgirl carnage swag it up. The reason I spent the last year on the arcade aircraft game was that I needed a break from the twin-stick shooter featuring leggy ladies with fluffy ears due to burnout - see the blog entitled, "A change is as good as a rest" from last year.

Well it's been a change rather than a rest and I managed to create a full working concept for arcade style aerial combat, which I expect to return to sometime in the future. However, for now it's back to all-action catgirl shooty collectathon because it's a lot closer to completion than aeronauticals and since it's been a whole EIGHT YEARS since Airship Dragoon was launched and it's almost embarrassing that I have failed to ship anything in that time.

I've got a new app id from steam and have been busy installing steamworks for the game on my local PC. This has taken a bit of extra work, mostly due to the fact that I couldn't remember anything about getting a game working for Steam because I haven't done it in said 8 years.

 Originally catgirl twin-stick swagathon shooter was called AoT ("Always on Time") ... which I dropped and renamed it "Swag It Up", a rather more to the point title. Don't go looking on Steam yet, I haven't sorted the store front out yet so it's not listed, I have just integrated steamworks locally for testing.

Now for that PBR ...

  Now the engine has a new asset browsing system, which is apparently all the rage and the cool kids can't live without it. Obviously I hate the entire thing but that's the future for you; I was promised flying cars and holidays on Mars, instead I get texture memory leaks and assets overloading their materials from their own asset file instead of using my predefined materials - which are still the ones that show up in the material editor even though the other ones are the ones getting loaded.

I redesigned my swag markers

Once I had found all of this out it was simply a case of opening each asset's file and removing the material reference that was interfering with my existing materials. This was somewhat of a pain in bum due to me having huge numbers of assets/models, all of which had to be individually and manually edited.

Shiny PBR is shiny

 So next up is to finish off the remaining PBR conversions and then go about porting the actual game logic to the latest Preview4 engine build. I think I will however upload the current working Dx11 but not PBR version of the game to steam for initial online testing.

The main thing to get done is sorting out the Steam store page and get it listed. This requires a trailer video and some screenshots, but most importantly I need to draw some good store front box art to advertise the game and also use as a main menu background. I also need artwork for the character portrait selection screen.

As for aeronauticals, it may well return one day and be completed and shipped. So here's a full video of the first mission.


Happy Halloween and don't have nightmares about global debt.

https://www.nationaldebtclock.co.uk/

 


 







Thursday, 30 September 2021

One Year Of Aeronauticals

 So it has been an ENTIRE YEAR (from 1st October 2020) of working on my aeronaut/aeronauticals/dogfighter game that was loosely inspired by Ace Combat with 1930s aircraft and a lot more tightly inspired by Descent: The Great War space combat simulator but with gravity.

How it started (after a month or so anyhow) ...

And, how it's going ...

 
So ... that's been a bit of a change then ...
 
First up, I've created a brand new class of object, aeronautVehicle, that derives off vehicle class, which derives off rigidShape which is the thing that controls the physics, and shapeBase class ... which everything and it's dog seems to derive off if you want it be any form of a dynamic object.
 
This meant that I had to work out how an aircraft actually flew worked. Obviously this would be incredibly boring so instead I worked out how an exciting arcade style flight model worked basing it on ideas and physics values that I mostly pulled out of my bum.
 
Actually that's not entirely true, I did detailed research for months previously, basing everything on real world values and compiled lengthy text files on how the whole thing would work; eg: hitpoints were based on empty aircraft weight divided by length per area element (wings, tail, etc); and thrust was based off maximum take-off weight divided by kilo-watts of power per engine (or something like that) with modifiers for total aircraft area versus air friction... eg: fat aircraft would lose speed faster than smaller ones, etc, etc.

Similarly gun damage was based off calibre, calibre per 10mm modifier, number of guns, and some other stuff, with more guns increasing both damage and overheat timing.

The real problem was creating an Ai system to fly the aircraft against the player. Not only did they not have to crash into anything --- which ended up being much harder than you'd think --- they also needed to act as if they were a real pilot, so I ended up making 12 (?) evasive maneuvers that they could pull when neccessary. Stalling ended up being a huge issue depending on speed and attitude of the aircraft and tightness of a turn. I ended up creating a class of super-Ai pilots who I never stood a chance against, and had to dial the whole OP back, discovering that the margin between genius Ai flyer and absolute idiot was very small.

Damageable elements reduced performance of the aircraft's speed, turning, rudder, etc, and the whole thing had to modeled in 3D and textures to give the player good visual feedback as to what is happening to their aircraft.

PBR was a thing ... a thing which I did not know what ORM stood for and so ended up putting the rough and occlusion maps into the wrong channels because that is how they are set out in the materials editor.

My grasp of networking certainly improved, I had managed to create a co-op mode - based on seperate instances on the same box because I only have the one machine - and I soon realized that I wasn't supposed to just fill the whole of pack/unpack with all of the read/write data because much of that was on the server anyway. Trailing definately need to be on both or either Ai/players would trail and the others wouldn't depending on how they were handling their aircraft. Huge amounts of pack/unpack were commented out and the weird jittering my AI aircraft had been doing in debug mode stopped.

I created a crude lobby system were the level loaded without the mission starting except a briefing to give the player the details of the mission via a seperate file and to choose their aircraft and paint schemes. The player would then wait in this psuedo-lobby for other clients to connect or start a co-op multiplayer mission alone and newly connected players could drop in and out. Debriefing required a bit more voodoo as shifting large amounts of player-mission contextual descriptors - that's text - required some fancy thinking to avoid abusing huge numbers of server to client calls - something that I had been very keen on working smoothly and with the least possible amount of bandwidth.

 Creating missions was a series of timed and triggered events based on what the player and Ai pilots were doing. This required lots of scripting due to the lack of physical triggers which a player could walk into on a more normal character based game of the types I had previously demoed or developed.

And so that is kinda of it. After a year of development I have a fully functioning dogfighting game that plays halfway between an arcade shooter and simulator with a mission complete with playable roster of aircraft, briefing, debriefing and drop in and drop out online co-op mode. So naturally it's time to relegate this to the backburner and go return to my previous game project (and really tidy up it's networking) as I want something that can at least be released for Early Access early(ish) next year and Freespace-style dogfighter will require the most work whilst topdown catgirl mayhem is around halfway complete but needs "fluff" adding for the player's ease of life for the first few levels.

Tuesday, 31 August 2021

Takes Two To Tango With A Brief Debrief

Having mostly been a single player player ... stops, rereads that, nah we're good ... the concept of networking multiple clients wasn't something that I had particularly much experience with. This was most obvious when reviewing my C++ code and seeing that I had literally packed/unpacked everything of my custom aeronautVehicle class regardless of whether it required it or not. On further inspection only rigidBody attitude and whether it should be emitting vapour or not really needed to passed around every frame the engine updated. This could probably explain the jitteriness of Ai and other client aircraft movements.

Debugging ... (don't @ me!)

After quite a bit of faffing around I not only managed to get 4 player Co-Op mode working but had it so that other remote human clients could arrive after the mission had started, and replace the allied AI who had already spawned in their place. The Ai would smoothly disengage, move away and fade out before being deleted, hopefully out of view of other players.

Any later joining client would have to pick the remaining available flights/callsigns that human players were permitted at the briefing screen. Initially I had listed each and every callsign individually, but once I had the whole system up and running, I decided it would be better to simply list available wings and the number of taken and free roles within them. This would cut down on the possibility of scrolling through vast numbers of disabled buttons.

Co-Op Mode! Player 1 and 2 look at each other during a flypast.

The briefing screen also acted as a rather rudimentary lobby. Players could arrive and choose their flight roles, aircraft and paint job, and then wait for the server to fill. Once two or more players had arrived and selected their aircraft and were ready to sortie, a countdown timer would start and automatically trigger the mission so they weren't waiting around for ever. A lone player, waiting on the server on their own could start the mission with Ai wingmen, and future arriving players could drop in and drop out as replacement, as explained above.

One of the things which had proven to be an issue with the networking was briefing. Sending huge amounts of text over a client connection seems like rather a bad thing and I have been desperate not to abuse seven shades out of the commandToClient. This is the reason that I haven't got a large and indepth mission briefing description working yet. I am considering creating it as a seperate GUI file and sending that directly to the player in the same way mission download should work. I do however have a quick description of mission objectives created, pulling them directly out of the mission file.

Lies, Damn Lies And Statistics

 The post mission debriefing screen lists all the statistics that pertain to the player. All allied aircraft are listed as well as their victories, recorded as kills and assists, and their final state which descibes their damage. Added to this is the individual client's performance which ... when I iron out the bugs ... will list the types of kills and assists they scored as well as how accurate they were with their weapons. Right now ... it's a tad buggy ...

More Lies And Bugs Than Statistics ...

Here's a video of the old way I selected playable flights with the multiple buttons at the beginning, and shows how the briefing screen works for aircraft and paint scheme choice.


And so that was the month that was. August, it was wet and cold and not much of an end to summer. The summer fan is dismantled and stored for next year, and the Autumn duvet is already on the bed for maximum comfy.