Skip to content

Creating a Game Pack

Introduction

A Game Pack is a JSON file stored on the Crowd Control servers which defines everything the app and extension need to know about your game. It contains the name of the game, its platform, a link to a setup guide, as well as all of the effects available for your viewers to use.

To get your game added to the Crowd Control application, you'll have to provide

For plugin users

If you're using one of our approved game engine plugins, it should already have a built-in function to generate a game pack file for you! Please refer to your plugin's tutorials for more information.

For modders

If you're building a mod with the Crowd Control SDK, then you can generate a JSON from your C# file:

cmd
.\CrowdControl.Packs.BuildTool.exe  -i -n -e -r -s "C:\PATH_TO_CS_FILE\" -d .\Packs\ --rdepth 2 --json .\JSON\ --qa .\QA\.

For game developers

Alright, looks like you need to generate this JSON yourself! No worries, it's pretty simple.

Metadata

To start, let's add your game's basic meta data.

json
{
  "meta": {
    "releaseDate": "2024-08-09",
    "platform": "PC",
    "name": "Hirocato - The Delivery Hero",
    "connector": ["ExternalUnity"],
    "steam": { "id": 2445060 },
    "description": "Navigate to Settings -> Crowd Control for setup!",
    "guide": "https://crowdcontrol.live/guides/HirocatoTheDeliveryHero"
  }
}
Descriptions

The releaseDate field is less of a "when your game released", and more of a "when your game pack most recently experienced a major update." For example, if you add a ton of new effects, we'll update the releaseDate field to today's date so that your game shows up earlier in our app.

The name field in most cases is just a string, however it also accepts an object which specifies a custom key for sorting which may be useful for games starting with a common word like "The."

json
{
  "public": "The Legend of Zelda: Ocarina of Time",
  "sort": "Legend of Zelda: Ocarina of Time"
}

The connector field is used by the app to determine what to display when your game is selected. Since you're building Crowd Control into your game, we specify that it is an external connector (which is named ExternalUnity for legacy reasons), which hides most of our mod setup UI.

The optional steam field allows us to provide a button in our app to launch your game.

The optional description field displays a message next to your game in the Crowd Control desktop app. It is usually used for quick important notes about setting up the game.

The guide field specifies the URL for your game. The guide is hosted on our website and written by our QA team, so it's not something you need to worry about; you can leave it blank.

There are many other available fields, but they are primarily managed internally by us or used mostly by game mods, so we'll settle for just these fields for now. If you'd like to know more, see the game-menu-session-sync payload.

Effects

Now let's add in your game effects:

json5
{
  "meta": {
    // [...]
  },
  "effects": {
    "game": {
      "kill": {
        "name": "Kill Player",
        "price": 500,
        "description": "Murders the player where they stand", // Get creative!
        "category": ["Player"],
        "group": ["singleplayer"]
      },
      "freeze": {
        "name": "Freeze Player",
        "price": 50,
        "description": "Locks the player in place, forcing them to think about their actions",
        "duration": { "value": 20 },
        "category": ["Player"],
        "group": ["singleplayer"]
      },
      "give_xp": {
        "name": {
          "public": "Give XP",
          "sort": "XP: Give"
        },
        "price": 1,
        "description": "Grant some juicy experience points!",
        "quantity": {
          "min": 1,
          "max": 100
        },
        "category": ["Give Items"],
        "group": ["singleplayer"]
      },
      "change_color": {
        "name": "Change Player Color",
        "price": 25,
        "description": "Give the player a fresh coat of paint!",
        "category": ["Player"],
        "group": ["singleplayer"],
        "parameters": {
          "color": {
            "type": "options",
            "name": "Color",
            "options": {
              "red": {
                "name": "Red"
              },
              "blue": {
                "name": "Blue"
              },
              "green": {
                "name": "Green"
              }
            }
          }
        }
      }
    }
  }
}
Descriptions

The key of the objects in game are the IDs of your effects. These are constant no matter what (while effect names might be tweaked during QA, or localized, etc) so they're what you'll use to identify received effects in your game.

The name field accepts a string or the { public, sort } object described earlier.

The price field defines the cost of the effects in coins, where 100 coins is 1$USD. You can look to some internally-developed packs like Super Mario 64 for references on reasonable prices. Note that streamers can easily change this value at any time. In fact we even perform some automatic scaling up and down for big and small channels.

The optional (but recommended) description field is displayed after a user selects an effect but before they purchased it and is used to clarify its purpose. We suggest having some fun with this one!

The duration field is used for effects which last for a period of time. They specify a default length in seconds from 1s-180s and can be overridden by the streamer.

The quantity field accepts an object with a min integer gte 1 and a max integer gte 2. It allows viewers to purchase multiple of the effect in bulk, for example to give a stack of items or other collectibles.

The optional note string field is displayed next to the effect's name in a lower contrast text color and is used to distinguish identically-named effects, such as Kill Player [Streamer] vs Kill Player [Random]. It's typically used for multiplayer titles.

The optional inactive boolean field is used to indicate whether an effect should be visible on a streamer's effect list by default. This is used to reduce clutter in packs with a lot of repetitive effects (such as spawns for every enemy in a game), but which certain streamers may still wish to enable.

The optional category field is used to organize effects into collections which are displayed to the viewer, while the group field is used just by you to mark a collection of effects as unavailable or hidden (see Effect Reports).

The optional parameters field is used to specify a list of options that a viewer can select from when purchasing an effect. These options hold no impact on the effect cost so they should not be used for major choices, like giving someone $1 vs $100, or a rupee vs a max health crystal. Instead they should be used for smaller decisions like what color to make something, or what design to apply to a player or item. Note that this field gets pre-processed before getting sent to clients; see effect-request event reference for more information.

Like with the game pack metadata, there are many other available fields, but they are primarily managed internally by us or modified by streamers, so we'll settle for just these fields for now. If you'd like to know more, see the game-menu-session-sync payload.