Viscera Cleanup Detail

Viscera Cleanup Detail

150 ratings
Level Creation Guide
By BlackEagle
Official Guide to Viscera Cleanup Detail Level creation, covering all the major VCD elements, but NOT Unreal Engine 3 level creation topics.

Learn how to place machines, blood, debris, viscera, and how to use the evil developer tools for covering levels with BLOOOOOD!
2
3
   
Award
Favorite
Favorited
Unfavorite
Preface
When it comes to creating a level for VCD, some basic Unreal Development Kit / Unreal Engine 3 level editing skills are required.
I'll not be going into that side of things, there is a wealth of information and tutorials available on the subject: UDN-LevelEditingHome[udn.epicgames.com]

So please, if you get lost and don't know how the editor works or what everything is, then be sure to read the Unreal Engine tutorials FIRST, then come back to this guide and put your knowledge to the test. Making levels is not always simple, and there are oh so many different things you can do with the editor, so I'll not be exploring anything other than what VCD levels require beyond normal Unreal Engine level creation skills.

If you need a leg up, we even have some Community Created video tutorials for starting out, so take a look at those if the contents of this guide are insufficient or too far ahead.

However, should there be something you need to know and it's not in this guide OR other tutorials, then please post your queries in the Community Content sub-forum. Otherwise, let me know in the comments below if I should elaborate further on certain sections.

Right then. I will assume you know enough about level editing to do what needs to be done, so lets get started!

Just note: Make sure the file name of your level has no spaces or "white space" in it, this would be bad and could cause some strange issues.

Ok, lets say you have a level idea and know how to make a level using the UDK editor, now where is everything, what makes a Viscera Cleanup Detail level different?
Lets start with the most important part, Viscera Cleanup Detail Content packages!
Finding the Content Packages
You can find all the Viscera Cleanup Detail content in the Content Browser under the Viscera folder.





You'll see a large window with squares in the lower right half, and a large folder-structure styled list on the left(Packages).





The Package list on the left will allow you to browse the various folders and content packages where everything is stored. Once you've selected a package, you'll see all its contents in the large window on the right, each item represented in a square.

You'll find all of Viscera Cleanup Detail's level content under the Viscera -> Environments folder.
Be sure to right-click on a package and select "Fully Load", before you start browsing its contents.

Once you've build your level layout using Viscera Cleanup content, added lighting, sounds and whatever else you want, it's time to start placing the actors specific to Viscera Cleanup Detail.
These include all the machines, tools, trash, viscera, blood, consoles, doors, etc. Basically anything you can interact with.

Before we do that however, lets go over the basics so you know how to build your level.
Back to the Fut...Basics!
Selecting Things

You can simply select things by left-clicking on them with the mouse.
To select multiple actors, hold down the Ctrl key when you click.

Easy!

Placing Things

Having found some of VCD's content packages and all the Static Meshes, you can now place some things.

Select any StaticMesh object in the Content Browser, then in the main editor window right-click on any world surface(or open air) and select the "Add StaticMesh: ...." option near the bottom.

Once you've placed something, you can select it and then hit Ctrl+W to duplicate it, this is especially useful for building the structure of your level, makes things much easier.

Additionally you can copy and paste (Ctrl+C to copy), and then find a desired area to paste; right-clicking on a nearby surface and selecting the "Paste Here" option near the top of the dialog to place it.

Moving Things

Movement is pretty easy, select an actor and a small "widget" will appear with 3 colored arrows.
They all point along a different axis and thus control movement in that direction.

You can also move actors by holding the Ctrl key and either the left or right mouse buttons.
This will allow you to move things without the widget. You can hold both left and right mouse buttons to control the Z(Vertical) axis.


Rotating Things

To rotate actors, it's much the same, but you need to be in "Rotation Mode" to do it.
Look at the top toolbar, moving from left to right, look for a cross shape with 4 arrows pointing outward. That is the "Translation Mode" icon, which controls the actors position as you have just been doing. Next to it is the "Rotation Mode" icon, click this and then you can control the rotation. You can also use the Ctrl and mouse keys to control this mode, as with Translation.

You can switch back to the Translation Mode by clicking on its icon when you're done with rotation.

Scaling Things

To scale objects, it's also very similar. You can use the two "Scaling Modes" next to "Translation Mode" and "Rotation Mode", but there is a better way when it comes to scaling.

Select an actor and then observe the bottom toolbar of the editor. On the right side you'll observe several numeric edit-boxes, they'll probably all say "1.0000". You can change these to manipulate the size of objects.

The first one controls the symmetrical scale and will be the one you most likely use, the next 3 are for each axis. X, Y, and Z.


Be aware that scaling in this manner has no effect on the radius of light actors, you have to actually open its properties window to do that. Which brings us to our next bit of info.

Changing the Grid Snap

You've probably noticed when moving Static Mesh actors that they seem to "snap" when you move them, sometimes you can't get them as close to something as you want because they keep snapping too far beyond it.
This is because of the Grid Snap setting being too high for your needs.
Look at the bottom toolbar of the editor, on the very right side is several small icons and check-boxes. One for "Auto Save", and then 3 for snapping. The one closest to the right is for scaling, then next along is rotation, then finally the last one is translation. It'll probably be set to 16 right now, so go ahead and click on the little downward-pointing arrow next to its check-box. A small list of possible snapping sizes will appear, choose what seems most appropriate.
The smaller the number, the smaller the snapping.

Changing the Properties of Actors

Every actors has a whole bunch of properties you can change, these could have just about any effect on them. To open the properties window, press the F4 key.

You'll notice several dark header lines. Each one is a specific properties category.
Most often though, the category with the same name as the actor's class is usually where you'll change things, ie: Static Meshes have a "Static Mesh Actor" section.

You can click on these sections to expand them and see the properties beneath. You'll probably also find lines now with little black arrows at the beginning of them, this means you can expand the line further to see yet more properties. You may even find some more of those dark header lines under there too.

There'll be a whole bunch of actors that have properties like this, such as lights for example.

Lighting

Adding lighting is pretty easy, but harder to master.

The simplest light type is the "Point Light". This one can easily be placed by rick-clicking on any world surface and selecting the "Add Actor -> Add Light (Point)" option near the bottom.

If you open up the properties of the light, you'll be able to find everything you need under its various property sections. Most of the time you'll only ever change Radius, Brightness, and Color.

You can find more advanced types of lights under the Actor Classes Browser.
You'll find this by opening the "Content Browser" and clicking the "Actor Classes" tab at the top of its window.
Here you'll find a whole list of actor types arranged into neat categories. The one you'll obviously want is the "Lights" category. There you will find several sub-types of light, with slight variations of each.

PointLights: are the ones you just added; light emitted outward from a single point.

SpotLights: are like point lights, but they only emit a cone of light in a single direction.

SkyLights: are a kind of "ambient lighting", they will not emit light from anywhere, but will instead give a tint to your entire scene. These aren't used much because they tend to reduce the impact of dark areas. When they are used, they are very faint, only enough to give a small bit of color to the entire level. Additionally, all other lights will be computed with "bounce lighting" which will cause light to bounce off bright surfaces and find their way into dark areas anyway.
So it's often hard enough to get pitch-black areas even without SkyLights.

DirectionalLights: are a bit different. Instead of emitting light from one point, directional lights emit light everywhere, but in a given direction. This is what one would call a "Sun-Light", because that's what it looks like.
Your entire level will seem to be be lit from some distant star in the sky.
These lights have been used in Unearthly Excavation, Unrefinery, and Athena's Wrath to give it sun light. So if you're making and outside level, or a level that uses some sort of global light source, then a Directional Light is what you need.
Back to the Fut...Basics 2!
Paths (Player Starts)

Viscera Cleanup Detail does not have any AI. So paths are not needed, but the editor will still complain about them, and you do however need one type of path.

Every level needs at least one "Player Start", these decide where your player will appear in the level when it loads. By adding several in the same area, you'll not only have variance, but space enough for multiplayer, so players can spawn away from each other and not get stuck.

To place a Player Start, right-click on any world surface and select the "Add Actor -> Add PlayerStart" option near the bottom.

Compiling

At this point you've probably got "Lighting Needs to be Rebuilt" and or "Paths Needs to be Rebuilt" messages.

This is because your level needs "Compiling". A process which takes your lighting and paths and computes it into an optimized and processed state so that it can be viewed and used.

Most of the time you can operate without compiling the level, if you've done it at least once, or don't need to test-run the level, but sure enough you will eventually have to.

To actually compile the level, look on the top toolbar(near the middle-right of it) for a small icon with both a box AND a light-bulb on it. Its tool-tip says "Build All". Click that one to compile your level.

Ok, that should be it for now, time to venture onward to the heart of things!
Good Level Creation Practices
There are a few important rules you can stick to in order to simplify and improve your levels and their creation process.

Structure

  • Do not rely too heavily on solely BSP or Static Meshes for every job. Either use a mixture of both for different uses, or stick with Static Meshes in simple arrangements to begin with, like in Section 8 or Evil Science.
    We used little to no BSP in many of our official levels, Static Meshes are easier to use, look better, come in pre-defined even sizes, and generally allow much more versatility. BSP can cumbersome and often not worth it when you can get the job done with an existing Static mesh. Particularly so when you have a library of Static Mesh content to work with, which VCD does.
    However, we did certainly make use of BSP in a number of cases where we really didn't need something complex, but did need unique one off sections of geometry that no Static Mesh would work for. You can see examples of this in Athena's Wrath, Uprinsing and Overgrowth.
    BSP is particularly useful for large and simple surfaces and structures where, if you used existing Static Meshes, you would have to repeat them multiple times or scale them to the point where they begin to look ugly and out of place.
    Experiment!

  • Avoid large cavernous areas
    If there is one thing that is sure to seem boring and repetitive, it's a wide open area with nothing in it. Avoid making areas that are either too large to be easily filled, or too open to allow fine details and small objects. The larger an area is, the harder it will be to avoid it looking repeated or empty, so try and keep things tighter, but not so tight that the player has difficulty getting around, the Janitor Office is an example of a cramped space.

    It's generally better to have more passages than rooms, or at least an equal measure of each.

  • Avoid rooms without passages
    It's worth saying twice, try to keep rooms separated by some stretch of closer, tighter passage areas. Try and keep a healthy balance of both.

Lighting

  • Avoid ambient lighting
    In general, Viscera Cleanup Detail levels are dark, this not only forms part of the gameplay, but also makes everything look sharper and accentuates colored lighting.
    The dirtier and less advanced your level's theme is meant to employ, the less large bright lights you should use. Leave dark areas in levels that are thematically abandoned or rarely visited
    (ie: Waste Disposal). Keep bright lights for cleaner, more high-tech and less abandoned levels.

  • Avoid overuse of colored lights
    Colored lights are nice and certainly essential, but too many different colors or too much saturation in the light can be bad.
    Establish a single base color tone for your level, White(Evil Science), Green(Hydroponic Hell), Blue(Cryogenesis), Red/Orange(Unearthly Excavation). By this I mean give the level colored lights of a single color to establish the background, these will be the largest lights.

    Make sure that whatever color you choose is the main color of the level, the most common color, the background color.
    Then, any colored lights you add beyond that which are not of the base color should be small, and generally used to enhance the level or highlight certain areas, never make a light so strong that it overrides the background color too often, otherwise your level will cease to look as if it has a base color palette.

    Whenever possible, make sure your lights have at least some white in them, lights generally look better if they enhance the background color without replacing it entirely, keep more colored lights for darker areas where they won't conflict with the base tone.

Post FX

A slightly more advanced topic, but well worth noting.

  • Post Processing, is a handy tool for improving the general look of a level.

    Post processing in the UDK is usually employed via either the level properties, or as a volume you can add to the level. Several official VCD levels have a Post Process Volume in them.
    With the volume, you can add depth of field effects, change lighting and color tones, and generally spruce up the appearance of a level if used wisely.

    The important thing to remember about post processing is to not go overboard, keep the changes subtle.

  • Color Grading
    Of course, some of the most substantial changes to the look of official levels comes from something called Color Grading, it's a little more advanced. But the look of a certain official VCD level that uses it can easily be copied to yours. Well worth looking into if you're feeling adventurous.

  • Distance Fog
    Fog is quite a useful bugger, not only can it make levels seem cloudier and more alive, but it can also be used to mimic darkness at a distance. If used wisely and kept subtle, it can mean the different between a flat scene and one that comes alive.

And that's that! Do try and keep these tips in mind when you go about creating your level.
Machines of Mayhem
First up, you'll probably want to place the machines. Hold off on adding any viscera, splats or game objects for now.

Open the Content Browser and select the "Actor Classes" tab at the top. You'll see a long list of expandable items, expand the "Viscera" category and you'll find all of VCD's specific classes.
You'll also need many of the main Unreal Engine classes such as Lights and Sounds.




What-A-Load of work

Ok, select the VCBinDispensor class under the "Viscera" category. Now in the main editor window, place the actor. Be sure to find a good spot for it, somewhere out of the way but also easily accessible. You can place it by right-clicking on any world surface and selecting the "Add VCBinDispensor Here" option near the bottom.














If you're feeling adventurous, you can place some small lights to light up the signs on the dispenser itself, this just makes the machine seem more alive, especially if it's placed in a dark area.





Slosh-O-Matriculation

Right, next up is the Slosh-O-Matic. In the class browser, select the VCBucketDispensor class just as you did with the Bin Dispensor. Now place it in the level somewhere similarly appropriate. Give it a small red light near its button panels if you feel like it needs it.



You can take this opportunity to place a bucket/bin near the machines if you want, this helps to further give the machines a sense of companionship, they get lonely without their children.












Supplementary Machinations

If you wish, go ahead and place the VCSupplyMachine in the same manner.




You could also place some VCMedpackBox_Content actors around the level on walls and such.
Just be aware with these; sometimes on certain walls, although they might look like they are positioned nicely, the collision of the wall could cause the actual med-packs you pickup to be unable to reach the med-box. If you notice that you just can't get the med-packs close enough to the box, then try moving the box off the wall a bit until it fits right. You can cover up the gap between the box and wall with some other small Static Mesh, like a scaled down pillar(as seen in VC_Cryo).
Incinerator & Punch-O-Matic
Alrighty then, we've got a bucket and bin machine. Now for the next few machines, these are slightly more complicated, so the easiest way to get them in your level is to copy them from one of the official levels.

Foraging Tools

Go ahead and save your level, then open up VC_Caduceus. Find the Incinerator in the level and make sure to select all 3 of the actors shown below, the Light, the Incinerator and the Trigger Volume(Green Lines). You can select multiple objects by holding down Ctrl when you click on them. Once selected, copy the actors (Ctrl+C).

Now open up your level again. Find a good space for the incinerator, right click on the floor of your chosen area, then select "Paste Here" in the window that appears. Move the incinerator around until it fits right.



Incinerator Roasting Event/Fundraiser

Ok, now for the real funk. Make sure just the Incinerator's Trigger volume is selected(Green Lines), then open up the "Unreal Kismet" window, small green "K" at the top(Next to the Content Browser Icon).



Once the Kismet window is open, right click in the large open space and navigate to the bottom where it says "New Event Using TriggerVolume_* -> Touch".




A Touch Event linked to the Incinerator's Trigger Volume should now be placed, select it.
On the bottom left is a list of properties for the Touch Event, make sure to expand the "Touch Types" category. Click on the "Add a new item" button next to the "Class Proximity Types" setting. There should now be a drop-down box under the setting, click that and select the 'VCDebris' class.









Ok next, expand the "Sequence Event" category in the same Properties window, then ensure that the values are set as shown in the following image.










A Link in the Chain of Sanitation

Next, right-click in the large open space again, to the right of the "Touch Event", navigate to "New Action -> Viscera -> Incinerator". Now find the incinerator actor in your level and select it, then go back to the Kismet window.

You'll notice two small magenta coloured squares on the Incinerator kismet action you just placed, right-click on the left(Incinerator) square then select "New Object Var Using VCIncinerator_*"

Do something similar with the "Touch Event", right-click on its small magenta coloured arrow, then select "Create New Object Variable". Once placed, click and drag a line from the small magenta(Object) square on the right side of the "Incinerator Action" to the Object variable you just created for the "Touch Event".


You should now see two lines leading to the same object, one from the incinerator action's "Object" Input and one from the Touch Event's "Instigator" output.
Last but not least, we need to link up the Touch Event and the Incinerator Action, drag a line between the Touch Event's "Touched" output and the Incinerator Action's "Add Object" input.
Do the same with the "UnTouched" and "Remove Object" connectors.


That's it, the Incinerator should now be fully functional! If all went well, you should have something which looks like this.


















Punch-O-Matic

Finally, one last machine; The Punch-o-Matic!

With this one, you're probably best off copying it from an official level as well. It's as simple as the bin and bucket machines, but looks better if you have the correct lights with it.


So go ahead and open up the VC_Caduceus level again, find the Punchout machine and copy the machine and its 2 accompanying lights.

Open up your level and then paste the little fiend and its lights somewhere suitable. All done!
Blood & Guts, the meat of it all.
OK, now we're getting somewhere. We have only one thing left to do, but it's a big one!

In the old days of Viscera Cleanup Detail, we would manually place every single blood splat and debris actor in the same way you placed the machines. Needless to say, this took a long time to do!
Ever since the Evil Science level though, we've used a new method. 2 special in-game tools were created to make placing debris and splats as easy as possible.

Behold the Painter and Plopper! One is a glorified blood-soaked mop capable of 'painting' the level with blood and any other kind of splat. The other tool is a magical pair of gloves that instantly creates objects in front of you.
Both tools allow you to control all the settings needed for most splats and objects, with the majority of small values needed for splats automatically taken care of in the background.

Getting the Tools
Right, lets get to it!

The best way to use the tools is to open up your level in the editor. Once loaded, launch your level using PIE(Play in Editor), you can find the button on the far right of the editor's tool bar.



Once launched, open the console using the tilde key "~". type "GiveTools" and press enter. Now you should be able to access the tools with the #5 and #6 keys. #5 is the Painter(You'll have to press it twice), and #6 is the Plopper(Such a wonderful name).











What do you get?
Both tools feature a window with a series of large squares similar to the content browser and a settings window for adjusting some important tool related stuff.


There is a drop-down box you can use to list items of a certain category to aid in searching. Both tools also feature a bunch of buttons at the bottom.
The main one you need to know about is the "Copy" button, more on that later.





How do they work?
You control the tools using a combination of hold keys and the mouse.
Both tools have a small hints section in their window, this will tell you most of what you need to know. Each time you hold down a key, the hints will change to reflect what keys to use to control the tool.

You can also right-click on images in the window to add them to a random cycle, so when you use the tool one of several choices will be placed, making it easy to place things that require randomness, this is especially useful with blood.

Your greatest friend is experimentation, it may take time to get used to using the tools, but it's the best way.




How do you get the results into your level?
Once you've placed and painted what you wanted, click the tool's Copy button, return to the editor and then Paste the results using the editor's "Edit -> Paste" option on the toolbar at the top. Then repeat this process for the other tool if you used it and want to copy something.

NOTE: The Painter and Plopper are not linked, clicking Copy on one does not also copy the contents of the other, make sure you copy and paste with both tools if you have used them! Once pasted in the editor, you'll also want to exit PIE and relaunch it again before it's safe to use the tools once more, otherwise you'll still be copying things you've now pasted.



Blood Painting is an Art-form
One of the greatest things about blood in VCD is that it can be used to tell a story, not a very pleasant story, but a story none the less.
By carefully placing blood of the right appearance in the right manner, you can subtly suggest past events and the eventual demise of a specimen.
Be mindful of the hero or heroes approach angle, where they came from, where they were standing when they shot at something, etc. Try placing blood and especially gun shot splatters in a way that reflects the angle at which something attacked the hero and was finally slain.
Bullet holes are often placed underneath bullet/blood impact marks.

Try to keep large collections of blood for where bodies finally end up, and try to space the scenes of death, allowing you to add life to all of the level instead of just one corner.
However, there are no real rules, so use your discretion when you want to tell your story, because whatever the story is, the blood must reflect it, and vice versa.

So yeah, come up with a story before you place blood, let it guide your hand. Avoid placing blood randomly.

Another thing to remember is blood graffiti. We have not included every letter in blood yet, so often we've simply made do with the ones we do have, and carefully used the shapes of the letters to craft different letters when needed. In this way, we have been able to write almost anything.
When writing graffiti, try masking it with at least some secondary blood splats, such as drips, droplets, smudges, etc. This will make it seem more real, at least as real as someone using their last moments alive to dig around in their wounds or the wounds of others to write cryptic messages in fresh blood can get.

You can change the color of blood by selecting the 'Use Custom Splat' check box in the Painter settings window, you can then select the actual class that will be used via the drop-down list, this decides the color.
NOTE: the blood in the editor will always appear red, but in-game while painting it WILL be the correct color, so don't be concerned when you see your newly placed alien blood is red after being pasted.

Warning
When using the Painter, try not to be excessive, it's easy to place too many splats without realizing it, but once you actually play the game you'll realize there are a lot.
Too many splats can have catastrophic effects in multiplayer, causing out-of-sync issues, lag, and a whole host of issues. Try to keep the levels as far below 1000 as you can, the average is around 500 per level.
Doors & Lifts
Now onto some moving things!

This'll be a fairly extensive one, so without further ado, lets get started!

Doorway to Nowhere

I'll assume you already have a corridor of some sort that is now ready for a door.
Perhaps it looks something like this?

You can clearly see the door frames are already present and eagerly awaiting some moving parts.



The Doors...to hell!
Firstly, you'll want to open the Class Browser(Content Browser - Actor Classes Tab) and locate the VCMover class. As shown below.
Go ahead and place this actor in the middle of the door-frame, on the floor.

Ok, so it's there, but it looks wrong...is that a big flat piece of metal? Yes, it is, but don't panic, it's probably clean!

Just to be safe, lets replace it with something better. Make sure it's selected, then open the actor's properties window(F4).

Navigate to the Dynamic SMActor - Static Mesh Component - Static Mesh Component section, as shown here.





















Replace it with this static mesh(you can simply copy this and paste it, or you can search the VCD content packages for something you like): StaticMesh'env_medical_01.Meshes.Doors.S_Env_Med_Door_A_01_Left'

Voila! That looks a little more promising, if a bit lonely without its partner. So lets put it out of its misery.













Place another VCMover just as before, then edit its properties, giving it this mesh instead: StaticMesh'env_medical_01.Meshes.Doors.S_Env_Med_Door_A_01_Right'



Right, well they look happier now, but still without life... so lets hook them up with some flashy consoles!








Consoling The Doors

Ok, so they look a bit grim without consoles, but we can fix this.

Open the Class Browser again and find the VCInteractiveActor class.
Place one of those suckers on the side of the door-frame.

Uh oh? It looks like a bucket machine!? Yes, I'm afraid it does...

Rip open its properties and navigate to the VCInteractiveActor - Stat Mesh - Static Mesh Component section, then change its mesh to the console mesh(found in the 'Env_Medical_01' package): StaticMesh'env_medical_01.Meshes.Deco.S_Env_Console_A_01'
Whew, that was a close one!





Now lets duplicate that for the console on the other side of the door(assuming you want one).

They should both be in place now...however, there is one more thing to do.
The properties for the consoles are all wrong, and must be changed.


Make sure to copy them as the image shows. Do this for both consoles you just added.

Aaaand Open!

Finally, we have doors and consoles, but still nothing moves. That just won't do at all.
Lets give the doors a Soul to get them going.

Open the Class Browser and find the VCScriptedControl_DoorsA class.
Place this in the door area. You'll know you've done it right when a rather alarming looking Llama head sprite is perched in the doorway.

Select Alpaca's cousin and open his properties.
Before doing anything else, click the 'Padlock' icon at the top of the properties window.
This will lock the window so it only shows properties for that actor, no matter what else you select afterwards(unless you click the icon again, or close the window).

Now, with the Llama selected and the window locked(so it can't escape), select the two consoles you added earlier.

With both of them selected, click on the left pointing green arrow icon in the Llama's properties window, the one next to 'Panels'.

This should insert both consoles into the list.

Next, do the same with the doors.
Select both doors, then click on the green arrow next to the 'Doors' list.

Both the Consoles and Doors should now be defined correctly in the Llama's properties.


Reshaping the Doors' Personality

Your doors, although correctly hooked up and connected to the consoles, will probably not work.
This is because we've forgotten to define some important properties for the doors themselves!

Select a door, then open its properties window.
Under VCMover, you'll find an End Position property, this defines where the door will move to when it opens, this is processed as an offset from the door's starting position.


Depending on the rotation of the door, a different axis will be used(X, Y, Z).
Use a value of 64.0, and make sure one of the doors uses negative value(-64.0), so they open away from each other.

Once you've got that right, give the doors a Move Duration of 3.0, or whatever you think is right.
Then, if you're feeling adventurous, give the doors some sounds!

You can find the basic door sounds under the Env_Audio_Movers_01 package in the content browser.

At this point, you'll probably also want to give the consoles some small lights and ambient sounds. It'll certainly make them feel less inanimate, and they really hate being inanimate, so don't remind them of their shortcomings.







Other Types of Movers

Well, you've made some simple doors. Now what else could you make with ease?

You can try making a lift, this uses the VCScriptedControl_Lift actor to link up the movers and consoles. It supports a lift with panels inside the lift, as well as doors and panels at the bottom and top of the lift. Exactly like the one you'll find in Evil Science(although that uses an older system for setting the lift up). The lift consoles use a VCInteractiveActor_ButtonConsole class(examples of which can also be found in the Evil Science level)

You could also try adding a locked keypad to your level to control doors!
These use the VCInteractiveActor_Keypad class. You can find examples for these in any level with a keypad(Unearthly Excavation, Evil Science, Cryogenesis).
Matinee Movers; Section #1
Ok, this is a very long and complicated one, so pay very close attention to everything and we just might make it out of this alive!

We'll be making a complete copy of the dual gates in Unearthly Excavation from scratch, so it's gonna get nasty...

Without further ado, let us begin!

Placing The Objects

First, find the static mesh we'll be using, look in the content browser under Env_Dig_01. You'll find two gate meshes. Either one will do.

Now place the gate in your level in a suitable place by right-clicking on a surface and selecting the "Add InterpActor: Env_Dig_01....." option. Make sure it's an "InterpActor" and NOT a "StaticMesh".


When you've placed that gate, place another next to it to form a dual gate.



At this point you can edit the properties for both gates as shown in the image, press F4 to open the properties window. In here you will see under the Interp Actor category mostly sound settings.
These will decide the sounds to play as the actor moves through its states[Open, Close, Moving, etc]










Ok, with the two gates now setup, place some interactive consoles near the gates. Be sure to read the section on Doors & Lifts to know how these work.

Set up your gates and consoles as shown in the image below:

















Alrighty, with the physical objects installed it's time for the really fun part; Kismet!

To the Matinee!

Go ahead and open up the Kismet window(Small green K on the toolbar at the top).
After we're done with the work in here, we'll have something that looks like this:



Intimidating isn't it? Well we'd better get to it!

















First start by right-clicking in the large grey area and selecting the "New Matinee" option.
Then, with your first gate selected(It MUST be selected), right-click the Matinee object and select the "Open UnrealMatinee" option.









Another frightening window opens. At this point you may want to look at the official Unreal Engine Tutorials[udn.epicgames.com], but nonetheless we shall forge ahead without it.


In the empty grey space on the lower left, right-click and select the "Add New Empty Group" option. Then right-click on that object and select the "Add New Movement Track" option.

















Ok, now follow the below image carefully. Set each indicated icon and setting to exactly as it's shown.

Take note of the small boxes you change in the top left. These are the movement/rotation channels, each color corresponds to the given axis, much like in the normal editor window.
In this case, with only the Rotation track being visible(Because you clicked the boxes at the bottom) you'll be isolating the Yaw axis, leaving only the blue box one and turning off both the Red[Pitch], and Green[Roll] boxes.

Keyframes

Right, I'll assume you did all that correctly.
Now, hold down the "Ctrl" key and click somewhere on the yellow line in the track window[upper right], make sure you click on the right side of the dot already present. This is a keyframe, it represents a point in Space and Time. Where your actor will be at what time.


Once the new dot appears, right-click it and adjust both the Time and Value settings, set the time to 3.0, and the Value to 90.0.
This will give it a movement time of 3 seconds and a total Yaw rotation of 90 degrees.
You may have to zoom out on the track window to see the dot, you can do this with the mouse wheel.




If everything went well, it should look like this now:









One final thing is needed, and that is to move the Track EndPoint. This decides when the movement sequence ends and triggers events that tell the kismet when the sequence has finished playing. Obviously, we want this to be as soon as our gate reaches the end of its rotation key.


On the bottom of the time track(Lower grey track area) there is a small red triangle on the right side. Right now it's probably set to 5.0 seconds, but our gate reaches its full rotation at 3.0 seconds.

Right-click the small red triangle and then select the "Move to Longest Track Endpoint" option.
That should all be be good now if you followed it carefully, so go ahead and close the Matinee window.





As you'll recall, we have two gates, but we've only edited one. Now would be a great time for you to setup the other gate in exactly the same way, following everything you did in the Matinee window.
There's just one thing you'll want to do with the second gate, and this is reverse the rotation.
If the first gate moved by 90 degrees, then the second gate must move by -90 degrees, so they open away from each other. Tinker with its values until your gates are behaving correctly. You can test the movement by playing the sequence in the Matinee window and observing the motion in the editor's main window.

Right, having done that we can now move onto phase 2.
Matinee Movers; Section #2
With the first part out of the way and our movers' animations setup, we can commence the wiring of events to get your gates to actually move when triggered by the interactive consoles you installed on the wall.

Speaking of, why don't you go ahead and select both of the consoles you installed. We needed two because you have to be able to open and close the gates from either side.


With both consoles selected and the Kismet window open, right-click near your Matinee objects in the Kismet window and select the "New Events Using VCInteractiveActor_...." option from the drop-down. The window will extend to show a list of possible events the consoles support. Choose the "Interactive Actor" event.

Move these into a suitable position left of the Matinee objects, allow a bit of space between each object to improve visibility when working in Kismet.

With those events placed, it should look a bit like this now:








Scripting Objects
Right, now to fill in the other crucial elements, follow these instructions carefully.
Place each of these objects in turn by right clicking in the empty Kismet space and choosing them from the drop-down window.

Place:

A "New Condition -> Comparison -> Compare Int" object.
A "New Action -> Set Variable -> Int" object x2.
A "New Action -> Viscera -> Interactive Actor" object x2.
A "New Variable -> Int -> Int" object.


Once those are placed, select both of your interactive wall consoles in the main editor window(if they aren't already). Then in the Kismet window, right-click and select the "New Object Vars Using VCInteractiveActor_..." option.






If all went well, you should now have a kismet setup similar to this:



Make sure it is arranged as indicated, then follow these instructions:

Notice the headings above each object? These tell you what object they represent, and what their properties must be.

Start with the "Compare Int" object. Select it and then in the bottom left of the Kismet window, expand the "Seq Cond Compare Int" properties category and set the "Value B" property to 3.
This as you will observe is the value indicated by the Kismet object's heading as shown in the image. Follow this example and change the properties of the other Kismet objects, specifically the "Int" and "Interactive Actor" objects near the top.

Once you have done that, we can perform the final and crucial step to finish the whole setup.


Wiring It Up
Right, we shall now connect all of these objects together in the exact way needed to make them operate successfully. Observe the following image:

You'll notice all your objects as before, but now they are connected together by small wires.

Follow the image exactly, and connect the wires as shown. Pay careful attention to what Console 1 and Console 2 are connected to.
They are setup so that when Console 1 is triggered by the player(Event), Console 0's state is updated by Console 1's new state and vice verse, thus they are in sync.

If you have been careful and followed the steps accurately, your gates and consoles should now be working perfectly.

Be sure to look over the tricky bits again if something isn't right.



By using this system, you can create almost anything that moves or rotates when triggered by consoles. So feel free to experiment, but do be careful as Kismet is tricky and poor wiring could lead to strange results.

Ok, that's that! It should now we working for you(assuming I've not forgotten anything), and you can now adapt this to your level.

As always, looking at Official levels is a good way of learning a bit about the inner workings of these systems.
PDAs
Note To Self

Ok, so you've got a level that's lookin' pretty good, but it really needs some story, specifically in the form of notes and PDAs.
Just how exactly do you do this?

Well, it can be tedious, especially the paper notes.
With that in mind, we'll start with the simpler PDAs.


Personal Defective Assistants

First, open up the Content Browser in the editor, then switch to the Actor Classes tab and navigate to Viscera->VCDebris_Placed->VCDebris_Note->VCPDA.
Right-click on VCPDA and select the Create Archetype... option.

A dialog will appear asking you to find a place to store the object.
Select/type the name of your level into the "Package" field. eg: "VC_MyFirstLevel".
Give it a Grouping of "Notes".
Finally, give the object a new name. Be sure to use a standard prefix like "Arc_PDA_", this'll make it easier to recognize objects in the Content Browser. Muriel's a nice name, why not choose that? For examples sake, we'll name it "Arc_PDA_Muriel01".




Colour Me Chuffed

Now you should have your PDA object available in your level's package.
Find it and double-click it, this will open its properties for editing.

Once open, expand the VCPDA and VCDebris Note sections.
Here you will find all the info relating to the PDA's contents and styling.
Let's start by setting its appearance.

Under the VCDebris Note section you'll notice two properties, Note Background Color and Note Scene Class. First, choose a suitable background color that you think fits with your level's style.

Next, choose a class from the Note Scene Class drop-down. All of the display classes for PDAs start with VCUI_PDAUI_. Choose the one you think most appropriate. Each one relates to a level featured in the game, some work for several level styles. The Hero one is used by all the abandoned "Hero PDAs" left scattered throughout most official levels.



Keep in mind that certain color combinations used between the Note Background Color and Note Scene Class will make the PDA hard to read, so you may need to change the Note Background Color to something more suitable.


Telling Your Story

The next step is entering the story elements for your PDA. You'll find all the required fields under the VCPDA section. They are pretty self explanatory, as you can see in the image above.
You may enter the "\n" keyword in any of these fields to add multiple lines. This is pretty essential for the main text field, but also useful for the Title and Name fields.

You may enter your text in direct readable form, as the example above shows, or if you're feeling adventurous, you can "Localize" your text. This allows you to store it in a separate file where you can keep everything in one place.
It's doubtful you'll ever truly have need to do so, and it's an advanced topic, so we'll not go into it here.
Consult the following discussions board if you wish to know more: http://steamcommunity.com/app/246900/discussions/4/


Placing Your PDA, And Preserving Your Dignity

The final thing to do is place the object in your level, so select "Arc_PDA_Muriel01" in the Content Browser and then right-click on a surface in your level(using the Perspective View) and select the "Add Archetype: VCPDA VC_MyFirstLevel.Notes.Arc_PDA_Muriel01" option.

Always make sure to place archetypes in your level when you've created them. If you don't place them in your level, they will not be saved along with your level. You will come back later after saving your level only to find all your archetypes are gone because they were not used by anything, sending you into a frantic rage that may destroy your keyboard and ultimately result in you appearing in a YouTube video.
-------------------------------------

And we're done!
That was the easy one, but fortunately we've already covered some of the important bits, so doing paper notes will be a little easier.
Paper Notes
Creating the Notes

Paper notes, like PDAs aid in telling a story to the player. They are typically reserved for the lower classes of workers and deceased employees. Those who can't afford, or are not important enough to warrant PDAs.

Creating notes comes with two main components; the Actual Physical Object(Page) and the Info Object(Widget) used to draw text and other things on the page itself.
First, we'll start by creating both objects before we change their info.

Let's begin by creating the Widget object.
Open the Content Browser and navigate to "UDKGame->Content->Viscera->Gameplay". You should see a package called GP_Notes_Arch, right-click it and select the "Fully Load" option.
Now that it's loaded properly, you'll see it has a "Bob" category. Click on it, and then right-click on the Note_Bob_Caduceus01 object and select the "Create Sub Archetype..." option from the pop-up menu.

Like above in the PDA guide, fill in the info needed to save the object to your level's content package. Let's say your note belongs to an employee named Gideon?
eg:
Package: VC_MyFirstLevel
Grouping: Notes
Name: Note_Gideon01
Click Ok when you've changed its info.

Now that we've got that one, we'll need to do the same with the Page object.
Right-click on the Arc_Page_Bob_Caduceus01 object this time, and just as before select the "Create Sub Archetype..." option from the pop-up menu. But this time, name the object something like "Arc_Page_Gideon01".

Using the Correct Object

Right, now that we have both objects, we can begin to change their properties.
Find the objects you just created, then double click on the "Arc_Page_Gideon01" object(this opens the properties window of course).
Ok then, this one looks a bit different to the PDAs.

You'll notice the "Note Scene Template" field already has the old Bob note assigned to it. Well that's no good, we'll have to change that.
Click on the small white-ish grey square icon on the right sight of the property field. It says "Clear Text".
This will remove the old reference. Be sure to click "Yes" when the warning about destruction of the universe or something or other appears.

With that cleared, find the "Note_Gideon01" object in the content browser and select it.
The properties window still open I hope? It better be!
Now click the little green arrow icon at the end of the "Note Scene Template" property field.
At this point another little dialog will probably appear, warning of failure. Just ignore it and click Ok. Despite its warning this will have worked anyway.

Splendid, only one step left!

Changing the Captions

Open up the properties for the "Note_Gideon01" object and expand the RSWidget section.

Woah! What is all this crap!?
Sure, it may look scary, but it doesn't bite...much.


You're only going to be interested in one bit, the "Mods" property field.
This little bugger is a large structured array, so it could get messy.

Expand the "Mods" property, you'll now notice 5 lines, all numbered. You'll only be interested in lines 1 through 4.









Expand line [1]. Then expand its "RSWidget Mod Caption" section. Here you'll notice a Caption field very similar to the PDA one. In fact, it's exactly the same.
You can either enter plain text here, or use a "Markup String" if you're familiar with localization.
Either way, you should know what to do, if not, read over the PDA section again.


Ok, you've done Line [1]. Now do the same thing with Line [2], [3], and [4]. Be aware of the end of each "Caption" line. You'll see they each end with something different; Name, Title, Date, Text.
Make sure you give the corresponding ones the relevant info.
  • [0]=Coloured Lines
  • [1]=Employee Name
  • [2]=Employee Title(Occupation)
  • [3]=Date/Time
  • [4]=Body Text


If you've done everything correctly and entered the text(Markup String or otherwise), it should all be good and working now.

To get it into the level, select the "Arc_Page_Gideon01" object in the content browser and place it in your level like you did with the PDA.
Always remember to place the object, or you may lose it when you want to use it later!

Save your level and give it a try. Remember that you may have to restart the editor or game if the text doesn't appear to change.

Well, that should be it!

NOTE:

Feel free to experiment with some of the properties in the "Arc_PDA_Muriel01" object, as well as the "Note_Gideon01" object.
These control the appearance, the paper note one is particularly extensive because everything it uses for drawing is in there, you can completely change the look of your note's face in that object alone.
You can add images, different styled text, re-arrange the captions, all sorts of stuff.
If you look in the "GP_Tools2" content package, you'll find different meshes for notes. You can assign one of these to the "Arc_Page_Gideon01" object's "Static Mesh" property field to change the look/shape of your note if desired.

For now though, this is enough to get your notes all good and proper.
Punch-out And Speedrun Settings
How do you change the punch-out settings for your level? These settings include:

-Notes that appear in the office when you punch-out from your level.
-Amount of time players have to finish your level in Speedrun mode.
-Where to send players when they punch-out from your level(By default the official Office level)
-What actors and situations to detect in your level for punishing or awarding players when they punchout.


Ok, so how do you change them?

First, open your Level's world properties in the editor. You can find this by clicking on the "View" tab at the top of the editor window.






Once open, expand the "World Info" category. Under there you will find a "My Map Info" field. Click the little blue arrow right at the end of the line, then select the "VCMapInfo" option.











You should now see a series of settings if you expand the "Punchout", "Saving" and "Speedrun" categories.

The most important settings are the "Punchout Handler" and the "Speedrun Time Scale".

Here is a run-down of what each setting does.

[Punchout Map Dest]: This is the filename of the level you want to send players when they punch-out from your level. By default it sends players to the official office level, but you can create your own office and then input its filename into this field.


[Punchout Handler]: This is the class that decides the vast majority of behaviour for player rating, speedrun information, office notes, level mess detection, etc. It does practically everything punch-out related within your level and then within the office as well.
If you want to implement custom conditions, then select the "VCPunchoutHandler_Custom" class from the list.

[Custom Punchout Conditions]: This list allows you to customize the situations and messes that will punish or reward the player during their cleanup of your level.
Allows you to create entirely new kinds of messes and Notes to go with them when players reach the Office. Only works if you select the "VCPunchoutHandler_Custom" class in the Punchout Handler list.

[Custom Official Notices]: This list allows you to override the "official notice" notes you receive from the company about your cleaning performance.

[Custom Hate Mail]: This list allows you to override the "hate mail" notes you receive from other colleagues based on your cleaning performance.

[Custom Male EotM Pictures]: This list allows you to override the "employee of the month" pictures you receive if you're a male janitor.

[Custom Female EotM Pictures]: This list allows you to override the "employee of the month" pictures you receive if you're a female janitor.

[Custom Debrief Messages]: This list allows you to override the "debriefing" messages you receive after punch-out; in the form of text on a clipboard interface.

[Gravity Volumes]: This list is used by levels with gravity to decide which volumes to consider for a "Gravity Off" failure situation. Basically, if the gravity in one of these volumes is off, then the player will be punished.

[Result Spawn Points]: This is only relevant to Office levels. If you are making a new one, then this actor list decides where notes generated by the Punchout Handler are placed within the level. You can look at the official Office level for an example of this.

[Random Spawning]: If this is a custom office level, then notes are spawned at the "Result Spawn Points" randomly among the locations instead of sequentially.

[Photo Spawn Points]: This, like "Result Spawn Points" designates locations for spawning actors. In this case it's currently only used by Employee of the Month photos. When a player gets Employee of the Month, the picture will be placed at one of these points.

[Trunk Spawn Points]: In the event that players have destroyed their trunk in the Office level, a new one will be spawned at one of these points.

[Is Office Level]: If your level is a new Office level, then make sure this is ticked. Certain conditions unique to Office levels will be taken into consideration.

[Punchout View Panels]: If this is a custom office, then this list will point to the Punch-out report viewing screens that show the players the results of their cleanup and the details filled in with the report forms.

[Punchout Office Save File]: If you have a custom office, it likely has a custom save-file. When sending players to your custom office, the office data will be loaded from this save file.

[Save Setup]: This decides the class used to handle saving for your level. You will probably never need to use this as the default system works well enough. However, if your level is an Office level, make sure to give it a value. "VCSaveGameSetup_Office" is of course the one you want. In this case you'll also want to change the file name for your save. You do NOT want it to be the same as your default VCD-Office(OfficeData.sav).

[Speedrun Time Scale]: This value scales the amount of time players have to optimally complete your level in Speedrun mode. This alters the optimal amount of time players will have to finish their cleaning before receiving penalties. It is scaled using a multiplication system, so 1.0 = %100[Normal]. 0.5 will give players half the usual amount of time, making it harder. 1.5 will give players %50 more time to finish the level.
You can adjust this scale based on certain difficulties unique to your level. By default the game automatically detects the difficulty of your level based on the severity and quantity of mess.
But, should your level have unique obstacles such as low gravity, high places, hidden rooms, locked doors, etc. Then you can increase the Speedrun Time Scale to take this into account.


Well, that completes the list. Keep in mind that several of these values are difficult to utilize in full without a good deal of experience with level creation.

In the meantime, you can use the default punch-out handler; VCPunchoutHandler_General. It's used in most of the official levels, and will work for most cases you're likely to need in your level.
You're welcome to choose some of the others as well if you want. For example, if you have low gravity in your level, then select the "VCPunchoutHandler_ZeroG" class.
If you have weeds or pus-pods then choose the greenhouse one, and so on.
Unfortunately, as you've probably noticed, these can't be combined.
However there is the "VCPunchoutHandler_Custom" class, which will allow you to make your own if you are feeling adventurous, or need to setup notes and ways of punishing players for special situations unique to your level.

To find out all about those, read on through the sections that cover Custom Punch-out Conditions!
Report Forms and P.I.Ds #1
No level is complete without some paperwork to fill in!
It's very likely your level has dead guys in it, am I right? Well, where there's a dead guy, there's also a ton of paperwork. In VCD this comes in the form of P.I.Ds(Personal Identity Devices) and in the Incident Report Form, both of which need to be supported by your level.

Incident Report Forms

So, how do we add these things to our level? Well, it's actually pretty easy.
All that the paperwork needs to work properly, is some tick-boxes and a couple numeric boxes.

Start by opening your level's World Properties from the editor's tool-bar. You'll find it under View -> World Properties, just like you did for the punch-out system earlier.
Once open, expand the World Info section and --making sure you have a VCMapInfo applied to the My Map Info field-- then expand the My Map Info -> Reports section.

You should now be presented with a long list of tick-boxes. Each one represents a certain type of hazard, or incident that led to the deaths of employees in your level.
Essentially, all the Report Form wants is a list of items it can compare to the player's answers.
So make sure you only tick the boxes that seem relevant to your level, or that can be proven by evidence in your level, or story elements in your level; something that gives a clue to players, so they can find the correct answer if they are paying attention.

You can hover the mouse over any of the tick-boxes to get a description of when they should be used. Be careful when selecting your choices, some of the boxes sound similar, but are quite distinct.

Here are some of the most vague options explained:

  • Mutations: This one is best ticked if your level contains either any part of the mutant aliens(brown, blue, and green spiky creatures), or if your level had any scientists or research being conducted on mutating lifeforms, and that it led to disastrous consequences.

  • Corruption: This one is best ticked if any of the employees who were working in the level became infected/diseased/corrupted/confused in such a way as to be psychologically manipulated to behave oddly and start destroying things or killing their colleagues.

  • Enigmatic Forces: This one is usually used in conjunction with Corruption if the cause was not disease, or anything biological, but instead mysterious and otherworldly. Take the Alien Artifact in Unearthly Excavation for example. Its enigmatic energies corrupted the employees, ultimately leading to mass hysteria and death. If it is strange and "unknowable", then this box would be ticked.

  • Deadly Fauna: This box refers to animal life being responsible for destruction or death. Usually ticked in conjunction with "Aliens". An animal could be anything that is not humanoid, or sentient, or perhaps even capable of moving. The "Sand Traps" in Unearthly Excavation or a perfect example.

  • Deadly Flora: This box refers to plant life being responsible for destruction or death. Usually ticked in conjunction with "Aliens". A plant would be anything uhm...plant-like.
    The weeds in Hydroponic Hell are a good example.

  • Homicide: This box is used only if humans(employees or otherwise) killed other humans(employees or otherwise). This is specific only to human -> human interactions and does not concern any aliens. The humans could however have been corrupted, or they were just murderers, it's your choice.

  • Other: If none of the above adequately describe a very large portion of what led to destruction or deaths in your level, then tick this box.


Right, so that's the main ones.
By now you've probably ticked the appropriate boxes, so let's move on to the last value for the Incident Report Form.

Num Dead Aliens: This box is the last important value. It is simply a measurement of how many aliens are to be found dead in your level at the start. Either there are dead bodies, or some clear indication of corpses(such as a large blood pool). It's much easier to just go with dead bodies, players can identify the number much easier than if there are only some blood pools to show the presence of corpses.


With the Incident Report Form values out of the way, we can move on to adding P.I.Ds for each dead employee.

P.I.Ds

Every dead employee must have an accompanying P.I.D for players to use, so they can fill out the paperwork. These are usually placed among the remains of said employee, or as near as makes sense.

To place one, open up the Class Browser and navigate to and select the following class: Viscera -> VCDebris_EmployeeChipBase -> VCDebris_EmployeeChip.

Once selected, right-click on a surface in your level using the Perspective Viewport.
Once the list appears, select the "Add VCDebris_EmployeeChip Here" option.
You should now have a P.I.D. Go ahead and open its properties window(F4).



If you want to change the material of your P.I.D, to give it a different colour, then first find the list of P.I.D materials in the Content Browser under GP_Objects->PID. Then, with one selected, expand the VCDebris->Mesh->Rendering section under your P.I.D's properties, and then apply the material to the Materials field.

With that done, let's move on to the important fields associated with your P.I.D and dead employee.

Expand the Reports->Death Report Info section.
You'll notice a whole series of tick-boxes and an "Employee Name" field.

Let's start with the Employee Name. You can either leave this blank to let the game select a random name, or you can enter whatever you want. Just remember that if you have any paper notes or PDAs made by this employee, that you should match the names up.

Ok, let's move on to the long list.
Just like with the Incident Report Form setting earlier, you'll want to select the boxes appropriate for this dead employee. Just be very careful to select the right ones. Not every box is simple, some are very vague.

Here is a list of some of the most vague and unusual boxes and what they mean:




  • Dragged: Usually used if the body has been dragged with visible signs, either up a wall, along the floor, or in some other way. It does not count if the body has "slid" down a slop or staircase. Drag marks are sometimes indicated with alien footprints.

  • Murdered: Used only if another Human, employee or otherwise has killed this employee. They may have been corrupted while committing the murder or not. Aliens are not considered for this one.

  • Thrown: Often indicated with a spray and then a gap before the body lands again. Sometimes they are slammed against walls or knocked off ledges. Both count as Thrown.

  • Liquified: Used only if the body has no visible signs of body parts bigger than organs left. Usually accompanied by lots of blood.

  • Stricken: Otherwise known as Corrupted. This is used if the employee was sick with a disease or corrupted by some enigmatic energies, or something unexplained. Used if the employee was "not themselves".

  • Sliced: Used if the body is usually accompanied by slashing sprays of blood, indicating a sharp tool or implement was used.

  • Slain: Unlike Murdered, Slain is used when the employee was not killed by a human or other employee, but instead by alien lifeforms or some other life-form. If they are killed by a hazard or machinery, it also doesn't count.
Report Forms and P.I.Ds #2
  • Ritualized: Indicates that the employee's body has been presented, or manipulated in a ritualistic way. Either their body parts are arranged in a pattern, or they are hung in a certain pose, etc.

  • Impact: Indicates the employee suffered impact damage, either from being thrown, falling, or hit with a blunt object. Anything kinetic.

  • Other: Used only if none of the above adequately describe a good portion of the employee's cause of death.

Right, those are the important ones. By now you should now have ticked the suitable boxes and completed the P.I.D for your employee.
The easiest way to proceed from here is to copy the P.I.D you've created and then paste it at next to every other employee, editing the new one's properties every time you do.

With the P.I.D selected, press Ctrl+C. Then, right-click on a surface next to another dead employee and select the "Paste Here" option from the list.

You may notice however that you'll want to move the P.I.D actor up slightly to prevent it from sticking into the floor. Once pasted and re-positioned, open its properties and once again tick the boxes appropriate for this employee, and un-ticking the ones left over from the copy that don't make sense.

Keep doing this until you have given every dead employee a P.I.D of their own.


In no time you should have all the P.I.Ds setup up for your level.
With both report forms and P.I.Ds taken care of, you are finished and your level will now support the paperwork filing players will have to do to get bonus points.
Common Problems...and Solutions!
So, you've run into a problem? Well that wasn't very clever of you, I'd have thought you'd see it and stop running. Oh well, we'll just have to get you to a doctor and fix that broken nose.

Otherwise, you could just follow these instructions to resolve your malady.

Be aware that I'll be adding to this section as problems arise, so if you encounter something and it's not here, let me know in the comments.


I Can't Select It, I just Can't!

Chances are the thing you're selecting is translucent and instead of selecting that actor(it's probably water isn't it?), the editor selects the thing behind it.

Why is it so cruel to me?

Well, that's another matter. But as to why you can't select it; the editor is probably not in "Allow Translucent Selection" mode. You can change this by clicking on the icon on the top toolbar. It's right in the middle, just to the right of that "slider", it looks like a glass box viewed from an angle.
Its tool-tip says: "Allow Translucent Selection"


My Lighting Doesn't Work

If you test it in the editor's Preview In Editor (PIE) and the whole level is dark, you've probably not compiled your level. Be sure to read over the "Back To The Fut...Basics!" section.


It Complains About No Player Starts

If you test it in the editor's Play In Editor (PIE) and it then crashes complaining that there are no player starts to spawn you at, then make sure to read over the "Back To The Fut...Basics!" section.

Also make sure your player starts are position high enough and away from surfaces just enough so their icon changes from "Bad Size" to a small pylon like thing.

I Tried Compiling, But "Swarm" Won't Run?

Swarms don't run, they fly...unless it's a Zergling swarm, hmm...bah, anyway!

This "Swarm Agent" is the tool the Unreal Engine uses to compute lighting and it's pretty essential. If it doesn't run on your machine, it's probably your Anti-Virus or something else blocking it.
If it's not that, then it's a compatibility issue with your machine. Best turn to ol' man Google to show you the way out of the dungeon, as I myself am not sure what would be the exact cause.

Could Not Create Cache Folder(Swarm)

Another Swarm one.
When the swarm window appears, click on its settings tab. Change the cache folder to where your Viscera Cleanup Detail is installed.
Set the directory to "Binaries\SwarmCache\".
This is probably a good idea even if you don't have the problem.

The Incinerator Won't Cook My Goose, Or Viscera

It's a bit too powerful for a roast goose, so I wouldn't try that. But if you really insist, then perhaps look over the Incinerator section of the guide again, make sure you didn't miss anything.
If you hear a sound(multiple times) when objects go into the incinerator then it is working, but if things are still not cooking and disappearing, then something else is going on. Possibly the volume(green-box) is too high up, or some other strange thing, let me know if this happens.


I Have Duplicate Objects Spewing When I Grab Something

Chances are you used the "Plopper" tool wrongly. Did you place a few things, copy the data, paste in the editor and then continued to place more things and copy+paste again?

Make sure that you close the PIE(Play In Editor) after you copy the data from the Plopper and paste it in your level. Otherwise if you keep using it and then copy-paste more, you'll also be pasting the ones you already did.

Ensure you don't do the same with with the "Painter" tool either.


Editor Compile Errors

"Object has overlapping UVs" is the error. Grabbing a cup of coffee and ignoring it is the solution.

"StaticMesh has invalid LightMapCoordinateIndex" is the error. Grabbing a bowl of chips and ignoring it is the solution.

"Maps not built with production lighting" is the error. You can either ignore it, or if you want better quality lighting that will take longer to compile, you can change the lighting quality to "Production", you'll find the icon for this next to the other compile icons, on the right side. It probably looks a bit like a greyed out light-bulb with a tiny eye next to it.


How Do I Hide My Hands/Mop?

A nice tip to remember for taking screenshots of your level for use with the level preview or in general, is to open the developer console with the "~" key, then type "HideWeapon". No more hands or mop in the way! You may have to retype it if you change weapons though.


I Have Duplicates of My Level in the Main Menu List
Make sure the file name of your level has no spaces or "white space" in it, this would be bad and could cause duplication issues or worse.
Exposing Your Level to the Game
Having now made a level, how in God's name do you get it to show up in the Main Menu correctly?

Firstly, make sure the file name of your level has no spaces or "white space" in it, this would be bad and could cause duplication issues or worse.

The Config File

The first step is to make your own Config(or .ini) file.
Find the Config folder under the game's base install directory, then create a new simple text document. Make sure it give the file the .ini extension.

Open it up in notepad and type out something like this:


If you intend making multiple levels, or this level is part of a larger mod of yours, you can either type this into your previously created .ini (if you have one), or simply make this .ini file more all purpose in name(keeping it unique enough to not be confused with any other level or mod out there). For example, instead of calling it JoJosGiantLevel.ini, call it JoJosGiantLevelPack.ini.

At any rate, make sure you've typed out the contents as shown, taking note to change the necessary info, such as the map name. This is the actual level's file name(minus the file extension). Be sure to change the heading to the same name as your level as well.
For example, if your level name is VC_JoJosGiantLevel, make sure the heading reads:
[VC_JoJosGiantLevel VCUIDataProvider_MapInfo]

The PreviewImageMarkup points to an image in a content package to use as the preview. Make sure that this content package is NOT your level's content package. Make sure it's a new unique package(or at least one you've already created for your stuff).

A nice tip to remember for taking screenshots of your level for use with the preview or in general, is to open the developer console with the "~" key, then type "HideWeapon". No more hands or mop in the way!

The MapPicAspectRatio, which changes the draw ratio of the preview image(in the event you have something that isn't perfectly square).

The SortOrder is simply a number to decide how high up in the map list on the Main Menu your level will appear, the highest VCD level has a value of 300, and the lowest has a value of 10.

The bHideFromMenu option allows you to hide your level from the map list on the main menu. This is very useful for Office levels which can't be reached like normal levels. Either set this value to true, or false. It is false by default.


The Localization File

The next step for your level is to give it some more meta-data.
Find the game's UDKGame\Content\Mods\Localization\INT folder.
Create a new file here(or follow the instructions I mentioned about the config file, multiple levels and so forth), then open it up and type info similar to the following:


Be sure to fill it out with your own info just as before. This time the text you are entering is the actual text you will see in the game menus.

FriendlyName is of course the level name that will appear in the map list on the main menu.

Description is the small bit of info about the level, displayed on the main menu.

MapBriefing is the briefing you will see when you actually play the level.

You can also add a unique MapRespawnBriefing to your file, this will of course be displayed when you die during the course of your duties and get replaced by another janitor.


Right! Now you should have your level all exposed to the watchful gaze of the game's menus.

Be sure to check out this very useful guide on publishing your creations to learn more about exposing and publishing things, and where to put files.

Steam Workshop Publishing Guide
Conclusion
Well, that's it!

You should now have a complete level ready for cleansing.
What a shame, all that hard work making a mess only to have to now clean it up!

I hope this guide has been enough to get you going, I'll add more parts to it as the need arises.
You can read on through the additional sections to learn all about the many features found in the game and how to implement them.

Also be sure to check out the official guide for our Workshop publishing toolkit(RUST):
https://steamcommunity.com/sharedfiles/filedetails/?id=1587473742


In the meantime:
Custom Punch-Out Conditions #1
The custom punch-out condition system allows you to override the default notes and conditions used by the game that decide what messes the player has to cleanup, and what actions they have to perform in order to "complete" a level.
You know, the news-paper clippings you receive in the Janitor Office upon completion/failure of various tasks.

It works in a similar way to normal; you receive a unique newspaper article in the Janitor Office for things that you failed to cleanup, or do. Each failure adds to the player's "penalty" value, detracting from their final completion score.

In order to use it, you must select the "VCPunchoutHandler_Custom" class for the "PunchoutHandler" field in your level's "World Properties -> World Info -> My Map Info -> Punchout" section.

The system is divided into two parts; Definitions, and Conditions.
Definitions

Each definition defines a "result", or note that you will receive in the Janitor Office in the event that its Conditions are successful.

To create one, simply expand the Punchout section of your level's Map Info object.
Then, left-click the small green cross at the end of the "Custom Punchout Definitions" field.
This will add a definition you can begin to actually define.
You can create as many of these as you want.




Every definition comes with a "Penalty" value. This can be thought of as a "rating" of how bad this failure is. For reference, this is how the default system treats various messes/failures.
  • Blood=17.5
  • Viscera(Including dead guys and body parts)=25.0
  • Casings=15.0
  • Trash=10.0
  • Bullet Holes=25.0
  • Overturned Barrel=7.5
  • Body Bag=150.0
  • Stolen Welder=400.0
For good practice, give the most frequent/numerous failures a lower value, and the once-off or unique failures a much higher value.
If you wish to award the player an amount for meeting the conditions instead of punishing them, then make the value negative. Easy!

Along with a penalty, there is also a Min/Max field called "Occurence Range". It is represented as X(Min) and Y(Max) and takes a value between 0 and 1. Simply put, it decides how clean the level must be, on a scale of 0% to 100%, before the associated note will appear in the Janitor Office. So, if the Y(Max) value was 0.5, then the player would have to have cleaned at least 50% of the level before this note will show for them.
Entering a value of -1.0 is the same as setting X(Min) to 0.0, or Y(Max) to 1.0 respectively.

The Resulting Pages list decides what notes, or newspaper clipping to spawn in the office if this definition is successful. Each page is chosen at random from the list.
To add a page, simply right-click any actor archetype in the Content Browser and select the "Copy Full Name To Clipboard" option from the list.
You can find a list of all of Viscera Cleanup Detail's Punch-out Notes in the GP_Punchout content package, and then by looking under Pages.
You can subclass any of these archetypes to make your own!
To learn how, see the Custom Punch-Out Notes section below.

Next, are two tick-boxes; Ignore Incinerator Items and Ignore Trunk Items.
These concern the Conditions for your Definition. Simply put, if any objects are inside the Incinerator or Janitor Trunk, then they will be disregarded and cannot punish or award the player any score. This is the default approach.

The third tick-box is Must Meet All Conditions. Basically if you have multiple conditions, then all of them must be met before this definition will be successful. Otherwise, if it's un-ticked, only one condition needs to succeed.
This tick-box is very useful for certain scenarios.
In our example, we'll be needing that on, so make sure you tick the box!

Lastly, we have Conditions list. These are the real meat of your definition, and decide what objects to look for, or what situations to consider.
To add one, simply left-click the green cross at the far right of the Conditions field.
Once a condition is added, you'll need to decide what kind of condition it'll be.
Left-click on the downward pointing blue arrow toward the right side of the field.
This should present you with a long list of all the various condition objects you can make use of.
Each one starts with "VCPunchoutCondition_". I will disregard mention of this moving forward, and simply refer to the various conditions using the name that follows afterwards, eg: FoundSplat

In this example, we'll be using the Found Debris and Is Full condition to punish the player for leaving empty buckets lying around.

Conditions

Conditions work by evaluating actors in the level, and then deciding whether to count them as a failure, or to simply ignore them.
Each condition looks at a different kind of object or situation, and by mixing conditions together, you can account for just about every situation the player can create in the level.

Conditions, by default are setup in such a way that they are almost contrary to most of the failures typical of Viscera Cleanup Detail. As you can see by the names of all the conditions, most of them start with "Is" and end with "Restored".
For example, the IsMedpackRestored condition isn't much use if you're trying to punish the player for leaving a medpack empty.
This is where the "Inverse Condition" tick-box comes in, it allows you to reverse/flip the result.
(There are many other subtleties to the interaction between conditions, but we'll get to that later)

Let's try this out by adding our first condition.

Found Debris

The Found Debris condition is used to evaluate physics objects; all the things you can pick up. One of the most useful aspects of this condition is that it can also be combined with other conditions to further specify a particular situation involving a physical object.


As stated earlier, make use of the Found Debris condition by adding it to the Conditions list using the green cross and then the downward pointing blue arrow icons.

Now that you have the condition object, go ahead and expand its "Condition" section.
You'll notice quite a few fields on this condition. It's one of the more complex, where as other conditions usually only have a couple fields at most.

All of these fields allow you to narrow down what kind of object the condition will evaluate. Each field compares a certain property of the object being evaluated with the condition itself, if they don't match, then the object is disregarded and can neither fail nor succeed this condition.

So, let's go ahead and set this condition up to detect Buckets.
Firstly, click on the "Debris Class" field; this should bring up a very long list.
Luckily, "VCBucket" is right at the top, select that class.

This one's very easy, that's essentially it. But...hold on a minute, "Must Count As Mess" is still ticked. That's no good, buckets don't always count as mess.
Make sure you un-tick that box, because were counting empty buckets, any empty buckets, not just the dirty ones.
Ok good? That's that condition done then. Very simple!

Let's move on to adding another condition that will evaluate the same object.
This one's called the "Is Full condition, and it does exactly what it sounds like.

Let's move on to the next guide section to make use of it.
Custom Punch-Out Conditions #2
Is Full

The Is Full condition evaluates buckets and bins to see if they contain anything. Specifically sand or water.

Make sure you add this condition just like you did the last, adding an extra entry into the Conditions list.


Once added, you'll notice a bunch of fields for screening buckets and/or bins.
For our uses we only want empty water buckets, buckets that contain neither water nor sand.
So go ahead and make sure both the Check Water and Check Sand boxes are ticked. And of course that the Count Bins box is NOT ticked.

As well as those three, you'll want to make sure that Full Ratio is higher than 0.0.
This is used by the sand check. Any amount of sand greater than or equal to this value will count.
It works on a scale of 0(0%) to 1(100%), so if we want to count buckets that have sand, how full must they be to count? In this case, let's just leave it at 1.0.
Only buckets full of sand will count as "full".

So, we're now detecting buckets, but there's a problem. With the way it's setup, we're actually telling it to look for full buckets. Both Count Buckets and Check Water is ticked, and the condition itself is named Is Full, so...how do we get it to only count empty buckets?
Well, that's the nice thing. It's as simple as ticking the Inverse Condition box!
This flips things around, and instead of thinking of it as an "Is Full" condition, it's now an "Is Empty" condition.

Easy!

Well, that's that for the conditions. Let's head back to the definition and make sure that Must Meet All Conditions is ticked.

If it is, then we're done, and the conditions will now be counting any occurrences of an empty bucket as a failure! Each time it finds an empty bucket, the "Penalty" value from the definition will be added. So, more empty buckets equals worse player score!


Great! Now that we know how conditions work, we can explore the others in greater depths.

Before we do, here are three fields that almost every condition has, and info on what they do.

Inverse Condition
You're already familiar with this one. It reverses the evaluation of any condition from an "Is" to an "IsNot". That's really all there is to it, pretty simple.

Checklist
This is a useful list you can use to tell the system that it must ONLY consider actors from the list.
Let's say you've put an extra special bucket on an altar, but you only want to punish players for leaving this bucket empty, or for making it dirty. You'd add a reference to that bucket into the Checklist to tell the system to only consider it and ignore all other buckets.

Compare Same Actor
This one's a little more complex. It can be thought of as ticked=same actor, un-ticked=global check.
In the example above, we used two conditions together. This only works because they both have Compare Same Actor ticked, which groups them together, telling the system to use both conditions when comparing any one actor.
If the Found Debris had its Compare Same Actor field un-ticked, then it would have succeeded on the first bucket it found, but would not have asked Is Full to check it too before moving on.

With the Compare Same Actor field un-ticked, you can use the condition as a "one-shot". It looks up all the actors in the level and succeeds if it finds even one, instead of running through each actor that fits the bill.
If you have Inverse Condition ticked then as well, then it essentially means "Did we not find any actors that fit the condition? Success!".
It can be tricky to figure out how these work together, but if you just want a condition to evaluate once per Defintion, and don't care how many other actors might also meet the criteria, then this is the tick box you'll need.
Custom Punch-Out Conditions #3
Right, let's go into more detail about each condition, what it does and what its properties mean.

Compare Kismet State

This is a simple condition that can compare the values of most Kismet Variables.

Variable To Check: Is a reference to a variable in your kismet sequence. Simply click on any Kismet Variable you have, then press Ctrl+C. Go back to your Compare Kismet State condition and paste(Ctrl+V) the variable into the Variable To Check field.
You should now see something like this: "Begin Object Class=SeqVar_Bool Name=SeqVar_Bool_0". Make sure you remove everything but the "SeqVar_Bool_0" at the end, then press enter. Done!

All the other fields in the Compare Kismet State condition specify what value you are looking for from the variable. If they match, the condition will succeed.
If Inverse Condition is ticked, and they do NOT match, the condition will succeed.

Found Biomass

This very simply condition evaluates to true for every Biomass actor in the level. This is the fleshy stuff stuck to the walls in Incubation Emergency. Specifically the ones that cannot be picked up or moved.
If Compare Same Actor is un-ticked, it will succeed the first time it finds ANY biomass in the level.
If Inverse Condition is ticked and Compare Same Actor un-ticked, it will succeed if there is NO biomass at all in the level.

Found Debris

This complex condition evaluates any physics objects(things you can pickup). All the property fields narrow down the kind of object you're looking for in a number of different ways.

  • Use Debris Type: If ticked, the condition will compare the object's Debris Type value with the condition's.

  • Must Count As Mess: Most if not all the objects that the Sniffer/MuckGyver detects "count as mess". Things that do not are barrels, crates, panels; decorative things. So if this is ticked, only those messy actors will be considered.

  • Must Cause Splat: If ticked, only objects that leave a splat decal when they hit a surface will be considered, such as Viscera, Pus Pods, Garbage Bags. Buckets do NOT count.

  • Must Not Cause Splat: Like the above, except it will only consider objects that do NOT leave decals. Using both effectively disables the condition entirely.

  • Use Debris Penalty: Every debris object has a custom penalty value that determines how "messy" they are. If this box is ticked, then the penalty value for your Definition will be ignored, and the penalty value will be taken from the object itself. This is the default approach for the official "Viscera" and "Trash" notes.

  • Debris Id: Every object has a Debris Id value, some of them are unique, others are not. If you know what objects have the Id you are looking for, then you can enter it here to filter out any object that does not have that Id. Keep in mind that that this field can be "partial". So any object that has a Debris Id with the condition's Debris Id somewhere in the name will count.

  • Debris Class: Typical lookup method. Objects come in many different classes. Pick the one that your desired object uses. VCDebris includes every single physics object, it is the "base class".

  • Debris Type: Most objects are grouped into a certain category, some of them change categories as they are "spent", used or broken. See Use Debris Type above.

Note: Inverse Condition essentially has no effect on this condition unless you're using the un-ticked Compare Same Actor method.
Also, you can enter an object's Mess Factory into the Check List for easy filtering.

Found Sand Pile

This condition simply detects piles of sand.

  • Use Sand Penalty: This allows the sand pile to multiply your Definition's penalty value by how large the sand pile is; Min divided by Max. Useful, and more accurate.

  • Sand Pile Class: Fairly unimportant, but useful if your level contains both classes for different reasons.

  • Volume Ratio: On a scale of 0(0%) to 1(100%), how much sand(at least) must the sand pile contain to count, how large must it be?

Inverse Condition will simply flip the result of Volume Ratio. "The sand pile must be NO LARGER than Volume Ratio".

Found Splat

Similar to Found Debris, Found Splat deals with decals such as blood.

  • Use Splat Type: If ticked, the condition will compare the splat's Splat Type with the condition's.

  • Use Splat Penalty: Every splat has a different penalty value based on its size, density and strength. If this box is ticked, then the penalty value for your Definition will be ignored, and the penalty value will be taken from the splat itself.

  • Splat Class: Every splat has a class it derives from, some are unique, others are very generic. VCSplat includes every single splat object, it is the "base class".

  • Splat Type: Most splats are grouped into a certain category, this is the main method used to determine what kind of splat something is. See Use Splat Type above.

Note: Inverse Condition essentially has no effect on this condition unless you're using the un-ticked Compare Same Actor method.
Also, you can enter a splat's Mess Factory into the Check List for easy filtering.

Is Debris Stacked

This simply condition is used in conjunction with Found Debris it check if the object is stacked in a Stacking Volume.

  • Volume Check List: Allows you to specify the Stacking Volumes to consider for the check.

Is Debris Upright

This condition is used in conjunction with Found Debris it check if the object is Upright or not.

  • Margin of Error: This decides the maximum deviation(in degrees) from upright the object can be to count. 90 degrees would mean a barrel can be lying on its side and still count. 0 degrees expects a near impossible, perfectly upright object.

Is Full

This condition is used in conjunction with Found Debris it check if the object --a bucket or bin-- contains either water or sand.

  • Count Buckets: If ticked, buckets will be considered for the condition.

  • Count Bins: If ticked, disposal bins will be considered for the condition.
  • Having both of these off effectively makes the condition pointless.

  • Check Water: If ticked, the presence(or lack thereof) of water in buckets will be considered.

  • Check Sand: If ticked, the presence(or lack thereof) of sand in buckets or bins will be considered.

  • Full Ratio: On a scale of 0(0%) to 1(100%), how much sand(at least) must the bin or bucket contain to count?
  • It should be noted that this has no affect on water checks, that can only be empty or full.

Is Incinerator Open

This simple condition checks to see if the doors of Incinerators are open or closed.

  • Ignore Door Zero: If ticked, the door with its hinges closest to the "tanks" will be ignored.

  • Ignore Door One: If ticked, the door with its hinges closest to the "pipes" will be ignored.

Is Incubator Restored

This condition simply checks Incubators to see if they are in various states of restoration.

  • Ignore Egg: If ticked, the presence(or lack thereof) of an alien egg inside is not taken into account.

  • Ignore Bulb: If ticked, the presence(or lack thereof) of an active light-bulb inside is not taken into account.
Custom Punch-Out Conditions #4
Is In Incinerator

This condition is used in conjunction with Found Debris it check if the object is inside an Incinerator or not.

  • Incinerator Checklist: This allows you to specify the Incinerators to consider for the check.

NOTE: For this condition to work, your Definition must have Ignore Incinerator Items un-ticked.

Is In Trunk

This condition is used in conjunction with Found Debris it check if the object is inside the player's Janitor Trunk or not.

  • Trunk Checklist: This allows you to specify the Janitor Trunks to consider for the check.

NOTE: For this condition to work, your Definition must have Ignore Trunk Items un-ticked.

Is In Move State

This condition evaluates VCMover actors to see what movement state they are in, such as "open", "closed" or "moving".

  • Required Move State: The mover must be in this state to be considered.

The possible values are:
  • 0=Opening(Moving Out)
  • 1=Closing(Moving Back)
  • 2=Opened(At End)
  • 3=Closed(At Start)
  • 4=Stopped
  • 5=Jammed

Is Light Bulb Restored

This condition evaluates Light Bulb Mountings(VCLightBulbMounting) to see if they have an intact light-bulb present, and if they are currently switched on.

  • Check Active: If ticked, the state of the light bulb, either On o Off will be taken into account.

  • Must Be Active: If Check Active is ticked, then the current state of the intact light-bulb will be compared with this value. If ticked, the bulb must be on to count. If un-ticked, it must be switched off to count.

  • Only Incubator Lights: If ticked, then only light bulbs part of an Incubator unit will be taken into account, and no others.

Is Low Gravity On

This very simple condition evaluates Low Gravity Volumes and succeeds if the gravity is "turned off", ie: Low Gravity.

Is Medpack Restored

This simple condition evaluates Medical Supply Boxes / Medpacks, and succeeds if the med-pack is properly restored.

Is Sand Trap Covered

This simple condition evaluates Sand Traps / Saarlac Pits to see if they have been covered with sand or not.

  • Filled In Ratio: This decides, on a scale of 0(0%) to 1(100%), how "filled in" the trap must be before it's considered "covered".

Is Seed Bed Restored

This simple condition evaluates Seed Beds to see if they are restored or not. If it is, then the condition succeeds.

Is Sentry Gun Restored

This condition evaluates Sentry Guns(Spartan Phoenix Guns) to see if they are properly restored.

  • Ignore Ammo: If ticked, the presence(or lack thereof) of ammunition in the gun will not be taken into account to decide if it is "properly restored".

Is Stacking Volume Full

This condition evaluates Stacking Volumes to determine whether or not they are full of stacked items.

  • Must Be Full: If ticked, then the stacking volume must be full(met its Required Count) for the condition to succeed.

  • Min Count: If Must Be Full is not ticked, then this is how many stacked items it should have before it counts as being "full".

Is Water Filthy

This condition evaluates Water Actors(VCWaterActor) and Buckets to determine if they are filthy/fully saturated or not.

  • Include Buckets: If ticked, then Buckets will also be taken into account.

  • Saturation Ratio: This determines how filthy --on a scale of 0(0%) to 1(100%)-- the bucket or water actor must be before it's considered by the condition.

NOTE: This condition can be used in conjunction with Found Debris to check a Bucket's filth level.

Is Within Volume

This condition can be used in conjunction with Found Debris or other conditions to check if an object is within a certain volume or volumes.

  • Volume Checklist: This list references the various volumes which will be used by the condition check. Objects must be within at least one of these volumes to count.
    You must specify at least one volume.

Player Has Inventory

This condition evaluates the Janitors/Players in the level to see if any of them are carrying the given inventory item, ie: Shovels, Brooms, etc.

  • Inventory Weapon: This drop-down list determines what inventory item the player must have to count. Always use the _Content versions and never the "Base" versions.

  • All Or Nothing: If ticked, then all players must have the item in their inventory. Or if Inverse Condition is ticked, then there must be no players at all with the given Inventory Weapon.
    If un-ticked, then players can have mismatches, and the first valid result will be used.

Was Machine Used

This simple condition evaluates Bucket Dispensers, Bin Dispensers and Vending Machines to determine if they have been used a given number of times.

  • Vend Count: This decides the number of times(at least) a machine must have vended a valid item(not jammed) before it will be considered by the condition.

All done!
And that's the complete list of Conditions. You should now have everything you need to make all kinds of interesting combinations.

This list may be expanded upon if there is a need for more condition types.
Custom Punch-Out Notes #1
Now that we have some conditions, we can also create new notes for all our strange situations used to punish/reward the player.

These notes tell the player what they missed, or what they did wrong.
The official notes do this in the form of small newspaper articles that tell a little story about what happens after you've left the work-site. Each article references the item/failure that you triggered, making it fairly clear what went wrong, and what you need to do better.

So, how do you create one of these notes? Well like most notes they come in two parts; the Widget(which decides the styling, text, and picture), and the Page(which is the actual physical object you pick-up).

Let's start with the Widget.

Creating a "Widget"

The first thing you'll want to do is open up the Content Browser and find the following package: Viscera->Gameplay->GP_Punchout.

Once found, right-click on it and select "Fully Load" from the drop-down.
This will allow us to see all the files in the package.

Find the "Widgets->GP_NoteWidget_Newspaper_Barrel02" file and then right-click on it.
Select the "Create Sub-Archetype..." option from the list.
This will open up a small dialog where you can choose how to name the new file, and in what package to place it. This file will be a copy of the selected file, one that automatically "inherits" all its properties(even if they later change).

Make sure you save the file to a new package, or one you've already created. Do NOT save it to your Level Package(the package with the same name as your level).

For example's sake, let's call it:
Package: "GP_BigBadNotesPackage"
Grouping: Widgets
Name: GP_NoteWidget_Newspaper_BigMess01

One you're happy with your choice, click OK.

Right, so you should now have your new Note Widget file. It'll already be setup like a real note, but you'll want to change the text, the image, and possibly even the colouring.

Before we do that, let's also create the Page object first, so we can test the look of your Note.

Creating the "Page"

Now that we have the Widget, we're going to need the Page; a physical object to draw the Widget onto.

Head back to the GP_Punchout package and select the following file: "Pages->Arc_Page_Newspaper_Barrel02".
This is the Page file, and it's already setup to look right.

So, just like before, right-click on the file and select "Create Sub Archetype..." from the list.
This will once again open up the small naming dialog.
Like before, choose the name of your target Package and the file's Name and Grouping.
Of course, this time it's slightly different, because the Name and Grouping are different.

For example's sake, we'll call it:
Package: "GP_BigBadNotesPackage"
Grouping: Pages
Name: Arc_Page_Newspaper_BigMess01

When you're done, click OK.

Right, you should now have your new Note Page file. The only left to do with this one is set it to use your new Note Widget file. So go ahead and double-click the file to open up its properties.

Expand the VCDebris Note section and then find the Note Scene Template field.
You'll notice the Note Widget for Barrels is already being used. We'll want to clear that and use a different object, our own Note Widget.

To do this, click the small box on the far right of the Note Scene Template field. Its tool-tip says "Clear text". Once cleared, go back to the Content Browser -- keeping the properties window open -- and select your Note Widget file; GP_BigBadNotesPackage->Widgets->GP_NoteWidget_Newspaper_BigMess01.
With it selected, click back on the properties window you had open. It may be hidden behind the Content Browser, so move it out of the way if you need to.
Now, click on the green arrow to the right of the Note Scene Template field. This will assign your new widget to the page object.

At this point you'll probably get an error message warning you that it "Failed to assign RSWidget'GP_BigBadNotesPackage.Widgets.GP_NoteWidget_Newspaper_BigMess01' to the Note Scene Template property, see log for details". This is a lie. Despite its warning, the note will have been applied anyway and should be working, so ignore it and click OK.

Right, with that done we can now move on to styling your note, and giving it some text content.

Customizing Your Note

With both archetypes created, we can begin to do the actual meat of your Note.

Start by opening up the Note Widget's properties by double-clicking on it.
Once open, expand the RSWidget section.
You'll notice a whole bunch of properties. The only one you need to worry about now, is the Widgets field. A field which, currently has four elements. Each one represents a different graphic on the Note page. They are:
[0]=Article Heading
[1]=Article Image(Photo)
[2]=Article Headline
[3]=Article Body Text


We'll be editing all of those, so go ahead and expand the contents of element [0]'s RSWidget section.

Ok, once again we're presented with a long list of properties. We'll only want the Mods field this time. Expand it, and then expand element [0].
This is the Article Heading. It's a multi-line text field, typically used to indicate what News Station or Corporation the article is from. Who created it essentially.

Having used "GP_NoteWidget_Newspaper_Barrel02" as our template, the heading will already be set to "Station Times", and coloured with the typical "Station Times" blue.
You can, if you want leave it at that. But if you want to make a new News Station, simply expand the RSWidget Mod Caption section and type whatever you want into the Caption field.
If you want to have multiple lines, simply insert a \n between your text.
You can take the time here to adjust any other settings you want, but by default it should all already be pretty perfect. You can of course change the colour if you want.

Moving on, let's take a look at the Article Image(Photo) next. Head back up the chain to the first Widgets list I mentioned. Then, expand element [1], and then its Mods field, element [0]. We'll be doing the same with all the visual elements.

With the Article Image expanded. Let's give it a new image.
To do so, you'd have to import an image file into your package. In the bottom-left corner of the Content Browser, you'll notice an Import button. Simply select an image file of your choice. It can be almost any file type you want, but make sure its dimensions are square, and ideally in powers of 2.
512x512 TGA files work best.
Once imported, simply select it in the Content Browser, and with your Note Widget's properties window open, click on the green arrow to the right of the Photo Mod's Texture field.
Alternatively you can use the official image files already present in the GP_Punchout package, if you think they are suitable.


Ok, we've got an Article Image and an Article Heading. Now we just need the Article Headline and Article Body Text.
Custom Punch-Out Notes #2
Simply repeat the steps used for the Article Heading above with the Article Headline, and then Article Body Text.

Fill in your text content using multi-line \n symbols where needed until you're satisfied with your story.

You may quickly discover that your story is too long or runs off the edge of the page and needs to be adjusted. This is normal, and can take a long time to tweak. We'll get to that after the next step.

Placing And Testing Your Note

With all of the note content done, the only thing left to do is test it, tweak it and use it!

Simply open up the Content Browser and select your Note Page object from earlier.
Then, with your note selected, right-click on a surface in your level somewhere and select the "Add Archetype: GP_BigBadNotesPackage.Pages.Arc_Page_Newspaper_BigMess01" option.

With the actor placed, launch PIE(Play In Editor) with the green Play Button on the top tool-bar of the editor window. Once your level loads, walk over to your note and pick it up.
If everything worked out, you should see a note complete with a Heading, Headline, Photo and Body Text. You may however notice your text doesn't fit the page, either running off the side completely, ending a line far from the edge, or being so long it runs off the bottom of the page.
These are common problems, but tend to take up a lot of time getting them right.

Close PIE and then open up your Note Widget's properties again.
Adjust the text fields based on your test and keep repeating until you get your text cut down enough that it fits the page nicely.
You may have to be extra clever in coming up with ways to say more with less space, mainly by choosing synonyms with less letters, or a more direct wording of some phrase or meaning.

Eventually you'll have a good looking note that you think is adequate, allowing you to move on to getting the game, and Custom Punch-Out Conditions to use it.

Using Your Note

Open up your level's World Properties and navigate to "World Info -> My Map Info -> Punchout ->Custom Punchout Definitions".

Notice the Resulting Pages list? This will let us use our new notes in connection with the corresponding conditions.
First, click the little green cross to the right of the field. This will add a new element.
Now, with the properties window still open, find and select your Note Page object in the Content Browser. Next, right-click on the file and select "Copy Full Name To Clipboard" from the list.

Head back to the Level Properties and your Resulting Pages element [0]. Click in the empty field and press Ctrl+V. This will paste a reference to your Note Page into the field, so the game knows where to find it.

And with that, it's essentially done!
Now, when you punch-out from your level, and have met the conditions of your Custom Punchout Definition, you'll receive a nice new note in the Office.

From here you can begin to customize your note, coming up with new styles and new stations, injecting your own brand of humour, or whatever else you wish to convey.
Just one thing to keep in mind, and that is to not play too loose with the Font Size field on your Note Widget's captions.
Yes, smaller fonts will allow you to fit more text, but don't assume that everyone has large screens that will allow them to read small text.
That goes the same for Text Color, a very faint or bright white-ish text will be very hard to read on the already bright page.

Beyond that, you can add all kinds of graphics with a bit of experimentation.

Right! That concludes Custom Punch-out Notes, and with that you should now have a pretty neat setup for creating your own notes and conditions.
Stacking Areas
So you want to add stacking areas to your level? No? Well too bad, because you're gonna hear about it anyway!

These are optional, but unfortunately they are also currently the only way to give players the ability to do an "Exceptional" (Employee of the Month earning) job.

So let's get started!

Finding Stacking Volumes

Once again we'll be copying things from another level. We seem to do that a lot, don't we?
Well there's a good reason; if you copy it you'll have all the tedious properties already setup, so you'll have less work to do. I myself have not made a stacking volume from scratch since I made the very first one. Anyway, I digress; onward!

Go ahead and open up the VC_Sewer level. Now look around for the stacking volumes.
You'll find one by the "water"(Crates), and another by the back gate up the stairs(the one with all the bodies, the Barrels one).


In each stacking area is a decal(a large white thing), this projects the paint markings on the floor, so you know it's there. You will also notice a large green wire-frame box(its edges might be hidden in the walls). This is the active part of the stacking area, it does all the work and designates the space for stacking-detection.



Now, go ahead and select both the decal and stacking volume(the green wire-frame box). Make sure you select the other stacking area as well. You should have 4 actors selected; two green boxes & and two decals. Do make sure you select the correct decal as well, you'll know it by its flat "preview box" which looks straight down at the floor.



Bringing Them Down to Your Level

Ok, with all 4 things selected, go ahead and copy them(Ctrl+C). After this, open your level and find the spot where you want to place them.

Right-Click on the floor and select the "Past Here" option. You will probably notice that neither stacking area is in the right position.
Select one whole stacking area(the decal AND the green box), move it around until it's where you want it.
The Orange Decal being the Crate area, and the Yellow one being the Barrel area.










The Properties

Once you're satisfied with its position, you can now edit some of its properties.
Select the volume(Green-Box) and open its properties window(F4).
You'll notice the valid Barrel/Crate types are already defined, as is the penalty offset and the required object count.

Valid Archetypes decides which objects are to be detected by this area. To change the values you'd have to look in the GP_Archetypes content package(Under objects) for something to add. To actually use it, right-click on one of the archetypes in the content browser and select the "Copy Full Name to Clipboard" option, then return to the stacking area's properties and paste that into one of the lines.

Required Count decides how many valid objects are expected to fit in the area(usually as many as you put in the level).

Can Partially Fill decides if the area can be partially stacked, or must be stacked up to or exceeding the Required Count before any bonus from stacking will be gained.

Penalty Offset decides how much work penalty is taken off the mess state of the level for fully stacking this area. The bonus you gain for filling it, basically.
If you give it a negative value, you can punish players for putting things in the area. This could be quite useful if your level contains dangerous objects, or areas in which certain things must NOT be stacked.

An important thing to remember about the values: A penalty offset of 250 is equal to 10 pieces of viscera. So the higher the Penalty Offset, the more objects that need cleaning can be ignored in the level.


Changing Your "Designated Area"


So by now you've probably got the properties of your volumes right, but the size and shape is all wrong.

Lets start with the decal. Select the bugger and open its properties.
Expand to the Decal Actor Base - Decal - Decal section as shown.
Here you'll notice a property for changing the material, which will alter the color, shape, and writing of the painted area marking. To find more decals you can use, look under the Env_Decals package in the content browser.



You'll also notice the Width and Height properties. These of course do as they suggest. They will be needed if you change the material for your decal, as some are rectangles and others are squares.




Ok, that should be good now, however the actual stacking volume(Green Box) itself is wrong and needs reshaping.
First, select the bugger. Then click on the "Geometry Mode" icon on the left-most panel in the editor(It says "Modes" above it).

A dialog box should appear, and the whole green box will have solid green faces.
Select a face(which should now go even greener), then use the movement widget to move the face inwards and outwards from the box until it's positioned where you want it.



Repeat this with the other faces of the stacking area box. Just make sure you keep the box straight, avoid strangely angled edges, the faces must be flat and tidy. Be sure to keep the face on top of the box a good deal higher than the floor, so players can optionally stack higher instead of wider.


Right, you should have it shaped correctly now, so go ahead and change back to "Camera Mode", this icon is right next to the "Geometry Mode" icon.


Splendid! Everything should be nice and fancy now. As a final act after completing the stacking areas, give your level a full compile. The icon on the top toolbar with a box and a small light bulb on it(Says "Build All"), as you probably already know.

Great, well that's that.
Give it a go! Though it might be hard to actually test.
Airlocks #1
So, you want to add an Airlock to your level.

Airlocks are fairly simple, but do require some complex setup to get them working smoothly with all the bells and whistles.

Doors
To start with, let's place the doors.

Open the Class Browser and select the Viscera->VCMover class.
Now, right-click on a surface in your level where you want the door to go.

You should now see a flat mesh that will soon become an airlock door.
Open the Content Browser and navigate to Content->Viscera-Environments->Env_ZeroG_01. Fully load the package and then select its "S_Env_Grav_Airlock_Door_lower" mesh file.

With your VCMover actor selected, open its properties(F4) and expand the following sections: Dynamic SMActor->Static Mesh Component->Static Mesh Component.
Now, click on the "green arrow" to the right of the Static Mesh field.
The mover should now look like the lower half of an airlock door.

Make sure to position the mesh correctly for your uses, and then edit its properties under the VCMover section.
Change its settings to reflect what is show in the image here.

Once that's done, make sure your mover is selected and then press Ctrl+W to duplicate it.
You should now see a duplicate.
Open its properties, and once again find the Static Mesh field.
Click in the field and change its value from StaticMesh'Env_ZeroG_01.Meshes.S_Env_Grav_Airlock_Door_lower' to StaticMesh'Env_ZeroG_01.Meshes.S_Env_Grav_Airlock_Door_top'.

There, you should now have the upper half of the Airlock door. With its properties still open, make sure to change the End Position value Z to 64.0

Fortunately, since you duplicated the mover, you don't have to change any other properties, so let's move on and create the other set of doors.
You do this simply by selecting both the lower and upper doors, duplicating them with Ctrl+W, and then moving the duplicates to where you want the other set of doors to go, inner/outer.
All done!

Control Panels

Next step is adding the 2 control panels.

Open up the Actor Classes browser again and select the Viscera->VCInteractiveActor->VCInteractiveActor_AirlockConsole class.
Now, moving back to the editor's perspective view, right-click on a surface inside your Airlock and select the Add VCInteractiveActor_AirlockConsole Here option.

You should now see a big ugly bucket dispenser...that's not right.
Unfortunately, we'll have to give it the right mesh.
So open up the properties(F4) and find the Static Mesh field under VCInteractiveActor->Stat Mesh->Static Mesh Component section.

Now, open the Content Browser again and navigate to and select: Viscera->Environments->Env_Medical_01->Meshes->Deco->S_Env_Console_A_01
This is the typical console used in VCD.
With the mesh file selected, go back to your VCInteractiveActor_AirlockConsole actor's properties and click the green arrow to the right of its Static Mesh field.

The actor should now look right. Go ahead and position where you want inside the Airlock.
After that, make sure to change its properties to what's show in the image.
You can even add a small light to make the console more lively, as seen in the image.

Now that you've got a console, select and duplicate(Ctrl+W) it then move the duplicate outside the airlock doors, on the inside of your level. Position it where you want, and give it the little light too if you wish.

Airlock Volumes

Ok, next step is adding the volumes to control gravity and the destruction of actors within the Airlock.

First, using the Builder Brush, shape a volume around your Airlock. Making sure it encases the inside of the Airlock but that its bounds do not exceed the center of each Airlock Door and reach outside the Airlock.

Once you have the shape, click on the Add Volume icon on the far left panel of the editor.
Select VCLowGravityVolume from the list.

You'll now have a volume that will be used for both destroying actors and toggling gravity within the Airlock.

Next, do the same with another brush. This time however, place the brush outside the Airlock on the outside of your level, where everything will be ejected to.
Make sure you choose the VCDisposalVolume for this one. This will allow any objects that touch it to gradually be killed off as they fly away from the Airlock.

Open up the VCDisposalVolume actor's properties and set its Disposal Rate to 0.3, and make sure Always Track is ticked.

Target Points

Next we'll set-up some Target Point actors for use as a "target" for where objects will fly toward, and also as targets for some sounds to play.

Open up the Actor Classes browser and select the Uncategorized->TargetPoint class. Now, right-click on a surface and place three of these actors. Place one in the center of the outer doors, one just outside the outer Airlock doors, and finally one where you want to play the Airlock's mechanical sounds(Pressurize/Depressurize/Jam) to indicate what the Airlock is doing.

You should now have all the actors you need for targeting.

Linking Everything

Finally, we have all the actors we need for the Airlock to work, but we still need to connect it all up to get it functional.

The first step is the Scripted Control actor.
Open up the Actor Classes browser and select Viscera->VCScriptedControl_AirlockDoors.
Place this actor(which looks like a Llama head) in the middle of your Airlock somewhere.

This is what links everything together...well, mostly everything.
Open up its properties and let's get cracking!

First things first, notice the small orange "padlock" near the top-right of properties window?
Make sure you turn that on. This will allow you to keep the properties window for your Scripted Control actor open while you select other actors.

Start by selecting the Control Panel you placed on the inside of your level, not the one inside the airlock. Then, click the green arrow to the right of the Inner Panel property field. Do the same for the Airlock Panel, by selecting the console actor on the inside of the airlock and assigning it to the field.

Next, select both the Airlock Doors that go from the Airlock to the inside of your level. Hold down Ctrl to select multiple actors. Then, with both of those selected, click on the green arrow to the right of the Inner Airlock Doors property field. Follow that up by doing the same with the Outer Airlock Doors.

Now, select the VCLowGravityVolume you added earlier and assign it to both the Low Grav Volume field and the Airlock Volume field.

Next, select the Target Point actor your placed outside your Airlock and assign it to the Ejection Target field.

Finally, select the main gravity volume in your level(if you have one). This will be the volume that the rest of your level, or the area beyond the airlock uses to decide if the gravity is off or not.
Select it and assign it to the Main Low Grav Volume field.

With all the actor references assigned, make sure now to set Ejection Velocity to X=192.0
This will give the Airlock some ejection power, shooting objects out the door when it opens.

And done! There is just one last step, and that is getting the sounds to play.
Airlocks #2
Playing Sounds With Kismet
To get sounds working, you'll have to script them in Kismet. So go ahead and open the Kismet window(Green K icon on top toolbar).

With your VCScriptedControl_AirlockDoors actor still selected, right-click anywhere in the Kismet window's blank area and select the New Event Using VCScriptedControl_AirlockDoors_01->Airlock option.
You should now have a working Airlock event.

Next, right-click in the blank area again and add four of the following Kismet Actions: New Action->Sound->Play Sound.

Keep three stacked above each other and move the last one further down.

Now, going back into the editor's viewports, make sure you select the Target Point actor we added earlier. The one we were going to use as a target for playing all the sounds.

Go back to the Kismet window and right-click in the blank space to the right of your three clustered Play Sound actions. Select the New Obj Var Using TargetPoint_1 option from the list.
Now simply click and drag a line from the Target Point object you just created in the Kismet window to each of the Target inputs you see underneath the three Play Sound actions. They should appear as small purple blocks.

When you're done, you should have three lines connecting the Target Point object to the Play Sound actions.

Select the top-most Play Sound action. This will be the "Jam" sound.
With the action selected, open up the Content Browser and find and select the following file: GP_Tools2->JHARM->A_GP_JHARM_Jam_Cue.
Now, going back to the Kismet window assign the sound file to the Play Sound field.

Next, select the next Play Sound action down and select the following file in the Content Browser: Env_Audio_ZeroG->Sounds->A_Env_Grav_DePress_Cue.
Then assign it to the Play Sound action's Play Sound field.

Lastly, do the same with the next Play Sound action down. Assigning the next sound file: Env_Audio_ZeroG->Sounds->A_Env_Grav_Press_Cue.

Finally, let's see about that other Play Sound action.
First, select the Target Point actor we added to the level earlier. The one centered in the Outer Airlock Doors. Now, heading back to Kismet, add an Object variable of it to the Kismet window.

With the object variable added, click and drag a line from it to the Target input node of the final Play Sound action.
Next, select the Play Sound action, and with it selected navigate to and select once again the following sound file in the Content Browser: Env_Audio_ZeroG->Sounds->A_Env_Grav_DePress_Cue.
Assign it to the Play Sound action's Play Sound field.

Whew, almost done!
The very last thing to do now, is link up the various Kismet objects.
Simply follow the image show here, dragging lines from each of the Airlock event's output blocks to the Play Sound input blocks.

Well Hoorah!

And that's that! Your Airlock should now be fully functional.
There are a few other things you can do to improve it, like adding extra Gravity Volumes to keep the player walking when they go into the Airlock, or making sure the Gravity in the Airlock changes based on the rest of the level when the doors are closed.
Both of which you can see examples of in the official level, Gravity Drive(VC_ZeroG_New).
Cables and Pipes (Splines)
Viscera Cleanup Detail levels often feature a whole bunch of cables and pipes running along the floors and coming out of walls. These are usually connected to the machines you use, such as the What a Load and Slosh-o-Matic machines.

But, what are they? And how do they actually work?

Adding Splines

Well, they are composed of actors called "Splines". They are a series of linked actors that bend and warp a mesh to follow a curved line.

They are pretty easy to create and use, but do have a few finicky elements.
Let's start be adding two of the actors and connecting them together.

Open the Actor Classes browser and select the "Uncategorized -> SplineActor -> SplineLoftActor" class. Once selected, right-click on a surface in your level and select the "Add SplineLoftActor Here" option. This will add the spline actor we'll be using. This is the only type of actor you'll need to make a spline.

Now, with it added you'll probably notice the actor's sprite is very large, and obscures your view a little, making it hard to work with. You can easily change this by adjusting the scaling of the actor using the "Scaling Boxes" in the bottom right of the editor's window.

By adjusting the left-most box, you change the actor's uniform scale. The other three are for each axis, but we don't need those.

Set the scale to something like 0.25. This will allow you to work with it easier, while still being able to see it too. Depending on how small your cable will be, you may want to reduce this even more.

With the Spline Actor selected, go ahead and open up its properties window(F4).
Then expand the Spline Loft Actor section.
Here you'll see a bunch of properties that determine the spline's appearance.

Let's start with the Deform Mesh. This is the mesh that we'll be warping to follow the spline.
Naturally the obvious choice is a simple cylinder, or cable shape.
To find it, we'll open the Content Browser and navigate to "Viscera -> Environments -> Env_Small_01 -> Meshes -> Deco". There you should see an S_Env_Small_Cable_01 file. If not, try "Fully Loading" the Env_Small_01 package first.

With the S_Env_Small_Cable_01 mesh file selected, go back to the properties window of your Spline Actor and click on the green arrow next to the Deform Mesh field to assign the cable mesh.

Nothing is going to happen yet, so let's set some more properties. Next up, Deform Mesh Materials.
Click the green cross to the right of the field, this will add a new element to the list. Now we just need a material. There are many different ones in VCD. You'll find them in the various Environment content packages.
For this example we'll use the one in Env_Small_01, under Resources -> Materials.
Select the MI_Env_Small_Cable_02 file and then click on the green arrow in your Spline Actor's properties window, next to the Deform Mesh Materials' element [0].
This will apply the material.

So, still nothing is. That's ok, we'll change one more setting.
Make sure the World XDir field is changed to:
  • X=1.0
  • Y=1.0
  • Z=0.0


Ok this is ridiculous, nothing is happening. You sure you know what you're doing?
Yes, I do...I think.

There is just one last step to get a Spline showing up, and that is actually linking two actors together. Now it all makes sense, doesn't it?

Linking Splines

With all the properties set and ready to go, we can begin to actually shape our spline!
The easiest way to do this is to just duplicate the actor at the end of the spline each time we want to add a link, and then change its connections.
But, how do you link them? Well that's easy.

With your Spline Actor selected, press Ctrl+W to duplicate the actor. Then move it a bit away from the first actor.
Next, select both actors and then right-click on one of them.
In the down-down list there should be a Spline category, and under that a "Connect/Flip" option, select that.
Ta-dah! You now have a connected spline. And if you move one of the actors around, you'll notice how the mesh curves toward it

Now, you'll likely want more than two points, so how do you create another? Well, as I mentioned earlier, the easiest way is to simply duplicate the actor at the end(the last one you added). As you do so, you'll notice a problem. The new spline is now linked just like the last one, causing a branch instead of a chain. This is easily fixed by disconnecting the two, and then re-connecting them to the correct link.
Select your new Spline Actor(the third one), and then the first link(the first actor you added). With them both selected, right-click on either one and select the "Spline -> Break" option to sever the link.

Now, with the link severed, select your second and third Spline Actors and then right-click on either one and select the "Spline -> Connect/Flip" option like earlier to link them together.

Well, that's going ok, but there is another problem. It's getting very difficult to see the cables with the Spline Actors' sprites getting in the way. So, select all your Spline Actors and reduce their Uniform Scale down to 0.05. Unfortunately this also scales your Cable. This is easily fixed by open up their properties and changing the Scale X and Scale Y fields to 3.0.

But wait...there is yet another problem!
Chances are the middle link in your Spline will look all twisted and messed up. This is a common problem. Your spline may look ok at the moment, but you're almost certain to come across this issue. So how do you fix it?
Simply select the middle and last spline(or whichever two are affected) and like before, select the "Spline -> Connect/Flip" option mentioned previously. With the links already connected, they will now instead be flipped, fixing the strange alignment(twisting) issue.

Whew, with any luck your Spline should now be behaving and you can continue to add links and stretch out your cable.

Of course, you're going to notice very quickly that the curve of your cable is all wrong, either too bendy or not bendy enough. This is easily fixed at least.

Changing The Curve

With a single Spline Actor selected, you'll notice there are some long white lines protruding from it. If you click on the squares at the end of one of the lines, you can move it around to change the curve's "tangent". This can help smooth out the curve if you lengthen it, and it can also bend the curve, making it, well, curvier.
Some experimentation will be needed to get the right curve for your cable, so just keep fiddling until it's right.

Along with using the tangent, you can rotate individual Spline Actors to better line up or bend the curve. This is more manageable than using the tangent, but you'll need to use a combination of them both to get the right effect you're looking for.

And with that, we've reached the end of Splines. As you can see, they are pretty straight forward(or bendy as the case may be), but do take a bit of tweaking to get right.
But you should have all you need to make all kinds of curved cables and pipes for your levels.
Sand-Traps / Saarlac Pits
Right, time to add some extra toothy ground-holes; otherwise known as Sand-Traps.

You'll typically find these monstrosities in Unearthly Excavation(VC_Digsite). But...how do you actually add them to a level and get them working properly?

Digging a Hole

The first thing you'll want to do is ensure that your level has a place to put the Sand-Trap. You do this by removing geometry around the are where you want the trap to go, in the shape of round pit. The larger the pit, the larger the Sand-Trap you'll have to put in.

Make sure you keep the pit fairly deep as well. You can of course always adjust it once you've placed the trap itself. One thing you need to ensure, is that the pit doesn't just open up into the void. There must still be geometry surrounding the walls and floor of the pit. Make sure it's encased, but not in the way of the trap.

You can see in the image here what one of these pits might look like without the trap yet added.
The surrounding edges of your pit will probably be very different. That's ok, just as long as there is space for the trap, and no gaps in the lower part of the pit.

With that hopefully good, let's move on.

Placing the Trap

First, open the Actor Classes Browser and navigate to and select the Viscera -> VCSandTrap class.
With it selected, right-click on a surface in your newly created pit, and then select "Add VCSandTrap Here" from the list.

You should now have a Sand-Trap placed in the pit, but it's probably the wrong size and not in the right place.

Make sure you re-position the trap and scale it correctly until it fits.
You can scale the Sand-Trap by using the "uniform draw scale" box near the bottom right of the editor's window. See the image for an example.

Once you have the Sand-Trap positioned and scaled how you want, we're going to need to place another actor to act as its collision, so objects can't fall into the trap through the edges.


Open the Content Browser and then navigate to Viscera ->Gameplay->GP_DigSite. Right-click on GP_DigSite and select "Fully Load" from the list, to ensure we have access to the content. Then, select the following file from that package: sandtrap->M_TrapBlocker01.

With the static mesh file selected, go back to your editor's perspective viewport and right-click near the pit. Select "Add StaticMesh: GP_DigSite.sandtrap.M_TrapBlocker01" from the list.
You should now see an unsightly ring shaped mesh.

Adjust its positioning and scaling until it fits into your Sand-Trap. The idea is to use this mesh as the "lip" of your Sand-Trap. It slops upward and onto the topmost part of the sand-trap, sticks out over the inner edge slightly, and then drops sharply into the trap's mouth. Make sure the mesh is positioned as seen in the image here.

Adjusting Properties

With the Trap Blocker mesh still selected, open its properties window with the F4 key.
There are a whole lot of settings to change on this one.

First, expand the Static Mesh Actor -> Static Mesh Component sections. Now, closely follow the image shown here. Set all the Bold properties as indicated. Either ticking or un-ticking them to match the image. You can however ignore "Replacement Primitive".

Each one of these settings changes the way the mesh is either displayed or what restrictions it has. Being an invisible mesh the player will never see, we want it to be hidden in-game. And since it's hidden, it doesn't need pointless lighting that will just ruin our shadows in the area. Also, since it's invisible, we don't want any decals to spawn on it as fleshly bits go rolling into the pit.

Once you've set all the properties for the Trap Blocker correctly, we can move on to the properties for the Sand-Trap itself.

Select the Sand-Trap actor and then open its properties with the F4 key.
Expand the VCSandTrap section.
You'll notice a bunch of properties here, but the only one we really care about is Sand Fill Max. This decides how much sand the player will have to shovel into the trap to cover it completely.

You can set this to whatever you want, but as an example, here are the typical values for Sand-Traps of varying sizes.

Large=40.0
Medium=32.0
Small=24.0

Right, with that property set, your Sand-Trap is now finished!

You can now begin to decorate the area around your Sand-Trap with rocks if desired, like in Unearthly Excavation. One thing to note about them however, is that the player and physics objects need to interact with the rocks differently to make walking near the rocks smooth. You can check out the Collision properties of the rocks used around Sand-Traps in Unearthly Excavation(VC_Digsite) to see how it's done.
Sentry Guns #1
Sentry Guns. Big, bad, "shooty" things. The bane of every hard working Janitor.

You've seen them, you've been blasted by them, you hate them. Now it's time to make them, so you can spread that extra special relationship!

Sentry Guns are fairly simple, but can be a little complex if you're not used to the triggers and systems they use. Each Sentry Gun has 3 key elements; Mounting, Scanner, and Gun(Optional, dead or alive).

Mounting Up

The most important part of the Sentry Gun is the actual Mounting, this is where all the main logic for the gun is handled, and it decides where your Sentry Gun will go, what it can see, etc.

Start by opening up the Actor Classes browser, and then navigating to and selecting the following class: Viscera -> VCMounting -> VCSentryMounting.

With it selected, go back to the editor's perspective viewport and right-click on a surface where you want to place the Sentry Gun. Select "Add VCSentryMounting Here" from the list.

With the mounting placed, you'll probably want to move it to wherever you think suitable.
Select the placed Mounting and open its properties with the F4 key.

If you expand the VCMounting and VCSentryMounting sections, you'll see a bunch of properties for changing the default state of the gun, and also the object that can restore this Sentry Gun.

If you wish to have this Sentry Gun fully restored at the start of the level, then tick the Start With Gun tick-box. Along with that, you can set the amount of ammo it'll start with using the Starting Ammo field.

Along with having the gun restored by default, there are two other possible states: Unrestored and Destroyed.
Unrestored is simply just the Mounting with no additional objects. A gun must be restored, but there is no currently destroyed gun present.
Destroyed is where the sentry gun was destroyed prior to your arrival. A destroyed gun object is present along with a scorch mark. Let's try and create that one now.

Destroying the Gun

To create a destroyed gun, we'll place a debris object and a splat. Both of these are present in the Plopper and Painter tools mentioned in previous sections of this guide. You can place it using that.

Simply launch the PIE window in the editor to test your level, then open the console with the "~" key. Type "GiveTools" and press enter.

This will give you access to the object placement tools. Press the 5 key twice to access the Painter. Use it to place a Scorch mark on the Sentry Gun mounting. Once you've placed the scorch mark, press the Copy to Clipboard button. Once you've copied the info, go back to the editor using the Windows key, or Alt-Tab.
Once back in the editor, click Edit -> Paste in the editor's tool bar.

With the splat placed, go back to the PIE window and select the Plopper tool with the 6 key. Use it to place a Robot -> Sentry Gun Wrecked object and position it on the underside of the Sentry Gun Mounting. When done, press Copy to Clipboard button again and then paste the actor back in the editor as before.

Once you're finished, you can close the PIE window.

If you've done everything right, you should now have something close to what's shown in the image here.

Initiating Scanners

With the gun itself done, we now need to actually trigger it with something.
For the sake of this tutorial, we'll be using "scanner screens" like you'll find in the Revolutionary Robotics level.

These are essentially just two objecst(a Trigger Volume and a Target Point) and a collection of static meshes to make the appearance of a detection field.
We won't be bothering with placement of the Static Meshes, as I'll assume you either have them in-place already, or yours is different. The only thing that really matters is the Trigger Volume and Target Point.

Shape your Trigger Volume so that it fits around the door-frame, and only slightly extends beyond the bounds of the scanner plane. If it's too thick, it will detect objects too soon before it enters the field. If it's too thin, some objects may be able to slip through before the collision system can properly detect the object.
You can see in this image below how it's done.

Along with the Trigger Volume, you'll want the Target Point actor. This will be used by Kismet as a proxy for sound playing. Make sure you open the Actor Classes browser and select the Uncategorized -> TargetPoint class.
With it selected, right-click on a surface near the scanner in the editor's perspective viewport and select "Add TargetPoint Here" from the list.
Once placed, make sure to move it into the center of the scanner. Or wherever you want detection beeps and alarm sounds to play from.

With those done, the final and most important step is to link everything together so the Sentry Guns understand what's going on.

Wired Up

The first step is to feed some info into the Sentry Gun when something passes into the scanner. For this, the scanner itself will typically have to process two kinds of actors. Pawns, and VCDebris. The former being Players, the latter being Physics Objects.

With the Trigger Volume in the scanner selected, open the editor's Kismet window.
Right-click in an open space and select "New Event Using TriggerVolume_0 -> Touch" from the list.

Select the new Touch event and expand its Touch Types and Sequence Event sections in its properties window.
Make sure to add two elements to the Class Proximity Types field. Make one of them VCPawn and the other VCDberis.

Next, set the following properties:

  • Max Trigger Count = 0
  • Re Trigger Delay = 0.0
  • Player Only = Unticked


This will make it so that players and physics objects passing into the scanner will be detected, and there will be no delay between detections, making it impossible for things to slip through undetected.

Right, now to feed info into the Sentry Gun.
Right-click in a blank space in the Kismet window and select New Action -> Viscera SentryGun from the list.

With the action placed, click and drag a connection from the Trigger Volume's Touch Event Touched output to the SentryGun action's Anger Target input.

Then, right-click on the SentryGun action's Instigator input and select "Create New Object Variable" from the list. With the Object Variable placed, click and drag a connection to the Trigger Volume's Touch Event Instigator output.

Next, temporarily close the Kismet window and select the VCSentryGunMounting actor you placed earlier. With it selected, go back to the Kismet window and right click the SentryGun action's Guns input and select "New Object Var Using VCSentryGunMounting_0" from the list.

This effectively links the two things together. The Touch event triggers and then feeds the actor that touched it into the SentryGun action, telling it to designate it as a target for its anger. This will in turn result in the Sentry Gun attacking the player or object, if it's a valid threat.
Which brings us to the next point; playing an alarm sound for valid threats, and a beep sound for anything passing through the scanner.
Sentry Guns #2
It's important to before we proceed, that you can feed more object variables into the SentryGun action's Guns input if you wish more Sentry Gun mountings to be alerted by a single scanner field. This is often the case in Revolutionary Robotics(VC_Robot)

Beep, Beep, Beep...KILL!

Moving on, let's start playing some sounds.

In the editor's perspective window, select the Trigger Volume actor you placed earlier.
With it selected, go back to the Kismet window, right-click on an empty space and select "New Event Using TriggerVolume_0" from the list.
Select the event and changes its properties as reflected below:

  • Class Proximity Type [0] = VCDebris
  • Class Proximity Type [1] = VCPawn
  • Max Trigger Count = 0
  • ReTrigger Delay = 0.05
    Player Only = Unticked



This, like the first event, allows both physics objects and players to trigger the event. But, unlike the first event, this one has a slight Re Trigger Delay to prevent excessive playing of beep sounds. Imagine carrying a bin full of objects through the scanner. That's a lot of beeps at once! That'd be pointless.

Next, we'll place two Play Sound actions to account for the beeps and alarm sounds.
Right-click in an empty space in the Kismet window and select New Action -> Sound -> Play Sound from the list. Do this twice.

When you're done, select the first one and move it next to the Touch Event, and then move the other Play Sound action to the right of that one.

Drag a connection from the new Touch event's Touched output to the left-most Play Sound action's Play input.

Next, select the left-most Play Sound action and expand its Seq Act Play Sound properties section. Moving out of Kismet, open the editor's Content Browser and find the Viscera -> Gameplay -> GP_Robot content package. Right-click it and select Fully Load. Once loaded, find and select the following file from the GP_Robot package: GP_Robot -> SentryGun -> A_GP_Robot_Scanner_Beep_Cue.

With it selected, go back to the Kismet window and select the left-most Play Sound action again. Click the green arrow to the right of the action's Play Sound field in its properties window. This will assign the Scanner Beep sound to the Play Sound action.

Repeat this process for the other Play Sound action to the right. Only this time, assign this file instead: GP_Robot -> SentryGun -> A_GP_Robot_Scanner_Alarm_Cue.

This will assign the Scanner Alarm sound to the Play Sound action.

Excellent, we have both sound actions setup, but they still need a target.
Go back to the editor's perspective viewport and select the Target Point actor your placed near the scanner earlier.
With it selected, go back to the Kismet window and right-click on the Target input of left-most Play Sound action. Then select "Create New Obj Var Using TargetPoint_0" from the list. This will create a reference to the target point.
Click and drag another connection from the newly placed Object Variable to the right-most Play Sound action's Target input. Both sounds should now be linked to the same target and will play from that location whenever something enters the scanner or sets off the alarm, hoorah!

Unfortunately, the alarm sound isn't being told to play yet. We will now address that by simply dragging a connect from the SentryGun action's Threat output to the right-most Play Sound action's Play input. This will trigger the sound only if a valid threat enters the field, and the sentry gun is able to attack. Otherwise just the beep will be heard.

If you've done everything correctly, your wiring should look like the example shown in the image here. If not, well then you've made a duff-up and will have to read over the steps again. For shame!

Congratulations, you've now endangered the lives of countless Janitors. Welcome to the dark side!
Security Cameras #1
Security cameras, they're watching, always watching. Perhaps you've seen them in Revolutionary Robotics(VC_Robot), perhaps you'd like to add some to your own level.

In this example, we'll learn how to place the typical variety of Security Camera you get in Revolutionary Robotics, as well as a little bit about how to generally make any surface render the view of a Camera.

Mounting Up

The first thing we'll need is a mount to put the camera one, this usually goes on a wall somewhere.

Start by opening up the Content Browser and finding the following package: Viscera->Gameplay->GP_Robot. Right-click on the package and select "Fully Load" from the list.

With the package loaded, select the following file inside it: GP_Robot->Cameras->S_GP_Camera_Base.
Next, find a good wall surface to place the Camera Mounting on in the perspective viewport. Rick-click on the surface and select "Add StaticMesh: GP_Robot.Cameras.S_GP_Camera_Base" from the list.

Position the mounting where you think suitable. You may have to move it again after placing the Camera itself.




Placing the Camera

Next step is to place the Camera itself. Start by opening the Actor Classes browser and un-ticking the Placeable Classes Only and Show Categories boxes.
This will replace the neat structure you're used to, with a full list of all actor classes arranged in a hierarchy.
Find and select the following class: Actor->SceneCaptureActor->SceneCapture2DActor->VCRemoteCamera->VCRemoteCamera_Content.

With the class selected, go back to the editor's perspective viewport and right-click on a surface near the Camera Mounting. Select "Add VCRemoteCamera_Content Here" from the list.

Make sure to move the Camera into position so that it's origin/pivot is on the end of the Camera Mounting.
After that, rotate the camera to look out at the scene you want it to capture. Remember to keep the Camera's facing centered on the scene. When the camera is up and running, it's going to swivel the same amount both left and right, so you don't want your camera facing left or right at the start. Unless you intend to make it a stationary camera. You can see how it's down in the image here.

Capturing the Scene

Capturing the view from a Camera requires two things; a Render Target and a Material to use it.

The Render Target simply takes the view of the Camera and outputs it to a texture, the Material then uses that however it wishes.

Let's start with the Material. Open the Content Browser and navigate to and select the following file: GP_Robot->Cameras->MI_Env_Rob_Sec_Screen.
Right-click on it and select "Create New Material Instance (Constant)..." from the list.
This will create a copy of the material that will inherit the properties of its parent(the file you're copying). You could create any material of your own to make use of the Render Target, but for this example we'll use the viewing screen from Revolutionary Robotics.

A dialog will now pop up asking you where you want to save the file. Make sure you save it to your Level Package. That's the content package with the same name as your level, such as VC_MyLevel.
Choose a Name and Grouping for your new Material.
See the image for an example.

The Material Instance Editor window will now open. Keep it open but don't change anything.


Next, go back to the Content Browser, your Level Package should already be open and selected, if not, navigate to it until its contents are visible. Next, right-click in the open area of the Content Browser. Select "New TextureRenderTarget2D" from the list.
This will open up another Dialog asking you where you want to create the file.
Choose your Level Package just as before, and name it "T_CameraRenderTarget_A01". Then, in the Options section of the dialog, make sure to expand the properties area(black bar). Under here you'll find some settings for the image's dimensions. You may want to use something different(based on the dimensions of the surface you'll be using it on), but in this example we'll use 1024x768, which fits nicely on the security monitors.
Set the Height to 768 and the Width to 1024 and click OK.
When the new Texture Properties dialog pops up, close it.


Next, with the Material Instance Properties window for your MI_Camera_ScreenA01 file still open, use the panel on the left to navigate through the properties to: Parameter Groups->Texture Parameter Values.
Make sure the Texture Render Target file you just created is selected in the Content Browser, then, using the Material Instance Properties window, click on the green arrow to the right of the Tex_UI field. Then, click on the tick box next to the field.
This will override the parent's default value and make the material use your Render Target as its display.

If everything went correctly, you should see your material go green, as shown in the image here.

Linking the Camera and Screen

With the images set up, we now need the Camera to output its view to the Render Target. At the same time, we'll tweak the Camera to make it behave how we want.

Make sure your Render Target texture is selected in the Content Browser. Then, go back to the editor's perspective viewport and select the Camera actor your placed earlier. Open its properties with the F4 key, then expand both the VCRemoteCamera and Scene Capture Actor sections.

You'll see quite a few settings. Luckily, you don't need to worry about many of them for most Cameras. We'll run through some of them later on.
For now, just look to the Texture Target field. Click on the green arrow to the right of it. Assuming your Render Target texture is still selected, it will now be applied to the Camera. This will output what it sees to that texture, and then to the Material that uses it.

Make sure you tick Skip Update if Texture Users Occluded. This will make sure the game doesn't needlessly render what the camera sees if no one is looking at the security screens(which we'll place shortly).

Next, look at the Camera Rotation Range field. This, as the name suggests, is how far to the left/right or up/down the camera can rotate. The Y field only applies to Cameras the player can take control of. Normally Cameras only pan left and right on their own.
Depending on how or where your Camera is positioned, you may want to restrict its movement more or less. Adjust the Camera Rotation Range field as you see fit. Remember that 16384 is 90 degrees and 8192 is 45 degrees. That means both left and right, so 90 degrees would allow a total of 180 degrees of motion/swivel.

The rest is good for now, we'll come back to this later.
Security Cameras #2
The final step in making the Camera's view show up, is placing the Security Monitor that uses it.
Open the Content Browser and select the following file: GP_Robot->Cameras->S_Env_Rob_SecurityMonitor_01.

Then, using the perspective viewport, right-click on a surface near where you wish to have the Security Monitor. Possibly in a security room, or on a guards desk?
Select "Add StaticMesh: GP_Robot.Cameras.S_Env_Rob_SecurityMonitor_01" from the list.
Once placed and positioned how you want it, select it and open its properties(F4).

Expand the following sections: Static Mesh Actor -> Static Mesh Component -> Rendering.
Click twice on the green cross to the right of the Materials field. This will create two material slot overrides. We only want element [1], but we need to add [0] anyway. If we leave its value blank, there won't be a problem.
Keeping the properties window open, go back to the Content Browser and select your Camera Screen Material: "MI_Camera_ScreenA01".

Then, in the properties window, click on the green arrow to the right of the [1] field.
This will apply your new Camera Screen to the Security Monitor, allowing the player to see what the Camera sees.

You now have a working Security Camera and Monitor!
In this example we'll also be adding the ability to take control of the camera and move it around.
If you don't want that in your level, then simply skip over this part to where we discuss some of the properties of the Camera itself.

Taking Control!

To get the player able to use the screens, we'll need a Trigger.
Right-click on the Security Monitor's face and select "Add Actor -> Add Trigger" from the list. This will place a small use-able trigger where the player is likely to click.
Make sure you position the trigger in the center of the screen, then open its properties.
Expand the Trigger -> Cylinder Component section.
It's possible the trigger is the right size, but if not, adjust the Collision Radius and Collision Height fields to suit your needs. 20x20 is usually good.

Next, making sure the Trigger is selected, open the Kismet window.

Start by creating a new Used event from the Trigger. Right-click in an open space and select "New Event Using Trigger_0 -> Used" from the list.
Then, right-click in the open space again and place a Set Remote Camera action; "New Action -> Viscera -> Set Remote Camera" in the list.

Position the Set Remote Camera action to the right of the Used event.
Then, drag a connection between the Used output and the Set Camera input.
Do the same with Unused and Remove Camera. If all went well, it should look something like the image shown here.



Next, select the Used event and edit its properties(bottom left). Set Max Trigger Count to 0. This will prevent the event from locking up after its first use.

Now, right-click on the Used event's Instigator output and select "Create New Object Variable" from the list. Once created, drag a connection from the variable to the Target input of the Set Remote Camera action. This will link the player that used the trigger to the Camera actor, allowing the action to know which player's view to interact with.

Finally, make sure your Camera actor(the VCRemoteCamera_Content actor) you created at the beginning is selected. Then, heading back to Kismet, right-click on the Set Remote Camera action's Cam Target input and select "New Object Var Using VCRemoteCamera_Content0" from the list. This will specify what Camera the action must link with the player.

If everything goes well, the player's view will now be set to the Camera, and the Camera will be controlled by the player whenever the player comes along and uses the Security Monitor.

Other Properties

Finally, we now have a working Camera that renders its view to a Security Monitor, and the player can even take control of it! At this point there may be a few things you'll want to tweak on the Camera actor itself, so let's go through some of the most important values in its properties.


  • Camera FOV Range: This allows you to alter how much zoom the Camera has. Smaller values allow a closer look at things, high values allow a wide angle.
  • Auto Camera Pan: If you don't want the Camera to pan around the room on its own, un-tick this box.
  • Camera Pan Rate: Pretty obvious, the Camera will swivel this much each second. 1024=5.625 degrees.
  • Camera FPS: You can increase this for more frequent updates to the screen at the cost of performance, or decrease it for the opposite effect.
  • Far Plane: A handy optimization. This decides the cut off distance for rendering things seen by the Camera. If the Camera can see to the ends of a long room, increase it, if the Camera can only see a short distance, decrease it. Try to avoid the Camera having a high Far Plane in a small room where it can't see very far.

And that's that! You can tweak a bunch of other things if you're feeling adventurous, but for the most part you'll have little need to.

By now you've probably got a who room full of Monitors, and Cameras in every room.
Just a word of caution; Cameras are expensive to render, and can significantly slow down your level. Try to use them sparingly if possible, otherwise players may have to turn the Camera rendering off just to play your level.
Incubators #1
Incubators! Warm, square, hot-boxes for preserving only the most deadly alien lifeforms, and you want to add them? Are...are you insane?
Hmm, we'll assume you're doing this for "science", which makes it all OK! So let's continue...

Incubators, currently only found in the level Incubation Emergency(VC_Incubator).
They are comprised of 5-7 objects: The Incubator Box, the Incubator Door, the Door Button, the Light Bulb, and finally the Status Sign. There is also the optional Alien Egg and Broken Light-Bulb.

Woah, that's an awful lot! This doesn't seem like a good idea...
Well, too bad, because now you're committed!

Incubator Box

The first step is placing the actual Incubator itself.
Open the Actor Classes browser and navigate to and select: Viscera -> VCIncubator.
With the class selected, right-click on a valid surface in your level using the perspective viewport.
Then, select "Add VCIncubator Here" from the list.

Your Incubator may appear black; ignore that and instead scale down the Incubator to a 0.55 scale. Look near the bottom right of the editor window, you'l notice on the bottom toolbar that there is a series of numeric boxes. Make sure you enter 0.55 into the left-most one. This will scale the Incubator down to the correct size.

Next, position your Incubator somewhere suitable. Against pillars or walls works quite well.
Once positioned, you'll need to add the Light-Bulb.

Light Bulb

At the moment your Incubator is without a light, so its not lit inside, making it difficult to tell what's going on. We'll likely need to compile lighting after placing the bulb.

To place the Light-Bulb, open the Actor Classes browser and select Viscera -> VCMounting -> VCLightBulbMounting. Once selected, right-click on your Incubator and select "Add VCLightBulbMounting Here" from the list.

This will place the Light-Bulb nearby. Make sure you scale it down to a 0.55 Draw Scale like you did with the Incubator itself. Then, position it as shown in the image here.

You may have to rotate and move the Light-Bulb very finely to get it right.
To do so, observe the tick-boxes in the bottom-right of the editor window. There is one next to both the rotation and movement grid snap amounts. Un-tick both the Toggle Drag Grid and Toggle Rotation Grid boxes. This will allow you to position the Light-Bulb very finely indeed.
Don't forget to tick them again after you're done, it's usually best to keep them on.

With the bulb positioned, let's go ahead and setup its properties. Select the Light-Bulb and open its properties using the F4 key. Expand the VCLight Bulb Mounting section.
Here you'll notice two properties; Has Bulb and Is Active. If you want the Incubator bulb to already be restored at the start of the level, then tick both of these boxes.

While there, you can change the light's colour under the Bulb Light Component properties.

If you want the light to be destroyed and not just missing at the start of the level, you'll also need to place a destroyed Light-Bulb the player can pickup. The best way to do this is to duplicate the VCLightBulbMounting actor and replace the copy with the relevant debris actor.

Broken Bulb

Start by ensuring the actor is selected, then press Ctrl+W, this will place a duplicate nearby. Make sure to move it back into place where the original mounting is.
With the duplicate selected, open the Content Browser and navigate to: Viscera->Gameplay->GP_Archetypes. Right-click on the package and select "Fully Load" from the list. This will ensure we have access to the bulb debris.
Next, select the following file: GP_Archetypes->Objects->Incubator->Arc_VC_Lightbulb_Broken_01.
This is the Broken Bulb actor. Make sure it's selected, and then, going back to your VCLightBulbMounting duplicate, right-click on it and select "Replace With -> Add Archetype: VCDebrisLightBulb GP_Archetypes.Objects.Incubator.Arc_VC_Lightbulb_Broken_01" from the list.

If everything went well, you should have a broken Light-Bulb in the same place as the Bulb Mounting. Just remember that you may have to move the broken bulb out of the way if you need to select the mounting. Be careful in future to make sure you have the correct actor selected as we move into more detail in this tutorial.

Status Sign

To show what's going with the Incubator, we'll need a sign of some kind.
While these are pretty simple, they unfortunately need a bit of changing to get them correctly set-up.

Start by opening the Actor Classes browser and selecting the following class: Viscera->VCSign->VCSign_Counter. With the class selected, right-click on your Incubator and select "Add VCSign_Counter Here" from the list.

This will place the sign nearby. Make sure to first scale it down to a Draw Scale of 0.3, and then position it inside the Incubator, near the top of the case, as shown in the image here.

Once positioned, open its properties(F4) and expand both the VCSign Counter and VCSign sections.
Here you'll notice a bunch of properties you can change. For this example, we'll set it just like it's shown in the image.

  • Counter Range:Y = 1.0
  • Sign Background Color:R = 0.3
  • Sign Background Color:G = 0.1
  • Sign Background Color:B = 0.0
  • Sign Scene Class = VisceraUI.VCUI_IncubatorSign


I short, this tells the sign to use the Incubator UI for its display, what background colour to give that display, and how many items the counter can reach. In this case, 0-1; an egg, or no egg.

Linking

With the three most important components placed, we now need to link the Incubator to its bulb and sign.

Select the Incubator and open its properties window, then expand the VCIncubator section.
There are three important properties here: Required Contents Count, Light Bulb, and Sign Actor.
If you want, you can change the number of eggs required to properly restore this Incubator. Just remember that the Sign Actor's Counter Range property must match this value for everything to work properly. At this point, you can even change the Required Contents Class to choose a different kind of actor that counts as a valid restore. Instead of Alien Eggs, you could use Dynamite for example! It's up to you.

Right, let's actually set the Light Bulb and Sign Actor values to set this thing up.
With the Incubator's properties window open, click on the "padlock" icon on the top right of the window. This will allow you to keep the properties window open while you select other actors.

With the window locked, select the VCLightBulbMounting actor you placed earlier, and then click on the green arrow to the right of the Light Bulb field in the properties window.
This will assign the actor reference to the field.

Next, do the same with the Sign Actor, select the VCSign_Counter actor and assign it to the Sign Actor field.
Your Incubator should now be properly linked!

At this point your Incubator doesn't necessarily need anymore work. But, if you want to add the door and egg, we shall!
Incubators #2
With the main bits out of the way, let's try and add the door to the front of the Incubator.

Incubator Door
Go ahead and open the Actor Classes browser. Select the following class: Viscera->VCMover.

With the class selected, right-click on your Incubator in the perspective viewport. Select "Add VCMover Here" from the list.

This will place an ugly floor piece. We'll now change this to the glass front piece used by the Incubator. Select your new VCMover and open its properties(F4).
Make sure you set all the Bold properties as shown in the image here.

You can find all the files shown here by opening the Content Browser and navigating to the destination it shows. If the package you need it "greyed out", then make sure to right-click on it and select "Fully Load" from the list.
When you have a file selected in the Content Browser, simply click on the green arrow to the right of the property field you're changing. This will assign the reference.

Here is what those values are:

  • End Position:Z = -37.0
  • Move Out Start Sound = SoundCue'Env_Audio_Movers_01.SoundCues.A_VC_Door_B_Open_Cue'
  • Move Out End Sound = SoundCue'Env_Audio_Movers_01.SoundCues.A_VC_Door_A_Open_Cue'
  • Move Back Start Sound = SoundCue'Env_Audio_Movers_01.SoundCues.A_VC_Door_B_Open_Cue'
  • Move Back End Sound = SoundCue'Env_Audio_Movers_01.SoundCues.A_VC_Door_A_Open_Cue'
  • Encroach Pawn Behavior = EB_Reverse
  • Encroach Debris Behavior = EB_Reverse
  • Static Mesh = StaticMesh'Env_Incubator_01.Meshes.Misc.S_Env_Incu_Incubator_A_GlassFront'


Once the VCMover actor has the new glass mesh assigned, you may notice that you can no longer select the actor. If this happens, then ensure that "Allow Translucent Selection" is turned on in the editor. You'll find it on the top toolbar of the editor.

With everything else set, you'll quickly notice that the piece of glass is too big, so make sure to scale it down to 0.55 like you did with all the other components. Once scaled, move and rotate the glass around until it fits in the front face of the Incubator. You'll notice the grooves where it's meant to go. It may take a fair bit of tinkering with the grid snap values to get the glass nicely positioned.

With the glass positioned, and its properties set(hopefully correctly), it's time to add the Button.

Door Button

The Button is nothing more than a Trigger placed over the "Open" button on the Incubator mesh.

Simply right-click on the Incubator and select "Add Actor -> Add Trigger" from the list. This will place a Trigger actor nearby. Once placed, make sure to move it to where we need it, in the center of the "Open" button. You may also want to scale the Trigger down to a value of 0.25.

Once the trigger is scaled and positioned, open its properties and change its collision sizes.
If you expand the Trigger -> Cylinder Component section, you'll notice the Collision Height and Collision Radius settings.
Make sure to set them to the following:

  • Collision Height = 8
  • Collision Radius = 8


With both the trigger and door placed, we can now link them up.

Linking

Ensure the newly placed Trigger is selected, and then open up the editor's Kismet window. Once open, right-click in the empty space somewhere and select "New Event Using Trigger_0 -> Used" from the list.
This will place an event linked to the Trigger actor.

Select the Used Event and, in its properties window in the bottom-left, change Max Trigger Count to 0. This will ensure the player can keep using the trigger endlessly.

Next, right-click in the open space next to the Used Event and select "New Action -> Viscera VCMover" from the list. This will place an action used to change the state of a mover. In this case, our glass door.

Link the Used Event to your VCMover action by dragging a connection from the Used output node to the Move Toggle input node.

Now, close the Kismet window and select the glass door you placed earlier.
With the glass selected, go back into the Kismet window and then right-click on the Mover input node of your VCMover action. Select "New Object Var Using Trigger_0" from the list. This will place a reference to the glass door and automatically link it as the target for our VCMover action.
If everything went well, your setup should look similar to the image here.

And with that, you've completed the door!
If you test it out, you should be able to use the Hands to open and close the door using the "Open" button on the Incubator.

At this point, you've got everything an Incubator could need expect one thing; an egg.

Alien Egg

This step is of course optional. The idea is that the player restore the Incubator and Egg on their own. But, if you want to either indicate to the player what they need to put in the Incubator, or just simply to have it restored at the start of the level for the hell of it, then you can of course place the Egg in the Incubator before hand.

To place the egg effectively, we'll need to use a more complicated method than just placing the egg itself. We'll have to use a Mess Factory.

Start by opening the Actor Classes browser and selecting the following class: Viscera-VCMessFactoryDebris. Then, right-click on a surface inside your Incubator and select "Add VCMessFactoryDebris Here" from the list.

With the actor placed, first scale it down to 0.5 and then open its properties using F4.
Expand the VCMess Factory Debris section, and then the Mesh -> Static Mesh Component sections.

With the properties window left where it is, open the Content Browser and select the following package: Viscera->Gameplay->GP_Incubator. Once selected, right-click on the package and select "Fully Load" from the list. This will allow us to access the Alien Egg's Static Mesh.

Select the following file: GP_Incubator->egg->SK_GP_Egg_A.
With the file selected, go back to the properties window and click on the green arrow to the right of the Static Mesh field to assign the static mesh.

Finally, with the mesh assigned, tick the Wake RBOn Spawn box and set Debris Class to VCDebris_AlienEgg.
This will ensure that the egg is awake on level load, and that the factory will actually spawn the Egg class, and not something else.

  • Debris Class = VCDebris_AlienEgg
  • Static Mesh = StaticMesh'GP_Incubator.egg.SK_GP_Egg_A'
  • Wake RBOn Spawn = Ticked


Obviously at this point, if your Incubator won't have be using an "Alien Egg", you'd select a different class.


That's all there is to it!
You should now have a door and even an Alien Egg placed inside the Incubator.

Congrats, you've now created a device for breading lifeforms that will kill us all.
I'm just going to go crawl into the panic room now...
Seed Beds #1
So, you want to add a pleasant/vile little plant bed. One where you can take some seeds, plant them, and watch an organism grow?
No problem, but one must respect the science, otherwise it might just eat you.

In this section will be covering the seed beds commonly seen in the "Hydroponic Hell" level.


Building the Base

In truth, seed beds don't have to look anything like they do in Hydroponic Hell. Since the "plants" are the actual object, what they are resting on is not important.

For Hydroponic Hell, we used a combination of these two meshes in the content browser:
(1): Environments->Env_Greenhouse_01->Meshes->Misc->S_Env_Green_Tray_01

(2): Environments->Env_Greenhouse_01->Meshes->Misc->S_Env_Green_PlantBed_01



You can choose to use whatever surface you want for the final plant to grow out of, or even just open ground like you'll see in the "Overgrowth" level.

So go ahead now and find/build a suitable place for your seed beds, and then we shall continue.
Go on, I can wait...

Planting the Plants

After we have a surface, we can place the eventual plants.

Go ahead and open the Actor Classes browser and look for Viscera->VCSeedBed. Select that, and then in your level, right-click on a surface and select "Add VCSeedBed Here".

You should now have a small plant visible on the surface with a wireframe cylinder around it.
Much like the surface it's on, the plant itself can be anything, not even a plant.
If you want a disgusting alien eye-ball to grow out of the ground, then so be it!

First things first however, you'll want to move the plant around so it actually looks like it's not hovering above the dirt, but partially covered.
Once that is done, we can go ahead and open its properties with the F4 key and start tinkering with its bits.

There are a few properties to take special note of here.

First, the Sign Actor value must point to any sign you want to have around to track the progress of your seed bed's replanting.
This is how the player will be informed of what needs to be done. Assuming that's what you want.
More on that later.

Secondly, there is the Restored value. This one is pretty obvious, it makes the plant fully grown and restored from the start.
Sometimes you'll want a plant or two already present in your seed beds for continuity. If that's the case, then tick this.
If however you want the player to actually plant a seed to restore this plant, then leave it un-ticked.

Here is a rundown of the other values:
  • Seedling Scale: This is the scale of your plant when it is first planted and begins to grow.
  • Seedling Scale Max: This is the scale of your plant once fully restored.
  • Seedling Growth Rate: This is the rate(in terms of scale) at which your plant will grow every second. By default this results in a 10 second growth time.
  • Plant Sound: This is the sound that plays as the plant's seed is planted and begins to grow.
  • Plantable Objects: This list allows you to specify custom objects to use as seeds for this plant. Want it to grow from a bucket? No problem!
  • Weed Objects:This list allows you to specify custom objects to use as pesky weeds for this plant bed. If any of these objects are touching the plant, it will be considered(by the sign actor) to be infested with weeds!
  • Collision Component->Collision Height and Collision Component->Collision Radius: These values allow you to change the seed and weed detection area for the plant. As you change it, you'll notice the wireframe cylinder around the plant change in response.


  • Finally, we have Stat Mesh. This allows you to change the physical appearance of the plant to almost anything. Want it to look like that horrid alien eye-ball, or even a simple box(you're growing boxes now...)? Then simply change the Stat Mesh->Static Mesh Component->Static Mesh value to whatever other Static Mesh content object you want.

Signing On For Signage

Now for the signage.
Start by opening the Actor Classes browser and selecting: Viscera->VCSign->VCSign_Counter.
Then, right click somewher near your seed bed and select "Add VCSign_Counter Here" from the menu.

At this point you'll probably notice two things:
(1): The sign is way too big.
(2): Your coffee has gotten cold, eugh!

Rectify #2 before continuing.
Once that is done, and with the sign selected, we're going to scale it down a tad.
Look to the bottom right area of the editor window, you'll notice the 4 scaling boxes. Change them so that they match what's seen in the image here.



With that done, open the sign's properties window with F4.
It's time to change a few values to make our sign support the seed bed setup.

First thing's first, the counter range!
This lets the sign know how many seed beds there are it needs to track. So it can give an accurate progress readout of how many plants in the bed have been restored.
You'll want to set the Counter->Y value to the number of VCSeedBed actors you have in the bed associated with this sign.
You can ignore the X value and leave it at 0.

Next, improve the sign's Background Color. You can see the values typically used in the image.

Then, we tell the sign to use the UI scene typically reserved for Seed Beds; VisceraUI.VCUI_SeedBedSign.

Finally, there is one more value which can be helpful for the sign, and that is the Sign State.
It tells the sign what state it will typically start in; Empty, Full/Restored, Partial, Weeds Present.
Set it accordingly.
  • 0 = Empty
  • 1 = Partial
  • 2 = Full
  • 3 = Weeds

The other values you don't need to worry about, but here is what they do.
  • Sign Tex Size: Used to give the display area of the sign the correct resolution and ratio to avoid stretching or pixelation of its contents. If you use a different static mesh as the sign with a different display surface, these values can be useful.
  • Static Sign: If ticked, the sign will not update every frame, but only once the info changes. For most cases this is the norm, as there are no dynamic per-frame elements on the display.
  • Panel Material ID: If the static mesh used as the display has different material groups, this will allow you to specify which one is the actual UI display.


Ok, now that the values are right, it's time to hook-up the sign and the plants/VCSeedBed actors.


Go ahead and select your previously placed VCSeedBed and open its properties.
Click on the Lock Selected Actors icon at the top of the properties window(it looks like a padlock).
This will allow you to select the VCSign_Counter actor you placed. Go ahead and do that by clicking on it.

Then, with the sign selected, click on the green arrow to the right of the Sign Actor value field in the properties window.
This should point the field to the sign actor in the level.

Make sure to do this with all of your placed Seed Beds.
Remember to turn the "padlock" off if you need to select another actor and see its properties.
As long as the padlock is on, you will only ever see the properties for the actor you had selected when you turned it on.

And that's that, you should now have a working seed bed!

One last thing to do, however... and that's ruin it!
Seed Beds #2
Weed Seeding

Any good seed bed needs a few pesky weeds.

Placing them is easy, there are two main ways.
(1): Using the Plopper tool.
(2): Placing the actors from the content browser.

We'll cover #2.
First, open the Content Browser and find the following content package:
Gameplay->GP_Archetypes
Then inside it, you'll find the weed objects under:
factories->Greenhouse->Arc_Factory_Weed_Large01.


Select one of the three weeds you'll find there, then right-click near your previously placed VCSeedBed. Select "Add Archetype: ***" from the pop-up menu.
You should now see a weed placed nearby.
Move the weed around and position it appropriately.

Keep in mind however, that the VCSeedBed actors and by extension, the sign actor can only detect the weeds if they are touching the VCSeedBed actors.


As you can see in the image here, the weed is in contact with the wireframe cylinder of the VCSeedBed.
You can adjust the VCSeedBed's collision properties as mentioned earlier to account for this if you need.

And there we have it, weeds!

Seeds, please...

At last, the final step; seeds!

Before we can restore our lovely/ghastly seed beds to life, we first need the give the player a way to get seeds.
Now, you can of course place all the seeds in the level they will ever need, but if you want to give them an unlimited supply, you're going to need to use the Vending/Supply machine.

First, find the machine in the Actor Classes browser and select it: Viscera->VCSupplyMachine

Now, right-click somewhere in your level and select: "Add VCSupplyMachine Here" from the pop-up menu.
With it placed, open its properties with F4.

Now, under the Map Supply Field you're going to want to add an entry.
Do this by clicking on the green "plus" sign to the right of the field.

Now, set the values as indicated in the image here.


Choose VCDebris_Seed for the Item Class and enter: Texture2D'UI_VC_Vendor.Textures.UI_Vend_Seed_01' for the Tex field.

Make sure the Coords values for UL and VL are both 128.0.

Lastly, if you want the machine to put out multiple seeds at a time(up to five) then put that number into the Item Count field.

And that's that! You should now have all the elements for your seed beds setup and working.
Signage #1
Ah, signs! The fairy lights of the space station world. The crumbs of a path to assured destruction.
Or, you know, just something to tell players where they are...

Anyways. So you want to add them to your level eh? Well they are varied thing, as there are several different kinds of varying complexity, so let's dive into it!

Door Signs

Door signs are handy little labels you can put above doors to indicate what room lies beyond.
Much like you would see in the "Caduceus" level.

Start by opening up the Actor Classes browser and finding and selecting the following class:
Viscera->VCSign->VCDoorSign->VCDoorSign_Content

Now, right-click somewhere in your level and select Add VCDoorSign_Content Here from the pop-up menu.
You should now see a sign actor nearby.

However, it's neither scaled correctly nor using the correct static mesh.
Let's fix the static mesh first.
Open up the sign's properties with the F4 key and expand the VCSign->Stat Mesh->Static Mesh Component sections.

Here, you'll want to set the Static Mesh field to:
StaticMesh'env_medical_01.Meshes.S_Env_DoorSign_A_01'
You should now see the correct door sign mesh.

It's not scaled correctly however, so we'll fix that next.

In the lower right part of the editor window, you'll see the 4 scaling boxes.
Make sure they match the values shown in the image here.

Once that is done, open up the sign's properties again(if it's not already) with the F4 key.
Here too you're going to need to match the values you see in the image.

I'll give you a rundown of what the values do.

VCDoorSign
  • Sign Symbol Texture: This is the texture to use for the symbol show on the left side of the door sign. You can use your own if you want, but in this example we'll be using the default value: Texture2D'UI_VC_Interactives.Textures.T_UI_DoorSigns01'
  • Sign Symbol Coords: This decides what portion of the sign symbol texture to use for the symbol. In the texture used here there are many symbols stacked next to each other, so we use some sub coords to pick the right one. Each one is spaced by 256 units. You can inspect the texture yourself to pick a symbol you like. To do so, click on the "Find object in Content Browser" icon to the right of the Sign Symbol Texture field.
  • Sign Symbol Color: This will obviously change the color of the symbol displayed.
  • Sign Label Color: This will change the color of the text displayed to the right of the symbol.
  • Sign Label: This tells the sign what text to display to the right of the symbol. You can use a localized lookup string as you may have seen in the Notes section of the Guide, or just enter straight text, like: Disposal.
  • Sign Font Size: If the text seems too small or large for your purposes, change this value accordingly.

VCSign
  • Stat Mesh: We've already somewhat covered this one. It will allow you to change the display mesh for the sign. However, it can't be just anything, it needs to support an active "display". If however you just want a mesh which always has the same info displayed on it, then you don't really need these doors signs at all and are in the wrong place. Fool of a took!
  • Sign Background Color: This allows you to change the background colour of the door sign, naturally.
  • Sign Tex Size X and Sign Tex Size Y: These are only used if you use a custom display mesh with a differently sized display area, or if you have scaled the mesh oddly and need to correct stretching.
  • Sign Scene Class: Decides what UI scene will be used to render the info. VisceraUI.VCUI_DoorSign is really the only class that supports it, so...
  • Panel Material ID: Again, you only need to worry about this one if you're using a custom display mesh.
  • Static Sign: This decides if the sign should update regularly or not. If it's ticked, the sign will NOT update regularly. In the case of door signs, it's ok to keep it un-ticked, as there is no other way to update the panel from time to time and you don't want the display to vanish.
  • Sign State: This doesn't really apply to door signs, so leave it at 0.

Right, and that's pretty much it for door signs. If you set all the values correctly, it should now look right when you see it in-game.


News Tickers

Adding news tickers to your level is quite easy. We shall do that now.

First, open the Actor Classes browser, then find and select:
Viscera->VCSign->VCNewsTicker

With it selected, right-click on a surface in your level and choose Add VCNewsTicker Here from the pop-up menu.
You should now see a news ticker object nearby.

Be sure to move it around, rotate it and scale it until it seems suitable for you.
Then go ahead and open its properties with the F4 key.

By default you don't have to do anything else. Just placing the object is enough to have it working in your level.
However, if you want custom messages to be displayed on the ticker, there are a couple different options.
  1. Override the messages on the VCNewsTicker actor.
  2. Add/Include new ones to your level using the World Properties and Map Info.
  3. Add/Include new ones to the entire game by defining them in new .INI and .INT files.

We'll cover #1 and #2. For help on #3, ask around on the forums.

Option #1

With the properties for your VCNewsTicker open, add an entry to the Override News Stories field.

Here you can specify unique messages to display on the ticker. Just keep in mind that adding even one entry to this field removes all default messages.
It will now only display what is in this list.

If you're ok with that, then keep add entries and changing values.
You can see an example in the image here.

The textures typically used for the News Background value can be found in the UI_VC_Interactives package, such as: Texture2D'UI_VC_Interactives.Textures.T_UI_NewsTicker_Ferret01'

The other values are pretty self explanatory.

Option #2

On the filebar at the top of the editor, click on:
View->World Properties.

With the World Properties window open, expand the Map Info section and(if you haven't already done it) create a VCMapInfo object in the My Map Info field.

Then expand to My Map Info->VCMap Info.
Here you'll find a Map News Stories field identical to the one in the VCNewsTicker actor.

Go ahead and add entries as you see fit.
This time however, instead of the values overriding anything on the news tickers, the entries will be added to all news tickers in your level, and there will be no need to edit them directly.
Unless of course you still want some to override the stories, in which case they will also ignore any defined in the World Properties.

And that's it, you should now have some custom news stories in your level, huzzah!
Signage #2
Large Displays

Adding large displays to your levels can be tricky and complex, so we'll not cover every aspect of it, but rather point you in the direction of some examples and show you how to setup a basic one.

Start by opening up the Actor Classes browser, then finding and selecting:
Viscera->VCInteractiveActor
Right-click somewhere in your level and then select: Add VCInteractiveActor Here from the pop-up menu.

You should now see an actor nearby, but it doesn't yet have the correct static mesh, so go ahead and open its properties with the F4 key.
Expand the VCInteractive Actor->Stat Mesh->Static Mesh Component sections, then change the Static Mesh field to: StaticMesh'Env_General01.Meshes.S_Env_MessageScreen_A_01'


Once you've done that, set the following values:
  • Panel Material ID = 0
  • Accepts Input = Un-ticked

You should now see the typical display screen used in many official levels.
The scaling might not be right for your purposes, so go ahead and change that using the boxes in the lower right area of the editor.
You should only need the left-most one.

Next, we'll be changing some more important values.


Start by expanding the UIPanel Comp->VCMachine UIPanel Component sections.

You'll now see a list of confusing values.
For the most part you'll never need to use anything other than the values shown in the image here.
They are used to setup the panel properly for input. This example won't go into adding input for this screen, but you can see the correct values used for this example Static Mesh.
If you choose to use a different static mesh intended to have input, you'll need to know what the values do. If so, head on over to the forums and ask for help.

For now, just set the values as indicated in the image all the same.

Ok so the panel is setup, but one very important thing is missing; its contents.
Here is where it gets potentially complex.

To do it right, we're going to need to construct some UI elements from scratch.

Start by opening the Actor Classes browser and un-ticking the following boxes.
  • Use 'Actor' as Parent
  • Placeable Classes Only
  • Show Categories

This will display all available classes.
Now, expand to and select:
Object->Component->RSWidget

Right-click on it and select Create Archetype...



A small menu will pop up asking you where you want to save the new object.
Make sure you select your level as the Package. Either name it exactly the same, or select it in the list.
Then optionally give it a group. This just helps keep things organized within your package.
Finally, give it a suitable name.
It's best if you follow the formatting I show here for the sake of sanity, but you can do whatever you want, you're a rebel!

Now you should see a new object created in your level package.
Find it in the Content Browser, then open its properties by double clicking it.
Start by expanding the RSWidget section and then setting the following values.
  • Id = BoardScene
  • Window = Ticked
  • Size.X = 1.0
  • Size.Y = 1.0

Now things get messy.
To make things easier, you can follow the example of another, similar screen used in the official Overgrowth level.
Using the Content Browser navigate to and open:
Content->Viscera->UI->UI_VC_InteractiveScenes->uiscenes->Jungle->Arc_UI_MsgBoard_Jungle01
Keep its properties window open and move it to the right, alongside the properties for your own widget.
Much like you see in the image above.

Now, following the example and values you see in the other object, start filling in the Mods field for your own object.
To make things easy, just copy across/match any fields you see in bold shown in the other object.

To add entries to the Mods field, first click on the green "plus sign" to the right of it.
Then, clicking on the blue "down arrow", select the correct module from the drop-down.
Start with a RSWidgetMod_Background.
Then, repeat with the next type of object. Following the example on the right, you add the following modules to the Mods field in order.
  • RSWidgetMod_Background (This one you should have already done)
  • RSWidgetMod_Material
  • RSWidgetMod_Icon
  • RSWidgetMod_Caption
  • RSWidgetMod_CaptionMultiLine

Next, as suggested, you match all the highlighted/bold fields shown in the example object's module properties.
You can simply select, copy, and paste any particularly long fields, such as the Material.

Once you have matched all the values we can begin to mix it up for our purposes.
If you haven't copied and matched everything yet, do that now.

Right, next we can change some values.
The RSWidgetMod_Background module dictates the background draw color for the entire screen. It is optional, as you can also change the background of the screen display area itself. However, we'll have it here too.

The RSWidgetMod_Material module holds a background material gradient displayed under the text that helps give the screen a less solid look.

The RSWidgetMod_Icon module holds a background icon graphic displayed under the text.
You can create your own for this, or use one of the many found under the UI_VC_Interactives package, or in certain other places.

The RSWidgetMod_Caption module is used to display a large label near the top of the screen. Typically this would be coloured differently from the rest of the text, and be larger. Saying something like "Warning!".
At the moment, the value is a lookup string. Go ahead and change it to whatever you want the text to say.

The RSWidgetMod_CaptionMultiLine module is used to display the main text of the screen. Go ahead and enter whatever you want.
You can use \n characters to break up lines.
Once done, make sure to also tick Use Backslash NChars As Newline. This makes sure the text gets encoded correctly.

Right, that's just about everything you need.
Take a moment to edit the colors, margins and icon offsets as you see fit, then we'll move on to the very last thing to do; apply the widget to your screen.


Once you're done, select the VCInteractiveActor you placed earlier and open its properties.

With the widget object you created in your package earlier selected in the Content Browser, click on the green arrow to the right of your VCInteractiveActor's Panel UIScene Template field.
A small warning message will pop up. Ignore it and click OK.
Your message board widget should now be applied to the screen in your level.

Go ahead and save your level. Whew!

And that's that, you're all done!

Test your level in PIE to see how the screen looks in-game, and then feel free to tweak the widget object as you see fit.
Recent Changes
Recent & Past Changes

Change: 16-10-2014; Added a new section(Good Level Creation Practices).

Change: 17-10-2014; Game update v0.34 now reflects what's shown in the guide, to do with where you can find VCD's classes in the Class Browser. Was previously all stored under Uncategorized

Change: 18-10-2014; Added tips for blood placing under the section about Blood & Guts, specifically the Painting paragraph.

Change: 18-10-2014; Added this section. No, this one...yes this one right here, this change right now, INFINITE LOOP, INFINITE LOOP; DOES NOT COMPUTE!

Change 23-10-2014; Added a bit about changing blood color to the Blood & Guts section, under the Blood Painting is an Art-Form area.

Change 29-12-2014; Added a new section(Doors & Lifts).

Change 29-12-2014; Added a new section(Exposing Your Level to the Game).

Change 30-12-2014; Added 2 new sections(PDAs & Paper Notes).

Change 31-12-2014; Added a new section(Stacking Areas).

Change 01-01-2015; Added a new section(Back to the Fut...Basics!).

Change 01-01-2015; Added a new section(Common Problems...And Solutions!).

Change 03-01-2015; Improved Common Problems...And Solutions! section.

Change 09-02-2015; Added 2 new sections(Matinee Movers; Section #1 and Section #2).

Change 09-02-2015; Added a new section(Punch-out and Speedrun Settings).

Change 08-08-2016; Updated/Reformed the PDAs and Paper Notes sections.

Change 26-08-2016; Added 2 new sections(Custom Punch-out Conditions #1 & #2)

Change 27-08-2016; Added 2 new sections(Custom Punch-out Conditions #3 & #4)

Change 27-08-2016; Updated Punch-out and Speedrun Settings section.

Change 29-08-2016; Updated Custom Punch-out Conditions #4 section.

Change 02-09-2016; Added 2 new sections(Airlocks #1 & #2)

Change 06-09-2016; Added 2 new sections(Custom Punch-Out Notes #1 & #2)

Change 07-09-2016; Added a new section(Cables and Pipes(Splines))

Change 12-09-2016; Updated Punch-out and Speedrun Settings section.

Change 26-09-2016; Added 2 new sections(Report Forms and P.I.Ds #1 & #2)

Change 28-09-2016; Updated Punch-out and Speedrun Settings section.

Change 28-09-2016; Added a new section(Sand-Traps / Saarlac Pits)

Change 03-10-2016; Added 2 new sections(Sentry Guns #1 & #2)

Change 10-10-2016; Added 2 new sections(Security Cameras #1 & #2)

Change 17-10-2016; Added 2 new sections(Incubators #1 & #2)

Change 10-04-2020; Added 2 new sections(Seed Beds #1 & #2)

Change 11-04-2020; Added 2 new sections(Signage #1 & #2)

Change 11-04-2020; Improved formatting on several sections and fixed the Exposing Your Level to the Game section pointing you to the wrong RUST guide!
239 Comments
eebydeeby Jan 11, 2023 @ 3:36pm 
While trying to get the incinerator to cook my goose, it ended up cooking my thighs instead lol
eebydeeby Jan 7, 2023 @ 10:30am 
Thank you so much for the help!
BlackEagle  [author] Jan 6, 2023 @ 10:00pm 
For that you'll need a VCWaterVolume
It's a BSP primitive built from the Builder Brush(the red box).

You can add volumes based on the Builder Brush by clicking on the "Add Volume" button on the bottom of the left tools panel.

Alternatively, since there isn't technically swimming support in the game, you may need to use a Low Gravity volume and add some force to it that simulates buoyancy like we did in the Sewer level's water volume.
eebydeeby Jan 6, 2023 @ 6:33pm 
I'm trying to make a level with a fish tank (currently struggling w the glass but that's at least manageable), and I can't for the LIFE of me figure out how to put water in! (Specifically a swimmable body of water like in the sewer level) any help would be helpful!!
jkcrmptn Oct 13, 2022 @ 3:21am 
Nevermind I have gotten the doors to work
jkcrmptn Oct 13, 2022 @ 12:01am 
I don't know if you will see this but I am trying to learn the editor but for the panels on doors I cant get them to work cause the images are too low res to read and whenever i click on them it just says url not found could you send an updated picture or maybe just type them out for me? I'd appreciate it a lot.
BlackEagle  [author] Nov 11, 2021 @ 1:09am 
So it works if you replace the object variable in kismet with a VCIncinerator actor, but the trigger/incineration doesn't work with a VCIncinerator_Fireplace_Horror actor?

Hmm, maybe post a threat on the forums.
If you can, select your block of actions and variables and stuff in kismet that have to do with the incinerator and then hit Ctrl+C
Then paste that into your forum post, should allow me to look at it, see if anything is odd there.

Maybe do the same with the actors in the level, namely the trigger volume and the VCIncinerator_Fireplace_Horror actor if you can.
TheGamingRealms Nov 10, 2021 @ 12:33pm 
Its all good, so I copied it from that, created my trigger volume, and nothing seemed to work for this. All settings and the Kismet is correct, I can get the actual furnace to work, but not this. Thanks!
BlackEagle  [author] Nov 8, 2021 @ 11:23pm 
Sorry for the delay.

For the incinerator, the best option might be to use the VCIncinerator_Fireplace_Horror actor. You can see its use in the small cabin in House of Horror.

Essentialy, it's invisible and acts as a tracker for objects.
You can then use a trigger to detect when objects enter and exit, much like normal.
Only you can dress up the area around the trigger however you want.
If you want, you can remove effects from it and so on in its properties.
TheGamingRealms Nov 4, 2021 @ 4:15pm 
Okay I fixed the door issue, just copied it from an official lvl, but I'm trying to make my own incinerator, I have a volume trigger made for it, I've tried multiple things, not sure if it's possible, I just want a different object other than the incinerator itself, I know I need the actor for it, I've tried even little stupid stuff like making the incinerator massive and the map being inside of it with the trigger in the incinerator that way but still nothing works, not sure what I'm doing wrong there