Thursday, December 6, 2012

Final Alpha

The game is now complete for Alpha.  This week I spent a lot of time playing with the game and iterating on items that needed attention before demoing our game.  It was important to get all of the features all the engineers have been working on into the game.  The first thing I did was imported all of the animations for the player into the game.  I then made sure the obstacles of collectibles, including abilities and flags were able to be collected by the player in the game.  The game shows how many collectibles you have collected and you win the game when collecting all the flags.  Unfortunately, you can't collect all of the flags until you have all the abilities because some of the flags are in hard-to-reach places where you need certain abilities to grab the flag.



Friday, November 30, 2012

Crunch Time

So our project has a lot of cool features but not many of the features are into the game yet, including effects and objectives to make the game playable. In our discussion, we decided that we wanted to do an art lock for Saturday and a programming lock for Monday night. The game is due the following Thursday so this will help us fix any bugs over the next three days. One of the first things was placing all the items on the map.

In our campaign world, this is our character.  Unfortunately, the player avatar will not work until you play on the xbox.  Animations should work properly and the next obstacle is to get images straight from the xbox so it would show the character.  Now that everything is in, the next thing is to debug the game and make the game presentable on Thursday.

Friday, November 23, 2012

Dynamic Class Creator

So I just implemented a very interesting piece of code that will dynamically create an inheritance class dynamically rather than having to make several methods that will each do practically the same thing.  This is a Class Delegate Function and the code looks like the following.


        /**
         * InstantiateCollectible<Item> - Creates a new Collectible on the map
         *  Item - Inheritance Child of Collectible
         *
         * PARAMS
         *  position - Position of the object
         *  rotation - Rotation of the object
         *
         * RETURN
         *  Collectible - Object Player can pick up in the game
         */
        public static Collectible InstantiateCollectible<Item>(Vector3 position, Quaternion rotation) where Item : Collectible
        {
            AvatarDescription description = AvatarDescription.CreateRandom();

            Collectible collectible = (Collectible)Activator.CreateInstance(typeof(Item), description, position, rotation, PlayerStatSheet.AvatarMass);

            collectible.TeamId = 1;

            return collectible;
        }

Friday, November 16, 2012

Collections Manager

I wanted to work with a Singleton Pattern and have a class that can be moved from project to project without having to do much modification in work.  I have come up with a collections manager that keeps track of what players have collected inside of a given level.  The code looks like the following:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

using UPC = System.Type;



namespace NinjaRoyale.Collections

{

    /**

     * Keeps track of all the collections collected inside of the game for any given player

     *

     * UPC - Universal Product Code, Finds out what kind of Collectible an object is

     *

     * Author - Mavin Martin

     * Date   - 11/21/2012

     */

    public class CollectionsManager

    {

        private static CollectionsManager instance = null;



        Dictionary<Entity, Dictionary<UPC, int>> ownerStash;





        /**

         * ===== CollectionsManager =====

         *

         * Uses Singleton Pattern to guarantee only one Collection Manager

         */

        private CollectionsManager()

        {

            ownerStash = new Dictionary<Entity, Dictionary<UPC, int>>();

        }



        /**

         * AddCollectable - Add's Collectable to the player

         *

         * PARAMS

         *  owner - Independent object owning the collectible

         *  item  - Item owned by owner

         */

        public void AddCollectable(Entity owner, Collectible item)

        {

            Dictionary<UPC, int> stash;

            if (!ownerStash.TryGetValue(owner, out stash))

                stash = initiateStash(owner);



            addItemToStash(stash, item);

        }



        /**

         * getStashItems - Get's the stash items owned by a certain owner

         *

         * PARAMS

         *  owner - Independent object owning the stash

         *

         * RETURN

         *  Dictionary<UPC, int> - Stash of items as linked list

         */

        public Dictionary<UPC, int> getStashItems(Entity owner)

        {

            Dictionary<UPC, int> stash;

            if (!ownerStash.TryGetValue(owner, out stash))

                stash = initiateStash(owner);



            return stash;

        }



        /**

         * RemoveCollectible - Removes Collectible from the player. 

         *

         * If you are getting rid of all items for an owner, please call RemoveOwner instead.

         *

         * PARAMS

         *  owner - Independent object owning items

         *  item  - Item belonging to the owner

         */

        public void RemoveCollectible(Entity owner, Collectible item)

        {

            Dictionary<UPC, int> stash;

            ownerStash.TryGetValue(owner, out stash);

            UPC upc = getUPC(item);

            stash.Remove(upc);

        }



        /**

         * RemoveOwner - Removes an owner from the Collections Manager.

         *

         * IMPORTANT NOTE: Owner does not need to add themselves.  This happens immediately when adding collectible

         *

         * PARAMS

         *  owner - the Entity that will own the collectible

         */

        public void RemoveOwner(Entity owner)

        {

            ownerStash.Remove(owner);

        }



        /**

         * addItemToStash - Add's item to the stash for a given player

         *

         * PARAMS

         *  stash - Linked List of items in the stash

         *  item  - Item to be added to the stash

         */

        private void addItemToStash(Dictionary<UPC, int> stash, Collectible item)

        {

            int count = 0;

            UPC upc = getUPC(item);

            if (!stash.TryGetValue(upc, out count))

                initiateItem(stash, item);



            stash[upc] += 1;

        }



        /**

         * initiateItem - Initiates item in a given stash

         *

         * PARAMS

         *  stash - Linked List of items in the stash

         *  item  - Item to be added to the stash

         */

        private void initiateItem(Dictionary<UPC, int> stash, Collectible item)

        {

            UPC upc = getUPC(item);

            stash.Add(upc, 0);

        }



        /**

         * getUPC - Get's the UPC of a specific Collectible

         *

         * RETURN

         *  UPC - Type of item being worked with

         */

        public static UPC getUPC(Collectible item)

        {

            return item.GetType();

        }



        /**

         * initiateStash - Registers an owner inside of the Collections Manager

         *

         * PARAMS

         *  owner - The independent object owning a stash

         * 

         * RETURN

         *  Dictionary<UPC, int> - Stash for a given player

         */

        private Dictionary<UPC, int> initiateStash(Entity owner)

        {

            Dictionary<UPC, int> stash = new Dictionary<UPC, int>();

            ownerStash.Add(owner, stash);



            return stash;

        }



        /**

         * GetInstance - Grabs Collection Manager Instance

         *

         * GUARANTEED SINGLETON

         *

         * RETURN

         *  CollectionsManager - Instance of the Collections Manager

         */

        public static CollectionsManager GetInstance()

        {

            if (instance == null)

            {

                instance = new CollectionsManager();

            }



            return instance;

        }

    }

}

Friday, November 9, 2012

Level Design

We wanted to visualize our game in real life so we bought some legos and constructed a playground for the game.  It was a complete success because we were able to see how high players will be able to jump, climb, and do certain things with their new abilities.

In the programming world, I was able to play with the wall jumps so that the player can now jump between walls back and forth until they get to the end of the map.  I have also been planning some new objectives.  I feel it would be fun to have vehicles inside the game so that will be my next proposal.

Friday, November 2, 2012

Team Lead Improvement

This week I worked a lot with the main Team Lead to make sure that our roles were understood.  It seems that I have more of a organized contributor personality and the team lead has more of a micro-management mindset.  This is a hard situation to work together and have the same vision since context-communication is usually not closely looked at and roles are more expected.  I'm excited to learn more about how we can work together because my goal is to be well-rounded in every situation I'm put in and understanding the other person's point of view on the differences in our personality.  When we figure this out over this week, I feel the team will become a lot more effective because we complement one another's weaknesses and can more openly turn them into strengths.

Friday, October 26, 2012

Camera Movements

Over this week, I wanted to create a system easier for debugging.  I have implemented a system that allows artists to see their own work inside of the map by using their Xbox Controller.  It is a cool feature by just simply pressing the "Back" button to freeze all the frames and allow camera scrolling around the world.  This will help in the view process of maps.

It looks like the next thing that we will need so that our progress isn't impeded is a good camera architecture that would learn of what state in the animation a user is in.

Friday, October 19, 2012

Technical Core Functionalities

Getting placed on Ninja Royale has been an awesome train to jump onto.  I definitely thought that getting assigned to a team would require much more planning to find out the direction of the game.  Instead, I was introduced to a new concept of moving straight forward even though we didn't have a direction for the game to go.

I decided that we needed to have mechanics invented in the game with a good architecture system.  Since we were looking for ideas that would make the game fun, I made my tasks assigned to team members generic.

I have also been looking deep into Git so that our team can use it to its potential without causing conflicts.  We found out that Git has a lot of clients and tools to work along side.  I planned a small lecture to show my team and make sure that they are on the right track.  It seems like things are going well though I've noticed no one has really committed up to the remote repository which requires me this week to talk to everyone and make sure they are on track and not falling behind on the system.

Friday, October 12, 2012

Game Election Day

After proposing all of the games, I found much potential inside a couple other games being proposed to work with.  As the presentations were ranked for potential by the professors, they chose the same games I felt would be most popular.  I have been assigned to be a Team Lead for the Ninja Royale on the Programmer Side.  We just need a new vision for the game that would make it 1 or more players rather than strictly multiplayer.

Friday, October 5, 2012

Project Unknown becomes Shock Solver

So we have made some significant changes to the game before our proposal tomorrow.  We have decided to change the name of our game to "Shock Solver".


We wanted to visualize effect much better so we have colored the platforms as you kill the enemies in the right places.  The video below will show the effect.
The puzzle effect has also been improved for more strategy and fun in combat to solve puzzles.  With the new camera system and with the gameplay mechanics, this is going to be a super fun game that will test your abilities in puzzle solving while in a flash mechanic type world that requires the acceleration of a quick mind to solve complex puzzles.

Friday, September 28, 2012

Core Mechanics

I have been able to implement the core features to the game.  In our presentation, we plan on showing the core mechanics that we have programmed in this 3D Game.  
Shows how you have to defeat the big boss before the little enemies would die.  You also have to defeat the boss and enemies on the given platform to solve the puzzle.
The flash mechanic is a great addition to the game that allows you to teleport from place to place.  You can teleport through enemies, up into the sky, and even down to speed your time up.
With the Camera change mechanic, you can easily see where you are going and what you need to accomplish.  This will be an excellent addition that will change between smooth camera flows, panorama, 2.5d changes, and even a third-person behind the head feel.

Friday, September 21, 2012

Puzzle Aspect

So our prototype is almost done for completion. Next week, I will be posting videos regarding our game with the core mechanics. As for puzzle ideas, we have come up with a new system that would allow you to understand what enemies you need to kill and in what way you need to kill them in order to open certain doors.
The idea is that you have to apply certain techniques in your fighting skills to unlock doorways and to complete puzzles. Our prototype has a simple version of this system that would allow doors to be unlocked when killing enemies on certain platforms which will be explained with my next post's videos.

Friday, September 14, 2012

Level Design

So we have been working a lot with the level design for the game idea we have for "Project Unknown". We wanted a feel of the future where electricity would be used often to complete missions in the puzzle-based world. The ideas we came with for the texture of the level are the following images.
We also needed a level layout that would go from 2.5D to 3D within a given level so we came up with this simple prototype level that would allow players to get the gist of the mission almost immediately.

Friday, September 7, 2012

Project Unknown

I have been assigned to work on a prototype for a game called "Project Unknown". The first thing we did was getting to know the team and the strengths each individual had. Project Unknown started as a game that was already solid but didn't have a good original idea that was a strong hook. We spent several days meeting through Skype and coming up with ideas that would make the game a hit on the Xbox Indie. We decided to give special powers to the Avatar in which Electricity would be its main advantage against enemies. Our character will be able to do such things like: teleport, charge up, steal energy from enemies. At the same time, enemies will do the same thing so you have to strategically plan accordingly to beat the level bosses and enemies.

Friday, August 31, 2012

Game Pitch - Dam It

Second week of school, we were all asked to make game pitches. My game idea was to protect your dam as a head beaver from flooding. It is Metroid Prime with Zelda like weapons where you will try to accomplish levels and upgrade your weapons to accomplish certain puzzles.

Friday, August 24, 2012

Blog Information

Hi viewers, I'm in my Senior year at the University of Utah. This blog will show my progress throughout my Senior Year in Designing a Game with a large team amongst other students in my same level. I will be posting weekly updates of where our progress is and the struggles as well as the experience I obtain from this year-long project.