Valve Developer Union

Anatomy of a Ricochet Level

(October 6, 2017)


One thing to remember about making Ricochet levels is that, despite jumping being central to the game, players can't jump on their own. Instead, they have to use special jump arrows to hop between platforms. If you'd like to make custom Ricochet levels, the information below will teach you how to create the items and effects normally seen in one.

Basic information

Layout

The platforms in a Ricochet level are laid out in a mostly symmetrical fashion. Bouncer walls should block the most obvious and direct of shots and encourage the rebound shots that net players more points. This view of rc_deathmatch shows the way a Valve map is constructed. Note the way the arrows are positioned on the top level; these help to focus the action towards the center of the playfield, as do the four outside platforms on the bottom level.

rc_deathmatch, one of Ricochet's pack-in maps
rc_deathmatch, one of Ricochet's pack-in maps

The far walls of the playfield are usually textured with sky.

Lighting

Ricochet levels are lit from below with a single light_environment entity. It's best to leave the light monochrome, or else platforms and other entities may have strange hues and tones to their faces.

Entities of a Ricochet level

Pad

A pad in a Ricochet level is a 256x256x16 cylindrical brush with 20 faces. There are three face textures per color, and the colors don't mix. You should make one side of your arena blue pads, using one of the disc_blue textures for the faces and trim_blue for the sides, and make the other side red pads, with disc_red and trim_red. Pads in the center of a level should be the dual color, disc_dual1. The opposite corners of the dual pad should be textured with both of the trims, red in the northwest and southeast corners and blue in the northeast and southwest corners.

A Ricochet pad without arrows
A Ricochet pad without arrows

rc_arena has beams underneath the pads. To create this effect, place two info_target entities (one directly under the pad, the other 384 units underneath it, and both centered in the middle), name them, and create an env_beam entity nearby with the following parameters.

Keyvalues to make the pad beam work
Keyvalues to make the pad beam work

Set "Start On" and "Shade End" for the spawnflags of the env_beam.

The pad won't work until you give it an info_target that'll act as the target for the jump arrow pointing in its direction. Center the info_target eight units above the pad and name it.

Jump arrow

A jump arrow should be 80x36x16 and seamless with the top and side of the pad. The pad should be split between two vertices and an 80x36x16 block created at the split. Use the clipping and vertex manipulation tools to shape it into an arrow, and make sure the top is flat. To texture it, use +0square1 on the sides, fit to the size of the face, and use +0arrow1 on the top and bottom, rotated the same direction as the arrow itself and fitted to the size of the face. For jump arrows on odd, uneven angles, you may want to copy over an existing arrow and rotate and vertex manipulate it into position. Remember to fit the textures to the face again.

The process of creating a jump arrow
The process of creating a jump arrow

The trigger_jump brush entity is what gives the jump arrow its functionality. Place a small one over the arrow and set its target to the info_target of the pad the jump arrow is pointing to. The distance between the platforms will usually be 128, though not always, especially if the player is jumping up a level.

Jump pad

A jump pad is different from a jump arrow as it's not connected to any other geometry. A jump pad is necessary if the player is to make a series of complex jumps in order to get to, say, another pad on a higher level. They are 112x96x32, 96 units above the platforms on their level, and use the same texture as the jump arrows, +0arrow1. Along with a trigger_jump, pads should also have an info_target, as players have to jump into the arrow in order to use it.

A jump pad with a trigger_jump and an info_target
A jump pad with a trigger_jump and an info_target

Bouncer

The bouncer walls are important, as ricochet kills are how players score big points in the game. The length of the bouncer can be as long as you want, but they're 16 units tall and eight thick. Place them 32 units above the pads on that level. Texture the horizontal sides with trim_yellow1, but set the Y scale to 0.5. The top and bottom should be textured with strip1a, with its Y scale set to 7.5.

A disc bouncer
A disc bouncer

Bouncer walls also have a trigger_push on top of them to prevent players from standing on them. Copy the bouncer upwards and texture it like a trigger, and then tie it to a trigger_push with its push speed set to 0.

Rotate them both between 10-45°. The textures will break if you don't have texture lock on, so make sure that it is.

Teleporter

Teleporters are the most complex entity in Ricochet to construct. Aside from the frame, textured with strip1a and with no less than four 8x8x8 diagonal brushes connecting the four-unit-thick and eight-unit-apart top and bottom to bouncers on both sides of the teleporter, they have two env_beam entities, each with two separate info_target entities, not to mention the trigger_teleport volume that envelopes the frame. Confused? A visual should help.

A diagram of how the disc teleporter should be set up
A diagram of how the disc teleporter should be set up

Each teleporter should also have an info_teleport_destination entity, which is where the discs will exit from. A separate teleporter is needed as an exit, though in this configuration, both can be used interchangably. If you want to put a teleporter in your level, it's a good idea to create two bouncers along with it and rotate them all at once.

The beams should be configured as such:

Keyvalues for the teleporter beams
Keyvalues for the teleporter beams

Set their "Start On" spawnflag.

Miscellaneous entities

trigger_fall

The trigger_fall brush entity kills any players that enter its volume. Its height doesn't matter, but make sure it spans the entire playfield and is about 200 units under the lowest platforms. Players don't take fall damage, so if they can get around the trigger_fall, they'll fall to the bottom of the map and be left out of the action for the rest of the game.

trigger_discreturn

Around the accessible bounds of the level, create a few trigger brushes and tie trigger_discreturn to them. When a disc enters its volume, it'll be made usable again by the player who threw it. Discs bounce off sky brushes, meaning players would have discs bouncing off of the void and returning to them, ruining the effect of an endless playfield.

item_powerup

The powerup can be placed anywhere along the course of a player's jump, preferrably near the top of the map. One of the four available powerups will be chosen at random, and they'll change at respawn. One entity is more than sufficient for most maps, though if yours is especially big, you can place two. Don't make them too easy to get.

The four powerups available in Ricochet
The four powerups available in Ricochet

These are the makings of a Ricochet level, though there's much room to get creative. Ricochet levels can use any of the textures and models available to Half-Life, meaning they can be added in and used to add further visual interest and variety to gameplay. (Half-Life monsters, NPCs, and weapons, on the other hand, aren't available.) Just remember that players can't jump, nor can they sprint, so large, sprawling designs are ill-advised.