Posted on Leave a comment

Game Programming Deep Dive: 3 scenarios for movement prediction

The following blog post, unless otherwise noted, was written by a member of Gamasutra’s community.
The thoughts and opinions expressed are those of the writer and not Gamasutra or its parent company.


We need to use movement prediction in our games more often than we might expect. We, as humans, predict the future position of objects all the time, and we act accordingly to that prediction. For example, when we want to catch a moving ball, we do not run to the place where it is currently in the air or on the ground. Instead, we naturally predict where the ball will be in a few seconds and move toward that predicted position. Based on our prediction skills we can catch the ball easily, or not so easily if our prediction was wrong.

Here are the examples of calculating predicted movement in a game:

  • A trajectory of a grenade, to prevent a character from running towards it.
  • Firing a projectile in the direction of the predicted place of a moving enemy.
  • Movement of a vehicle in the close future to allow characters to avoid it.
  • Predicted position of a replicated object over the network to compensate for the lag.

In general, if we want to predict the movement of an object, we need to execute some form of physical simulation. The ideal situation would be if we could simulate the whole physical world for the needed time in the future. In most cases, because of the limited computing power, this is not (yet!) reasonable. However, depending on our needs, we can perform a simplified simulation to get the predicted state of the single object in the future.

In this article, I would like to describe three different scenarios of how we typically use prediction in games:

  1. Character. In this case, we are interested in a predicted position for a short amount of time in the future.
  2. Projectile. For projectiles, we want a much longer time of predicted movement including collisions.
  3. Vehicle. For vehicles, to properly handle the predicted movement, we also need to take into account the orientation with angular velocity.

Nevertheless, we still need to remember that this is a prediction. We are not running the full physical simulation. Rather, we want to compute the most probable state of the object in the future.

To perform our predictions as a form of physical simulation, we need the basic physical quantity for the kinematic object: a velocity [1]. In general, the velocity is a rate of change of position in respect to time and is expressed using a derivative:

However, for our prediction needs, we can use the formula for the velocity during the constant movement, without referring directly to the derivative:

where  is the position displacement (from point  to ) and  is the elapsed time (from  to ).

Velocity is a vector quantity, which has a direction and a length. The length of a velocity vector is a scalar value and can be called speed.

Our main concern for the character is the prediction for the short amount of time in the future – usually less than 1 s. This is the basic case for the prediction, where we make a few assumptions:

  1. We simulate the character’s movement as a point moving along the straight line without any collisions.
  2. We know the character’s current velocity.
  3. We assume that the character will continue its movement along the straight line with its current velocity.

We start with the formula for the constant velocity from the previous section:

But this time we assume that , , and  are known variables and  is unknown.

We multiply both sides by :

Then, we move  to the left side:

Finally, we swap both sides of the equation:

and we get the final formula, where  is the current position of the character,  is the character’s velocity,  is the time of the prediction, and  is our predicted position in the future.

This formula has a natural geometrical explanation. The object moves with a constant linear movement, so we are moving the point along the velocity vector  from the point  to the point .

Below you can find the code in Unity Engine™ with a straightforward implementation of the final formula:

Vector3 LinearMovementPrediction(Vector3 CurrentPosition, Vector3 CurrentVelocity, float PredictionTime)
{
 Vector3 PredictedPosition = CurrentPosition + CurrentVelocity * PredictionTime;
 return PredictedPosition;
}

In navigation, the process to predict the position in the future is called “dead reckoning” [2] and it uses this formula as the basic computation technique.

This is also a simple formula to predict the movement of a character in multiplayer games while waiting for a new network data to arrive [3, section ‘Display of Targets’].

On the image below, we have an example with a geometrical description for this prediction scenario:

 

The blue curve marks the movement of the object (dashed blue line is the future movement). Velocity is the derivative of position function, so it lies on a tangent at the point  [4, section ‘Kinematic quantities’]. Since we are predicting position along the velocity vector, we can observe how a longer prediction time  will cause the predicted position to diverge from the real position in the future. A shorter prediction time  gives a better approximation.

Acceleration

There are situations when we want to consider acceleration in our prediction. In such cases, instead of assuming the constant velocity, we will assume the constant acceleration during the prediction period:

where  is the initial velocity,  is the final velocity, and  is the prediction time.

The formula for the predicted position  with the constant acceleration  is given by

As we can see, when there is no acceleration (), this formula still gives the same prediction result as the equation from the previous section.

The formula can be easily explained using the graph below for one-dimensional movement:

The graphs show a relation between velocity and time. In other words, it shows how velocity (a blue line) changes over time. When the graph is given in such a way, the area under the velocity line (marked with a blue color) is the distance traveled by the moving object [1, section ‘Instantaneous velocity’]. We can calculate that area as a sum of two figures: a rectangle A and a right triangle B.

Using notation for the areas with the initial distance  and the final distance  traveled by the moving object, we get the formula:

The area of the rectangle A is:

The area of the right triangle B can be computed as the half of the upper rectangle:

Because the acceleration is given by  , so . Using that, we can change the equation above to:

Finally, substituting for A and B in the first formula for  we get:

By renaming variables  to  and  to , we obtain the formula for the predicted position  given at the beginning of this section:

In the case of projectiles, we are interested in the much longer time of our prediction. Additionally, we want to track the projectile when it bounces off other objects.

To perform this prediction, we need to execute a simulation loop and check for collisions in every step. We will assume simple ballistics physics for the projectile moving as a point [4, section ‘Uniform acceleration’]. Below is the code with the implementation in the Unity Engine:

Vector3 PredictProjectileMovement(Vector3 InitialPosition, Vector3 InitialVelocity, float TimeToExplode)
{
 float Restitution = 0.5f;
    Vector3 Position = InitialPosition;
    Vector3 Velocity = InitialVelocity;
    Vector3 GravitationalAcceleration = new Vector3(0.0f, -9.81f, 0.0f);
    float t = 0.0f;
    float DeltaTime = 0.02f;

    while (t < TimeToExplode)
    {
    Vector3 PreviousPosition = Position;
        Vector3 PreviousVelocity = Velocity;

        Position += Velocity * DeltaTime + 0.5f * GravitationalAcceleration * DeltaTime * DeltaTime;
        Velocity += GravitationalAcceleration * DeltaTime;

        // Collision detection.
        RaycastHit HitInfo;
        if (Physics.Linecast(PreviousPosition, Position, out HitInfo))
        {
        // Recompute velocity at the collision point.
           float FullDistance = (Position - PreviousPosition).magnitude;
            float HitCoef = (FullDistance > 0.000001f) ? (HitInfo.distance / FullDistance) : 0.0f;
            Velocity = PreviousVelocity + GravitationalAcceleration * DeltaTime * HitCoef;

            // Set the hit point as the new position.
            Position = HitInfo.point;

           // Collision response. Bounce velocity after the impact using coefficient of restitution.
           float ProjectedVelocity = Vector3.Dot(HitInfo.normal, Velocity);
            Velocity += -(1+Restitution) * ProjectedVelocity * HitInfo.normal;
 }

        t += DeltaTime;
 }

 // Return the final predicted position.
    return Position;
}

We will explain the code given above in the following three subsections: Simulation loop, Collision detection, and Collision response.

Simulation loop

The choice of the time step (DeltaTime) for every iteration depends on our requirements for accuracy. Typically, this will be the same value as the time step for our physics engine (in Unity Engine the default value is 0.02 s).

At the beginning of the loop, before evaluating our movement equations, we store position and velocity in PreviousPosition and PreviousVelocity variables. This is required to perform collision detection.

We are considering only gravitational acceleration, which is constant during the whole movement. Because of that, we can use the formula from the previous section to compute the new position after a given time step:

Position += Velocity * DeltaTime + 0.5f * GravitationalAcceleration * DeltaTime * DeltaTime;

Similarly, the new velocity is calculated using acceleration:

Velocity += GravitationalAcceleration * DeltaTime;

Collision detection

The essential part of the loop is the test for collisions, which is described in the image below:

We use position from the previous step (variable PreviousPosition) and the newly calculated position (variable Position) to test if the line segment between them hits any objects. The collision test is performed by the Unity Engine method Physics.LineCast:

Physics.Linecast(PreviousPosition, Position, out HitInfo)

If there is a collision, the method returns true and stores the result in HitInfo:

  • HitInfo.point – the impact point (HitPoint in the image above).
  • HitInfo.normal – the unit vector perpendicular to the surface of the collision (HitNormal in the image above).
  • HitInfo.distance – the distance from the beginning of the line segment (variable PreviousPosition) to the impact point.

Having that data, we can recalculate position and velocity at the point of collision.

The velocity is recomputed first to get the precise value at the HitPoint. The variable HitCoef has a value between 0 and 1, and is the ratio of the HitInfo.distance to the total length of the line segment. We recompute the velocity using the same movement equation but scaling the last component with the HitCoef. In this way, we scale the DeltaTime to the moment of collision and obtain the value of the velocity at the collision point.

The new position is simply the point of impact.

Collision response

Finally, we are ready to bounce the velocity according to the impacted surface. We use the HitNormal and coefficient of restitution (how strong the bounce should be) [5]. The value of Restitution should be between 0 and 1. If the Restitution variable is 1, there is a perfect bounce, and no energy is lost at the collision. If the Restitution is 0, then the whole energy is lost, and the velocity along the hit normal is canceled entirely.

Calculation of the bounced velocity (after the impact) is described in the image below and the following text derives the final formula:

To compute the velocity after the impact, we need to assume that we want to apply an impulse along the vector n (HitNormal) with unknown magnitude j to change the velocity:

We start our computations with the main equation defining coefficient of restitution as a relation between relative velocities:

In general, relative velocities  and  are computed as projections onto the collision normal of differences between velocities for two colliding objects (symbol  is the dot product):

But in our case, because we collide only with a static environment (object B has always zero velocities), it can be simplified to:

Combining three equations together we obtain:

Now we are using the first equation and making a substitution for VelocityAfterHit:

The left side transformation:

We move the first term to the right side:

Because the collision normal n is a unit vector, it has length 1, so  is also 1:

Finally, we can simplify the right side:

Going back and making a substitution for j in the first equation:

This equation is implemented in the code as the line:

Velocity += -(1+Restitution) * ProjectedVelocity * HitInfo.normal;

This concludes the details of the collision response.

Summarizing this section, we can observe that our function calculates the full predicted trajectory for the projectile. The value of variable Position can be stored at the end of every iteration as a consecutive point of the curve. We can use it to draw the expected trajectory when a player is aiming to throw a grenade. Also, we can send the final position to the AI system to mark places to avoid.

When predicting the movement of the vehicle, we will consider only a short amount of prediction time. Unlike previous cases, we need to consider an angular velocity [6]. Vehicles are usually relatively big objects in the game and turning is an essential part of their movement. Hence, even if we consider a short time of prediction (less than 1 s), we still need to calculate the rotational component of the movement.

Angular velocity is the rate of change of orientation in respect to time. Angular velocity is an equivalent to linear velocity but for rotational movement. Angular velocity is a vector quantity. The direction of the vector represents the axis of rotation, and the length of the vector tells us about the rate of change of orientation – in radians per seconds.

To calculate the full predicted state of the vehicle we need to compute both components of movement: linear and rotational. Linear component (predicted position) can be evaluated in the same way as for characters. For the rotational component, we will assume the constant value of angular velocity during the prediction. The code is presented below:

Quaternion RotationalMovementPrediction(Quaternion CurrentOrientation, Vector3 AngularVelocity, float PredictionTime)
{
 float RotationAngle = AngularVelocity.magnitude * PredictionTime;
 Vector3 RotationAxis = AngularVelocity.normalized;

 Quaternion RotationFromAngularVelocity = Quaternion.AngleAxis(RotationAngle * Mathf.Rad2Deg, RotationAxis);

 Quaternion PredictedOrientation = CurrentOrientation * RotationFromAngularVelocity;
 return PredictedOrientation;
}

We build rotation quaternion using the axis and angle interface – the method Quaternion.AngleAxis(). The axis of rotation is taken directly from angular velocity as a normalized vector:

RotationAxis = AngularVelocity.normalized;

The angle of rotation is computed as the multiplication of the rate of change and our prediction time:

RotationAngle = AngularVelocity.magnitude * PredictionTime;

Since the length of angular velocity vector represents the rate of change of the orientation, if we multiply it by our desired time of prediction, the output is the total angle we need to rotate around the axis. For example, let us assume that our vehicle is turning with a rate 0.25 radians per second. If we multiply it by 2 s of prediction time, then we get 0.5 radians as the value of the RotationAngle variable (approximately 28.6 degrees). This is the predicted angle the vehicle will turn in 2 s.

Having the rotation axis and the rotation angle, we can build the quaternion from angular velocity (also, using conversion from radians to degrees, because the Unity method expects the angle in degrees as an input):

RotationFromAngularVelocity = Quaternion.AngleAxis(RotationAngle * Mathf.Rad2Deg, RotationAxis);

Finally, we need to compute the quaternion to represent the final predicted state. We will use multiplication, which represents a composition of two orientations. Therefore, we multiply the current orientation by the rotation quaternion, which represents the change from angular velocity:

PredictedOrientation = CurrentOrientation * RotationFromAngularVelocity;

The result of this multiplication is the orientation of the predicted state of the vehicle:

Iterations

While executing rotational prediction once will give us a good approximation, for objects like cars or tanks, we might need to execute the prediction several times with smaller time steps. Also, linear velocity in vehicles is aligned with their forward direction, and it changes with every orientation change. To achieve better results – especially for a longer prediction time – we can execute both linear and rotational prediction in a loop with just a few iterations. In every iteration, we will match the linear velocity with the new forward direction from orientation to approximate the behavior of vehicle physics. The code is:

void VehicleMovementPrediction(Vector3 Position, Vector3 LinearVelocity, Quaternion Orientation, Vector3 AngularVelocity, float PredictionTime, int NumberOfIterations, out Vector3 outPosition, out Quaternion outOrientation)
{
 float DeltaTime = PredictionTime / NumberOfIterations;
    for (int i=1 ; i<=NumberOfIterations ; ++i)
    {
    Position = LinearMovementPrediction(Position, LinearVelocity, DeltaTime);
        Orientation = RotationalMovementPrediction(Orientation, AngularVelocity, DeltaTime);

        // Match LinearVelocity with the new forward direction from Orientation.
        LinearVelocity = Orientation * new Vector3(0.0f, 0.0f, LinearVelocity.magnitude);
    }

 outPosition = Position;
 outOrientation = Orientation;
}

After executing the loop, we should see prediction results similar to the image below:

We have presented three different scenarios for movement prediction. What they have in common is that they all perform simplified physics simulation customized for prediction needs. However, it is important to remember that this is only a prediction and it is impossible to fully predict the future of an interactive world controlled by human players. Our gameplay logic, which relies on prediction results, needs to be prepared for a failure and be ready to deliver a fail-safe solution.

I would like to thank Luis Bermudez, Mohammed Yassir Ouali, and Philippe Baron for their valuable feedback.

[1] “Velocity”, https://en.wikipedia.org/wiki/Velocity

[2] “Dead reckoning”, https://en.wikipedia.org/wiki/Dead_reckoning

[3] “Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization”, https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Protocol_Design_and_Optimization

[4] “Equations of motion”, https://en.wikipedia.org/wiki/Equations_of_motion

[5] “Coefficient of restitution”, https://en.wikipedia.org/wiki/Coefficient_of_restitution

[6] “Angular velocity”, https://en.wikipedia.org/wiki/Angular_velocity

Posted on Leave a comment

Fight for your dream to become a hero

Fight for your dream to become a hero

As a kid, there were dreams of adventure— monsters and mysteries to be solved. But, as a shopkeeper, duty came first. Year after year, the needs of other adventures came first. Today is different. Today, you start your own adventure.

Conduct business during the day at Rynoka Village, and at night traverse the Gates to different realms and dimensions as you guide Will through this action-RPG.

Features

  • Shopkeeping: Put items on sale, set their price carefully, manage gold reserves, recruit assistants and upgrade the shop. Be careful though— some shady individuals may want to steal your precious wares!
  • Fight with style: Masterful control of your weapons, critical timing, careful positioning, and an understanding of your enemies and environment are crucial to your survival. How you battle your enemies is up to you.
  • Meet villagers: Get to know your neighbors as you restore the prosperity of this small commercial hamlet. Help establish new businesses and watch them grow in the idyllic community of Rynoka.
  • Craft, enchant, and loot: Interact with the villagers to craft new armor and weapons, and enchant existing equipment. Also collect valuable items from exotic civilizations!

If you would like to purchase the game, please visit https://www.nintendo.com/games/detail/moonlighter-switch.


Fantasy Violence

Posted on Leave a comment

Video: Experimental approaches to improving peer feedback in games

In this GDC 2018 talk, Carnegie Mellon University’s Jessica Hammer and Broken Rules’ Martin Pichlmair share two experimental approaches for improving peer feedback on game projects both big and small.

The duo presents best practices, common challenges, and successful formats around providing critique, discussing how to select and implement the appropriate critique methods. 

While originating from education, the techniques presented by Hammer and Pichlmair are applicable to a wide range of design areas, especially in game development. 

It’s an insightful talk that’s definitely worth watching, so developers shouldn’t miss the opportunity to do so now that it’s freely available on the official GDC YouTube channel!

In addition to this presentation, the GDC Vault and its accompanying YouTube channel offers numerous other free videos, audio recordings, and slides from many of the recent Game Developers Conference events, and the service offers even more members-only content for GDC Vault subscribers.

Those who purchased All Access passes to recent events like GDC or VRDC already have full access to GDC Vault, and interested parties can apply for the individual subscription via a GDC Vault subscription page. Group subscriptions are also available: game-related schools and development studios who sign up for GDC Vault Studio Subscriptions can receive access for their entire office or company by contacting staff via the GDC Vault group subscription page. Finally, current subscribers with access issues can contact GDC Vault technical support.

Gamasutra and GDC are sibling organizations under parent UBM Americas.

Posted on Leave a comment

To balance Heroes of the Storm, ‘remember that MOBAs aren’t a true sport’

In the midst of its many game updates announced at Blizzcon this weekend, Blizzard also made a notable announcement for Heroes of the Storm–the company’s MOBA that mixes together characters from different Blizzard games. The company is releasing a new hero named Orphea, whose game of origin is in fact Heroes of the Storm. 

Her release, combined with a slew of changes announced for 2019, shows that Blizzard is still interested in fueling its in-house MOBA even while other game genres are dominating the multiplayer market. With that kind of investment, we wanted to check in on what Blizzard’s doing to keep both professional and recreational players engaged in a competitive market. 

That curiosity led us to lead live designer Brett Crawford and Battlegrounds designer Steve Holmes, two Heroes of the Storm devs we were able to track down at Blizzcon. Like many other multiplayer game developers, the pair spoke about how the short list of changes in the 2019 update came from a long, focused amount of iteration, but what was interesting to hear from the pair is that the team’s balance strategy for the next year isn’t so much about tweaking characters, but rather bending known MOBA systems to keep matches competitive. 

“All MOBAs have the problem with…it’s not a true sport!” Crawford exclaimed while trying to parse the minute game changes being discussed. “In basketball, if I make a 3-pointer, I’m not 3 inches taller then you now. In MOBAs, that’s what happens! I just did something good, and I get a power advantage over someone else.”

Crawford says that this philosophy means that in the last few years, the dedicated team at Blizzard has looked at everything from ripping out character levels to eliminating hte concept of Mana. What they’ve focused on for the last 6 months instead, is tweaking rules to keep power imbalances from stacking up quickly. 

Holmes, who’s responsible for analyzing the game’s different maps (and their myriad mechanics, the map isn’t standard like it is in League of Legends or DOTA 2), chimes in with the way Blizzard uses its metrics to analyze how changes impact different types of players. “We can take the [game] data and slice it by different categories of players, so which MMR (skill ranking), which league, we can tell what effects have on different players.”

So per Holmes, the Heroes of the Storm team can look at micro decisions and ask if they’ll primarily impact pro players, or everyone else. 

What unites many of the data points Holmes and Crawford are measuring, is what time those metrics are taking place in the game. Crawford is quick to point out each Battleground has different standards, so there aren’t universal metrics he can point to, but decisions like changing what happens after players destroy an enemy’s keep are driven by trying to tamp down different kinds of power spikes from occurring too quickly. 

But Crawford adds, that time analysis also means engineering downtime for competitors. “We want these highs, and then we want players to get a break, so they don’t get blown out. We want the match experiences to feel different here, and if every map does the exact same thing we want to push that to be different.” 

Posted on Leave a comment

Don’t Miss: The world building of Diablo III

[Blizzard designer Leonard Boyarsky talks to Gamasutra about the process of expanding the Diablo universe significantly with the third installment of the series, talking about what has both worked and what has not.]

Tackling mammoth expectations while building a world for a highly-anticipated sequel would be daunting for most game designers. Thankfully, Leonard Boyarsky isn’t just any designer. With nearly 20 years in the industry, Boyarsky’s career encompasses several PC cult classics, including art direction for Fallout and Fallout 2 at Interplay, as well as Arcanum and Vampire: The Masquerade – Bloodlines during his helm as CEO and co-founder of Troika Games.

After Troika’s demise, Boyarsky joined Blizzard in 2006, where he’s been hard at work as Diablo III‘s game world designer. He has integrated his years of know-how into crafting a game that evokes the feel of its predecessors while driving a more plot-focused experience.

In this interview, Boyarsky details the experience of working on a title with lofty expectations, infusing Diablo III with more back story, and scrapped iterations of the game on its long journey from concept to product.

What’s challenging about going from wholesale crafting an aesthetic — as you did in Fallout — to working within a certain set of expectations?

Leonard Boyarsky: Well, it’s really just interesting to come in and work with an established franchise, but a lot of the process is the same: trying to find interesting ways to explore the story, to develop the universe.

I think the most interesting thing about the Diablo universe is just that there’s so much richness to it that hadn’t been really explored.

So, I think that’s the way I approached it, looking at what we could do with this universe that really hasn’t been exploited. [VP of creative development] Chris Metzen was really on board with that because he really had a lot of ideas and a lot of things that he wanted to see in the series that hadn’t been brought to the forefront. So, it’s been a very creative process. It’s been very challenging but enriching at the same time.

Can you provide some examples of elements within the Diablo lore in which there were gaps for you to expand upon?

LB: Well, I think they had a lot of ideas — like Chris was talking about [during the Diablo III presentation preceding this interview], the battle between Heaven and Hell, and all that stuff — where they kind of touched on some of that stuff, but they didn’t really explore it.

A perfect example is like Deckard Cain, you know. He identified your items, and he threw out a bit of lore for you in the first two games, but you know, we’ve give him this extra depth that we feel like he should’ve been able to see… if he had taken the Horadric teaching a little more seriously earlier on, he could have avoided what happened during Diablo. Kind of giving him a little more depth as a character, we feel.

And it’s a different time in terms of game-making. You know, we want the characters to be deeper. We want them to have more realistic motivations, I guess you’d say, have reasons for what they’re doing, and feel like they have a background and history to them.

In your long career of working on different franchises from Fallout to working with Vampire: The Masquerade, you’ve definitely dealt with very passionate, vocal fans. Would you say that’s given you thicker skin for coming into Diablo III?

LB: [laughs] Yes. You would definitely have to have thick skin, because there’s always going to be people who don’t like what you’ve done or are objecting to your latest decisions. So, you get used to it after a while. Try not to take it too [personally]…

It’s a double-edged sword because it’s very helpful to hear what people have to say, how people see things and what people want to see from a franchise, whether it’s one that you created or whether it’s one that you’re carrying on.

It’s not to say that we always have to blindly follow what the fans want, but it’s nice to know what the fans are looking for, if that makes sense. [It’s important to know] what people are expecting, what people are looking for, the questions that they feel that they need to have answers to. Because if you don’t deliver on at least some of those things, then you’ve kind of failed.

Posted on Leave a comment

Weekly Jobs Roundup: Monster Squad, Game Closure, and more are hiring now!

Whether you’re just starting out, looking for something new, or just seeing what’s out there, the Gamasutra Job Board is the place where game developers move ahead in their careers.

Gamasutra’s Job Board is the most diverse, most active, and most established board of its kind in the video game industry, serving companies of all sizes, from indie to triple-A.

Here are just some of the many, many positions being advertised right now. If you’re a recruiter looking for talent, you can also post jobs here.

Location: Tokyo, Japan

Game Closure is on the hunt for Systems Engineers to help us build the social games that guide the development of our mobile game engine. We are a 70 ­strong and growing team with offices in Mountain View, CA, Eugene, OR and Tokyo, Japan. If you want to join us to make great games on our cutting­ edge technology and truly make an impact, then we want to talk to you!

As a Systems Engineer at Game Closure, you will play a pivotal role in creating a platform to revolutionize the mobile game development industry. Our engineers are generally amazing at something and great at everything else. We write cross-­compilers, custom browsers, ARM7 assembly, GPU shaders, Node.js & Python back­ends, JavaScript game APIs and tools, and whatever else it takes. No matter what you work on each day, you will work with the best engineers in the world; we have top talent in every part of our stack.

Location: Hamburg, Germany

As a Unity Developer, you will be part of our agile, cross-functional and international development team. You will drive the development of new features as well as maintain and improve the current code of our new games.

Location: San Francisco, California

Impulse Gear is looking for a Senior Narrative Writer to help push the boundaries of interactive storytelling in our next Virtual Reality game. Daily tasks will include story development, game dialogue and general narrative contribution. The ideal candidate will have previous success as a game writer or screenwriter, outstanding communication skills, a good understanding of story and game structure, and an absolute passion to tell great stories in various mediums.

Location: Los Gatos, California

Senior Producers at Cryptic Studios work closely with designers, artists and programmers to organize and drive the game development process. A Senior Producer’s number one priority within the development structure is to make sure the overall development and business goals are being driven towards and met. This means a no nonsense approach to problem solving with daily communication and working to support all the members of the team in task management and scheduling challenges.

Location: Seattle, Washington

Are you the type of Programmer who recreated your favorite game’s combat system to figure out how it was made? Did you learn to program so you could make the games you love to play?

At Monster Squad, our Gameplay Programmers are also Gameplay Designers. In this role, you will go beyond just building tech, and actively design the systems that go into our games. This is a unique opportunity for creative individuals who have the self-direction to bring the team and your own inspiring ideas to life.

Posted on Leave a comment

Blizzard announces its first mobile Diablo game

Blizzard announced a new action-role playing Diablo game is coming to iOS and Android devices, titled Diablo: Immortal.

Revealed during BlizzCon earlier today, Diablo: Immortal is the first game Blizzard has developed specifically for mobile platforms. 

Described as a “full-fledged action RPG you can play everywhere with everyone,” It’s currently being developed in collaboration with NetEase.

Diablo III originally launched for PC back in 2012 before making its console debut a year later on PS3 and Xbox 360.

The game moved to the newest generation of consoles with a PS4 and Xbox one release a year later, and most recently launched on the Nintendo Switch. 

More information about Diablo: Immortal can be found here.

Posted on Leave a comment

Visual tweaks hit Rainbow Six Siege ahead of release in Asian countries

Like many developers that aim to bring a game to countries like China, Ubisoft plans to change some visual elements changed before Rainbow Six Siege can see an official release in the country.

But for Rainbow Six Siege, those changes won’t be confined to only that region’s version of the game. Instead, as Ubisoft details in a blog post on the game’s website, icons and environmental elements featuring gambling, blood, and sexual content will be removed from all versions of the game as the developer readies Rainbow Six Siege for release in “expansion into Asian territories.”

The company explains that maintaining a single version of the game rather than two parallel versions eases strain on the development team and ultimately prevents it from having to do the same work twice to address issues in both versions.

The changes themselves are minor and don’t affect the gameplay, the company notes. Ubisoft has side-by-side pictures of what it is changing on the full post, for example, and most of the decisions boil down to things like removing a line of slot machines from a room or cleaning up a splatter of blood that previously adorned an in-game wall. Changes to some of the icons in the game, pictured below, are likely to be the most noticeable.

Posted on Leave a comment

Blizzard’s long-awaited World of Warcraft Classic releases next summer

Newsbrief: Blizzard has announced that its previously announced World of Warcraft Classic will officially go online next summer.

The revamped MMORPG World of Warcraft captures a version of the game as it was 14 years ago before various updates and expansions changed the landscape and certain features of the massive online fantasy world.

A throwback version of World of Warcraft has been something wanted by players of the long-running MMORPG for a while now. Fans have unofficially tried to set something up on their own through standalone projects created by reverse engineering Blizzard code like Nostalrius, which was met with a legal threat from Blizzard, and it’s follow-up Elysium.

Blizzard’s own take on a vanilla World of Warcraft server is now set to go live during the summer of 2019, though folks that are attending Blizzcon either in-person or through the event’s digital ticket can explore an hour-long demo of Classic this weekend.

Posted on Leave a comment

Survey: Teens spend an average of $184 on video games a year

The investment firm Piper Jaffray has published the findings of its latest Taking Stock With Teens survey, detailing ongoing shifts in how teenagers divide their yearly spending budget up between things like food, clothing, and video games.

This latest report, based on data gathered from 8,600 teens, says that teenagers expect to spend an average of $215 during the current calendar year. All in all, that makes up 14 percent of the average teen’s yearly spending but is a 4 percent decrease from the spring 2018 survey.

While the data can point to useful trends in how younger players divvy up their spending, it is worth keeping in mind that the company’s numbers are based on expected spend rather than a dollar-by-dollar tally of how much teenagers are actually dropping on video games in a year.

For instance, 83 percent of teens surveyed say that they either own or plan to purchase a current generation console by year-end, up 3 percent from this spring. Breaking that down, Piper Jaffray says that 66 percent of those surveyed already own a PlayStation 4 or Xbox One while an additional 17 percent plan to own one. 

The survey also has some notable stats on how many teenagers are playing mobile games. For the Fall 2018 survey, 69 percent of teens said they play games on either a mobile phone or tablet, down from 75 percent in spring 2018 and the lowest percentage the survey has reported across 12 reports.

Of those, 28 percent say they spend money on in-app purchases in mobile games, which is up 1 percent from the spring 2018 survey but about par-the-course for 2017 and 2018.