• Please make sure you are familiar with the forum rules. You can find them here: https://forums.tripwireinteractive.com/index.php?threads/forum-rules.2334636/

Level Design Updates to the new SDK - PART 1

Status
Not open for further replies.

[TW]Swag

Grizzled Veteran
May 14, 2009
350
100
Yonder, Georgia
There are a number of updates to the SDK that need to be documented so that the level designers know how to react to the changes. Below you will find the things that have been updated:

Classic Mode Roles

With the introduction of Classic mode we had to come up with a means for the roles to translate correctly between the game modes. To that end we added the functionality to override a role for classic mode. It was done because the Classic Mode roles sometimes have different equipment load outs than that of Action and Realism.

Squad Leaders Roles

German Squadleader -> Role Info -> Classic Mode Override Class -> RORoleInfoAxisSquadLeader_Classic

Russian Squadleader -> Role Info -> RORoleInfo -> Classic Mode Override Class -> RORoleInfoAlliesSquadLeader_Classic

Assault Roles


The Assault role got modified as well. We've deprecated the other Axis/Allies Assault role so when your map is resaved without changing out the Assault roles, they will be nullified out and you will see t-posed Russians doing a limbo in your map when you play it. (Hermes from Futurama would be proud) Replace all Assault roles as shown below:

German Assault roles:

ROInfoAxisEliteAssault -> Role Info -> RORoleInfo -> Classic Mode Override Class -> RORoleInfoAxisStandardAssault

Russian Assault roles:

ROInforAlliesEliteAssault -> Role Info -> RORoleInfo -> Classic Mode Override Class -> RORoleInfoAlliesStandardAssault

The Classic Mode Override Class can also be used to simply change what the squad configuration is when in Classic Mode. So, for example, if you want to have all Engineers to be Anti Tank roles instead while in Classic Mode, we support that.

RORoleInfoAxis{Allies}[ROLE] -> Role Info -> RORoleInfo -> Classic Mode Override Class -> WHATEVER

Action Mode Roles

In order to facilitate role availability functionality (just about the entire team can be elite assault, elite rifleman or marksman) we added some additional role properties and methods to job done; however, before I get going explaining it, let me point out some parameters to the squad UI scene:

The Squad Info UI scene only supports:

<= 11 squads/team
<= 5 fire teams/squad
<= 3 roles/fire team.

** WE DO NOT SUPPORT DEVIATIONS FROM THESE PARAMETERS **

We have a conformed role/squad/team setup that we used in RO2 which basically had 3 fire teams with 3 roles in each fire team which, when including the squad leader, had us at 10 roles per squad.

Our execution method was to add Action Mode ONLY roles to the existing squads. To defined these as Action Mode ONLY roles, we added the variable Boolean Bit "Action Mode Only" to the Fire Teams structure. In order for the system to understand that it is in FACT an Action Mode only fire team you also have to set the Minimum Players Integer field to 1. It's imperative that it's set to one(1) unless you desire 20 lashes with a cane.

Our target role availability was ~20 ADDITIONAL roles of the following:

Elite Assault
Elite Rifleman
Marksman

These roles will not need a Classic Mode override because, obviously, they are Action Mode only roles. ;)

Action Mode Override Class
: You can also modify existing non Action Mode only roles to be something else when in Action Mode. This functions basically the same way that the Classic Mode Override Class does.

RORoleInfoAxis{Allies}[ROLE] -> Role Info -> RORoleInfo -> Action Mode Override Class -> WHATEVER

*************************************************
OPTIMIZATION TOOLS

RO2 Static Mesh Combining Tool

This tool allows for you to combine similar staticmeshes into one staticmesh allowing you to reduce the overall draw calls per scene frame. We had a number of guidelines that we worked with to get the best results that we could.

1) Do not combine meshes that do not share that same material(s) in the same slots
2) Do not combine too many meshes that you fight with the natural occlusion systems as even the smallest of pixel of a mesh being rendered will render the entirety of the mesh
3) Do not combine meshes that will give you exceedingly high poly counts. (>5000)
4) Do not combine meshes that you cannot use over and over as this fights with the engine's instancing capability
5) Culling > Occlusion

With those guidelines in mind, select the meshes you would like to combine then:

RMB -> Combine Mesh

Select the package, group and the name of the asset that you would like to create the asset into in the popup window as if you were importing a new asset. DO NOT FORGET TO SAVE THE NEW/UPDATED PACKAGE!!

RMB -> UnCombine Mesh

This will simply uncombine the meshes and replace them with the stored reference of the original assets in the combined mesh. Do not uncombine more than one combined mesh at a time.

NOTE: When you are combining meshes it's a good idea to keep an eye on Properties -> Static Mesh Component -> Override Light Map Res and it's Boolean bit as well. Having a non default value will result in lightmap errors. To override the lightmap of combined meshes, do it at the asset itself in the package.

StaticMesh Asset Properties -> Light Map Resolution -> [INTEGER]

Procedural bCastDynamicShow TRUE/FALSE

Every static mesh object in the map has the capability to cast a dynamic shadow. A dynamic shadow uses the cascade shadowing system to make nice crisp shadows for the world objects when the player gets near them. The down side is that they can be an expensive render, relatively, when the engine must cast a dynamic shadow into an already shadowed space. To save from having to check this on each and every object in the world a new system was introduced that traces a line from the 8 corners of the bounding box of the static mesh actor back to the DominantDirectionalLight in the map. If ANY of the traces hit the DominantDirectionalLight, the bCaseDynamicShadow Boolean variable is set to TRUE. If none of the traces touches the DominantDirectionalLight then the variable is set to FALSE.

Some times you can get a false readings in situations where all 8 corners of the bounding box are contained in another mesh (such as walls with a pillar on each side of each section of wall). In this case we've given the capability for the Level Designer to override the procedural system.

StaticMeshActor Properties -> StaticMeshComponent -> Lighting -> Allow Auto Cast Dynamic Shadow Override
 
Some times you can get a false readings in situations where all 8 corners of the bounding box are contained in another mesh (such as walls with a pillar on each side of each section of wall). In this case we've given the capability for the Level Designer to override the procedural system.

StaticMeshActor Properties -> StaticMeshComponent -> Lighting -> Allow Auto Cast Dynamic Shadow Override

Thats what I noticed :D:D:D:D
 
Upvote 0
Not too far off. I am still gathering all the wonderful screenies. I plan to go over other the more complex aspects such as destructibles, satchel obstacles, satchel objectives, and all things that should be handled with explosives. Also the 100% definitive guide to overhead maps, objective overlaps, spawn overlays and everything else that shows up when you press the M (default) key.

If there is something specific you'd like to see in the next guide (arrival ~5 days) PM me for consideration.

Closing Thread.
 
Upvote 0
Status
Not open for further replies.