Warzone Fiesta Released
A mode with random loadouts made from 100+ unique weapons, new boosts and powerups.
Written by Okom on Dec 13, 2024 in Halo. Last edited: Dec 13, 2024.Warzone Fiesta is a mode suite in Halo Infinite where players spawn with random loadouts of weapons, equipment and ability boosts. Halo Infinite features two official "Fiesta" modes with the normal variant having just the default weapons and equipment, and the "Super" variant having only the Legendary weapons and equipment. Warzone Fiesta combines both of these and adds over 45 uniquely designed weapons, 4 new powerups and 11 ability boosts/armor mods to the sandbox on top of everything else.
Find the modes here Supported maps listGameplay loop
Warzone Fiesta is a mode for mindless fun. The loadout you are given is completely random; choosing items from a pool of 100+ weapons, 14 equipment and 11 ability boosts every respawn leaves little room for any strategic plays as you can't predict what you'll do during your next life. The same applies to your opponent.
Mode variants
Warzone Fiesta comes in multiple mode variants including Slayer, CTF and KOTH, which all follow their own core gameplay, just with that extra randomness on top, which makes the modes more casual.
Weapons
The weapon sandbox used in Warzone Fiesta consists of the default weapons, legendary weapons and over 45 brand-new weapons which are detailed in our tsg Warzone Weapon Configuration documentation. The name for the mode also stems from the involvement of these weapons being the new thing that players would likely want to experience.
These weapons were designed with care by me and Implied Skill in a way where they could be integrated into the sandbox of Halo Infinite and be of varying power-tiers.
Weapon combinations
Halo Infinite's Forge tool allows players to combine two weapons together to create a new weapon. Each weapon is made up of a Base Weapon and a Configuration which produce a Weapon Type. The Base Weapon is the weapon at its core, the Configuration is a possible variant applied on top of the Base Weapon and the Weapon Type is the combination of the Base Weapon and the Configuration.
Combining two weapons together can lead to results ranging from a useless weapon like a Rocket Launcher that shoots Assault Rifle shots to a completely overpowered weapon such as an Assault Rifle that shoots Rocket Launcher shots. It's the weapons in the sweet spot in between these two extremes that me and Implied Skill spent months finding and creating. There's only a finite amount of combinations you can make that are balanced in their respective power-tiers and I believe we have gone through every single one there is to make in Halo Infinite that suits our gameplay needs.
All of the new weapons in Warzone Fiesta are weapon combinations, as each of them has a unique Weapon Type, which we rely on for Weapon trait application and UX communication. It should be noted that every weapon has a Base Weapon value, but there is a finite amount of weapon combinations that can be made as only the Legendary weapon variants posess a valid Configuration value. Think of every weapon like a bucket, where only some buckets have a colored liquid in them. Any bucket can be given a liquid, but you can't combine two buckets together.
Weapon design problem
A big user experience issue we faced with these weapons was communicating to the player which weapon they are holding. Let's start from the limitations we were faced with and had to work around. In Halo Infinite's Forge we can't:
- Rename weapons
- Make custom skins
- Make custom models
- Make custom sounds
- Make custom animations
- Make custom crosshairs
With that being the baseline, we had to use pretty much what the game made us use, which in the case of our weapons were:
- Weapon name inherited from the Configuration
- Weapon skin overridden by player customization in the case of most UNSC weapons; alien weapons showed a default skin
- Weapon model inherited from Base Weapon
- Weapon sound inherited from Base Weapon
- Weapon animation inherited from Base Weapon
- Weapon crosshair design inherited from Base Weapon but crosshair scaling values inherited from Configuration
We were at a loss for a very long time about this topic as it seemed like we couldn't influence it at all, until one day when I accidentally discovered that giving a cloned player biped a weapon first and then giving it to a player makes the weapon have no player customization on it. This opened up a possibility for us to give slight boost in the skin design of the weapons as we could force a default skin on all the custom weapons and leave the player's own skins on the default weapons.
Read more about how granting a default skin works in the article: tsg grantDefaultWeapon Released.
Projectile weapons
When we ran out of cool weapon combinations to make, I wanted to explore a territory that only a few scripters had done demo scripts of: making weapons shoot arbitrary projectiles.
As we're talking about Halo Infinite here where we don't have access to engine-level tags and functions, this was not as straight forward as selecting which projectile a weapon should shoot. Instead I had to create the projectile out of thin air and somehow make it look like the player shot it. Here is a summary of how it works:
- Spawn an AI on the level and make them shoot the desired projectile. This creates the projectile on the level.
- Catch that projectile via a set of filters from it entering a volume.
- Set the projectile to a stasis loop where it's cloned every 2 seconds so its internal despawn timer doesn't despawn it.
- Clear the AI so it won't interfere with that specific projectile catching volume again.
- Build a custom module that tracks player ammo count every tick to determine when a weapon is fired because we have to build that as well in Halo Infinite.
- Build a custom module that allows for setting the initial position, rotation, velocity and amount of the projectile that would be shot out and attach this to the On Weapon Fired module.
- Grant the player a weapon combination that shoots a dummy, near invisible projectile such as a Rocket Launcher shooting a Assault Rifle.
- When the player fires the weapon (ammo gets reduced etc.), clone a specific projectile from stasis, set its position, rotation, velocity and count to predetermined values.
- It now looks like you've shot a custom projectile out of your gun. In reality, it's all just an illusion.
As the projectiles are just clones, they have no affiliation to anything, so if a player gets killed by one, nobody will be credited for the kill. We had to design these projectile weapons with this in mind as well so we combined the Base Weapons with Configurations that would result in a good likelihood of the actual weapon shot landing on an enemy, and the cloned projectile following up for the killing blow. This would result in the last damage of the enemy being from that player, and it would once again be an illusion that you killed that player with the cloned projectile.
For the two Rocket Launchers that shoot a total of three rockets (Knight of Zeretus & Guard of Doisac), I made the cloned rocket projectiles have a slightly lower velocity than the real rocket so in most cases the real rocket would impact first and then the cloned ones could finish the kill.
Trait application
An integral part of our custom weapons is being able to change the traits that get applied to the player when they hold a specific weapon. This allows us to adjust the damage output of the weapon or up the movement speed of the player while wielding the weapon. This is done by tracking each player's held weapon of every tick and applying a set of traits to them if a matching weapon is found.
Some weapons only had minor adjustments made to the weapon damage while for the projectile weapons we had to null out the weapon damage to the point that it would register the tiniest amount of damage, while letting the projectile do the rest of the damage.
VFX application
While wielding some weapons or activating one of three viable powerups, players are given a visual effect that covers their screen and 3rd-person player model. Building the system for this wasn't as straight forward as the every-tick applying of traits as for some reason, you're able to stack the same VFX multiple times, but in doing so you must also remove it multiple times.
I had to build a module that assigns a value to each VFX and tracks them in a list. If a VFX is requested, it gets added to the list that allows no duplicates, so it can't be added twice. Somewhat simple once I figured it out, but then what if a player holds a weapon that gives you "VFX 1" only when holding that weapon and they use an equipment that gives you "VFX 1", but should disappear after 45 seconds? Shit.
So I came up with a solution that can hold 9 variants of each of the three VFXs instead of just 1 variant of each. This allows me to apply the same VFX multiple times, but have the source of it be from different variants so they are not duplicate values in the list. When a VFX is to be removed, a call is made to clear all the player's VFX and then the remaining VFXs in the list get applied again.
Equipment
The equipment was somewhat of a letdown as Halo Infinite doesn't let us reference the Legendary equipment that each have their own tag references in the engine, but we just don't have access to a method in Forge that allows us to easily create copies of those. That resulted in the mdoe only supporting the default equipment, powerups and our four custom powerups.
The equipment do still have something special about them as the amount of charges per equipment has been custom-designed to mirror what me and Implied Skill thought to be appropriate for them at their power-tier.
Custom powerups
At the time of writing, Halo Infinite has 3 powerups: Active Camouflage, Overshield and Quantum Translocator. There's also four equipment named "Custom Equipment A-D" which do nothing, but can be made to do something. Me and Implied Skill saw this as an opportunity to create powerups that were not in Infinite's sandbox yet. The four powerups we created can be found in our tsg Warzone Powerup Configurations documentation.
The weird names come from Halo Infinite's Forge limiting players to 858 strings (in an unsearchable list in-game by the way) that can only be used instead of writing custom strings.
Each of the powerups except Speed Boost (because we only have 3 VFX variations) has a distinguishable VFX applied to the player for a duration of time to let others know visually that the player has some kind of buff active. Some of the custom weapons also use a VFX, but we decided that the VFX should communicate a threat level more than a specific powerup or weapon combination.
Ability boosts
Ability boosts are our interpretation of the "Armor Mods" from Halo 5 Warzone. They are passive buffs added to a player ranging from increased radar size to upgraded sprinting and extra grenades. The 11 ability boosts we created can be found in our tsg Warzone Armor Mod Configurations documentation.
Each time a player spawns in Warzone Fiesta, they will be granted a passive ability boost. Which boost they get is displayed in a pop-up message on their screen.
Supporting the mode on a map
Warzone Fiesta at its core works on any map with 0 setup required, but will be missing around 20 weapons, which just so happen to be the most unique ones. So loading up the mode on any map guarantees chaos and fun, but a map with full support for the mode will exceed player expectations.
Adding full Warzone Fiesta support
Full support for Warzone Fiesta requires a small amount of objects to be placed on the map. These objects are placed in an area where they can be seen, and they will only be used if the mode logic calls them so they won't interfere with other modes.
The budget impact from the On-Level objects is:
- Game Simulation: 1.2%
- Forge Simulation: 0.5%
- Objects: 0.3%
- Node Graph: 0.1%
- Vehicles: 1
Video install guide
I've created a video guide that shows exactly how to set up and position the On-Level Kit on a map.
Assets used in the video:
Written install guide
- Bookmark the On-Level Kit prefab.
- Open your map in Forge.
- Make a folder where the objects will be placed and set it as the working folder.
- Spawn the kit and position it around the top middle of the map.
- Ungroup the kit and move the two AI Spawners to an area with Nav Mesh data. Make sure the AI Spawner boundary is fully covered in Nav Mesh data and that it's not covered in a Hard Kill volume, which would instantly kill the AI as they spawn. You'll have to build Nav Mesh if it's not present on your map.
- Make a map version save with the note "WZ Fiesta debug". This is for debugging issues later if they do occur.
- Select the remaining objects of the kit and make them into a prefab
- Set the prefab's Z position to -9000, which will be under the map where it can't be seen and won't be covered in potential Hard Kill volumes that can interfere with the AI.
- Ungroup the objects.
- Make a map version save with the note "WZ Fiesta ready".
- Exit Forge.
- Bookmark the Debug mode.
- Open a custom game lobby, select your map with the "WZ Fiesta ready" marked version and load the debug mode.
- In the match, observe that the special weapons spawn and that their custom projectiles work. The turrets will not shoot custom projectiles.
- The setup is complete and you've successfully installed and validated Warzone Fiesta on your map.
Trivia
Warzone Fiesta was a mode idea that came from wanting to test the new weapons we had designed for our tsg Warzone mode against real players. I had already built Darkstar Firefight which allowed me to see how our weapons fared in a PvE environment against AI and if players knew how to use them, but I was lacking the research from a PvP standpoint.
As I had built out the modules that make the weapons possible very modularily and portably, it was quite easy to get the initial tests of the mode in a working state. It was when I tried to run the code from within just a mode itself with no mode code on-level that I ran into unexplainable issues. Luckily being a part of the best Halo Infinite scripting community–The Scripter's Guild–I was able to ask around, put my own findings in the discussion and figure out a workaround where declared variables that are pulled from scripts on-level need to also be declared in the mode code because... we don't know, but it's Halo Infinite we're talking about so it makes sense!
It's funny that I had pretty much gathered 90% of the data that I wanted to see when using these weapons against players just from playing probably over 100 test games with random players and bots in the custom games while trying to debug the mode not working, even before I got to release the mode. But I like to finish my projects, especially if I get the feeling that they can also be enjoyed by people other than me so here we are.