Since I finished my Digital Forensics Course (wrote the exam on the 24th Oct), I've moved on to a new course on Network Security. 

So far,  I've already been disassembling networking protocols using Wireshark from almost every layer within the OSI network stack. This is a similar thing I had to do when designing/debugging the networking protocol I designed in my broker a while back when sending TCP/IP packets back and forth between the client, server and broker, though this formalises the theory somewhat.

I've been always interested in the technical aspects of network routing but now, I'm able to incorporate principles of network design, routing and security into my study which is great. We're using a build of ArchLinux provided by Cisco as part of their CCNA CyberOps and CCNA Security modules, which the course is based primarily on.

I say primarily because I still have to write essays and reports alongside being graded by the CCNA exam subsystem, so there is no chance to escape being assessed on all the material.

I made great progress recently in my understanding of IP routes and routing in general, particularly with regards to layer 3 IP address and subnet calculations and Layer 2 routing is also something I've come to appreciate so far, particularly the Spanning Tree Protocol.

I've also been learning about elements of the Game Design process which is actually quite fun and more recently we've started learning about Unity a 3D C# game engine which makes things ridiculously easy to create a 3D game. It also shows how much is involved in creating a game engine. I'm only touching the surface with my own prototype which is rudimentary at best.

I've been working on my Game pitch for a game I've designed called Mazer. Designing games is a very creative process, something I've not really experienced before and while it's new and interesting, it's also quite tricky because it's not just about development/programming.

I've got to give a presentation on my design-pitch next week. I'm prepared, I've designed a pretty cool game which I think with a little blood, sweat and toil, I can pull off.

It's basically a mix between Pac-man, space invaders, a puzzle/jigsaw and a maze. Here's the presentation/pitch for far:

{google_docs}https://drive.google.com/file/d/1TvFzzrjO7QJ9tDKB6mPpFiHuu2xT2Cvc|width:800|height:500|border:1|border_style:solid|border_color:#000000{/google_docs}

11/08/2019: I gave the presentation yesterday. It was a bit nerve-wracking talking up in front of the people but I did ok, which for a creative exercise like this - I'm happy with as public speaking is not usual for me.

I've now got to write up a game design spec and then produce a prototype. I've been designing Mazer in my spare time using my C++ game engine prototype but for assessment, I'll be using unity which means I'll need to port my maze generation code into C#, which should be easy. More about that below.

I'm interested now in learning more about quantitative research approaches and sampling techniques, in view of exploiting stuff I've not learnt about before. For example, basic statistics describing populations and central tendency via standard deviation, dispersion and variance might be vastly improved upon using aspects of theory testing via statistical inference which I've not got much experience with. So I'd like to learn more about that.

On Friday(my day off) and Saturday, I spend time reading about the different research strategies including Design and creation (I'll probably use this predominantly for developing my Game idea), Experiments, Case Studies, Interviews, Observation and general Questionnaires in obtaining sample research data.

On the game development front, I've had to cut back on my 3D ambitions and branch off new code base that focuses solely on 2D graphics for Mazer because mazer is basically a 2D maze-shooter-puzzle.

I've implemented a rudimentary algorithm which is not based on the well-known Prims algorithm but my own (dangerous!) 'it-makes-sense-in-my-brain' algorithm to create sub pockets of mazes.

The net effect is a maze-like construction, as Mazer is not really a traditional maze, as it requires you blow your way walls via procedurally generated pseudo-sub-mazes(pockets) in order to make your way towards a destination(see the presentation for the game idea).

So, unlike prim's algorithm and other's like it, I don't need a maze that has a solution (But I'll need two solutions paths for the enemy patrol routes), but something that the player can be trapped in and blow themselves out of!

Here is what my 'Pockets of destruction' algorithm does so far:

Granted, it doesn't look like much now but it proves that the algorithm can generate these kinds of open-closed room systems that I'm after. That little white dot in the middle, well that's the player.

I'm working on the collision detection now as my player can just go through walls like a ghost, which is not part of the game!

My "pockets of destruction" maze algorithm (for now, it basically plops a series of squares down and randomly removes walls):

	auto screenWidth=800;
	auto screenHeight=600;	
	auto roomWidth = 25;
	auto maxRows = screenWidth/roomWidth;
	auto maxColumns = screenHeight/roomWidth;
	
	 vector<shared_ptr<Room>> mazeGrid;
	 stack<shared_ptr<Room>> roomStack;

	for(int y = 0; y < maxColumns; y++)
	{
		for(int x = 0; x < maxRows; x++)
		{
			auto gameObject = shared_ptr<Room>(new Room(x*roomWidth, y*roomWidth, roomWidth));			
			mazeGrid.push_back(gameObject);			
		}
	}

	auto totalRooms = mazeGrid.size();	
	
	for(int i = 0; i < totalRooms; i++)
	{
		auto currentRoom = mazeGrid[i];
		auto nextIndex = i + 1;
		auto prevIndex = i - 1;

		if(nextIndex >= totalRooms)
			break;

		auto nextRoom = mazeGrid[nextIndex];
		auto row = abs(i / maxColumns);		
		auto lastCol = (row+1 * maxColumns)-1;
		auto col = maxColumns - (lastCol-i);

		bool withinRowsRange = row >= 0 && i <= maxRows;
		bool withinColsRange = i >= 0 && i <= maxColumns-1;
		
		int roomAboveIndex = i - maxColumns;
		int roomBelowIndex = i + maxColumns;
		int roomLeftIndex = i - 1;
		int roomRightIndex = i + 1;

		bool canRemoveAbove = roomAboveIndex >= 0;
		bool canRemoveBelow = roomBelowIndex < totalRooms; 
		bool canRemoveLeft = col-1 >= 1;
		bool canRemoveRight = col+1 <= maxColumns;

		vector<int> removableSides;
				
		if(canRemoveAbove && currentRoom->IsWalled(TopSide) && mazeGrid[roomAboveIndex]->IsWalled(BottomSide))
			removableSides.push_back(TopSide);
		if(canRemoveBelow  && currentRoom->IsWalled(BottomSide) && mazeGrid[roomBelowIndex]->IsWalled(TopSide))
			removableSides.push_back(BottomSide);
		if(canRemoveLeft  && currentRoom->IsWalled(LeftSize) && mazeGrid[roomLeftIndex]->IsWalled(RightSide))
			removableSides.push_back(LeftSize);
		if(canRemoveRight  && currentRoom->IsWalled(RightSide) && mazeGrid[roomRightIndex]->IsWalled(LeftSize))
			removableSides.push_back(RightSide);
	        // Choose a random element wall to remove from possible choices
		int randSideIndex = rand() % removableSides.size();
		
		switch(removableSides[randSideIndex])
		{
		case 1:
			currentRoom->removeWall(TopSide);
			nextRoom->removeWall(BottomSide);
			continue;
		case 2:
			currentRoom->removeWall(RightSide);
			nextRoom->removeWall(LeftSize);
			continue;
		case 3:
			currentRoom->removeWall(BottomSide);
			nextRoom->removeWall(TopSide);
			continue;
		case 4:
			currentRoom->removeWall(LeftSize);				
			auto prev = mazeGrid[prevIndex];
			prev->removeWall(RightSide);
			continue;
		}
		
	}
	
	/* Queue each generated game object to be added to the current scene */
	for(auto gameObject : mazeGrid)
	{
	std::shared_ptr<GameObject> cpe = std::dynamic_pointer_cast<Room>(gameObject);
	auto event = std::shared_ptr<AddGameObjectToCurrentSceneEvent>(new AddGameObjectToCurrentSceneEvent(&cpe));
		
		EventManager::GetInstance().RegisterEvent(event);
	}

Still got a long way to go, and still needs to be ported to C# for prototyping but its a start.

Oh, and in other far better news - we won the Rugby World Cup, which really made my day :-)

So proud of them.

I even wore my Springbok rugby jersey at half time (Transported back to my 9-year old self)