Friday, June 27, 2014

Final Build

Today marks the end of my 16 week class as well as my education as I am graduating. Here is the final build for Starbound Aces. To note, we focused mostly on multiplayer and there that is the game option that is complete. So, invite a friend or 7 and play a round.

Link to WebPlayer

Monday, June 23, 2014

The Final Week - Starbound Aces

Today marks the beginning of the final week of our 16 week production cycle for my Senior Project - "Starbound Aces".

I would like to thank everybody who contributed to the project, both my team members and those who helped test it. It was a long (well, actually short) journey to produce a decent multiplayer game. Thankfully, it was a school project and I have learned much from it.

I will soon be posting our competition submission video here as well as a link to the newest version for the webplayer. I will also link downloads for the PC version. They play the same but there is definitely a performance increase using the PC version.

Wednesday, June 18, 2014

Starbound Aces Latest Build

Today I present to your the latest build for Starbound Aces. Here we have some new features in the game as well as improvements.

Play Now (Unity WebPlayer)

Whats New?

  • Enemy Death Effects
  • Better Sounds
  • Button Sounds
  • Server enhancements
  • Server configuration
  • Different stats for each weapon
  • Different stats for each ship

Tuesday, June 17, 2014

Server Side Player Properties

An after effect of our server side overhaul is that the game now has a database full of ship, weapon, and projectile configurations. This means the server can pull data from there and send the properties to players upon game starts. In conjunction with the client side GUI to configure a ship, we have a good system going for multi-player games.

The only real issue was wrestling with the timing of script execution, construction, and threads. This caused some issues where the client was not updating its properties when the server sends the data due to the script not existing and therefore not listening for the event. When that happened, the event just disappeared. Unity does allow for script execution ordering but that would not have fit my case as the GameManager Singleton and the SmartFox Client Controller needed to send and receive events before, during, and after other scripts. Therefore, I rolled some code in the C# scripts to time events the way they would work with our system.

Saturday, June 14, 2014

Unity / SmartFox Senior Project Update

For the past two weeks I have been working on overhauling the server side logic to be more authoritative in our game Starbound Aces. Most of the work is done and completed to satisfaction. The parts that are complete are server side validation of input, shooting, abilities, ship configurations, and weapon configurations. All of that data is replicated well to each client.

The final step - transformations and maneuvers are hitting a rough patch.

As it works now, the game on the server is launched in a new thread that is updated every 150 milliseconds. Right now, this causes jittery game play and horrible movement. These are the issues I plan on resolved soon.

Wednesday, June 11, 2014

Server Replication

I have been spending the past two weeks re-factoring the server for our game - Starbound Aces. It is in an attempt to move to a more authoritative server model for the game to prevent cheating and game-play issues due to players being out of sync. The biggest improvement I have made is translating and rotating object on the server and sending the new positions to the players. With the aid of the LWJGL and the Apache Math3 API, I was able to imitate the original Unity C# scripts we had for movement onto the server in Java.

Here is the source code for that:

package com.gspteama.gamedriver;
import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
import org.apache.commons.math3.geometry.euclidean.threed.RotationOrder;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;
import org.lwjgl.util.vector.Vector4f;
public class Movement{
    public float Velocity;
    public float Acceleration;
    
    private float maxVelocity;
    
    protected Vector3f position = new Vector3f();
    protected Vector3f rotation = new Vector3f();
    protected Vector4f quaternion = new Vector4f();
    
    protected static final Vector3f UP = new Vector3f(0.0f, 1.0f, 0.0f);
    protected static final Vector3f LEFT = new Vector3f(-1.0f, 0.0f, 0.0f);
    protected static final Vector3f FORWARD = new Vector3f(0.0f,0.0f, 1.0f);
    
    protected Matrix4f transform = new Matrix4f();
    
    public void onUpdate(float deltaTime){
        Velocity = Velocity + Acceleration * deltaTime;
        if(Velocity >= maxVelocity){
            Velocity = maxVelocity;
        }
        
        Rotation rotator = new Rotation(RotationOrder.XYZ, rotation.getX(),
                rotation.getY(),
                rotation.getZ());
        quaternion = new Vector4f((float)rotator.getQ0(),
                (float)rotator.getQ1(),
                (float)rotator.getQ2(),
                (float)rotator.getQ3());
        
        transform.setIdentity();
        
        transform = transform.translate(position);
        transform = transform.rotate(rotation.getY(), UP);
        transform = transform.rotate(rotation.getX(), LEFT);
        transform = transform.rotate(rotation.getZ(), FORWARD);
        transform = transform.scale(new Vector3f(1.0f, 1.0f, 1.0f));
        
        //to row major
        transform.transpose();
        
        //get the forward vector
        Vector3f forward = new Vector3f(transform.m20,
                                        transform.m21,
                                        transform.m22);
        forward.normalise();
                                        
        Vector3f forwardVel = new Vector3f(forward.getX() * Velocity,
                                            forward.getY() * Velocity,
                                            forward.getZ() * Velocity);
        
        position = Vector3f.add(position, forwardVel, position);
    }
    public Movement(float maxVelocity){
        this.maxVelocity = maxVelocity;
        Velocity = 0.0f;
        Acceleration = 0.0f;
        transform.setIdentity();
    }
    
    public void onLeft(float value){//A
        rotation.y += value;
    }
    
    public void onRight(float value){//D
        onLeft(value);
    }
    
    public void onUp(float value){//W
        Acceleration += value;
    }
    
    public void onDown(float value){//S
        Acceleration -= value;
    }
    
    public void onHorizontal(float value){//MouseX
        rotation.z += value;
    }
    
    public void onVertical(float value){//MouseY
        rotation.x += value;
    }
    
    public float[] getPosition(){
        return new float[]{position.getX(),
            position.getY(),
            position.getZ()
        };
    }
    
    public float[] getQuaternion(){
        return new float[]{quaternion.getX(),
            quaternion.getY(),
            quaternion.getZ(),
            quaternion.getW()
        };
    }
}

Monday, June 9, 2014

Hey Baby, I Wanna Know (What Have I Been Up to)!

Seems like it has been a while since I have done my last post. This is with good reason, my fingers are blistering from refactoring the server side engine. What is it that I am doing? Something maniacal in a time crunch - every programmers dream come true.

Currently I am in the middle of a major overhaul of the server side engine to be more authoritative in regards to gameplay. The key word here is gameplay. So far, the engine works great in regards to GUI systems calling server events and data. Such things would be high scores, creating games, joining games, ship configuration, and so on and so forth. The part that needs work is the actual code that handles the game logic simulation such as collisions and player positions. As it stands right now, the server just forwards all this information with no replication. This can lead to easy cheating and abuse of networking. So, I decided to fight this by doing the following:

  • Player input is sent to server for processing
  • Server calculates position
  • Server updates game world on itself, then sends data to players
  • Server handles collisions
  • Server handles player elements - health, life, death, ammo, cooldown, etc.
On another note, I have also been working on the special effects in the game to make it more visually appealing. More on that on another date.

Thursday, June 5, 2014

Starbound Aces Promo Trailer

Today is a good day to dogfight! Here is the official Starbound Aces Promo Trailer, featuring epic space combat!


Wednesday, June 4, 2014

Unreal Engine 4 Mini-Project

Today I started a new project. The project is a simple Pinball game made in Unreal Engine 4 using C++. As it stands right now, I have a framework already up and running for the project and will soon go to implementing special features. After that, I will have need for my own sounds, meshes, and textures. When that is done I will then make a simple UI for the main menu of the game, again using C++. Here is a short video on what I finished today:


Tuesday, June 3, 2014

Starbound Aces Update - The Countdown

With the impending end of our project, I have been in scramble mode. Our project Starbound Aces is coming to a close and there is much to do to get a viable product from the 16 week development period. So, first and foremost, we must focus on fixing any issues we have that reside in the game. As it stands, there are a few. These issues are as follows:


  • Network problem when joining a second game after playing the first
  • Sound issues
  • Projectile / Weapons are lame
The last one is more or less a comment on how we have not gotten to adding awesome effects for the projectiles themselves.

Enough gripping though, I have some nice art content to show off for our game, as well as an in game screen shot! Enjoy!

Image of ship in pursuit

Image of ship manuevering

Smooth space ship