Skip to content

Breathing LIFE into an Open World

Array ( [blocks] => specificItem [show] => [itemId] => 13676 [exactSize] => 200 [itemFrame] => none [albumFrame] => none ) Array ( [blocks] => specificItem [show] => [itemId] => 13639 [exactSize] => 200 [itemFrame] => none [albumFrame] => none ) Array ( [blocks] => specificItem [show] => [itemId] => 13646 [exactSize] => 200 [itemFrame] => none [albumFrame] => none )
Error (ERROR_STORAGE_FAILURE)
  • in modules/core/classes/GalleryStorage.class at line 494 (GalleryCoreApi::error)
  • in modules/core/classes/Gallery.class at line 202 (GalleryStorage::search)
  • in modules/core/classes/helpers/GalleryUserGroupHelper_simple.class at line 105 (Gallery::search)
  • in modules/core/classes/GalleryCoreApi.class at line 1876 (GalleryUserGroupHelper_simple::fetchGroupsForUser)
  • in modules/core/classes/helpers/GalleryPermissionHelper_simple.class at line 64 (GalleryCoreApi::fetchGroupsForUser)
  • in modules/core/classes/helpers/GalleryPermissionHelper_simple.class at line 39 (GalleryPermissionHelper_simple::_fetchAccessListIds)
  • in modules/core/classes/GalleryCoreApi.class at line 501 (GalleryPermissionHelper_simple::fetchAccessListIds)
  • in modules/core/classes/helpers/GalleryUserHelper_simple.class at line 76 (GalleryCoreApi::fetchAccessListIds)
  • in modules/core/classes/GalleryCoreApi.class at line 566 (GalleryUserHelper_simple::hasItemPermission)
  • in modules/imageblock/classes/ImageBlockHelper.class at line 217 (GalleryCoreApi::hasItemPermission)
  • in modules/imageblock/classes/ImageBlockHelper.class at line 93 (ImageBlockHelper::_getBlockData)
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 1352 (ImageBlockHelper::loadImageBlocks)
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 867
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc(1229) : regexp code at line 1
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 1229
  • in ??? at line 0
  • in /home/aarmgorg/public_html/journal/wp-includes/plugin.php at line 213
  • in /home/aarmgorg/public_html/journal/wp-includes/post-template.php at line 230
  • in /home/aarmgorg/public_html/journal/wp-content/themes/barthelme/page.php at line 12
  • in /home/aarmgorg/public_html/journal/wp-includes/template-loader.php at line 75
  • in /home/aarmgorg/public_html/journal/wp-blog-header.php at line 16
  • in /home/aarmgorg/public_html/index.php at line 4
1
Scott Phillips

A look at Saints Row 2 – and how nodes were used to design and place the activities NPC’s can do. There were highs and lows to this system – so some takeaway of a possible, but not fully recommended way of doing it. Some main points:

  • Simple actions most commonly used are very effective – smoking, reading, talking. Need a lot of these to make the special fun ones special, since they can’t be put everywhere
  • Art editor needs to be able to show node placement, so if levels are altered it doesn’t ineterfere with where actions can take place
  • Do not underestimate how long it will take to place lots of these kinds of things in an open world.

Notes

Scott Philips – Project design architect on Saints Row 2 at Volition. It is one half of the lead designer position.

Saints Row 2 had over 100 staff at pea, 3+ years with core staff development time, and 2.6 million copies sold.

How do you bring a giant open world to life? You want to populate a realistic city. Need to fill them with tons and tons and tons of stuff. Provide “oh wow” moments.

Problems with standard memory/speed issues, but also density of people. Previous generation games had full sidewalks – GTA3, True Crime and The Getaway. Current generation, Crackdown, Saints Row 1, GTA4 has full sidewalks, limited standing/walking variations, limited world interaction (sitting on benches etc.).

Problems with the past games solutions has been scope. Limited variety to have interactions. We want the player to fuck things up so why do more then sidewalkers?

Error (ERROR_STORAGE_FAILURE)
  • in modules/core/classes/GalleryStorage.class at line 494 (GalleryCoreApi::error)
  • in modules/core/classes/Gallery.class at line 202 (GalleryStorage::search)
  • in modules/core/classes/helpers/GalleryUserGroupHelper_simple.class at line 105 (Gallery::search)
  • in modules/core/classes/GalleryCoreApi.class at line 1876 (GalleryUserGroupHelper_simple::fetchGroupsForUser)
  • in modules/core/classes/helpers/GalleryPermissionHelper_simple.class at line 64 (GalleryCoreApi::fetchGroupsForUser)
  • in modules/core/classes/helpers/GalleryPermissionHelper_simple.class at line 39 (GalleryPermissionHelper_simple::_fetchAccessListIds)
  • in modules/core/classes/GalleryCoreApi.class at line 501 (GalleryPermissionHelper_simple::fetchAccessListIds)
  • in modules/core/classes/helpers/GalleryUserHelper_simple.class at line 76 (GalleryCoreApi::fetchAccessListIds)
  • in modules/core/classes/GalleryCoreApi.class at line 566 (GalleryUserHelper_simple::hasItemPermission)
  • in modules/imageblock/classes/ImageBlockHelper.class at line 217 (GalleryCoreApi::hasItemPermission)
  • in modules/imageblock/classes/ImageBlockHelper.class at line 93 (ImageBlockHelper::_getBlockData)
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 1352 (ImageBlockHelper::loadImageBlocks)
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 867
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc(1229) : regexp code at line 1
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 1229
  • in ??? at line 0
  • in /home/aarmgorg/public_html/journal/wp-includes/plugin.php at line 213
  • in /home/aarmgorg/public_html/journal/wp-includes/post-template.php at line 230
  • in /home/aarmgorg/public_html/journal/wp-content/themes/barthelme/page.php at line 12
  • in /home/aarmgorg/public_html/journal/wp-includes/template-loader.php at line 75
  • in /home/aarmgorg/public_html/journal/wp-blog-header.php at line 16
  • in /home/aarmgorg/public_html/index.php at line 4
1

Inspiration was checking out players of Saints Row 1 – it just didn’t feel like a real place. Decided to have the AI do more interactions when the player is nearby. At pre-preduction needed to brainstorm with every department on NPC’s – walk holding hands, taxi’s, umbrellas, drinking beer, road construction crews, playing guitar, cops on patrol, people committing suicide….etc. Etc.

Put into categories (such as “Dialogue system”, “Patrolling”) – the props required, priority, and so forth. 19 categories.

Scope control – enormous – what was cut was patrols, dialogue system (vo cost would be enormous) and nodes were cut down. Also cut down on the detail – not going to see a full “go in shop buy food go out sit down and eat” – players are just going to run those over.

To implement it there are certain things added to the world:

  • Action Nodes – placed in the world by designers, one person or multiple people. Define specific behaviours through lists.
  • Object Linked Nodes – Actions on an object – sitting down and so forth. Linked in 3dsMax to the World Objects. Art generally worked on it – design only looked at it very close to the end
  • AI Behaviours – Ambient behaviour, non-location specific, umbrellas etc – code driven done by programmers.
  • Spawn Variants – Take a person in the world and give them different animation sets – old people might have oxygen tanks behind them or walking sticks.

Design – had to implement all the nodes. Hand placed. Write dialogue for it.
Programming – Implement core systems
MoCap – Not much
Art – Create props
Audio – Create SFX, record the dialogue

Intial plan was for 1 designer to do it (Scott!) but eventually had to do 6 designers to get it done. 20,000 nodes at ship.

Used a table file editor (Volition XML editor) to tweak the LIFE system. Used the in game editor (IGE) which runs in real time on the development kit to place the nodes in place.

Programming had to build everything – one programmer had to build it, lead then took over when he left near the end of the project and rewrote some of it. It was a phased implementation – multiple phases of work.

Main other areas were animations/props creation, then audio – dialogue and sound effects for it (70,000+) and music for guitar players.

Spawning Limitation Issues – like police officer serving a hotdog to another police officer, old men strip dancing to each other, and prison people having umbrellas. Basically no context for nodes, and spawning issues – sometimes too many if a node thought there was no one using it.

Also issues with props – disappearing props, orientations etc. Then there were spawning issues – co-op arbitration between spawning, collision issues and missing animations.

For streaming it is difficult and it was determined to just pre-load everything.

Amount of nodes was underestimated by Scott. In Game editor was constantly running out of memory – FPS was near 0, sheer magnitude since it loads all of them at once.

Data visualisation was a big problem – identification of dead spots was difficult (and impossible to automate). Enter Tableau – visual editor, using a python script can visualise where everything is, how many and what they are. Roughly 12,000 action nodes hand placed.

Error (ERROR_STORAGE_FAILURE)
  • in modules/core/classes/GalleryStorage.class at line 494 (GalleryCoreApi::error)
  • in modules/core/classes/Gallery.class at line 202 (GalleryStorage::search)
  • in modules/core/classes/helpers/GalleryUserGroupHelper_simple.class at line 105 (Gallery::search)
  • in modules/core/classes/GalleryCoreApi.class at line 1876 (GalleryUserGroupHelper_simple::fetchGroupsForUser)
  • in modules/core/classes/helpers/GalleryPermissionHelper_simple.class at line 64 (GalleryCoreApi::fetchGroupsForUser)
  • in modules/core/classes/helpers/GalleryPermissionHelper_simple.class at line 39 (GalleryPermissionHelper_simple::_fetchAccessListIds)
  • in modules/core/classes/GalleryCoreApi.class at line 501 (GalleryPermissionHelper_simple::fetchAccessListIds)
  • in modules/core/classes/helpers/GalleryUserHelper_simple.class at line 76 (GalleryCoreApi::fetchAccessListIds)
  • in modules/core/classes/GalleryCoreApi.class at line 566 (GalleryUserHelper_simple::hasItemPermission)
  • in modules/imageblock/classes/ImageBlockHelper.class at line 217 (GalleryCoreApi::hasItemPermission)
  • in modules/imageblock/classes/ImageBlockHelper.class at line 93 (ImageBlockHelper::_getBlockData)
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 1352 (ImageBlockHelper::loadImageBlocks)
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 867
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc(1229) : regexp code at line 1
  • in /home/aarmgorg/public_html/journal/wp-content/plugins/wpg2/wpg2embed.inc at line 1229
  • in ??? at line 0
  • in /home/aarmgorg/public_html/journal/wp-includes/plugin.php at line 213
  • in /home/aarmgorg/public_html/journal/wp-includes/post-template.php at line 230
  • in /home/aarmgorg/public_html/journal/wp-content/themes/barthelme/page.php at line 12
  • in /home/aarmgorg/public_html/journal/wp-includes/template-loader.php at line 75
  • in /home/aarmgorg/public_html/journal/wp-blog-header.php at line 16
  • in /home/aarmgorg/public_html/index.php at line 4
1
Hotdog man lapdance

What went right?

  • Organisation – Sorted in the end, worked to get thousands of nodes
  • Variety – 244 node types for huge amounts of variety
  • Cooperation – Team working together well to add more items
  • Quick Turn Around – at the end at least
  • It worked in the final product!

What went wrong?

  • Standardisation – Lots of problems getting the benches to work – anything linked to a part of the world. Getting things to a stable point in SR2 – never got to a point where it was stable enough to fix the problems.
  • Scope – Extremely difficult to test nodes, scope was just massive.
  • Insufficient Preview Tools – couldn’t check what the outcome was quickly from placing a node. Bad when Art team had 2 more months adding to the city, where they put trash cans etc. over action nodes. Led to some bugs like clipping in terrain at ship.
  • Too slow/too late implementation – took too long to get nodes in the game to test. Should have front loaded it. Had tons of gardeners for 6-8 months!
  • Not enough focus on everyday things – lots of crazy stuff, but not enough normal things. Added in the end some nodes to add some character.

Lessons learned:

  • Focus on a programmatic implementation – wasteful, should have planned what was going to be generic behaviours – could have just been spawned programatically (eg: drinking, or smoking).
  • Preview tools – hard to test the nodes. Needed to fill an area and get it done.
  • Bang for your buck – Should have prototyped and chosen ambient behaviours, rather then doing a mime – weeks on a firebreathing mime.
  • Implement core systems and test early – Obvious right? :) – an issues for the entire project.

Questions

Q – What is most important for the ambient life?
The final node for 3 people talking made the world feel more real. Groups of people stopping to talk to each other. Having more people helps with everything. Ideally you fill it with hundreds of people.

Q – How long from Saints Row 1 did the in game editor take to make?
6 months to a year to develop it fully. Saints Row 2 just maintained it.

Q – Having the Sims approach with copies of the same actions, and the umbrella ambient behaviours are important. A pure procedural approach doesn’t fill the world with life. Have you thought about an area based tool to define areas where the procedural approaches then can hook into?
I don’t think we ever looked at a volume based solution. We wanted more control I think, the volume based you’re not too sure what you will get. Would work more for the smoking ones then the yazuka outside their club.

Q – What do you think the next layer on top of this system that will provide more life in a world?
In the future there might be some system of schedule for every person with tasks.

Q – I was wondering if you could throw out some low level detail? Like bone numbers, numbers of screen, etc.
We had 12-18 NPC’s on screen. Didn’t do any kind of bone scaling (kind of crunched). You pop out pedestrians and cars off screen or most costly ped when there is more action on screen like police chases. Saints Row 2 had almost too much popping. It hurts the game a bit, but had to do that with some of the ways the systems were built.

Q – How would you sort the scaling problem?
Programmer freaked out with the group which added 4 nodes – had to cut it down carefully to fit. For the choice of what ones to do the leads on SR2 was different to SR1 – the thought was to do way over the top all the time. Next it likely will be a 5% crazy stuff.

Q – I wondered if you had any persistent systems? (going into and out of a club)
Yep, new people each time, like GTA. In co-op there are two bubbles and the machines talk if they are close. For action nodes we do keep track of when the last time we saw it – it is dirty for a certain amount of time.

Q – If the next big thing is they all have stories, how do they interact with the game stories?
In SR2 the ambient people were spawned because of a certain set of conditions – persona, etc. Every system we had was providing variety to the player. In the future giving them procedural things like speech or missions and interactions with the player and randomly hand them out would be great.

Q – What kind of reference did you use to say that would make it more realistic?
We didn’t reference anything really. The brainstorming was “the most ridiculous thing” – it doesn’t help filling out the world but is a huge breadth of stuff. Next time is to be cohesive across the world so that the loop is feeding into each other so things make sense. Maybe things change over time.

Q – How did you check for misplaced nodes?
We didn’t. In game editor for nodes, in art editor in max, but the art world can’t see what nodes are placed. A constant problem.

Q – Did you video people in real life to check?
No, we just kind of said “when you picture this what do you think of”.

Post a Comment

Your email is never published nor shared. Required fields are marked *