This is a two-player co-operative platform puzzle game, developed during the Nordic Game Jam 2012. Each player is represented as a robot, who uses energy for any of their movement actions sich as:
Moreover, players also have to deal with a constant energy sap when not in motion. Hence, effectively players have only a certain amount of time to finish each level. However, if players pick up the radiant ball in the level, they can recharge themselves. The "energy core" also presents a constraint. When held beyond the point of maximum charge, the core causes the player to start overheating and prolonged exposure can cause death.
Both players have to work together in order to overcome challenges presented in the level to reach end of the level along with the ball:
As a game, the final product has very few levels and most of them can get players stuck without any chance to reset. However, the team did run through developing a large amount ofpuzzle mechanics that can be combined into several permutations by level designers to build interesting levels. Hence, while we failed to create an engaging game, we were able to create a toolset for level designers.
The code shown below is the main update method in the playercontroller:
void FixedUpdate ()
{
transform.eulerAngles = new Vector3(transform.eulerAngles.x, Mathf.LerpAngle(transform.eulerAngles.y, targetRotation, Time.deltaTime * 7f), transform.eulerAngles.z);
if (activePlatform != null)
{
var newGlobalPlatformPoint = activePlatform.TransformPoint(activeLocalPlatformPoint);
var moveDistance = (newGlobalPlatformPoint - activeGlobalPlatformPoint);
transform.position = transform.position + moveDistance;
lastPlatformVelocity = (newGlobalPlatformPoint - activeGlobalPlatformPoint) / Time.deltaTime;
}
else
{
lastPlatformVelocity = Vector3.zero;
}
activePlatform = null;
if(verticalMovement > -1 * MaxFallVelocity)
verticalMovement -= Gravity * Time.deltaTime;
controller = GetComponent<CharacterController>();
flags = controller.Move(new Vector3(horizontalMovement, verticalMovement, 0) * Time.deltaTime);
grounded = (flags & CollisionFlags.CollidedBelow)!=0;
if(crouched && !prevcrouch)
{
controller.transform.localScale = new Vector3(controller.transform.localScale.x, 0.75f, controller.transform.localScale.z);
}
if(!crouched && prevcrouch)
{
controller.transform.localScale = new Vector3(controller.transform.localScale.x, 1f, controller.transform.localScale.z);
controller.transform.position = new Vector3(controller.transform.position.x, controller.transform.position.y + 0.25f, controller.transform.position.z);
}
if (activePlatform != null)
{
activeGlobalPlatformPoint = transform.position;
activeLocalPlatformPoint = activePlatform.InverseTransformPoint (transform.position);
}
prevcrouch = crouched;
if(WalkedThisFrame == true)
{
playerEnergy.DoWalk();
WalkedThisFrame = false;
}
if(!playerEnergy.IdleDrain() || !playerEnergy.CanWalk())
die();
}
The latest version of the game can be played below.
How to play: