- 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
Eduardo Jimenez, Senior Programmer, Black Rock Studio – “Eduardo will explain how the AI for riders is designed o prevent the feeling of rubber band AI that’s symptomatic of many racing games, and will present the solution to the problem applied in Pure which falls into the increasingly popular category of “experience management” for games.
This is an interesting way to do alternative rubber banding, hopefully it is as Eduardo says and is much less noticeable by the player, and it does give the designers some neat control to do interesting races
An alternative to rubber banding with race management.
Why use race management? AI is too good, or too bad, and the AI won’t react to the player’s mistakes. It makes it necessary to manage it somehow, to make it challenging for anyone, adapt to different situations (different take overs) and make it fun (competitive and close).
Rubber banding is what is used currently. It makes the AI players will speed up or slow down to ridiculous speeds to keep players not from winning or losing too badly. Cheating! It is bad to do this. It does work almost always, the player is always surrounded – and so is never is alone. The problem is the cheating, and it is easy to spot – player thinks it is not a fair race, so at least don’t let the player know about it (if possible).
First, to check how the player is doing – they check the Skills – rankings of how well a player does at certain things – trick racing, stunts, racing, etc. – around 16 or so. Skills are normalized (to the 0…1 range), for the use by AI so their own skill limits are set by that, and they could be used to represent personality too – although wasn’t used in PURE. Original approach to difficulty was to use static skills, done from the start of the race, which didn’t work very well.
You need some important properties of skills – broad range of skills, since it needs to cover all the user cases, and also responsiveness to changes – using small increases in player skill normally so we want it to have small steps too. Bigger steps won’t be very responsive, it’ll be huge change instead.
Watching an AI player, the skill at 0 does tricks wrongly, not go too fast. When skill was set to 1 (by increasing the players laps to be 2 ahead) he dramatically increased in skill, but not cheating speed, and almost not making mistakes.
Dynamic Competition Balancing term described as changing the skills mid-game. Doing static skills at the start of a race didn’t work too well – lonely (too hard, so all ahead, or too easy, so too far behind). DCB modifies the skills dynamically during the race according to some rules.
Firstly, they tried to match the players index with the leaderboard position – if they are in first position on the table, they’re “good” so make it harder. Didn’t react too well, too inflexible. 5 miles or 5 meters ahead not taken into account.
Then tried the concept of groups – divided in group heads and members – members follow the heads in order. Didn’t work too well, sometimes it did but most of the time it didn’t work, groups were too lose or no real groups at all. Lonely racing still.
Race script was the final method used. Doesn’t just include the definition of the script but part of the implementation too. The race script has designer-implemented documentation on how the race evolves – a good/bad player with a good/bad AI player, etc. combinations. Designers must realise how important it is to have the players performance be the main part of the race script. It isn’t a strict script – it’s rough guidelines and “best case” scenario.
Distance was the main rule for DCB. Every rider is aiming to be at a point X meters in front or behind the human player. The skills of the AI riders will vary according to the distance to the point – if the rider needs to be X meters behind the player, their skill lowers around X meters behind the player, not at the player. Can also group players by having points to aim at around other players. Points may also move during the race – so some groups might progress during the race.
From the players perspective it is him who is progressing through the groups. It’s subtle, and he doesn’t know the AI is helping.
Main two differences from rubber banding: skill limited to a certain range, to limit “always being in front or behind”, and the AI’s also follow a script not the player, so this varies what happens.
There were also other mechanisms in addition to the script’s distance checks. There was the start of races, where you speed up using a skill of 1 right at the beginning (5-10 seconds) and then lose their skills (set to 0) at the end of the game (last 10-15 seconds) – as well as stop their improvement to skill in the final meters to be more accessible to win for the player (even with previous changes the AI was sometimes hard in the last metres).
This might also be applicable to other game types – FPS, RTS, RPG where it isn’t all scripted (maybe how often you hit, what you do generally). You only need two elements: skills and a script, and an idea on how to implement it.
Question at the end: What happens if the player stops at the start line?
The AI players will get to 500M, 1000M in front as they are told to at normal skill, then go to their minimum skill – usually 0 (maybe higher, 0.3, 0.7, etc.) and carry on racing as normal, just at that lower level.