Posted on Leave a comment

Pick your favorite Teenage Mutant Ninja Turtle in tubular new Splatoon 2 Splatfest

Pick your favorite Teenage Mutant Ninja Turtle in tubular new Splatoon 2 Splatfest

Cowabunga! This May, Splatoon 2 for Nintendo Switch will host its first-ever tournament-style Splatfest to determine which brother from the iconic Teenage Mutant Ninja Turtles franchise is the ultimate fan-favorite. Featuring characters from Nickelodeon’s upcoming animated series Rise of the Teenage Mutant Ninja Turtles, fans will vote in three rounds to crown one Hero in a Half-Shell (turtle power!). Will it be Raph, Leo, Mikey or Donnie?

To participate, players won’t be asked to order a pizza, hop on a skateboard or save the city from an army of masked ninjas – they can just start voting for their pick beginning on April 27 simply by visiting the in-game Inkopolis Square. The first of three in-game Splatoon 2 Splatfest tournaments takes place May 4-5 and pits Raph against Leo, with the second running May 11-12 and featuring Mikey vs. Donnie. The final match between the winners of the first two showdowns takes place May 18-19. The full schedule is below:

Round 1: Raph vs. Leo
May 4 (Friday), 9 p.m. PT – May 5 (Saturday), 9 p.m. PT

Round 2: Mikey vs. Donnie
May 11 (Friday), 9 p.m. PT – May 12 (Saturday), 9 p.m. PT

Finals
May 18 (Friday) 9 p.m. PT – May 19 (Saturday), 9 p.m. PT

“We love working with unexpected partners to expand our brand and bring smiles to people’s faces in surprising ways,” said Doug Bowser, Nintendo of America’s Senior Vice President of Sales and Marketing. “Teaming up with Nickelodeon and Rise of the Teenage Mutant Ninja Turtles made perfect sense, as we share many of the same fans who enjoy family-friendly entertainment and classic characters.”

Splatfests are recurring online competitions in Splatoon 2 that ask players to pick a side – in this case, their favorite Teenage Mutant Ninja Turtle. Once players choose a team, they’ll receive an in-game T-shirt adorned with an image of their preferred Turtle for their Inkling character to wear as they compete in online multiplayer Turf Wars battles to see which side comes out on top. At the end of the Splatfest, each team’s popularity and win rate is tallied up, and one team is crowned the victor. Depending on what Splatfest rank players achieve, they’ll receive Super Sea Snails, which can be exchanged to further customize gear in the game. Because of the new tournament format, players need to pick up their Super Sea Snails by the Tuesday morning following each round. The early squid catches the Sea Snails, as the old saying goes. Splatfests are open to all Nintendo Switch owners who have the Splatoon 2 game and an Internet connection.

Nickelodeon’s new animated series Rise of the Teenage Mutant Ninja Turtles follows the band of brothers as they discover new powers and encounter a mystical world they never knew existed beneath the streets of New York City. The 2D-animated series debuts later this year on Nickelodeon. For more information about the show, visit http://www.nick.com/rise-of-the-teenage-mutant-ninja-turtles/.

For more information about Splatoon 2, visit https://splatoon.nintendo.com/ or https://splatoonus.tumblr.com/. Learn about results of past Splatoon 2 Splatfests at https://splatoon.nintendo.com/splatfests/.

Game Shown:

Cartoon Violence

Posted on Leave a comment

Video: Pulling off portal locomotion in the VR game Budget Cuts

Giving players the power to move around your VR game without making themselves sick is tricky business, but Neat Corporation seem to pulled it off pretty well with the “portal” locomotion in its VR sneaker Budget Cuts.

As part of VRDC @ GDC 2018 earlier this year, Neat Corp.’s Joachim Holmer gave an insightful talk about how the studio conceived of and implemented the solution.

It was a fun, concise talk that shed light on the ins and outs of the game’s portal translocator device, the technical implementation of the system, and Neat’s solutions to making it performant.

Holmer’s presentation was very interesting, especially if you’re a VR dev or a fan of Budget Cuts, so don’t miss your chance to now watch his talk completely free via 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

Get a job: Stardock is hiring a Graphics Engineer

Location: Plymouth, Michigan

Stardock released the first DirectX 12 game as well as the first game to support both DirectX 12 and Vulkan. We are currently seeking a full-time Graphics Engineer to work on our next generation game engine for both announced and unannounced titles to build up our team of dedicated and experienced talent!  This is a salaried, full-time position at our Plymouth, Michigan office.

 Primary Responsibilities Include:

  • Develop graphics technologies to enable aesthetics and gameplay.
  • Create and optimize shaders and materials to run on a variety of platforms and machine specifications. 
  • Develop systems for animations and special effects.
  • Creating and maintaining game art pipeline.

 Education and/or Experience Desired:

  • Bachelor’s Degree in Computer Science, Engineering, Mathematics or equivalent work experience.
  • 5+ years of DirectX, Open GL, or Metal experience.
  • Strong proficiency in Math including Linear Algebra, Trigonometry and Quaternions.
  • A passion for optimization and familiarity with optimization tools.
  • Self-motivated, likes to identify and solve problems. 
  • Familiarity with Vulkan and excitement about its potential. 
  • Very strong C++ background.

Interested? Apply 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.

Looking for a new job? Get started here. Are you a recruiter looking for talent? Post jobs here.

Posted on Leave a comment

Steam Spy isn’t dead, but it’s not back at 100% yet either

Steam Spy creator Sergey Galyonkin has opened up about how Valve’s recent changes to Steam interfered with his unofficial Steam sales tracker, noting in a Medium post that he’s working on getting everything up and running again despite the setback. 

In its previous form, Steam Spy was be a useful tool for developers looking get a read on trends in video game markets, so the return of the service could stand to once again give developers an information boost.

Right now, Galyonkin says he has brought Steam Spy back online in a limited capacity. Following a second change to the Steam API and hundreds of emails to developers, he says he decided to set the new algorithm powering the utility live and get basic features like the ownership ranges, playtime distribution, and related games up and running once again. 

But he notes that, in this new form, Steam Spy is by no means as accurate as its earlier version. Galyonkin says that the margin of error is within 10 percent for a good chunk of the games he has verifiable data for, but that he’s spotted some “crazy outliers” as well.

Galyonkin’s full post has more details on the issues Steam Spy encountered when Valve switched things up and a full explanation of what’s different between the old and new utility.

Posted on Leave a comment

Blog: Scaling dedicated game servers with Kubernetes – Part 4

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.


Originally posted on compoundtheory.com.

This is part four of a fivefour-part series on scaling game servers with Kubernetes.

In the previous three posts, we hosted our game servers on Kubernetes, measured and limited their resource usage, and scaled up the nodes in our cluster based on that usage. Now we need to tackle the harder problem: scaling down the nodes in our cluster as resources are no longer being used, while ensuring that in-progress games are not interrupted when a node is deleted.

On the surface, scaling down nodes in our cluster may seem particularly complicated. Each game server has in-memory state of the current game and multiple game clients are connected to an individual game server playing a game. Deleting arbitrary nodes could potentially disconnect active players — and that tends to make them angry! Therefore, we can only remove nodes from a cluster when a node is empty of dedicated game servers.

This means that if you are running on Google Kubernetes Engine (GKE), or similar, you can’t use a managed autoscaling system. To quote the documentation for the GKE autoscaler “Cluster autoscaler assumes that all replicated Pods can be restarted on some other node…” — which in our case is definitely not going to work, since it could easily delete nodes that have active players on them.

That being said, when looking at this situation more closely, we discover that we can break this down into three separate strategies that when combined together make scaling down a manageable problem that we can implement ourselves:

  1. Group game servers together to avoid fragmentation across the cluster
  2. Cordon nodes when CPU capacity is above the configured buffer
  3. Delete a cordoned node from the cluster once all the games on the node have exited

Let’s look at each of these detail.

Grouping Game Servers Together in the Cluster

We want to avoid fragmentation of game servers across the cluster so we don’t end up with a wayward small set of game servers still running across multiple nodes, which will prevent those nodes from being shut down and reclaiming their resources.

This means we don’t want a scheduling pattern that creates game server Pods on random nodes across our cluster like this:

Fragmented across the cluster

But instead want to have our game server Pods scheduled packed as tight as possible like this:

Fragmented across the cluster

To group our game servers together, we can take advantage of Kubernetes Pod PodAffinity configuration with the PreferredDuringSchedulingIgnoredDuringExecution option. This gives us the ability to tell Pods that we prefer to group them by the hostname of the node that they are currently on, which essentially means that Kubernetes will prefer to put a dedicated game server Pod on a node that already has a dedicated game server Pod on it already.

In an ideal world, we would want a dedicated game server Pod to be scheduled on the node with the most dedicated game server Pods, as long as that node also has enough spare CPU resources. We could definitely do this if we wanted to write our own custom scheduler for Kubernetes, but to keep this demo simple, we will stick with the PodAffinity solution. That being said, when we consider the short length of our games, and that we will be adding (and explaining) cordoning nodes shortly, this combination of techniques is good enough for our requirements, and removes the need for us to write additional complex code.

When we add the PodAffinity configuration to the previous post’s configuration, we end up with the following, which tells Kubernetes to put pods with the labels sessions: game on the same node as each other whenever possible.

apiVersion: v1
kind: Pod
metadata: generateName: "game-"
spec: hostNetwork: true restartPolicy: Never nodeSelector: role: game-server containers: - name: soccer-server image: gcr.io/soccer/soccer-server:0.1 env: - name: SESSION_NAME valueFrom: fieldRef: fieldPath: metadata.name resources: limits: cpu: "0.1" affinity: podAffinity: # group game server Pods preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchLabels: sessions: game topologyKey: kubernetes.io/hostname

Cordoning Nodes

Now that we have our game servers relatively well packed together in the cluster, we can discuss “cordoning nodes”. What does cordoning nodes really mean? Very simply, Kubernetes gives us the ability to tell the scheduler: “Hey scheduler, don’t schedule anything new on this node here”. This ensures that no new Pods get scheduled on that node. In fact, in some places in the Kubernetes documentation, this is simply referred to as marking a node unschedulable.

Cordoning nodes

In the code below, if you focus on the section s.bufferCount < available you will see that we make a request to cordon nodes if the amount of CPU buffer we currently have is greater than what we have set as our need. We’ve stripped some parts out for brevity, but you can see the original here.

// scale scales nodes up and down, depending on CPU constraints
// this includes adding nodes, cordoning them as well as deleting them
func (s Server) scaleNodes() error { nl, err := s.newNodeList() if err != nil { return err } available := nl.cpuRequestsAvailable() if available < s.bufferCount { finished, err := s.uncordonNodes(nl, s.bufferCount-available) // short circuit if uncordoning means we have enough buffer now if err != nil || finished { return err } nl, err := s.newNodeList() if err != nil { return err } // recalculate available = nl.cpuRequestsAvailable() err = s.increaseNodes(nl, s.bufferCount-available) if err != nil { return err } } else if s.bufferCount < available { err := s.cordonNodes(nl, available-s.bufferCount) if err != nil { return err } } return s.deleteCordonedNodes()
}

As you can also see from the code above, we can uncorden any available cordoned nodes in the cluster if we drop below the configured CPU buffer. This is faster than adding a whole new node, so it’s important to check for cordoned nodes before adding a whole new node from scratch.  Because of this we also have a configured delay on how long before a cordoned node is deleted (you can see the source here) to limit thrashing on creating and deleting nodes in the cluster unnecessarily.

This is a pretty great start. However, when we want to cordon nodes, we want to cordon only the nodes that have the least number of game server Pods on them, as in this instance, they are most likely to empty first as game sessions come to an end.

Thanks to the Kubernetes API, it’s relatively straightforward to count the number of game server Pods on each Node, and sort them in ascending order.  From there we can do arithmetic to determine if we still remain above the desired CPU buffer if we cordon each of the available nodes. If so, we can safely cordon those nodes.

// cordonNodes decrease the number of available nodes by the given number of cpu blocks (but not over),
// but cordoning those nodes that have the least number of games currently on them
func (s Server) cordonNodes(nl *nodeList, gameNumber int64) error { // … removed some input validation ... // how many nodes (n) do we have to delete such that we are cordoning no more // than the gameNumber capacity := nl.nodes.Items[0].Status.Capacity[v1.ResourceCPU] //assuming all nodes are the same cpuRequest := gameNumber * s.cpuRequest diff := int64(math.Floor(float64(cpuRequest) / float64(capacity.MilliValue()))) if diff <= 0 { log.Print("[Info][CordonNodes] No nodes to be cordoned.") return nil } log.Printf("[Info][CordonNodes] Cordoning %v nodes", diff) // sort the nodes, such that the one with the least number of games are first nodes := nl.nodes.Items sort.Slice(nodes, func(i, j int) bool { return len(nl.nodePods(nodes[i]).Items) < len(nl.nodePods(nodes[j]).Items) }) // grab the first n number of them cNodes := nodes[0:diff] // cordon them all for _, n := range cNodes { log.Printf("[Info][CordonNodes] Cordoning node: %v", n.Name) err := s.cordon(&n, true) if err != nil { return err } } return nil
}

Removing Nodes from the Cluster

Now that we have nodes in our clusters being cordoned, it is just a matter of waiting until the cordoned node is empty of game server Pods before deleting it. The code below also makes sure the node count never drops below a configured minimum as a nice baseline for capacity within our cluster.

You can see this in the code below, and in the original context:

// deleteCordonedNodes will delete a cordoned node if it
// the time since it was cordoned has expired
func (s Server) deleteCordonedNodes() error { nl, err := s.newNodeList() if err != nil { return err } l := int64(len(nl.nodes.Items)) if l <= s.minNodeNumber { log.Print("[Info][deleteCordonedNodes] Already at minimum node count. exiting") return nil } var dn []v1.Node for _, n := range nl.cordonedNodes() { ct, err := cordonTimestamp(n) if err != nil { return err } pl := nl.nodePods(n) // if no game session pods && if they have passed expiry, then delete them if len(filterGameSessionPods(pl.Items)) == 0 && ct.Add(s.shutdown).Before(s.clock.Now()) { err := s.cs.CoreV1().Nodes().Delete(n.Name, nil) if err != nil { return errors.Wrapf(err, "Error deleting cordoned node: %v", n.Name) } dn = append(dn, n) // don't delete more nodes than the minimum number set if l--; l <= s.minNodeNumber { break } } } return s.nodePool.DeleteNodes(dn)
}

Conclusion

We’ve successfully containerised our game servers, scaled them up as demand increases, and now scaled our Kubernetes cluster down, so we don’t have to pay for underutilised machinery — all powered by the APIs and capabilities that Kubernetes makes available out of the box. While it would take more work to turn this into a production level system, you can already see how to take advantage of the many building blocks available to you.

Before we finish, I would like to apologise for the delay in producing the fourth part in this series. If you saw the announcement, you may have guessed that a lot of my time got taken up developing and releasing Agones, the open source, productised version of this series of posts on running game servers on Kubernetes.

On that note, this will also be the last installment in this series. I had already completed the work to implement scaling down before starting on Agones, and rather than build out new functionality for global cluster management on Paddle Soccer, I’m going to focus those efforts building out awesome new features for Agones and bring it up from its current 0.1 alpha release, to a full 1.0, production-ready milestone.

I’m very excited about the future of Agones, and if my series of blog posts have inspired you, watch the GitHub repository, join the Slack, follow us on Twitter and get involved the mailing list. We’re actively seeking more contributors, and would love to have you involved.

Lastly, I welcome questions and comments here, or reach out to me via Twitter. You can also see my presentation at GDC and GCAP from 2017 on this topic, as well as check out the code in GitHub.

All posts in this series:

  1. Containerising and Deploying
  2. Managing CPU and Memory
  3. Scaling Up Nodes
  4. Scaling Down Nodes
  5. Running Globally
Posted on Leave a comment

Don’t Miss: How Blizzard designed StarCraft II with esports in mind

The game industry’s enthusiasm for eSports is clear as day, but what’s less clear for many game developers is how, exactly, you design and tune a game to be played competitively at a professional level for years at a time.

Blizzard Entertainment did just that with StarCraft II, and at GDC 2011 Blizzard’s Dustin Browder took the stage to deconstruct the game’s design and examine how its competitive multiplayer was tuned to serve the needs of a global eSports community.

It was a unique look inside Blizzard’s design process, and shed light on the development and maintenance of one of the world’s early eSports success stories. If you missed it in person, it’s well worth going back to watch the entire talk for free over on the official GDC YouTube channel.

In addition to this presentation, the GDC Vault and its new 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, GDC Europe, and GDC Next 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 Tech

Posted on Leave a comment

Nintendo still has plans for the 3DS through ‘2019 and beyond’

Following earlier conversations about the role the 3DS would play in a post-Switch industry, Nintendo now says that it has plans to support the 3DS into and beyond 2019.

Currently, the 7-year-old handheld platform has sold 72 million units across its various models and Nintendo says it plans to continue to leverage that install base in the coming years. During a presentation to investors, Nintendo president Tatsumi Kimishima said that the company is still looking at ways it can drive hardware and software sales, noting that Nintendo is currently “preparing new software for release in 2019 and beyond.”

Right now, the company has a handful of games like Captain Toad: Treasure Tracker, WarioWare Gold, and a Luigi’s Mansion rerelease due out for the system in 2018, with Mario & Luigi: Bowser’s Inside Story + Bowser Jr’s Journey slated for a 2019 release.

Kimishima also notes that the 3DS has a library of over 1,000 games between both digital and physical releases and that Nintendo is currently looking at ways to drive both hardware and software sales going forward.

“We will continue the Nintendo 3DS business by leveraging its installed base and rich software library,” said Kimishima. “We believe it is important to leverage the rich library of Nintendo 3DS series titles to drive sales with existing Nintendo 3DS owners as well as with consumers who recently purchased the Nintendo 3DS hardware, and are investigating strategies for doing so.”

Earlier this year, Nintendo leadership addressed concerns about how the 3DS would fit into its company following the Switch’s success since the portable nature of the Switch gave it some level overlap with Nintendo’s own dedicated handheld system.

At the time, Kimishima noted that the 3DS was still profitable and expressed hopes that “consumers will embrace it together with Nintendo Switch,” something that now looks to be reflected in the company’s release calendar. 

Posted on Leave a comment

Now Available on Steam – AI Nightmare, 40% off!

AI Nightmare (a 360 Video), is Now Available on Steam and is 40% off!*

Abducted by futuristic AI robots, you race against the clock to solve a cryptic message and prevent Earth’s coming destruction – only to question if what you experienced was actually just a nightmare. 

Official Selection of 2018 Mammoth Film Festival
Official Selection of 2018 Capital City Film Festival
Official Selection of 2018 New Media Film Festival (LA)
Official Selection of 2018 Mediterranean Film Festival Cannes (France)
Honorable Mention from IndieTO VR Film Festival

*Offer ends May 3 at 10AM Pacific Time

Posted on Leave a comment

With the PlayStation 4 at 73M sold, Sony braces for sales to slow

Sony has sold 73.6 million PlayStation 4 systems since releasing the first version of the hardware back in 2013. And while sales have remained strong for the console in the last few years, Sony’s latest financial statements show that the company is preparing for hardware sales to slow down in the 2018 fiscal year.

Right now, that predicted decline is responsible for a 2 percent decrease in forecasted sales for Sony’s Game and Network Services segment, though rising software sales are expected to help soften the blow. 

According to the company’s predictions, hardware sales are expected to fall to roughly 16 million units during the current 2018 fiscal year. For reference, the PlayStation 4 is currently sitting at 73.6 million sold, with 19 million of those systems sold during its last fiscal year, down ever so slightly from the 20 million reported in 2016.

This all comes as the PlayStation 4 edges ever closer to the lifetime sales of the PlayStation 3, which saw roughly 83 million systems sold in just over a decade.

As those sales fall, however, Sony is banking on rising software sales to keep the company’s operating income on the up and up. Speaking during a presentation to investors earlier this week, Sony CFO Hiroki Totoki noted that hardware sales fell year-over-year between 2016 and 2017, but that sales overall rose 18 percent thanks to rising software sales. The company’s forecasts for the current 2018 fiscal year show that Sony is banking on this trend to continue. 

Sony saw ¥920.1 billion (~$8.4 billion) from game software sales in its 2017 fiscal year, up from ¥718 billion (~$6.6 billion) in 2016 and ¥560.9 billion (~$5.1 billion) in 2015. The company didn’t specifically note where it expects game software sales for the 2018 fiscal year to fall, but did say that it expects PlayStation 4 software, especially digital, to continue to increase.