Fully Loaded
1/1/2014
Happy New Year! I've spent the last week working on a lot of new art assets. All 5 of the arenas now have animated backgrounds instead of the ugly, sold green background that used to be there. An example of a few arenas are below. I also finally got around to fixing my threading issue I mentioned a while ago. Now Fully Loaded no longer pauses when it checks for network input. The netcode is finally running correctly in its own thread and then sending any data it gets over to the main game thread. So the UI is much more enjoyable to use now. I also added a nice UI improvement that allows scrolling windows to be flickable so they don't stop scrolling the instant you release your finger. The scrollable windows had been really annoying to use before. But now they work more like everyone's become accustomed to.
bottom border
Cold Arena
Sky Arena
Water Arena
12/22/2013
First Person Shooter is finally on the App Store! That took a lot longer than I intended since I was waiting for my D.U.N.S. number to come so I could create an iTunes developer account. But the damn thing never came, so I said screw it and just released it under my name. It still took a few tries to get it on there though. Even with Unity making it easy to create an iOS version, I ran into a few usability issues. This was a bit surprising since I thought the Apple devices were supposed to be more uniform and therefore easier to make a GUI for. But the reviewers ran into some funny display issues that I had to fix twice!
Back to Fully Loaded, I finished up 2 more loading bars. Once I finished, I counted how many I have and realized I'm at 12! Which was the absolute minimum amount I wanted to have. So now my choices are to make a few more (I'd like to get to 20) or clean up the menu art and release. I'm leaning towards the 2nd option, and then after it's released, I'll add some more loading bars as updates.
bottom border
12/8/2013
Just finished my machine learning course! It was pretty tough, but still fun. Learned a lot and have some ideas on how to apply it to game AI later on. I can now focus fully on Fulyl Loaded again. There's still a lot of art work left to do, so that'll be my focus for the next few months.
bottom border
11/19/2013
Alpha is finally ready! And as a bonus, I found an amazing dump of high quality, free artwork that I can use thanks to the generosity of the Glitch team. It's unfortunate that Glitch is ending, but it was very nice of them to release all of their work to the public domain. The alpha can be downloaded for Android here.
bottom border
11/7/2013
I added a tutorial tonight. It didn't end up being as big a task as I thought it would be. The tutorial could use a few more components to it but I'm pretty happy with where it's at right now. It covers all the basics of the game play and interacting with most menus. I'll definitely still need to add some tutorial for sending friend requests and receiving mail, but that shouldn't be too difficult now that I've got the tutorial framework in place and in use.
I did run into an issue with saving files to an Android phone, so I still need to figure out saving, but once that's complete, the only major thing left is artwork! I do want to reorganize the layouts of a few menus too, but I'm hoping that will be simple.
bottom border
11/3/2013
After everything was looking good in my previous post, I ran into some issues running Fully Loaded on my phone. I found out that some of the APIs I used weren't supported in Mono on Android! Fortunately I could make my own APIs if I could find a way to access the Android API directly. The only way to do this in Unity is to make a plugin. I needed to make a mini Android app that provided the hooks I needed and expose them to Unity. Of course I had no idea how to do this. Lucky for me, I found a blog post that detailed step by step exactly how to do it! With so many steps, I was sure something would end up going wrong, but it ended up being very well put together. There were a couple minor omissions in the post and I screwed up a bit of my added code, but all in all, I was able to get a plugin set up to replace my APIs in just a few hours.
I'm getting pretty close to a bare-bones, full game now. I just need to add a tutorial, which could be a pretty big task, and a few UI elements and it'll be ready for some serious user testing.
bottom border
10/30/2013
It's been a while since my last entry. This machine learning course has been pretty tough and has taken up a good 90% of my free time. But even so, I've managed to work in some development and things are really coming along nicely. I've now got persistent, online storage working, meaning users can now register an account with the server, send and receive friend requests, and update the server with their active loading bar so their friends can challenge it. With this done, I think I have the full game loop finished. Once I've tested it enough, all that's left is the tutorial and a bit of art. There are some other small things to work out as well in terms of performance. The game itself isn't demanding at all, but I still need to receive data over a socket in the game. This means I have to block the game processing for a short time and it's extremely noticeable. Unfortunately, with Unity, spawning off a thread to handle this isn't as simple as it sounds since Unity heavily restricts what can be processed in a thread. I have some thoughts on how to handle it, but it's just not very elegant.
bottom border
10/06/2013
After a fair bit of searching I learned that I can use UPnP to programatically request port forwarding. This is great news since it means I won't have to switch over to TCP. After a bit more searching, I found an example on exactly how to do this. Unfortunately, I was only able to find 1 example in all my searching and it didn't work :( But all hope is not lost. After a few days of working with the example, I finally found the bug it had and was able to get UPnP requests working! This is great and means I can start focusing on more of the back end stuff now. But I might not be able to focus on it too much for a bit as I've just started taking an online machine learning course. I've just finished my 1st week and it's already looking to be a pretty difficult course. So I'll be spending most of my time working on the course material over the next few months.
bottom border
10/01/2013
So I decided to work on the server side a little earlier since I wanted to take a break from doing art. I've already had the basic design of my server done for a while and just needed to add a few more messages for it to handle. After adding those, I finally deployed it to this server so I could connect to it from anywhere, instead of just from home on my LAN. And that's when I realized I made a big mistake in my server architecture.
In order to keep my server fast and scalable I decided to receive UDP messages from the client on a thread, put those messages in a message queue, and read off the queue in another thread which would then also respond to the message. This worked great on my LAN, but I overlooked one glaringly huge issue... NATs.
When I respond to the message, I also respond with a UDP message, which my home router drops because it doesn't know what to do with this UDP packet. To resolve this I need to set up port forwarding... to my phone!. It wouldn't be so bad if Fully Loaded was a desktop game, but requiring port forwarding to a phone in order to connect over Wi-Fi is a bit much to ask. Especially since players likely won't even be on their own Wi-Fi with the ability to set up port forwarding. So now, not only do I need to redesign my server to use TCP, I have to redesign the game client to use TCP as well. Unfortunately, this has the disadvantage of severly limiting the number of simultaneous connections I can process at once. But if I manage to actually get that problem, I'll be one happy developer.
bottom border
9/22/2013
I've been a bit of a Dark Souls bender lately. I'm on my 5th play through it and wanted to try out a different weapon. So I went with the Dragon King Greataxe because its 2H R2 attack is so awesome. I'm nearly done the run now, just have Manus, Kalameet, and Gwyn left, but man has it been a lot tougher of a run than I expected.
Despite gorging myself on Dark Souls, I've finished off a few more loading bars. I'm up to 10 total now, so only 2 more before I start to get to work on the server side of things. In the last loading bar I finished, I wanted the border ot have rounded corners. The problem with this is that the bar that fills up behind the border is a rectangle and its corners were poking out behind the border. So I had to delve back into Unity's shaders and figure out how to not render the corners of a billboard. It ended up being surprisingly simple. I just needed to pass 2 points to the shader create a line and then set the alpha to 0 if the current point was to the left of the line for the left half of the billboard or the right of the line for the right half of the billboard. I only needed to pass 2 points, because I could just flip the points horizontally and vertically to cut off the corners of the other 3 corners. The results is below. This loading will randomly pick a load percent to display. But since it always uses the same seed, it will always follow the same pattern. So once you get used to it, you will be able to tell how far along it is even though it's randomly picking how much progress to display.
bottom border
Loadng bar without corners
9/9/2013
No visual updates, but I just finished implementing the affinity bonus system. As I mentioned before, arenas will have different affinities. If the type of your loading bar matches the affinity of the arena, your loading bar may occasionly gain an advantage. Your loading speed may speed up for a short time or even jump forward by a small amount. Having a favorable affinity is nice, but you really don't want to have an opposing affinity. Opposing affinities will proc much more than positive affinities, so you will want to make sure you have the correct loading bar match up for the arena you are in.
So as I was saying, I just finished making a awesomely generalized system for handling all affinity match ups. This is the 1st time I've used reflection and I'm not sure how I could have made this system without it. Well ok, I could have done it without reflection, but it would have been so ugly! And with reflection, the system allows the user (programmer) to configure it pretty freely and easily. I simply need to tell it what function to use, what affinity it's associated with, how long the "bonus" lasts, how often it can proc, and whether or not it's a positive or negative affinity. I don't like having to distinguish between positive and negative, but I didn't see any other way around it. I'd also ultimately like to have a way to scale how long the bonus lasts based on something. I might add that in later if having the bonus times be constants doesn't work out. Without reflection I would have had to give all that info twice. Once for the player and once for the opponent. Since I only need to do 2 reflection look ups per update, I don't think performance will be an issue. But then this is mobile so we'll see how it goes.
bottom border
9/5/2013
Fully Loaded will be the most intense loading experience of your life! Quiver in unbridled excitement as you wait for your bar to finish loading! Load against the computer, load against your friends, but always load first! Gain the upper hand by dragging files into cache or using items to speed yourself up or slow your opponent down.
Fully Loaded has been in development for about 2 months as a side project. Since I'm now transferring over to be my primary project, I'm starting a dev blog to follow it's progress. Most of the menu system has been finished along with some of its artwork. I'm not sure how many different total loading bars there will be yet but I'm thinking of at least 12. Several arenas have been implemented that influence how the cached files appear. See the gifs below to see how they work. All of the game's items have been implemented, but I still need to make some artwork for some of the items. Each arena will also have an affinity that will allow certain loading bars to gain a boost bonus or if they have the opposite affinity they may be given a penalty. Players will also be able to play asynchronously against their friends. After you friend someone, you will be able to load against your friend's bar in his roster.
bottom border
Shaking Arena
An example of an arena with shaking cache files. I may increase the distance and speed the files shake.
bottom border
Circling Arena
An example of an arena with circling cache files.
bottom border
Hiding Arena
An example of an arena with cache files that hide intermittently.
bottom border
Menu Example
An example of the menu system.
bottom border