Killing Floors tutorial for getting started making custom maps for the FPS Horror Survival game.
Posted by Henley on May 17th, 2009
Killing Floor is powered by Unreal Engine 2.5, and maps are created in Unreal Editor 3.0. Prior experience with UED will be useful if you plan to start a Killing Floor map as this guide is intended for people with intermediate/advanced knowledge of the Unreal Editor. If you are a complete newcomer to Unreal Engine editing, you should check out some beginner resources before you launch into anything specific to KF. The following are some good places to start understanding Killing Floor's tools.
Single player story mode isn't officially supported but you are free to use it as you wish. These single player parts of the game are not covered in this guide.
Designing a map for Killing Floor requires a slightly different sort of thought to say - a Deathmatch level in Unreal. The main things to keep in mind when planning a KF map are:
1. Where will the players be able to set up their defenses?
2. Where will enemies spawn?
3. Where will the trader shops be located?
Q: Where will the players be able to set up their defenses?
A: Killing Floor is a sandbox style game, and players will often gravitate towards defensive points that they feel comfortable with. It's your job as a mapper, to give them as much choice as possible, and to make sure that these locations are each as balanced as possible.
For example, if I decide to create an enormous tower in the middle of an open area, players are probably going to spend all of their time up there, and never come down. This might be fun for a while, but it will have the effect of giving the map a static and eventually boring feel. The most important aspect of any killing floor map is that it be constantly tense when the wave is underway. And this means presenting players with defensible, but not impenetrable areas.
For example: A small shack with only one entrance, and multiple windows to fire out of is probably being a little too kind to the players! If you add a back door to the shack, the scenario becomes more interesting, because now the players are forced to watch two directions at once, and this increases the tension!
Q: Where will enemies spawn?
A: Killing Floor makes use of "ZombieVolume" actors, to determine what is a good place for a mob of enemies to spawn at. This will be discussed in more detail, in a later section. As a rule of thumb however, you should keep in mind that the more speciman spawns a map has, and the more interesting and sneaky the places they are, the more exciting the gameplay will feel. Vent shafts, roof tops, windows. All of these are better places to spawn specimens than just right there on the ground!
Q: Where will the trader shops be located?
A: The "Trader" in Killing Floor provides players the opportunity to upgrade their arsenal or get rid of junk they no longer need. Because of this, she is a hugely important character, and critical to winning a match. Every killing floor map should contain more than one trader! If a mapper places only a single trader area, it's pretty clear where the players are going to be camping when they play the map! This creates stale, boring gameplay; and we don't want that! Typical KF maps have anywhere between 3 and 5 trader zones, but the actual number is largely determined by the size of the map. So if you plan on creating some massive area, maybe you will want to place five or more spots. The actual process of setting up trader shops will be discussed in a later section of this document.
As discussed earlier, trader rooms play a pivotal role in any Killing Floor map. When placing them, you should be make sure they are evenly spaced from one another, so that there is one trader room in each major area of the map.
Now that we've covered the rules of trader placement, we can look at the actual creation of these areas. It doesn't matter where a trader is situated (in a room, behind a fence, etc) so long as there is some way of establishing distance between the shoppers and her. It's recommened that you look the TraderExample map which you can download from here. If you copy and paste the trader and all the objects around her into your map it will allow you to keep an consistent feel with the official maps provided with Killing Floor.
When you have set apart your trader area, you will want to block it off with a mover called TraderDoor. The inside of the trader area will now need a ShopVolume. It needs to take up the space inside so people can shop and it should not extend outside of the room. If it does then players will be able to shop at that trader location even if it isn't active.
The tag of the TraderDoor needs to be the same name as the ShopVolume's event. For example: TraderLocation1. Next you will need to add six Teleporters so people still in the shop can be warped outside when the trading time has run out. These Teleporters need to be placed just outside of the TraderDoor.
In the ShopVolume's properties under ShopVolume set the URL to the same name as the tag of the teleporters. For example: TraderTeleport1.
For the players to be able to navigate easily to the trader locations you will need to set the pivot of the ShopVolume to near or exactly where the trader is standing. You will also want to make sure there are path nodes leading up to the TraderDoor.
To spawn specimens in Killing Floor we use a volume called ZombieVolume. ZombieVolumes are placed in maps in the same way you would any other sort of volume. They should not be sunk into walls or floors, and the bounds of each volume should be made to fit whatever area it inhabits. You should have the pivot of the volume in the center near the floor and it should not be inside an object or near one. It should be okay to place the pivot offset from the center if there is an object in the way.
bDebugZombieSpawning - If true it will attempt to spawn green cylinders in the spawn volume in-game to show where specimens will spawn. If the cylinder is red that means no specimen will spawn there. Ideally you want at least 6 green cylinders so a full squad of specimens can spawn together. If you are not seeing any cylinders after setting this to true then no specimens will spawn you will need to make sure the pivot of the volume is at the center towards the bottom and is not in inside or too close to an object. Because this is a debug variable, you should make sure that all volumes in your map has this set false, before you distribute your work.
bNoZAxisDistPenalty - This determines if the ZombieVolume should be weighted for spawning specimens based on its z axis location. This should be set to true if you have a map where specimen spawns are on one level but at different heights such as on an outdoor level with gentle rolling hills.
CanRespawnTime - This value sets the minimum time between spawns on your ZombieVolume. For example, if you set this value to 6, your volume could only potentially spawn a squad of specimens once every six seconds.
TouchDisableTime - When a player comes in contact with a ZombieVolume, he disables it temporarily. This is done so that specimens don't spawn in the immediate area a player is defending. This value simply determines how long a volume should remain disabled for once a player has touched it, before it is able to resume spawning enemies.
OnlyAllowedZeds - This is an array for spawning specific specimens only. By default, the array is empty and each ZombieVolume can spawn any kind of enemy, as determined by the server settings and wave configuration. But let's say you wanted a certain area where only Stalkers spawned. You could add an array entry and select ZombieStalker from the dropdown list. You have now created a Stalkers-only spawning area.
MinDistanceToPlayer - This is a very important value and probably the one you will want to adjust carefully for each of your volumes. It determines how far, in units, players must be from your volume, before it is allowed to spawn any specimens. The default value is 600, which means that specimens can spawn around corners or moderately close to a player's location. In special cases however, such as a hidden air duct above players' heads where you want to spawn specimens, you should set this to a value of "1", and otherwise players who are walking underneath the duct will prevent it from spawning. In another situation, maybe you are creating a style of map where specimens spawn in the distance, and move in on players. In such a case you might set this value to something like 1500 or more.
RoomDoorsList - If you are creating a map with open/closable doors, this is a variable you should consider. In a few cases, you will have a room or area that is completely contained when the doors are shut and welded. It really wouldn't make sense to have specimens spawning inside of this area with you, when it has been barricaded. So to prevent this, you can add entries to this array, for each perimeter door of the containable area. When a door is added to the array, its parent Volume will not spawn enemies while that door is closed or welded. If bOnlyWhenWelded is true then no specimens will spawn inside only if the door is welded. A final caveat: Do not go overboard adding doors to this array! If you associate every door in the map with a volume's door list, it will make it difficult to spawn specimens near the player.
KFZombieZoneVolume - This volume is used to block only players. Specimens will be able to walk through it. It is recommended to place this near one way barricades that specimens can climb/walk out of.
Usable doors are movers called KFDoorMover. These are movers that act normal but that can be opened outward from either direction. They have three key frames. The 0 key frame is set to a closed position and 1 and 2 are set to a open position for both directions.
There needs to be a corresponding trigger for opening the door called KFUseTrigger. It's event needs to the same name as the door's tag. For example: Door1. This links the door and the trigger together. The KFUseTrigger needs to be placed in the center of door with it's arrow pointing the same direction as the 2nd key frame. In the trigger's properties under KFUseTrigger, "bDirectionalOpen" needs to be set to True.
WaveSpawnPeriod - This is the rate at which new squads of specimens spawn after one squad dies. Small changes in this number can make a significant difference in the difficulty and intensity of gameplay on a level. A general rule is that smaller levels should have lower times and large maps have shorter time length.
Ammo/item pickups should be evenly spread out within he level so they don't spawn in clusters. The ammo/item pickups are spawned randomly throughout the level based on percentages determined by the difficulty setting. Most official Killing Floor levels have 14 ammo and item pickups.
Item pickups have chance to spawn based on the difficulty:
Ammo pickups have chance to spawn based on the difficulty:
A KFMusicTrigger will control the music being played during combat and during the trader downtime. Within the actor's properties there is a section called KFMusicTrigger and another section called WaveBasedSongs. This is an array of songs that you can add. CalmSong is the song played when the trader is active and CombatSong is the song played with fighting specimens. Each time you add a set of songs it will associate with a wave number. List 0 is wave 1 and list number 9 is wave 10. It is recommended that you make 10 sets of songs to support KF's Long setting.
Under MusicTrigger in the KFMusicTrigger properties there is a field called Song. There field is for specifying the song played when fighting the Patriarch.
Killing Floor has a fairly distinct grungy look, and if you are planning to create a map which honors that, there are a few things you can do to keep your work consistent.
Textures - Many of Killing Floor's environmental textures have been created to look as though they have a bump map effect, even though this rendering technique is not actually possible in the KF engine. There are a few different ways to achieve this, but one method that is very simple and effective is to create an emboss filtered grayscale copy of your base texture, and overlay it on top of itself, before saving. If the result looks too severe, try lowering the opacity or blurring the embossed copy to make it look more natural.
In general, the KF textures are high contrast and each one uses one or more detail layers to suggest added grit/grime. If you are working in Photoshop, try adding soft light or overlay blended textures on top of your base texture to experiment. This can also be done in UE by adding high contrast detail texture to your material.
Finally, Killing Floor makes use of some complex shaders to simulate things like bump mapping and normal mapping. While I won't bring up the specific techniques in this document, if you are interested in how to recreate some of these effects for your own map try looking in the following packages for examples.
"Normal map" - KF_Specimens_Trip_T.clot_cmb
"Bump map" - "KillingFloorManorTextures.Statics.BumpSpecRockShader"
Color Correction - A feature distinct to Killing Floor is per-zone color correction overlays which have the power to tint the player's world a certain color, (typically as a mood enhancer). This effect is determined by the color of the fog with a ZoneInfo. Within a ZoneInfo's properties under ZoneLight you can set bNoKFColorCorrection to false if this effect is unwanted. In most cases if your level appears too dark in-game but looks correct in the editor, it's because the fog color is too dark and is causing the overlay to darken the player's view.