Game Design, Programming and running a one-man games business…

Code Breakdown for Gratuitous Space Shooty Game

I code my games in C++ using visual studio 2015, and some help from visual assist from whole tomato (basically improved intellisense). I coded my own engine, but as GSSG is a simple 2D space shooter, thats easily good enough. I thought just in case anyone who reads my blog is learning C++, it might be interesting to describe some of the code.

The core part of the game is a function called GameProc, which is what gets called from the WinMain function in a loop, assuming the game is running, and its super simple:

void Game::GameProc()
{
GetInput()->Process();
GUI_GetSounds()->Process();
GGame::GameProc();
}

Thats the whole game loop! But obviously most of the relevant stuff happens in other classes. The basic principle is important though. My games reads all asynch user input (basically its checking the keystates for the keyboard), then it processes the sound engine, then the core game does its thing in a separate class. User input from mouseclicks and key hits is handled differently. I go through the windows messages for my app, and handle them as they happen outside this loop.

The fun stuff happens in that second GameProc function, which looks like this:

void GGame::GameProc()
{
	HRESULT result = GetD3DEngine()->GetDevice()->TestCooperativeLevel();
	if (FAILED(result))
	{
		if (result == D3DERR_DEVICELOST)
		{
			Sleep(50);
			return;
		}
		else
		{
			RecoverGraphicsEngine();
		}
	}
	if(PCurrentGameMode)
	{
		PCurrentGameMode->ProcessInput();
	}
	if (BActive)
	{
		GetD3DEngine()->BeginRender();

		if(PCurrentGameMode)
		{
			PCurrentGameMode->Draw();
		}

 		GetD3DEngine()->EndRender();
		GetD3DEngine()->Flip();
	}
	else
	{
		ReleaseResources();
	}
}

This is more interesting! Lets go through it. This code first checks to see if we somehow have lost the focus of the graphics driver, and if we have, it just pauses for 50ms and checks back later. Ideally everything then recovers from losing directx, and gets rebuilt. This sort of stuff isn’t really a problem now, as everyone is using non-exclusive borderless windowed mode, so its kinda legacy. The main game stuff comes next. The current game mode reacts to input, then assuming the game is still running, we begin the scene, draw everything and then end the scene, copying the backbuffer to the screen with flip.

So where is all the actual game code I hear you ask?

The trick is that PCurrentGameMode pointer. This is a pointer to an object thast represents the current game mode, and which one is selected and current is based on what we are doing. Right now my game has one object for the main menu, one for the (debug only) level editor, and one for the main game class. To make it interesting, lets check out the code for the main game objects call to Draw():

void GUI_Game::Draw()
{
	SIM_GetGameplay()->Process(); 
	GetD3DEngine()->ClearScreen(RGBA_MAKE(0, 0, 0, 255));
	GetD3DEngine()->ClipViewport(GetGame()->ScreenArea);
	if (GetGame()->GetGameModeName() == "game")
	{
		SetRT("rt_offscreen");

		GUI_GetBackground()->Draw();

		if (SIM_GetGameplay()->GetGameMode() != SIM_Gameplay::PREGAME)
		{
			SIM_GetShipManager()->Draw();
			GUI_GetAsteroids()->Draw();
			SIM_GetBulletManager()->Draw();
			SIM_GetPowerupManager()->Draw();

			GUI_GetParticleManager()->Update();
			GUI_GetParticleManager()->Draw();
			GUI_GetFloaterManager()->Draw();
			GUI_GetShieldStrengths()->Draw();
			GUI_GetDropLabels()->DrawAll();
		}

		PostProcess();

		GUI_GetInterface()->Draw();
		switch (SIM_GetGameplay()->GetGameMode())
		{
		case SIM_Gameplay::GAMEOVER:
			PGameOver->Draw();
			break;
		case SIM_Gameplay::POST_LEVEL:
			break;
		case SIM_Gameplay::PREGAME:
			DrawPreGame();
			break;
		}


		GUI_GetWindowManager()->Draw();

		if (BPaused)
		{
			DrawPaused();
		}
	}

	GetD3DEngine()->RestoreViewport();
	DrawBorders();
}

There is a lot of hacky nonsense happening here, but this is just a little hobby game, so I’m not too ashamed :D. So what does this do? Well the very first line of code does all of the actual gameplay stuff. I have an object of class type SIM_Gameplay, and I call that here and do all of the game simulation stuff. This moves the alien ships, handles scores, collision detection, and anything like that. All of the game mechanics are processed here, neatly separate from the graphics code.

Then I clear the screen to black, and clip the viewport (where we render) to an area I defined to be the gameplay screen. This is not the full screen, because I’m fixing the aspect ratio for this game to be some multiple of 1920×1080. This is the ‘ScreenArea’ which is just a RECT structure.

Then I get a bit clever. I set the render target to be an offscreen copy of the backbuffer I called rt-Offscreen. This is where I do 90% of the drawing in the game. I then go through a bunch of various singletons which access different visuals objects that get drawn, from back to front in painter-algorithm style, no Z buffer needed.

Finally I call PostProcess(). This is where I handle some fancy shockwave effects. I fill up yet another offscreen buffer with special images to donate any visual distortions I want to have, for when ships have shockwave explosions. I then copy the whole of that rt_offscreen to the backbuffer, using a shader which combines it with the contents of the distortion buffer to give me a nice distorted shimmer effect. Then finally I set the new render target to be the backbuffer, and draw the UI overlay stuff normally, so its NOT distorted by my shimmer effect.

Then I have some hacky places where I draw certain UI elements if the game is over, or not started yet, and then any windowed stuff, and finally some hacky code to draw GAME PAUSED if relevant.

Finally I restore the viewport so that I can fill in any surrounding borders for unusual aspect ratios and not have anything ‘leak’ out onto the edges.

This code is all a bit messy, because I haven’t nicely settled on a naming convention for a lot of those functions. Am I calling Draw() or Update() or DrawAll() its kinda random! Plus that UI stuff thats on the end of that function is a mess. I’m handling things THREE different ways here! An enum (GameMode) to call different functions, a complete window manager UI PLUS a special case there for if the game is paused. What a mess!

It all works and feels bug free, but its not clearly software engineered at all. I will definitely go back and re-arrange stuff and re-factor it so everything is laid out nicely. The reason I do NOT code like that at the start of the project is because I often throw things in quickly to see if they are a good idea, and I don’t want to type out a whole bunch of complex engineering layout baggage just to discover that this is a bad game mechanic or that this thing looks awful :D.

This is just the way I code, it doesn’t make it officially good, or fast, or better, its just what works for me!

Making a hobby game!

I’ve been getting very motivated about a little hobby game I’ve been working on in-between dealing with solar farm stuff, and playing the guitar. I have a lot of really cool space-game assets from my old game (some might say classic!) ‘Gratuitous Space Battles‘ and it just feels wrong to have all the art to make a space-invaders style game and not just do it! I decided to call the game ‘Gratuitous Space Shooty Game’.

I am so disorganised that its simpler for me to code a new game engine from scratch than find the hard drive with GSB code on it (or at least all of it), but luckily I have time plus experience, and I can type stupidly fast, so I’ve basically written a new game engine for this little hobby project. Its nothing amazing, the game currently only uses 2 shaders, no clever effects, no amazing visuals, just a simple ‘shoot at static sprites and enjoy some primitive particle effects’ style game:

Obviously its 2023, so just making simple ‘space invaders’ wont cut it even for a hobby game, so there is a lot of influence from stuff like galaxian, and pheonix, and all the other space shooters out there. Right now, the alien movement is very generic and simple, and nothing to shout about. No fancy splines, just left right and down!

The thing thats motivating me about this game is the small scope, and ease of adding new stuff. When I work on a giant commercial game of mine like Production Line or Democracy, every single line of code or change to a single data item needs to be checked and balanced for 11 different languages and every conceivable screen resolution and hardware, then uploaded as a patch to itch, gog, epic, humble and steam. The amount of admin, and busywork required to make marginal changes to a large project can be pretty overwhelming.

With this game, its 1920×1080 res or nothing (stretched to actual resolution, and bordered if necessary), only in English. And right now its not even on any store. This means I can have a cool idea, start typing code, and be testing it within minutes, which makes the development process pretty fun.

I don’t want to put up a public build for it quite yet, because so much of it is just totally broken, or half assed. The current font sucks, and doesn’t even display percentage symbols :D. The gameplay is unbalanced, and there is no high score system that actually stores anything anywhere yet. I reckon I need to code a primitive online high score system, and include music and sfx volume controls before I make it public. Oh and a pause button might be nice too!

I have to say though… its already very very fun. There is something very adrenaline-rushy about playing it on the harder levels, where everything gets a bit hectic. In these days of F2P, monetization, competitive e-sports, multi gigabyte patches, and achievements and so on… there is something very pleasurable about a simple game where you move left and right and hit the fire button!

When I stick it on itch or the humble widget I’ll post about it here :D.

Fourth site visit to the solar farm

2 days ago we took our fourth trip up to the farm to take a look at the site. Its over 400 miles a day of driving to do the round trip, so not something done lightly. Luckily this time we had arranged to be there when it was super-sunny, which is always a nicer way to visit a solar farm. Sun might mean no mud, but it doesn’t change the fact that this is a farm full of grazing sheep. 2 days later and I still have not got all of the sheep crap off my boots. After a while you stop looking where you are treading…

Because we are in the phase of the site build where MOST of the panels are up, and they are being wired, there is not much change to see on a day-to-day process. Most people would struggle to notice if the panels in a farm were wired-in. The wiring is always looped around the metal frame, then bundled into metal channels and cable tied together, so its not like you should expect to see cable trailing on the ground. There is a kind of minimum height to aim for with most of the cabling, which is above the height a sheep can gnaw at.

Here is an image near the end of a row showing the bundled cabling that runs along connecting the panels, and how it goes into the big chunky inverter:

Normal inverters just have one ‘string’ of panels connected to them, but industrial ones have multiple strings. This allows the inverter to do clever voltage balancing so that each cluster of panels is operating as efficiently as possible given that some may be a bit more shaded than others at certain points in the day. When you have just 10 panels on your roof, it tends to be ‘cloudy’ or ‘sunny’ at any point in time, and the inverter will adjust accordingly, but when you have 4 acres of panels, the conditions are going to always vary across even just 300 panels (one inverter) so you need the inverter to be more adaptable.

Not all the panels are connected yet. I insisted on being ‘that guy’ who wanted to plug one in personally!

This was our first visit where we saw panels installed on the right hand side of the overhead line. This makes the farm feel much bigger, and it will feel bigger still once that overhead line is moved and the two sections of panels can be joined. Waiting for confirmation on the grid connection works date and the substation and earthing design has been the biggest headache for me in recent weeks. It does feel impossible to get progress to move at any faster rate. Basically electricity generation connection in the UK has been handed over to private monopolies with no demand that they proceed in a reasonable timeframe. You have no choice but to just accept their quotes and their timescales. Its a huge scandal that nothing is done about it, but then we have a government who actively despises renewable energy, so I doubt anything will change until a new government. Very depressing…

On a happier note, it always makes me feel good to get a sense of perspective in photos like this showing how much renewable energy my little company is building:

I also had some genuinely great news, by co-incidence while I was at the farm. I had got ‘indicative quotes’ from the company building the farm for how much I could get for the power, in what is called a ‘power purchase agreement’ (PPA). You sign these for 1, 2 or 3 years with a fixed price to take all the power you generate. Of course in real physical terms, your power will flow to the nearest demand, which will be local villages and a nearby town in Shropshire, but in market terms, someone will contract to pay me for my power, and that could be anyone.

The interesting thing is that there is a dual market here. There is a simple PPA, where someone wants electricity, and they will buy it anywhere. It could come from nuclear, coal, gas, oil, wind or even from France or Norway. There is a thriving free market for this stuff. Then there is the REGO market. REGO is “Renewable Energy Guarantee of Origin”.

A REGO is a virtual certificate you get if you generate a megawatt-hour of renewable energy. It proves that the power came from a real renewable source. The REGO is basically traded on the free market, and keeps people honest. You cant sell the same REGO to 2 people, so it means if 10 companies each want 1,000 MWH, then they need to do deals with renewable generators who can provide that much power. If demand exceeds supply, the price of REGOs will go up, and vice versa.

For anybody super cynical, be aware, this system is real and works. If a company is bragging that they are 100% powered by renewable energy, they need to buy the REGOs to prove it, and only us renewable energy companies have them to sell. If you are getting your power 100% from a company that only supplies renewable generation, this is how that is enforced, and it really works.

In practice, at my scale, its not two separate things. You find a company who both needs power, and wants it to be renewable, and they give you a price for the bundle of the power + REGOs for everything you generate. In effect, this is a premium on top of the PPA I would get offered if I was a gas or coal-fired power station. Anyway… this is all a long technical explanation to say that I got 2 quotes from big (household name) energy companies and they were both WAY HIGHER than the other quotes I got. I am VERY nervous about the finances of this project, but if those prices stay in the same sort of level until I energize the plant (maybe October?) then, I will make a reasonable profit and it wont be a disaster :D.

My life will be far more chill when I finally get a date for the grid connection, or even just for the overhead line move… Fun fun fun.

Solar Farm: 3rd site visit during construction

In case you didn’t know. I run a small energy company and am building a small solar farm with the money I made from selling video games. Here is the company website: http://www.positechenergy.com

We made another trip to the site yesterday. Its a 350 mile round trip, and part of it was in the rain. This was the first time we visited in bad weather, but to be honest it wasn’t TOO bad. The site is basically the crest of a hill, so drainage is excellent, and it wasn’t too muddy. Despite, this they were still transporting solar panels on pallets using tracked vehicles, because…mud is still a thing.

I bought these solar panels about 8 months ago, in a fit of enthusiasm to push the project forwards. This turned out to be madness, as I then had to store 3,000 of them in a warehouse at huge expense. The panel prices did then rise…but then fell. I think overall, it was a bad decision, but not catastrophic. Despite owning solar panels all this time, I had never seen them until today. Also, 60 tons of solar panels sounds a lot, but does it look a lot in person…?

The answer is YES. It does. Its a lot of boxes, and thats not all of them, a lot of them were already fitted to the frames. Its multiple big articulated lorries full of them. On the plus side, I am no longer getting monthly storage bills. On the negative side, I had to pay £700 to the warehouse to load them on to the truck. This sounded a lot, but it is a lot of panels so… I guess its understandable.

The real excitement for this trip was to see panels actually on frames, to get an idea of what the finished project will look like. Our first impressions were that they were being fitted pretty quickly, and that the frames are really high. No danger of long grass obscuring the bottom of a panel! (A disaster when that happens, as it effectively shadows the whole panel, and indeed the whole string).

I posted that picture to give some idea of scale. Thats not a complete row of panels, we currently have a ‘gap’ awaiting the moving of the HV cable. once that is moved we can fill it in and have longer rows. You can just about see that a few rows are now double paneled, and some they have just done the bottom row. The bottom row is first, then they go back with a sort of frame to stand on so they can access the top row and fit those. There was a team of 4 people working together to mark out the location, attach the fixtures, and then place the panels on the rails. While they do this, fresh panels are delivered to points along each row on pallets ready to be fitted.

At this point, the panels are attached, but there is no wiring. A separate team of people (electricians this time) are connecting the panels together to form strings which eventually get wired to the inverters at the end of some rows.

Thats one of the inverters already mounted. Its a 100kw inverter, so about 25x the power of the kind you have if you get panels on your house. The box to the right is the emergency cut out switch. All that metal stuff underneath is just a bracket to attach a LOT of DC cabling to the inverter, which will run at head height along the length of the panels. In cases where the inverter is connected to panels on another row, there is underground armored cable & ducting to bring all the DC cabling together. Further underground ducts will connect each inverter to the substation using AC cable, but that work has not started yet. The substation design is holding everything up!

A picture to show the scale of each solar table next to a mere human. As someone with a small ground-mount array of 10 panels in his garden, its surprising how high up these are, and how tall they are at the top of the final panel. They are fitted in 2 rows height, in portrait mode (some farms are landscape), and each panel is ‘split’ into two, hence the white line in the middle. They are effectively 2 panels each, and have 2 connectors on the back of each one. Each panel outputs 410 watts

and lastly…

When people repeat stupid oil-company propaganda nonsense about losing farming land to solar panels, I’ll be tempted to reply with this. The grass is still very appealing to the sheep, and plenty of room between and under the panels for them to graze. Frankly on a day like yesterday the sheep probably thought the shelter was awesome. Technically the sheep are supposed to be out of the way during construction, mostly for their safety, but they got in somehow, and it turns out getting them out again isn’t easy. They seem to co-exist with the construction site pretty happily :D.

There will likely be a delay of a few weeks before I go back, unless something exciting happens. There are a lot of panels to attach, and then a LOT of wiring to be done, which is still a manual procedure. There is no clever automation or robotics that can do this yet. Actual humans have to walk to each panel, grab a cable, plug it in, then probably cable tie the cabling nicely out of the way, so it stays there in thunderstorms for 25 years. Maybe one day Teslabots will do this, but not this year.

The real hold up on this project has been the grid connection. First it was planning, then grid connection. I could write a whole epic space opera about how much grief it has been. I HOPE that we are now zeroing in on final agreement as to how everything will work, and thus we can a) start building the earthing mesh and connections for the substation and b) get a date for the DNO to move that overhead cable so we can fill-in the final mounting frames and tables and have everything connected.

The project is still a cause of daily worry and stress, because it involves literally dozens of people talking to each other in email threads that are contradictory, out of synch and confusing. Hopefully things get much better soon.

Meanwhile, a reminder of how important it is that we do projects like this.

Solar farm: 2nd site visit (July 2023)

A week after the first visit to the solar farm, we decided to head back. Its a LONG drive, but a lot had changed, and the next week looks like bad weather so I thought I’d grab the opportunity to take another look.

There is now a LOT of metal in the field! When you see a completed solar farm, it looks like just rows and rows of glass and plastic panels, but what is mostly hidden from you is the amount of metal support needed to keep it all in place. As I’ve mentioned before, you need to be sure that everything stays firmly in the ground for 25 years minimum, so there are no half measures.

With the frames in place now for most of one of the 3 zones, we get a true feel for how large each of the groups of panels (called ‘tables’) are. They are much bigger than the small array I have in my garden :D. I can just about touch the top of the main support posts if I’m on tip-toes.

Now that the frames are in, you get a much clearer picture of how undulating the land is. This looks like a few long rows of panels, but its actually not the full width. We wont be able to finish any of the rows of panels until the overhead high voltage cable has been buried, because you cant be piling tall metal posts in that close to an 11,000 volt cable. Hopefully we get an actual date for that very soon!

In a perfect world, the field for this farm would be completely flat, so the layout of the panels would be very uniform, with one inverter mounted at the end of each row, and each group of DC cables from the tables running along the top, at head height (so we don’t electrocute any sheep!) and they would plug right into the end-row inverters. Then a single trench would run along all the inverters taking their AC cables underground (armored, with sand laid on top, then topsoil, so totally buried and safe) to the substation.

Because this field is NOT flat, you need to wire the tables in groups that will get the same level of sunshine at all times. because of the hill, at sunset some panels in one region might be getting more sun than others. This means that each row is NOT a single inverter, but varied clumps of panels are wired to each inverter. That means SOME cabling in that gap between the rows you see above. That will be DC cabling, but will also need to be buried safely underground. Its an annoying extra complication.

I was very pleased with the progress in the 7 days between site visits. I’m still very nervous about the timing of getting the substation built. We cannot do this until the earthing is buried, and we cannot bury earthing until the design is complete. We HAVE now paid the connection cost to the grid in full (ouch), but still have neither confirmation that its received, or a set date for the earthing. I’ll have to try chasing that up soon, which I hate doing.

Solar farm building is 45% planning permission, 45% chasing people to do stuff, and 10% paperwork and spreadsheets. It’s a horribly stressful business, and its unusual for it to fall ultimately on an individual who owns a company. I suspect most people making the financial decisions for solar farms are accountants at big multinationals, for whom its not *their money*. I do not recommend this path as easy money or a quiet life!

In 4 days time panels will start to arrive and get fitted, which will make the site look much more finished and like a real solar farm. We already have the inverters (now back to Solis instead of Huawei. Don’t ask) ready to fit. BTW the inverters are BIG. I had in my mind that they MUST be big, but when you see pictures they look like domestic ones, but no. Each pair is on a pallet and the size of a chest freezer.

I’ll probably not be at the site next week, but will go back again after that to view the panels and inverters for myself. I like visiting the site and would go there twice a week if it was local, but 8 hours of driving in a day is a bit much, even if I can do about 80% of that on autopilot in my car. How anybody drives a manual car with gears and without cruise control or autopilot for that long each day is beyond me! (I used to do that in the past, but in my twenties).

BTW, just in case you think I am nuts for doing this, and that I should just relax instead, here is a reminder why I am doing it.