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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
An example of an arena with shaking cache files. I may increase the distance and speed the files shake.
An example of an arena with circling cache files.
An example of an arena with cache files that hide intermittently.
An example of the menu system.