Oddball FFA (Completed Game Mode)

Introduction
I think my first workshop project is finally complete, so I’m ready to share!

Some of you may remember the game type “Oddball” from Halo 2, which involved holding a skull for a certain amount of cumulative time during a match to win. I’ve recreated this style of game in Overwatch using the FFA Deathmatch gametype as a base to build upon. Play testing has been ludicrous fun when I could get enough people to fill the lobby, so I look forward to seeing what the rest of the community thinks of this one!

How to Play
The basic ideas are simple, but the meta-game is actually quite complicated. Here’s the basics:

  • Touch the ball to pick it up
  • Kill other players to make them drop the ball
  • Score a point by holding the ball for 3 seconds
  • Win by scoring 50 points, or by having the most points when time runs out

As you play, you’ll find that getting in fights away from the objective will slow you down, but that it is actually beneficial to deal damage to everyone near the ball in case they pick it up before you do. The result is a chaotic brawl that moves around the map in a path dictated by whoever holds the ball, giving ample opportunity for game experiences similar to standard FFA alongside objective-based gameplay with more interesting dynamics. Attacking anyone who isn’t the ball carrier is a gamble but has a compelling payoff, because you need cooperation to corner the ball carrier but you also need to be the last man standing after the ball drops to gain control over it.

Game Balance Issues and Solutions
As you might imagine, there are a few issues with balance in this game type but most are dealt with handily when the lobby is full. It’s very difficult for one player to hold the ball against 11 other people trying to kill them, no matter what hero they are playing! There are two exceptions, and I’ve made special scripts for each of them that I’d like to go over here.

Particularly on Chateau Guillard, Lucio and Pharah are both able to use Wall Riding or flight abilities to loiter in areas of the map that are inaccessible to other heroes. Each of these heroes required a unique but similar solution in order to reign them in without sacrificing their abilities or game play.

The solution I chose was simpler for Lucio, of the two. A script disables Lucio’s jump button (and by extension his wall riding ability) after 10 seconds of not touching the ground while holding the ball. This allows Lucio just enough time to wall ride around the outside of Chateau Guillard’s longest stretch of outside wall, but if he wastes any time loitering with the ball outside the accessible area of the map, he will fall.

Like Lucio, Pharah’s limitation as a ball-carrier is based on a 10 second timer. However, unlike Lucio, Pharah is expected to be able to loiter in the air almost indefinitely during normal game play. Pharah’s timer does reset when she touches the ground, but it also resets when Pharah moves in to line of sight of the nearest walkable terrain. This allows Pharah to play far out over the water and fly indefinitely even with the ball, but ensures that she always presents a reachable target for everyone else. Players shouldn’t notice her limiting script unless they’re actually trying to take the ball somewhere they shouldn’t. As with Lucio, expiry of the timer results in Pharah falling out of the sky. Both timers are displayed in the corner of the player’s screen.

Wrecking Ball is a third possible consideration for scripted limits and I did develop a script to disable Wrecking Ball’s ability to roll along the ground (but nothing else) while holding the ball, but given how hard Mei counters him with 3 or more people in the lobby I decided not to include that feature in this release. There are other examples of questionable hero mechanics, but I think any I haven’t addressed can be countered without requiring everyone else in the lobby to switch to a Lucio or Pharah. Sombra just needs someone camping the translocator. Tracer can only recall backward into the pack chasing her. For every remaining potential balance problem, there is a hero-selection-based solution or an exploitable weakness.

I humbly request for any modifications made to this game mode to keep this ideal in mind: all heroes should be playable and as close to original functionality as possible. I like the idea of people jumping into Oddball and using the same skills they’ve developed everywhere else in Overwatch. That said, I think there’s also a lot of fun that could be had by forcing all players on to the same hero at set intervals. Especially Reinhardt.

Interesting Notes and Challenges
While the scripts for specific heroes took a considerable amount of time to get right, the most time-consuming part was trying to figure out why everything that depended on the Nearest Walkable Position function has a tendency to randomly break. I don’t know what the proper solution is (probably something the Overwatch devs have to handle), but I did find a workaround. When Nearest Walkable Position doesn’t give a valid position (for whatever reason), the result will be not equal to true. Using that discovery, I store the last known good Nearest Walkable Position everywhere that I use it as a backup source for that data.

Also included is a method for tracking the average position of all living heroes, which is stored in the global variable O and used to determine where the ball will spawn both at the start of the game and any other time that no ball is in play (such as ball carriers disconnecting or becoming spectators). This allows the game mode to adapt to any map with dynamic ball placement. To accomplish the task, I had to learn and leverage some of the execution control statements like Skip alongside prior knowledge of how to code for multi-threaded applications using semaphores. While I don’t know if the workshop feature actually uses more than one thread to run its scripts, I was unable to ensure a known order of execution using the Ongoing - Each Player event I chose to work with. Approaching the problem as if it were a multi-threaded function led to success, but I’d be interested to hear of alternative solutions to do the same thing using Ongoing - Global events and, perhaps, some kind of array functionality I haven’t discovered yet.

I realize that the previous two paragraphs are probably not everyone’s cup of tea, but I hope that they help people who are trying to learn the Workshop while looking at my code. (Is it really code when you’re just clicking on it?) So without further ado, the part most of you are probably here for follows…

Workshop Import Code
Y2G72

I look forward to your feedback!

2 Likes

The good old Halo 2 days!

Is it possible for you to add some of the oddball functionality that was in Halo Reach? In particular I want the option for the oddball to explode randomly between different time periods (ideally between 15 and 45 seconds of holding the ball).

This creates some awesome tension in the game!

This would work best with only Pharah and a bottomless ammo clip with only 4 players. Any more players and this game mode, “Rock the Oddball” we used to call it, stops being fun, too many explosions… 4 is just perfect for the insane tension.

You would be my hero if you can add the option for the oddball exploding!

An extended mode to this is “Ninja Ball” where characters run super fast when they don’t have the ball, but are super slow when the have the ball, all characters can jump super high. Mid air explosions are the best. In halo this worked well with Snipers/Swords in halo, not sure how it could be done the same way with the characters available. This worked really well in an open map like Coagulation.

2 Likes

So you want the ball carrier to randomly die after holding it for a little while? Am I getting that right?

As for modified speed/jump/etc for ball carrier vs empty-handed, that wouldn’t be hard to implement considering it’s just a few more actions added to existing rules, but I think doing that would cause a lot of problems with hero balance. In a game where everyone plays the same or at least very similar characters, a mobility buff affects everyone equally… but in Overwatch it has dramatically different effects depending on the affected hero.

Correct.

I fiddled around with the game settings on top of your game mode and managed to get mostly what I wanted, except for the random ball exploding bit and having different speeds depending who has the ball or not. This latter isn’t crucial as I can control which characters I decide to use, and get the game balance just right.

It was a lot of fun, when going only Pharah for “Rock the Oddball”, and only Doomfist for “Ninja Ball”. We were jumping and screaming so much from the excitement xD

Some situations meant Doomfist pros could forever escape on certain maps, so the random exploding makes it more fair. We tried only Lucio instead of Doomfist and again, the game broke without the exploding ball, once someone could always escape.

I also need to refine the maps for each game mode, some just didn’t work for the modes.

Ah, so you’re locking everyone to a limited hero pool? Yes, I could see that causing problems catching the ball carrier. In order for the game mode to work well without limiting hero capabilities, the players need to swap heroes to counter the ball carrier particularly in games with few players. If someone is Wrecking Ball on Chateau Guillard, for example, a Mei or Sombra to freeze or hack him can become a necessity due to the speed with which he could otherwise reach the two mega health packs.

I also designed and tested the game mode specifically on Chateau. I then modified it so that it would run on any map. Others shared your opinion that some maps do not lend themselves as well to the game mode. I’m not sure there’s really a way to fix that without editing the maps.

I’m not liking the idea of randomly exploding the ball carrier because it’s an unpredictable and uncontrollable punishment for the player, and it also replaces skill-based rewards with RNG. However, I was toying with the idea of turning the ball carrier into a specific hero as an alternative version of the game that played more consistently. Hammer torb would do nicely for the purpose.

I’ll check in on the workshop when I have time later to try adding some new rules. Like the devs at Blizzard, perhaps I have overestimated how much people want to swap heroes after picking and you can definitely run into problems caused by hero selection in this game mode.

Edit: Update!

Try this code: Q7B76

This adds rules to turn the ball carrier into a hammer Torb with 20 hp/sec passive regen, Overload and Molten Core enabled. Ultimate charge and health percentage is carried over when swapping to and from Torb. The rules can be easily adapted to substitute any hero for Torb. Just change workshop references from Torb to the hero of your choice and edit the non-workshop hero settings appropriately. I think Brigitte and Mercy might have good potential as ball carrier heroes too! This code should allow you to do most of what I think you want to do with the game mode.

Pressing the Interact button will drop the ball, restoring the player’s chosen hero.

If you want to remove the passive heal, you’ll need to remove the actions that start and stop the heal when swapping to and from torb, as well as the action set to store the heal as a variable.

Second edit: Exploding Ball Carrier

This code should do what you want to “explode” the ball carrier as described. I’m not keen on the idea for the game mode myself, but here you go:

rule("kill ball carrier after 15-45 seconds")
{
	event
	{
		Ongoing - Each Player;
		All;
		All;
	}

	conditions
	{
		Value In Array(Player Variable(Event Player, A), 0) == True;
	}

	actions
	{
		Wait(Random Integer(15, 45), Abort When False);
		Kill(Event Player, Null);
	}
}

Hmm, this is very interesting, but is there anyway to set it to be specifically Interact to hold the ball, and any other input except Melee drops the ball?

The whole point of Oddball was to have to juggle the ball and combat, with instant kill melees while holding the ball (at least in default settings for H3) being your last resort.

If you set it to interact pickup and non-melee drop, then you could change the scoring to be straight time.

1 Like

The scoring was originally done in one-second intervals, but the built-in scoreboard makes noise when score is adjusted and it got REALLY ANNOYING, really fast. :rofl:

I could do the scoring in a custom UI, but I’m not sure how to hide the existing scoreboard or ensure the display of the post-game score rankings were I to do that. Modifying the way the game does scoring would also break other aesthetic things like the timing of (or even existence of) the music that comes in near the end of the game. And it would be a lot of extra work. I’m open to the idea of making that modification to the game mode, however, if someone else knows how to solve those problems.

I could certainly set player controls to interact pickup and non-melee drop. All I would need to do is change the conditions for the ball pickup and ball drop rules using the first release version of the game mode as the basis. I think I know how I would alter melee attacks for the ball carrier, too. However, I don’t think going that route would work very well in Overwatch where an instant kill melee attack would utterly negate some heroes’ entire existence.

Imagine trying to play any hero in Overwatch who has an effective range of less than 10 meters against the kind of lunging one-shot or two-shot melee attacks common to Bungie’s shooter games and their derivatives. Remember launch day Brigitte? It’d be even worse than that.

I like the idea of the ball giving you different powers when you’re holding it, but balancing those powers against the rest of the cast presents a great many challenges. I’d be interested to hear more about how you think we could get closer to the Halo Oddball experience without breaking the game balance.

You could simply have melee apply a flat 200/250 damage.

Or hell, even just 145 damage, since the game doesn’t have a “draw” animation for weapons. As soon as you drop the ball, you’d have the ability to do an input on frame 1 out of dropping it. Which could easily just be 5-50 more damage, depending on the hero.

Some Halo 3 behaviors of Oddball – the ball resets to a neutral position spawn location if it falls off the map.

Imagine playing Reaper against that.

Reaper has Wraith.

This is Overwatch’s melees, there are no lunges, so he can juke the player holding the ball by dipping in/out of Wraith and then punish.

If quick melee had a longer cooldown, maybe. That is something that the Workshop would let us change, but it would feel weird. Also consider Brigitte and Rein, who can’t block melee attacks. And Reinhardt doesn’t actually do anything when you press quick melee.

I’m currently unaware of a way in which this could be implemented. It does happen already with the flags in the game’s CTF game mode, but the ball in my game mode is a different kind of entity. I’d have to figure out how to make it a physical object that can bounce and roll along map geometry. Also, making this change would mean that characters who sometimes depend on environmental kills–like Lucio–would not be rewarded with a ball pickup for killing a ball carrier.

If a dev sees this… we could make a lot of new game modes with spawnable ball and flag objects that have behaviors like this built-in!

1 Like

Awesome thanks for the code! :smiley:

I take it that there isn’t a way to insert an explosion effect on the ball?

The exploding ball when I played it in halo reach was some of the funniest and intense moments with my friends. I’ll try add this code and let you know some feedback. I’m hoping to get some of that same fun and intensity as halo again!

It still takes skill to hold the ball even for 15 seconds with how easy it can be to die in my game mode. You can’t get mad at how ludicrous it can get haha.

Also, that reminds me, if the “explosion” has a blast radius that takes out people in the vicinity as well would be awesome (this happened in Reach). About the same range as one of Pharah’s rocket’s splash damage. Again, hilarity ensues in some situations, it gives everyone a fair chance.

Good idea making the ball carrier limit damage to only melee, I had forgotten about that in Halo. I’ll try Mercy and Briggite out too.

I’ll mess around and get back to you. If this works and makes for some seriously insane fun, I should get you to try it out, I’m sure you’ll come around xD

I’ve figured out how to add explosion effects!
Messing with it now!