Killing Floor

Killing Floor

Not enough ratings
Special Zed Events in ScrN Balance
By [ScrN]PooSH
This guide explains creating, customizing, and running special zeds events in ScrN Balance. Circus, Halloween, Xmas zeds - choose one or mix all together; define per-map events (e.g., Circus zeds on Abusement Park or Xmas zeds on Ice Cave); define events for custom zeds (e.g., Old Halloween); run server-wide events or allow users to vote for their favorite zeds via map voting menu.
   
Award
Favorite
Favorited
Unfavorite
Requirements
You need the latest version of ScrN Brutal KF Bundle, particularly ScrN Balance + Zed Pack (both are included in the bundle). Note that some features described in this guide were added in ScrN Balance v9.69.16, so those are unavailable in the previous versions. Make sure to update to the latest available version.

The guide assumes bScrnWaves=true in ScrnBalanceSrv.ini (enabled by default).

Also, having a feature-rich text editor for editing config (.ini) files like Notepad++ is recommended. vim+grep+sed is an option too :)
Just a Number to Filter Zeds
A so-called "Special Zed Event" in ScrN Balance is just a number to filter available zeds. Note the EventNumber=3 in the Xmas zeds definition (ScrnZeds.ini):
[XmasZeds ScrnZedInfo] EventNum=3 Zeds=(Alias="CL",ZedClass="ScrnZedPack.ClotX") Zeds=(Alias="BL",ZedClass="ScrnZedPack.BloatX") Zeds=(Alias="GF",ZedClass="ScrnZedPack.GorefastX") Zeds=(Alias="CR",ZedClass="ScrnZedPack.CrawlerX") Zeds=(Alias="ST",ZedClass="ScrnZedPack.StalkerX") Zeds=(Alias="SI",ZedClass="ScrnZedPack.SirenX") Zeds=(Alias="HU",ZedClass="ScrnZedPack.HuskX") Zeds=(Alias="SC",ZedClass="ScrnZedPack.ScrakeX") Zeds=(Alias="FP",ZedClass="ScrnZedPack.FleshpoundX") Zeds=(Alias="PAT",ZedClass="ScrnZedPack.BossX") Zeds=(Alias="BOSS",ZedClass="ScrnZedPack.HardPatX")

It means that if the server is running Zed Event #3, the XmasZeds are selected. However, nobody prevents from changing the event number or zed lists that are assigned to the given number. Multiple zed lists can be assigned to the same number. For example, the next example spawns a mix of Xmas+Circus zeds in Zed Event #100:
[XmasZedsMix ScrnZedInfo] EventNum=100 Zeds=(Alias="CL",ZedClass="ScrnZedPack.ClotX") Zeds=(Alias="BL",ZedClass="ScrnZedPack.BloatX") Zeds=(Alias="GF",ZedClass="ScrnZedPack.GorefastX") Zeds=(Alias="CR",ZedClass="ScrnZedPack.CrawlerX") Zeds=(Alias="ST",ZedClass="ScrnZedPack.StalkerX") Zeds=(Alias="SI",ZedClass="ScrnZedPack.SirenX") Zeds=(Alias="HU",ZedClass="ScrnZedPack.HuskX") Zeds=(Alias="SC",ZedClass="ScrnZedPack.ScrakeX") Zeds=(Alias="FP",ZedClass="ScrnZedPack.FleshpoundX") Zeds=(Alias="PAT",ZedClass="ScrnZedPack.BossX") Zeds=(Alias="BOSS",ZedClass="ScrnZedPack.HardPatX") [CircusZedsMix ScrnZedInfo] EventNum=100 Zeds=(Alias="CL",ZedClass="ScrnZedPack.ClotC") Zeds=(Alias="BL",ZedClass="ScrnZedPack.BloatC") Zeds=(Alias="GF",ZedClass="ScrnZedPack.GorefastC") Zeds=(Alias="CR",ZedClass="ScrnZedPack.CrawlerC") Zeds=(Alias="ST",ZedClass="ScrnZedPack.StalkerC") Zeds=(Alias="SI",ZedClass="ScrnZedPack.SirenC") Zeds=(Alias="HU",ZedClass="ScrnZedPack.HuskC") Zeds=(Alias="SC",ZedClass="ScrnZedPack.ScrakeC") Zeds=(Alias="FP",ZedClass="ScrnZedPack.FleshpoundC") Zeds=(Alias="PAT",ZedClass="ScrnZedPack.BossC") Zeds=(Alias="BOSS",ZedClass="ScrnZedPack.HardPatC")

0 = No Event
  • If the server runs Zed Event #0 (default), it means no event, and all zeds are spawning, regardless of their EventNum value.
  • If a zed list has EventNum=0 (default), those zeds are always spawning, regardless of the Zed Event number.
  • To spawn only the Standard (Classic) Zeds, run the Zed Event #4.
Global (Seasonal, Server-wide) Zed Events
To run a Zed Event globally on the entire server, set EventNum in ScrnBalanceSrv.ini. ScrN Balance has five built-in events + the special value (254) for the random selection.
EventNum
Description
1
Summer (Circus) zeds
2
Halloween zeds
3
Xmas zeds
4
Standard (Classic) zeds
5
Grittier zeds
254
Random zed event. Randomly selects 1-5 before loading a map

Command Line Option
Alternatively, you can add "?ZedEvent=X" option to the server startup command line or KFMapVote.ini. The following command starts the server and runs Xmas zed event without changing ScrnBalanceSrv.ini:
KF-BioticsLab.rom?Game=ScrnBalanceSrv.GT?GameLength=0?ZedEvent=3
Per-Map Zed Events
ScrN Balance allows running map-specific events. For example, use Circus zeds on Abusement Park and Hell Ride, Xmas zeds on ESL and Ice Cave, etc. Such behavior is defined in ScrnMapInfo.ini:
[KF-AbusementPark ScrnMapInfo] ZedEventNum=1

Per-map events are used only if there is no global event running. For instance, if the server is running Xmas Event, Xmas zeds will spawn on Abusement Park despite the "ZedEventNum=1" set in ScrnMapInfo.

Map-Specific Zed Events
ZedEventNum
Event Name
Maps
1
Circus/Summer Zeds
  • KF-AbusementPark
  • KF-Hellride
  • KF-Steamland
2
Halloween Zeds (new)
  • KF-Clandestine
  • KF-Clandestine-SE
  • KF-FrightYard
  • KF-HillbillyHorror
3
Xmas Zeds
  • KF-EvilSantasLair
  • KF-IceCave
  • KF-ThrillsChills
4
Standard/Classic/Normal Zeds
  • KF-BioticsLab
  • KF-Farm
  • KF-Manor
  • KF-Offices
  • KF-WestLondon
You can modify ScrnMapInfo.ini to add/change Zed Events for any standard or custom map.
Per-Game Zed Events
The first thing you will probably notice after trying to set up a Zed Event is that only a few game modes (a.k.a. "lengths") support zed event. By default, a game mode does NOT support zed events. You have to set bAllowZedEvents=true in ScrnGames.ini to enable them. However, it is not that simple. Let's take XCM as an example (ScrnGames.ini):
# XCM - eXpert Challenge Mode [7 ScrnGameLength] ... Zeds=ClassicZeds
Even if we set "bAllowZedEvents=true" for XCM, it will change nothing because XCM uses only ClassicZeds, and those do not have the EventNum assigned (ScrnZeds.ini):
[ClassicZeds ScrnZedInfo] Zeds=(Alias="CL",ZedClass="ScrnZedPack.Clot") Zeds=(Alias="BL",ZedClass="ScrnZedPack.Bloat") ...
Let's add event zeds to make XCM and enable zed event support:
[7 ScrnGameLength] ... bAllowZedEvents=true Zeds=NormalZeds Zeds=CircusZeds Zeds=HalloweenZeds Zeds=XmasZeds Zeds=GrittierZeds
Now, we made XCM support zed events. However, there is one problem: if the server does not run any zed event, XCM will spawn all kinds of zeds mixed, which is not always desirable.

FallbackZedEvent
Introduced in ScrN Balance v9.69.16, FallbackZedEvent allows setting zed event for the given game mode if neither the server nor the map set it. The above XCM example spawns all kinds of zeds together if no zed event is set. Adding "FallbackZedEvent=4" selects normal zeds for non-event games. Or set "FallbackZedEvent=254" to randomly choose a zed event for every playthrough.

ForceZedEvent
Sometimes, you may want to force the zed event for a particular mode only, and ForceZedEvent helps you there. For example, you want XCM to choose randomly between Normal and Grittier zeds, ignoring the other events:
[7 ScrnGameLength] ... bAllowZedEvents=true ForceZedEvent=254 Zeds=NormalZeds Zeds=GrittierZeds
Using ForceZedEvent with other values than 254 rarely makes sense, as in most cases, you can simply keep the default "bAllowZedEvents=false".


Zed Event Selection Priority
There are many different options to set Zed Event in ScrN Balance. Below is the priority list (from highest to lowest) for Zed Event selection:
  1. ScrnGameLength.bAllowZedEvents. If false, zed events are disabled; end of story. Otherwise:
  2. ScrnGameLength.ForceZedEvent if set (>0)
  3. ?ZedEvent=X if (X > 0)
  4. ScrnBalance.EventNum if set (>0) and ScrnBalance.bForceEvent=true
  5. ScrnMapInfo.ZedEventNum if set (>0) and ScrnBalance.bForceEvent=true
  6. ScrnGameLength.FallbackZedEvent
Game Example: XCM with Event Zeds
For example, let's add Zed Event support to XCM. The stock XCM mode always runs with standard zeds - zed events are disabled for this game mode. To change that, we need to:
  1. Enable bAllowZedEvents.
  2. Add event zeds definitions (CircusZeds, XmasZeds, etc.).
  3. Assuming that we don't want to mix event zeds for XCM, define FallbackZedEvent.

ScrnUserGames.ini
The laziest solution is simply to modify the official game - "[7 ScrnGameLength]" in ScrnGames.ini. However, when ScrN Balance updates come in, you risk accidentally replacing your changes with the update or running the outdated version of the game. A better way is to copy the game into a new one, e.g., "[107 ScrnGameLength]".

ScrN Balance v9.69.16 introduced even a better option: by setting bUserGames=true in ScrnBalanceSrv.ini, user-defined games (GameLength value between 100 and 199) are loaded from a different file - ScrnUserGames.ini, with additional options to use ScrnUserZeds.ini and/or ScrnUserWaves.ini instead of their non-user counterparts.

Using ScrnUser*.ini files eliminates the chance of your modifications getting replaced by ScrN updates.

So that's what we are going to do: set bUserGames=true in ScrnBalanceSrv.ini, and copy "[7 ScrnGameLength]" object from ScrnGames.ini into "[107 ScrnUserGameLength]" object in ScrnUserGames.ini. Note that the object type (class name) has changed to include "User" too: ScrnGameLength => ScrnUserGameLength.

The Final Result
Below is the ScrnUserGames.ini file containing the modified version of XCM to support Zed Events. Since we don't need to modify waves or zeds, we leave bUserWaves=false and bUserZeds=false, so the game keep loading the default versions from ScrnWaves.ini and ScrnZeds.ini respectively.
# Pay attention to "User" in ScrnUserGameLength! [107 ScrnUserGameLength] GameVersion=100 GameTitle=XCM Mod Author=The User BountyScale=1.00 bRandomTrader=false TraderSpeedBoost=-1 LaterWavePct=70 LaterWaveSpawnCooldown=1.0 MinDifficulty=7 bForceTourney=true TourneyFlags=5 SuicideTime=180 SuicideTimePerWave=150 SuicideTimePerPlayerMult=0.2 HardcoreLevel=(HL=1) HardcoreLevel=(Difficulty=7,HL=25) HardcoreLevel=(Difficulty=8,HL=30) NWaves=0 OTWaves=0 SDWaves=10 bUserWaves=false Waves=XCM1 Waves=XCM2 Waves=XCM3 Waves=XCM4 Waves=XCM5 Waves=XCM6 Waves=XCM7 Waves=XCM8 Waves=XCM9 Waves=XCM10 Waves=XCMBoss ######################################## # Below are the changes for Zed Event Support ######################################## bAllowZedEvents=true # use Grittier Zeds if no Zed Event is running FallbackZedEvent=5 bUserZeds=false Zeds=NormalZeds Zeds=CircusZeds Zeds=HalloweenZeds Zeds=XmasZeds Zeds=GrittierZeds
Custom Event Example
You are not limited to built-in zed events in ScrN Balance. You can make your own events: mixing different types of zeds, adding custom zeds, etc. To demonstrate the process, let's create super intolerant (by modern standards) sexist events: male-only and female-only zed events.

ScrnUserZeds.ini
Following good practice, we make our zed modifications in ScrnUserZeds.ini instead of ScrnZeds.ini. Pay attention to the object type: ScrnUserZedInfo.
[MaleZeds ScrnUserZedInfo] EventNum=100 Zeds=(Alias="CL",ZedClass="ScrnZedPack.Clot") Zeds=(Alias="BL",ZedClass="ScrnZedPack.Bloat") Zeds=(Alias="GF",ZedClass="ScrnZedPack.Gorefast") Zeds=(Alias="CR",ZedClass="ScrnZedPack.CrawlerH") Zeds=(Alias="ST",ZedClass="ScrnZedPack.GorefastH") Zeds=(Alias="SI",ZedClass="ScrnZedPack.BloatC") Zeds=(Alias="HU",ZedClass="ScrnZedPack.HuskH") Zeds=(Alias="SC",ZedClass="ScrnZedPack.Scrake") Zeds=(Alias="FP",ZedClass="ScrnZedPack.Fleshpound") [FemaleZeds ScrnUserZedInfo] EventNum=101 Zeds=(Alias="CL",ZedClass="ScrnZedPack.StalkerX") Zeds=(Alias="BL",ZedClass="ScrnZedPack.BloatH") Zeds=(Alias="GF",ZedClass="ScrnZedPack.Ghost") Zeds=(Alias="CR",ZedClass="ScrnZedPack.CrawlerC") Zeds=(Alias="ST",ZedClass="ScrnZedPack.Stalker") Zeds=(Alias="SI",ZedClass="ScrnZedPack.Siren") Zeds=(Alias="HU",ZedClass="ScrnZedPack.SirenX") Zeds=(Alias="SC",ZedClass="ScrnZedPack.FemaleFP") Zeds=(Alias="FP",ZedClass="ScrnZedPack.FemaleFP_MKII")
Since there is no female boss character, we keep our game without the end-game boss.
Like game lengths, user-defined zed events numbers should be between 100 and 199.

ScrnUserGames.ini
Setting bUserGames=true in ScrnBalanceSrv.ini and keeping GameLength number between 100 and 199 allows us to use ScrnUserGames.ini instead of ScrnGames.ini and not worrying about accidental overwritting our modifications with the future updates.

# Medium Game (no boss) with gender-specific zeds [100 ScrnUserGameLength] GameTitle=♥♥♥♥ Author=The User # Keep the default waves from ScrnWaves.ini bUserWaves=false Waves=Wave1 Waves=Wave3 Waves=Wave4 Waves=Wave6 Waves=Wave7 Waves=Wave9 Waves=Wave10 # Load user-defined zeds from ScrnUserZeds.ini bUserZeds=true bAllowZedEvents=true # If Zed Event is not set, pick randomly between male and female FallbackZedEvent=254 Zeds=MaleZeds Zeds=FemaleZeds
Since we don't allow mixing males with females, set FallbackZedEvent=254 to randomly select one of the available events (100, 101) if no zed event is set.

KFMapVote.ini
The final step is to add new game modes to the map voting menu. We use the same game length (100) but select between male/female/random zeds via custom zed events (100/101/254 respectively).
GameConfig=(GameClass="ScrnBalanceSrv.GT",Prefix="KF-",Acronym="Male",GameName="Sausage Party",Mutators=,Options="GameLength=100?ZedEvent=100") GameConfig=(GameClass="ScrnBalanceSrv.GT",Prefix="KF-",Acronym="Female",GameName="Girl Power",Mutators=,Options="GameLength=100?ZedEvent=101") GameConfig=(GameClass="ScrnBalanceSrv.GT",Prefix="KF-",Acronym="♥♥♥♥",GameName="HomoRandomus",Mutators=,Options="GameLength=100?ZedEvent=254")