tomm reacted to Mapcore for an article, Day of Infamy Mapping Contest
Participants have from the 15th of September 2016 until Midnight (GMT) on the 22nd of December 2016 to create, test and upload an original or Day of Defeat inspired map for Day of Infamy (www.dayofinfamy.com)
Map included officially in game
Void Surround Sound Headphones
M330 Mouse Pad
All Wall Worm Source Modelling Tools
M330 Mouse Pad
All Wall Worm Source Modelling Tools
M330 Mouse Pad
All Wall Worm Source Modelling Tools
M330 Mouse Pad
All Wall Worm Source Modelling Tools
(*All prizes are subject to participant eligibility. No cash value. The contest Organizers and Sponsors reserve the right to change or remove the prize structure at any point with or without reason.)
In addition to the prizes stated above, GameBanana will also be offering a sub-prize for the best development blog, work in progress or tutorial created throughout the process.
This is an entirely optional part of the contest and is open to members of all communities.
To enter simply create either a development blog / work in progress page OR a level design tutorial / guide for Day of Infamy on either GameBanana, MapCore or the Insurgency Forums.
Entries must be uploaded on or before Midnight (GMT) on the 22nd of December 2016, and include “[DoI Contest]” in the title. Entries will be judged by members of the GameBanana team, as they appeared at the deadline.. No changes or updates are permitted during the judging phase.
Rules and Frequently asks Questions
The submission must be a playable map for the PC version of Day of Infamy.
Remakes of existing maps are not allowed, however maps inspired by classic DoD maps are encouraged.
Entries must be submitted to the Day of Infamy mapping contest section of BOTH GameBanana.com and the Steam Workshop before the deadline.
Multiple entries are permitted, however submissions will be judged on individual quality rather than quantity.
Team based entries are permitted, however the entrants will have to agree how to split any prizes awarded, prior to prize claim and dispatch.
It is essential to thoroughly test your submission before the deadline as entries cannot be modified during the judging phase.
Exceptions: Changes to the submission profile are permitted after the deadline, provided they are purely aesthetic and that the map file does not change. (E.g. Editing the description / screenshots)
Maps that were under creation prior to the announcement of this contest can be entered, provided a completed version has not been released for public Download.
All custom textures, models or code must be contained within the download file or embedded into the .bsp.
Authors are free to share their content on any other websites or services they wish, however the file must remain free to download and play, without requiring membership or payment.
If the submission is distributed on an external website or service, it must clearly state that the submission was created for the "GameBanana / MapCore Day of Infamy Mapping Contest 2016”.
Authors must be able to accept cash payments via paypal and will be required to fill in a prize claim form prior to payment. Winners of hardware and physical products will also be required to provide a valid shipping address.
Judges and individuals associated with organising this contest cannot enter or assist entrants.
Entries must clearly state which game mode the level is designed for.
Participant eligibility: The “GameBanana / MapCore Day of Infamy Mapping Contest 2016” is open to any individual, or teams of individuals, provided they comply with the following:
Participants may not be an employee of the “Organiser” or “Sponsors”.
Participants may not have taken part in the preparation or announcement of this
Participants may not be a direct relative, spouse, direct employee, or long term
partner of any of the above definitions (a - c).
Legal Age: This contest is open to any individual who meet the above “participant eligibility” criteria. In the event of participant who has not reached the legal age in his/her state winning one or more prizes defined below, he/she must provide contact details for the legal guardian who will claim the prize(s).
TWO (2) copies of the map are required for this contest, and must be uploaded on or before the deadline. The primary version (used for judging) must be submitted to GameBanana.com and placed in the “Day of Infamy > Mapping Contest 2016” category.
The second version must be uploaded to the Day of Infamy Steam Workshop
No changes to the downloadable file can be made during the judging phase. Please remember to ensure that all relevant custom content is included, and that your map is thoroughly tested.
Maps will be judged by the developers at New World along with the staff at MapCore and GameBanana. Each map will be scored on the following categories, and given a total score out of 100.
Gameplay (40 marks)
Visuals (30 marks)
Originality (15 marks)
Performance / Optimization (15 marks)
tomm reacted to will2k for an article, Source FPS Cost of Cheap and Expensive Assets
A new question?
After successfully solving the eternal mystery of func_detail vs. displacement in my last article (here), I was contacted by the High Council of Source Engine Optimization. Apparently, there seems to be another enigma to be uncovered and a major question to be answered.
What is the fps cost of cheap and expensive assets in Source engine? Is there a significant difference between the two in terms of frame rate? (that’s 2 questions but I’ll let this one slide)
As with the last article, this one is also going to be a short but sweet article; fewer words, more numbers and screenshots. The systematic approach is also going to be very similar: 2 similar test maps where one contains expensive assets while the other has cheap versions of these assets. The assets will be the same and will be located in the same locations in both test maps.
The recent assets added with the new de_nuke update in CSGO will be the perfect candidates for our study as Valve made most of these in cheap and expensive versions. For props, the expensive version is high-poly models while the cheap one is low-poly. For textures, the expensive version gets a normal map (up to 2), specular map, advanced reflections, detail map, and Phong shading in some cases; the cheap version is basically the diffuse map with the occasional detail map.
I will record the localized fps in both versions and compare, then draw conclusions that will hopefully answer the High Council’s question(s).
The first map to test is the one made of cheap assets. It’s basically a simple map consisting of 4 walls and a floor on which are spread several props and textured blocks at predetermined locations. Textures are mostly concrete while props contain crates, cars, pipes, wires, doors, and vents.
The fps recorded is 330 fps. The expensive version is exactly the same but with props replaced with their high poly versions and textures swapped with their expensive versions.
The fps is now 286 fps; interesting. All right, let me call the High Council to relay the news.
Hold your horses right there. We are men of Science and you know that…yes, yes, I know, one map is not enough to draw conclusions.
I’m going to take this map and quadruple it, in area and in content, and test again (Nobel prize here I come). The new map will have 4 times the amount of props and textured brushes (the same ones of the initial map cloned into the new areas) as well as having its total area increased fourfold. We start with the cheap version that we will refer to as test map (4x).
The fps decreased to 279 (from the 330 in the simple cheap map) due to the extra content that the engine has to render. Our main point of concern would still be to compare this version against the expensive one.
You know the drill by now; we will also create the (4x) expensive version.
The fps is 229. The decrease in (4x) version is more or less in line with the one in the simple version. Let’s recap in a table for easier viewing.
As you can see, the fps dropped 44 fps in the simple version and 50 fps in the 4x version, between the cheap and expensive maps respectively.
We can draw 2 conclusions from the above table:
There is a significant drop between the cheap and expensive version (44/50fps), and there is also a substantial drop within the same version (51/57fps) when you add much more content that is all visible in the PVS.
These results can shed some light on the latest update of de_nuke where the overall fps is lower than the rest of the stock maps in CSGO. The high amount of props/details that can be seen/rendered from one location coupled with the expensive assets in the playable area contribute to further decrease in the overall fps in that map (in addition to the open skybox/layout). I have tackled a revised optimization system for de_nuke in a topic of mine last month that can be read here (https://www.mapcore.org/topic/19909-de_nuke-a-revised-optimization-system/)
As a bonus, I’ll throw in the compile times of the above maps so you can witness the effect of cheap vs. expensive, and the additional content in (4x) versions, on the compile time, especially on vrad since it will mostly be affected by the extra faces in the high poly models and the additional vmt switches in the expensive materials.
You can clearly see that vrad times increased considerably between the cheap and the expensive versions, as well as within the same version when we quadrupled the area/content.
Now if you’ll excuse me, I still have a phone call to make; the grand council woman cannot wait any longer.
The final cost
Expensive assets bring visual eye candy to the map in hand which is a necessity in today’s ever-growing and continuously pushed graphics boundaries. Relying on low poly models and cheap textures won’t fare well on the visual fidelity front. However, expensive assets come at a cost of taxing the rendering engine and decreasing the overall fps in the map.
These expensive assets are a requisite if you want your map to shine (pun intended) but one has to be careful not to overuse them. Use them wisely in the playable area and resort to cheap versions when decorating the non-playable areas of the map or any place that the player cannot see up close to discern the difference.
tomm reacted to will2k for an article, Displacement Vs. Func_detail - A comparative fps study
What is the question?
Ever since the dawn of humanity, this question was the center of a colossal debate. Greek and Roman philosophers tried to solve it to no avail. Alchemists in the Middle Ages gave it a go and failed miserably. Even Industrial Age scientists touched on the subject with no big breakthrough.
Luckily for everyone, I am here today to answer this question and put an end to a centuries-long argument: What is better in terms of fps, func_detail or displacement, in the context of the Source engine? If you were expecting an existential question, I am deeply sorry to disappoint you but hey, life is full of disappointment.
This is going to be a short but sweet article; fewer words, more numbers and screenshots. The study is pretty straightforward and systematic. To make things fair and square, I will create 2 exactly identical test maps: In one, everything will be turned to func_detail while the other will have everything switched to displacements. I will then proceed to record the localized fps in these maps from a preset location and compare. Pretty simple, isn’t it? Well, it should be as the whole purpose of this study is to compare func_detail vs. displacement in absolute terms while keeping all other parameters constant.
The first map to test is the one made of displacements. Here is the screenshot showcasing the fps.
The map itself is very simple consisting of 7 identical houses placed at predetermined locations and surrounded by 4 walls. The houses are detailed enough to put some slight pressure on the rendering engine. For the skeptics among you, here is a wireframe in-game shot to show that everything is made of displacements.
To refresh your memories, in Source engine wireframe mode, green is displacements, pink is brushes (world, func_detail, brush entity, etc…), blue is props, and yellow is decals/overlays. The recorded fps in this map is 289. We now move to the second map, the func_detail version to check how the frame rate is faring. Here is the awaited screenshot.
Surprise, surprise. The fps is 330, much higher than the displacement version. Here’s the wireframe shot to put your mind at ease.
Honestly, I was thinking the figures would be more on par as the engine handles both details and displacements pretty well, but in the end, Source is about BSP so I guess brushes would get a slightly preferential treatment over polygon meshes (conspiracy theory ensues).
The question that forces itself now is: Should we rely solely on func_detail in our maps? Of course not. Both func_detail and displacement have their advantages and inconveniences and leaning exclusively on one will inevitably lead you to a dead end. The best thing to do is get the best of both worlds by using them together.
In our little test map, how about we mix things up in a third version: let us make the house walls out of displacements while having the doors, windows, frames, and roofs made of func_detail. Incoming screenshot, brace yourselves.
Much better, isn’t it? We have now 311 fps, a very nice middle ground between the 330 fps of func_detail and the not-so-bad 289 fps of displacements. The mandatory wireframe shot follows.
So, what can we learn from all this? Well, apart from the obvious places where displacements are mandatory for the organic mesh sculpting (rock formations, cliffs, bumpy/twisted roads…), it is a good idea to spread some more displacements around your map to alleviate the total brush-count that you will inevitably hit the maximum in a highly detailed map. Your fps will remain high and you will enjoy the margin to keep adding structures to your map without fear of reaching the maximum allowed total brushes (substituting brushes with models/props is another viable solution that is not in the scope of this article).
I’m a man of science and I know that one example is not enough to draw conclusions. That’s fine, I have a second test map to investigate what we established before. The concept of having 2 identical maps is still the same, however, this time, we will spice things up by adding some static/physics props and some decals here and there. We will start with the displacement version.
230 fps, not too shabby. Let’s check another angle.
220 fps, more or less, on the same level as the previous number. Now for the wireframe shot.
The tree cards in the background are func_brush in both maps (the detail and displacement versions), so it’s a level playing field in this case.
Now for the moment of truth you all have been waiting for: will the detail version have better fps to support my earlier findings or will I be publicly embarrassing myself? A screenshot to the rescue.
I knew I was right, never breaking a sweat (apart from the nervous cold sweat I just wiped off my forehead). 255 fps for the first location A. Let’s check the other angle or location B.
250 fps. Bam, sweet victory…sorry I got carried away a bit. Ahem…Let’s get back to being scientific, shall we. Here’s the wireframe proof.
Let’s recap all the action and numbers in a nicely formatted table.
You can notice the fps gap between the func_detail and displacement versions in both test maps whereas the “mixed” version considerably narrowed this gap. The numbers have spoken.
The bottom line
The bottom line is, if you rely only on func_detail, you will hit the maximum brush-count allowed in Source and severely limit your map and creativity. You might also run into T-junction issues as well as parts of your geometry flickering and disappearing from certain angles in densely func_detail’ed areas.
On the other side, if you stick to displacements alone, then you will have lower fps than a func_detail map version. You might also run into visible seams and un-sewn displacement issues.
Having a clever distribution of both func_detail and displacement in your map is the way to go. You will have high fps, better lighting around the edges, and organic sculpting while not getting anywhere near the total brush limit; the best of both worlds.
tomm reacted to FMPONE for an article, 2015: Mapcore's Year in Review
(Art by Thurnip)
This overview proves how talented our community is. We share, give feedback and learn from one another. Lots of our members have made it into the game industry and continue to make their mark working for high-profile studios. Our articles were shared around the world and our collaborative CS:GO contest was a huge success. We can only conclude that 2015 was again a stellar year for the Core and we are looking forward to an even better 2016!
2015: Mapcore's Year in Review
It was a banner year. Here’s a taste of what our community created:
Temple of Utu by Minos
Corridor by JonnyPhive
Rails by Deh0lise
Cold Fusion by Rusk
Half-Life 2 Scene by Psy
Resort by 'RZL and Yanzl
Zoo by Squad and Yanzl
Santorini by FMPONE and Dimsane
Corridor by RaVaGe
Seat by penE
Half-Life 2 UE4 Corridor by PogoP
Tulip by catfood
Volcano by 2d-chris
Chilly UE4 Scene by TheOnlyDoubleF
High-quality original content:
Grand Prize Winner Announced
Hurg Smiles Upon You All!
tomm reacted to will2k for an article, Viability of Hostage Rescue Scenario in CS:GO
This level design article is about the past and the present of the hostage rescue mode in Counter-Strike. Showcasing the inherent issues that accompanied the scenario allowing the bomb/defuse mode to gain traction and popularity. This article will also present what can be done, level design wise, to remedy some of the shortfalls and allow the scenario to be viable.
A historical background
Counter-Strike officially started life in June 1999 with the release of beta 1, and it shipped with four maps, that’s right, four whole maps. They were all hostage rescue maps and the prefix used for these maps was cs_ as opposed to the standard deathmatch maps starting with dm_. This prefix was an abbreviation of the game’s name (Counter-Strike) which hints to this hostage-rescue scenario being the only one in the minds of Gooseman and Cliffe, the creators of CS, at the time of launch.
Fast forward a couple of months, beta 4 rolled out in November 1999 bringing to the table a new scenario, bomb defuse. The new maps carried the prefix de_ and while one would think that the hostage rescue maps would be switched to hr_ prefix, they kept the same prefix which started to be referred to as the “Classic Scenario”. Counter-Strike was built on hostage rescue scenario.
I started playing CS in beta 2 in August 1999 (I totally missed beta 1, screw me) and maps like Assault and Siege were all the rage at LAN parties. The nearest LAN/internet café was a 5-minute drive from my place, and LAN parties with friends used to be a blast full of shouting, cursing, bluffing, noob-trashing; the standard menu for a CS session. Good times.
Siege, the oldest CS map (beta 1), and Assault (beta 1.1) were the epitome of the game. You had to dive in as a CT deep into the T stronghold to rescue the hostages and bring them back to safety. These maps were the most played on LANs and embodied the style of early CS gameplay. At the LAN place where I used to wage my virtual battles, Assault equaled CS, literally. A fun fact is that when Dust came out, I started a LAN session with this map and everyone in the room shouted at me: "What the hell is this? We wanna play CS!" For my friends, Assault was CS.
However, those rosy days for hostage rescue began to turn into grim grey when folks started playing bomb defuse scenario and realized how…fun it was. A map like Dust almost single-handedly pushed the scenario into higher ground with its bright environment/textures, clear/wide paths and its ease of use and noob-friendliness. A year later, around Summer 2000, Counter-Strike was now equivalent to Dust for my friends.
How did this happen? What went wrong?
Inherent flaws of hostage rescue
Hostage rescue is a very delicate and tough scenario for law enforcement operators in the real world. It puts the assailing team at a great disadvantage against heavily-armed barricaded hostage-takers who are probably using civilian hostages as human shields and as a bargaining chip for a later escape.
As you can deduce, transferring this scenario as realistically as possible into the game will not fare well, and this disadvantage will carry on for the CT team. The problem is only exacerbated when you add the more or less “flawed” game mechanics to the scenario. This is exactly what went wrong with hostage rescue scenario in case you are still wondering about the rhetoric questions at the end of the historical background introduction. The popularity of cs_ scenario started dwindling and the rise of the bomb/defuse scenario only made things worse.
Almost all the early cs_ maps featured a relatively tiny hostage zone/room having one entryway usually sealed with closed doors that the CT must open to get access inside. This room was typically located behind T spawn which made the area a camping ground and made camping that zone an obvious and rewarding tactic for Ts. The doors having to be manually opened with a loudening sound made things worse and negated any surprise or sneaky rush towards the hostages. A classic example is the hostage area and T spawn in cs_assault.
I dare not think of how many Ts are camping behind those doors
Another equally important camp fest occurred in the hostage rescue zone. Early designs made the rescue zone relatively small with one or two access paths that can be defended from one location. If the CT team manages to reach the hostages and rescue them, the Ts could easily fall back to the rescue zone to camp and patiently wait for the CTs to show up. The hostage rescue zone in cs_italy is a nice example to showcase how one T could camp in the southernmost spot in the zone allowing him to monitor both entryways, from market and from wine cellar, within the same field of view. CT slaughter was almost a guaranteed thing to happen.
A CT will show up any second now; imminent slaughter commencing in ...3, 2, 1
A third flaw was the hostages themselves. They were difficult to escort and protect and were easily stuck or left behind in various parts of the maps between their initial hostage zone and the final rescue zone. I lost count of how many times I rescued the hostages and ran as fast as I could to the rescue zone, reaching it with a big grin on my face only to turn around and find out that only one or two of the four hostages actually followed me; the others were randomly stuck on a ladder, door frame, window ledge, vent, chair, table…I could go on but my blood is starting to boil just thinking of this.
To add insult to injury, hostages could also be killed or “stolen” for ultimate trolling. When Ts were stacked on money, they could easily kill all the hostages, basically turning the round to a frustrating terrorist hunt for CTs. In early CS versions, a CT teammate could press the “use” key on a hostage that you were already escorting to steal it. This would leave you helplessly wondering where the hell did the 4th hostage go in case you did not catch the teammate performing the action.
Lastly, maps themselves contributed to the issues that were piling up against hostage rescue scenario. If you are a CS veteran and you were around the early betas in 1999, you would most certainly remember how quickly hostage rescue maps were pruned from one beta to another; some maps even had a life span of 1 week before being discarded out of the official roster. Most of these early cs maps featured dark, nightly environments that were unfriendly to both newcomers and established players. Other maps had a confusing-as-hell labyrinthine layout that confused even the most great-sense-of-direction players, and made remembering paths nigh impossible. Some of these maps had narrow twisted paths and choke points, vents, and ladders that not only frustrated players (especially CTs) but also made rescuing and escorting the hostages more of wishful thinking. The icing on the cake was the different gimmicks introduced in some maps that made a frustrating gameplay/layout even more annoying: some maps had a machine gun nest in T spawn allowing Ts to master and perfect the art of CT slaughtering while other maps had flammable drums that could be shot and blasted for the ultimate carnage right next to the hostage zone. Good example maps include cs_prison, cs_bunker, cs_iraq, cs_hideout, cs_facility, cs_desert, among many others.
Meanwhile, bomb/defuse scenario was gaining grounds at an increased rate and before too long, hostage rescue was relegated to a distant second place in terms of popularity among players and level designers alike.
As a small experiment, I tallied the number of custom hostage and defuse maps submitted on Gamebanana for Counter-Strike Source and Global Offensive. For CS:GO, there are 761 de_ maps against 157 hostage maps while for CS:S, the figures are 4060 de_ for 1244 cs_ maps. The disparity is rather meaningful as the ratio in CS:GO is 4.85:1 while for CS:S the number is 3.26:1. This means that for each hostage map in CS:GO there are almost five maps of bomb/defuse whereas this number drops slightly to almost three maps for CS:S. With CS:GO putting extra focus on competitive gameplay, this ratio is bound to further grow widening the rift between bomb/defuse and hostage rescue maps.
That’s it? Is it done for cs_ maps? Shall we prepare the obituary or is there a magical solution to breathe some fire and life in them?
Solutions for viability
There is a magical solution that involves you transferring a large sum of cash to my bank account, then my “guys” will contact your “guys” to deliver the “solution”. The drop point will be at the…apparently, there has been a mix-up, this is for another “deal” …nervous chuckle.
Seriously though, while there is no magical solution that will lift hostage rescue onto the rainbow, there are a couple of things that level designers can do to start injecting some momentum to the scenario. Luckily for us, Valve has already paved the way (so these “Volvo pls fix pls” do work after all?). In March 2013, Valve introduced a major CS:GO update that completely overhauled the hostage rescue scenario mechanics and introduced cs_militia as well. The update was a game changer and a much needed tweak towards a better hostage rescue gamemode.
We now have two hostages instead of four, and the CTs only need to rescue one of them to win the round. Moreover, the hostage does not stupidly follow the CT but instead is carried on the CT’s shoulders. Obviously the movement speed of the CT carrying the hostage is decreased but this “inconvenience” is countered with added bonus round time and the fact that the CT doesn’t have to glance over his shoulders every five seconds to make sure the hostages are still following him (this kind of distraction can prove fatal to the CT escorting the hostages). The hostages’ spawn location is randomized and can be controlled by the level designer. A nice change is that hostages don’t die anymore thus cutting any chance of Ts trolling (you still lose money when you shoot a hostage – shooting a hostage is pretty pointless now akin to shooting yourself in the foot).
This is all good news if you ask me; hostage rescue is on the right path to become popular and viable again. With Valve doing the first half of the change, level designers have the duty to continue with the second half.
As a first suggested solution, let us start treating hostage rescue as bomb defuse. Let’s be honest, bomb defuse works really well, so why not transfer this “experience” into hostage rescue. What we can do is to have a hostage rescue map’s layout mimic one of bomb defuse – that is have two hostage zones that are similarly placed as two bomb sites. We need to start treating a hostage zone like a bomb site with all accompanying techniques of rushing, pushing, faking, peeking, holding, smoking, flashing, etc. The good thing about this is that whatever knowledge, skill, and layout awareness that players have acquired from defuse scenarios will transfer effortlessly to the hostage rescue scenario; you do not need to learn new tactics and strategies. The roles will be inversed: instead of Ts rushing bomb sites and CTs defending, CTs will push hostage zones and Ts will defend and rotate.
Sounds logical, right? Some people might argue that having 2 separate hostage zones is not “realistic” and my answer is Counter-Strike was never about realism (carrying and running around with a 7 kg (15.5 lb), 1.2 m (47.2 inch) AWP sniper rifle with 25x telescopic sight, quickscoping and headshotting opponents is the epitome of “realism”). If you want a realistic hostage rescue scenario, then you are better off playing the original Rainbow Six Rogue Spear and SWAT 3 from 1999, or the more recent ARMA and Insurgency for a realistic military setting. I practice what I preach and I already implemented this technique in my last map “cs_calm”. The map was a remake of my CS 1.5 map from 2003 and obviously I made the “mistake” at that time to follow the trend set by official maps of having one hostage zone right behind T spawn. A playtest on Reddit CS:GO servers back in March 2015 confirmed that this setup won’t work well as Ts will inevitably abuse the hostage zone.
I made some radical layout changes towards T spawn and hostage zone and created two new hostage zones on the upper and lower levels of the map that are connected by a back hallway to allow quick rotations (in addition to the one through T spawn). Obviously, there is no direct line of sight between hostage zones to prevent 1-zone camping. Ts have absolutely no incentive to camp one zone as CTs can reach the other one, rescue the hostage and head back to the rescue zone without being spotted from the other zone. CTs actually have a chance of winning the round by rescuing the hostages.
I like to believe the new layout worked well. Only time and more hostage rescue maps will tell.
Layout of the map "cs_calm"
Rescue zone anti-camping
We have remedied the hostage zone camping but we still need to tend to the rescue zone camping issue. A solution to this is to have two rescue zones in a similar setup to what is nicely done in cs_office. While Ts can still camp one zone, they risk a big chance of having CTs reach the other rescue zone. Again, CTs will have a viable option to save the hostages without being shredded by camping Ts. If the layout does not allow or facilitate having two rescue zones, then one big rescue zone with multiple entrances (three is a good number) should work fine. The trick here is to have the entrances not easily covered within the same field of view to prevent camping.
Into the zone
Just as we established that we should treat hostage zones like bomb sites, it goes without saying that each hostage zone should have at least 2 to 3 entry points. It’s pretty pointless to have only one entrance as this totally defeats the purpose of spreading hostages into two zones. The different entryways should also not be covered within the same field of view of one T; if a T decides to camp the zone, then he should be able to cover two entrances from one point leaving the third one more or less at a dead angle and viable for a CT rush or stealth/sneak surprise.
Showcase of Hostage Zone A on the map "cs_calm"
The above screenshot showcases “Hostage Zone A” in cs_calm. A terrorist will typically camp near the hostage covering the two encircled entrances. The third entrance from upper level denoted by the arrow is not in the direct FOV, and is prone to a surprise attack by CTs that could catch the camping T off guard. If possible, try to spread the entrances on different vertical levels to spice things up and keep Ts on their toes.
Lastly, it is a good idea to have a connector between hostage zones to allow fast rotations but without having a direct line of sight between hostage zones. We want to make the scenario fairer to CTs but not at the expense of Ts, inadvertently making it unfair for them.
Hostage rescue is a fun scenario if you ask me. It had many inherited and added flaws that contributed to its waning but it’s nothing that can’t be reversed. We, as level designers, need to push some changes to put the scenario back on track. What I just showcased in this article might not be the only viable solutions but they certainly are a step in the right direction. Level designers are intimidated by players who shun away from cs_ maps, and this turns into a vicious circle where players avoid hostage rescue maps and mappers in return avoid designing them. We need to break this cycle and designers need to bravely embrace the solutions I presented here or come up with their own solutions. The more cs_ maps that come out and get tested, the more we could validate these solutions as viable.
In either case, we need to get proactive towards hostage rescue scenario; after all, this is the cornerstone that Counter-Strike was built upon.
tomm reacted to FMPONE for an article, Congratulations to our finalists and Grand Prize Winner, DE_EMPIRE!
(Art by Thurnip)
It’s finally time to declare a grand prize winner in our exciting Counter-Strike: Global Offensive mapping contest. You’ve playtested the maps on Reddit, you've waited months for the results... let's get down to business!!
GRAND PRIZE WINNER:
By Andre Valera
Sometimes it boils down to consistency: broad strength across several categories. No map in our contest better exemplifies this notion of consistent quality than Empire.
Empire features a stacked bomb-site layout similar to popular official maps like Nuke and Overpass. While this relatively unorthodox design presents level designers with additional challenges, Empire ably sticks its landing. Furthermore, the ambition of Empire’s design is tempered well by its no-nonsense visual presentation. We’re left with a digestible, fun, and very playable level.
Congratulations, Andre Valera!
Featured in a goRGNtv showmatch!
Featured in CEVO PUG rotation for one month!
$1000 and Mapcore swag!
CS:GO prize pack courtesy of Valve:
a signed CS:GO poster, lanyard, vinyl sticker
SteelSeries Kana Mouse!
A truly unique map. Some felt it was the strongest entry in the contest given its strong theme, abundant polish, and beautiful visuals; others, however, questioned the map's small scale. This was a tough map to judge.
CS:GO prize pack courtesy of Valve:
a signed CS:GO poster, lanyard, vinyl sticker
An attractively sleek map, there is plenty of room for Royal to blossom into something very special.
CS:GO prize pack courtesy of Valve:
a signed CS:GO poster, lanyard, vinyl sticker
By Ornate Baboon
A map that was under heavy construction for much of our contest, one gets the sense that Coast wasn't quite ready yet. With a little bit more time, who knows?
$100 + Mapcore swag!
CS:GO prize pack courtesy of Valve:
a signed CS:GO poster, lanyard, vinyl sticker
~~~We at Mapcore would like to thank the r/GlobalOffensive moderators for their assistance, our lovely guest judges, Valve, goRGNtv, CEVO, as well as Gamebanana.com and Steam workshop artist EGO DEATH for contributing to our prize pool.
Last but not least... THANK YOU, for making this 'Core event special and fun!
"May Hurg guide you..."
tomm reacted to FMPONE for an article, Reddit + Mapcore CS:GO Mapping Contest Finalists Announced!
(Art by Thurnip)
Contest finalists have been chosen!
Before announcing our finalists, we want to thank everyone for participating and giving your feedback: with over 150 entries, this event has thus far exceeded expectations in every way.
We strongly considered adding an “honorable mentions” addendum to this announcement, but realized there were simply too many maps which came extremely close to becoming finalists, lacking only one of our “big three” judging criteria components.
Now, without futher ado…
(in no particular order)
By Andre Valera
By Ornate Baboon
These exciting levels exhibit competitive potential, excellent visual presentation, AND a satisfying level of polish, making them truly strong representatives for our talented community. As finalists competing for the grand prize, the authors of these levels will be able to update their work based on your feedback, including fine-tuning their competitive layouts using public playtesting over on Reddit. Let's support them on their journey!
To check out the excellent prizes awaiting our finalists (including money prizes + official Valve merchandise), click here.
...but who will be the Grand Prize Winner? Find out September 30th.
P.S. – To all our wonderful participants: don't despair. Level design is an art to be pursued for its own sake, and brilliant work should always be celebrated and studied. Additionally, Valve has consistently supported CS:GO community mapping, and Valve Operations remain a lucrative and thrilling opportunity for community mappers such as yourself. Valve’s criteria for Operations can be found here.
"Never give up." - Hurg
tomm reacted to leplubodeslapin for an article, Source Lighting Technical Analysis: Part Two
This is the second part of a technical analysis about Source Lighting, if you haven’t read the first part yet, you can find it here.
Last time, we studied the lightmaps, how they are baked and how VRAD handles the light travel through space. We ended the part 1 with an explanation of what the Constant-Linear-Quadratic Falloff system is, with a website that allows you to play with these variables and see how lighting falloff reacts to them. We will now continue with basic examples of things you can do with these variables.
Examples of application
The simplest type of falloff is the 100% constant one. Whatever the distance is, the lighting has theoretically the same intensity. This is the kind of (non-)falloff used for the sun lighting, it is so far away from the map area, that light rays are supposed to be parallel and light keep its intensity. Constant falloff is also useful for fake lights, lights with a very low brightness but that are here to brighten up the area.
Another type of falloff is the 100% linear one. With this configuration, light seems to be a bit artificial: it loses its intensity but goes way further than the 100% quadratic falloff. It can be very useful on spots, the lighting is smooth and powerful. Here is an example:
This is the default configuration for any light entity in Hammer, following as we said before the classic Inverse-Square law (100% Quadratic Falloff). It is considered to be the most natural and realistic falloff configuration. The biggest issue is that it boosts the brightness so much on short distances, that you can easily obtain a big white spot. Here is an example, with a light distant of 16 units from a grey wall:
This can also happen with linear falloff but it is worse with quadratic. Simple solutions exist for that, the most common is not to use a light entity but a light_spot entity that is oriented to the opposite direction from the wall/ceiling the light is fixed to. You can make the opening angle of your light_spot wider, with the inner and outer angle parameters (by default the outer one is 45°, increase that to a value of 85° for example). If needed, you can also add a light with low brightness to light the ceiling/wall a bit.
50% & 0% FallOff
A second light falloff system exists, overriding the constant-linear-quadratic system if used. The concept is much simpler, you have to configure only 2 distances:
50 percent falloff distance: Distance at which light should fall off to 50% from its original intensity 0 percent fall off distance: Distance at which light should end. Well ... almost, it actually fall off to 1/256% from its original intensity, which is negligible. The good thing with this falloff system is that you can see the 2 spheres according to the 2 distances you have configured in Hammer. Just make sure to have this option activated:
An appropriate section for models lighting is needed, because it differs from brush lighting (but the falloff stays the same). In any current game engine, lightmaps can be used on models, a specific UV unwrap is even made specifically for lightmaps. But on Source Engine 1 (except for Team Fortress 2) you cannot use lightmaps on models.
The standard lighting method for models is named Per-Vertex Lighting. This time, light won’t be lighting faces but vertices, all of the model’s vertices. For each one of them, VRAD will compute a color and brightness to apply. Finally, Source Engine will make a gradient between the vertices, for each triangle. For example:
If we take a simple example of a sphere mesh with 2 different light entities next to it, we can see it working.
With this lighting method, models will therefore be integrated in the environment with an appropriate lighting. The good thing is that, if a part of the model is in a dark area, and another part is in a bright area, the situation will be handled properly. The only requirement for this is that the mesh must have a sufficient level of detail in it; if there is a big plane area without additional vertices on it, the lighting details could be insufficient.
Here is an example of a simple square mesh with few triangles on the left and a lot on the right. With the complex mesh, the lighting is better, but more expensive.
If you need a complex mesh for your lighting, you don’t want your model to be too expensive, you have to find a balance.
Two VRAD commands are needed to make the Per-Vertex Lighting work:
StaticPropLighting StaticPropPolys You have to add them here. You can find more information here.
Another system exists, that is much cheaper and simpler. Instead of focusing on the lighting of all the vertices, the engine will only deal with the model’s origin. The result obtained in-game will be displayed on the whole model, using only what has been computed at the model’s origin location. This can be an issue if the model is big or supposed to be present in an area with lots of contrast in lighting. The best example for that is at the beginning of Half-Life 2 with trains entering and exiting tunnels. We can see the issue: the model is illuminated at the beginning, but when it enters the tunnel it suddenly turns dark. And this moment is when the train’s origin gets in the shadow.
This cheap lighting method will replace the per-vertex lighting for 3 types of models:
For prop_dynamic or any kind of dynamic models used in the game (NPCs, weapon models in hand, any animated models...) For prop_physics For ANY MODEL USING A NORMAL MAP (vertex lighting causes issues with normal maps apparently), EVEN IF USED AS A PROP_STATIC
The big problem with these models is their integration in the map, they won’t show any shadow and their lighting will be very flat and boring (because it’s the same used for the whole model). But hopefully there are 2 good things with this cheap lighting method.
First, the orientation from which comes light is taken into account, if blue light comes from one direction, therefore all the faces oriented toward this direction will be colored in blue. And if you have different lighting colorations/intensities coming from different sides of your model, they should appear in game.
Here is an example of a train model using a normal map with 2 lights on both side. If you look closely, you’ll see some blue lighting on the left, on faces that are supposed to be in the shadow of the blue light but are oriented toward the blue light.
The second good thing is that there is still some kind of dynamic per-vertex lighting, but much simpler: it only works with light and light_spot entities (NOT with light_environment), and it just adds some light to the prop, it cannot cast any shadow (it only takes into account dynamically the distance between the light and the vertex). If we use again the high-poly plane mesh we had before as a prop_dynamic, being parented to a func_rotating that ... rotates. Light is dynamically lighting the vertices of the props. There is a limit of 3 dynamic lights per prop, it can’t handle more at the same time.
And if you add a normal-map in your model’s texture, this cheap dynamic lighting works on it:
Projected texture and Cascaded Shadows
Few words to finish the study with dynamic lighting. Projected textures is a technology that appeared with Half-Life 2: Episode Two in 2007, it consists of a point-entity projecting a texture in the chosen direction, with a chosen opening angle (fov). The texture is projected with emissive properties (it can only increase the brightness, not lowering it) and it can generate shadows or not. The great thing with this technology is that it’s fully dynamic, the env_projectedtexture can move and/or aim at moving targets. This technology is used for example on flashlights in Source games. But as usual, there is also a drawback: most of the time you can only use only 1 projected texture at a time, modders can change this value quite easily but on Valve games it is always locked on 1.
The cascaded shadows system is only used on CS:GO. The concept is quite similar from a projected texture but it doesn’t increase the brightness, it only adds finer shadows. It is used for environment lighting, using much smaller luxels than for the lightmaps and it is fully dynamic. It starts from the tools/toolsskybox textures of the map and cast shadows if it meets any obstacle. Shadows from the lightmap are most of the time low resolution and the transition between a bright and a dark area is blurry and wide. Therefore, the cascaded shadow will be able to draw a clear shadow around the one from the lightmaps.
When an object is too small to get a shadow in the lightmap, it will be visible thanks to the cascaded shadows. There are 3 levels of detail for cascaded shadows on Counter-Strike, you can configure the max distance at which the cascaded shadows will work in the env_cascade_light entity at the parameter Max Shadow Distance (by default it’s 400 units). The levels of detail will be distributed within this range, for example:
Since cascaded shadows and projected textures share some technology, you can’t use them both at the same time.
I really hope you have found this article interesting and learned at least few things from it. I believe most of these informations are not the easiest to find and it’s always good to know how your tools work, to understand their behavior. Source Engine 1 is old and its technologies might not be used anymore in the future, more powerful and credible technologies are released frequently but it’s always good to know your classics, right?
I would like to thank Thrik and ’RZL for supporting me to write this article, and long live the Core!
// Written by Sylvain "Leplubodeslapin" Menguy
Additional commands for fun
Mat_luxels 1 // Allows you to see the lightmaps grids Mat_fullbright 1 // Disables all the lighting (= fullbright). On CS:GO, cascaded shadows stay and you should delete them as well (cf next command) Ent_fire env_cascade_light kill // KILL WITH FIRE the cascade shadows entity Mat_drawgray 1 // Replace all the textures with a monochrome grey texture, useful to work on your lighting Mat_fullbright 2 // Alternative to Mat_drawgray 1 Bonus:
Mat_showlowresimage 1 // Minecraft mode
tomm reacted to leplubodeslapin for an article, Source Lighting Technical Analysis: Part One
After the announcement of the Reddit + Mapcore mapping contest, the website has welcomed many newcomers. A proof that, even if it is a twelve year old game engine, Source engine attracts map makers, and there are lots of reasons for that. It is common knowledge that technology has moved forward since 2003, and many new game engines have found various techniques and methods to improve their renderings, making the Source Engine older and older. Nevertheless, it still has its very specific visual aspect that makes it appealing. The lighting system in Source is most definitely one of the key aspects to that, and at the end of this article you will know why.
About the reality...
Light in the real world is still a subject with a lot of pending questions, we do not know exactly what it is, but we have a good idea of how it behaves. The most common physic model of light element is the photon, symbolized as a single-point particle moving in space. The more photons there are, the more powerful light is. But light is in the same time a wave, depending on the wavelengths light can have all kind of color properties (monochrome or combined colors). Light travels through space without especially needing matter to travel (the space is the best example; even without matter the sun can still light the earth). And when it encounters matter, different kind of things can happen:
Light can bounce and continue its travel to another direction Light can be absorbed by the matter (and the energy can be transformed to heat) Light can go through the matter, for example with air or water, some properties might change but it goes through it And all these things can be combined or happen individually. If you can see any object outside, it is only because a massive amount of photons traveled into space, through the earth’s atmosphere, bounced on all the surfaces of the object you are looking at, and finally came into your eyes.
How can such a complex physical behavior from nature be simulated and integrated into virtual 3D renderings?
One of the oldest method is still used today because of its accuracy: the ray-tracing method. Just to be clear, it is NOT used in game engines because it is incredibly expensive, but I believe it is important to know how and why it has been made the way it is, since it probably influenced the way lighting is handled in Source and most videogame engines. Instead of simulating enormous amount of photons traveling from the lights to the eye/camera, it does the exact opposite. If you want a picture with a 1000x1000 resolution, you will only need to simulate the travel of 1 000 000 photons (or “rays”), 1 for each pixel. Each ray is calculated individually until it reaches the light origins, and at the end the result is 1 pixel color integrated in the full picture.
By using the laws of physics we discovered centuries ago, we can obtain a physically-accurate rendering that looks incredibly realistic. This method is used almost everywhere, from architectural renderings to movies. As an example, you can watch The Third & The Seventh by Alex Roman, one of the most famous CGI videos of all time. And because it is an efficient way to render 3D virtual elements with great lighting, it will influence other methods, such as the lightmap baking method.
OKAY LET’S FINALLY TALK ABOUT THE SOURCE ENGINE, ALRIGHT!
A “lightmap” is a grid that is added on every single brush face you have on your map. The squares defined by the grid are called Luxels (they are kind of “lighting pixels”). Each luxel get its 2 own properties: a color and a brightness. You can see the lightmap grids in hammer by switching your 3D preview to 3D lightmap grid mode.
You can also see them in-game with the console command mat_luxels 1 (without and with).
During the compilation process, a program named VRAD.exe is used. Its role is to find the color and brightness to apply for every single luxel in your map. Light starts from the light entities and from the sky (from the tools/toolsskybox texture actually, using the parameter values that has been filled in the light_environment entity), travels through space and when it meets a brush face:
It is partially absorbed in the lightmap grid A less bright ray bounces from the face Here is an animated picture to show how a lightmap grid can be filled with a single light entity:
When you compile your map, at first the lightmaps are all full black, but progressively VRAD will compute the lightmaps with all the light entities (one by one) and combine them all at the end. Finally, the lightmaps obtained are applied to the corresponding brush faces, as an additive layer to the texture used on that face. Let us take a look at a wall texture for example.
On the left, you have the texture as you can see it in hammer. When you compile your map, it generates the lightmaps and at the end you obtain the result on the right in-game. Unfortunately, luxels are much rougher, with a lower resolution, more like this.
On the left you have a lightmap grid with the default luxel size of 16 units generated my VRAD, a blur filter is applied and you obtain something close to the result on the right in the game.
In case you did not know, you can change the lightmap grid scale with the “Lightmap Scale” value with the texture tool. It is better to use values that are squares of 2, such as 16, 8, 4 or even 2. Do not go below 2, it might cause issues (with decals for example). Only use lower values than the default 16 if you think it's really useful, because you will drastically increase your map file size and compilation time with precise lightmap grids. Of course, you can also use greater values in order to optimize your map, with values such as 32, 64 or even 128 on very flat areas or surfaces that are far away from the playable areas. You can get more infos about lightmaps on Valve’s Wiki page.
But as we said before, light also bounces from the surface until it meets another brush, using radiosity algorithms. Because of that, even if a room does not have any light entity in it, rays can bounce on the floor and light the walls/ceiling, therefore it is not full black.
Here’s an example:
The maximum amount of bounces can be fixed with the VRAD command -bounce X (with X being the maximum amount of bounces allowed). The 100 default value should be more than enough.
Another thing taken into account by VRAD is the normal direction of each luxel: if the light comes directly against the luxel or brushes against it, it will not behave in the same way. This is what we call the angle of incidence of light.
Let us take the example of a light_spot lighting a cylinder, the light will bright gradually the surface - from fully bright at the bottom to slightly visible at the top.
In-hammer view on the left, in-game view on the right
Light Falloff laws
One of the things that made the Source Engine lighting much more realistic than any others in 2004 is the light falloff system. Alright, we saw that light can travel through space until it meets something, but how does it travel through space? At the same brightness, whatever the distance is between the light origin and destination? Maybe sometimes yes… but most of the time no.
Imagine a simple situation of a room with 1 single point light inside. The light is turned on, it produces photons that are going in all the directions around it. As you might imagine, photons are all going in their own direction and have absolutely no reason to deviate from their trajectory.
At one time, let’s picture billions of photons going in all the directions possible around the light, the moment after, they are all a bit further in their own trajectory, and all the photons are still there, in this “wave”. But, as each photon follows its own trajectory, they will all spread apart, making the photon density lower and lower.
As we said before, the more photons there are, the more powerful light is. And the highest the density, the more intense light is. Intensity of light can be expressed like this:
You have to keep in mind that all of this happens in 3D, therefore the “waves” of photons aren’t circles but spheres. And the area of a sphere is its surface, expressed like this:
(R is the radius of the sphere)
If we integrate that surface area in the previous equation:
With ♥ being a constant number. We can see the Intensity is therefore proportional to the reverse of the square of the distance between the photons and their light origin.
So, the further light travels, the lower is its intensity. And the falloff is proportional to the inverse of the square of the distance.
Consequently, the corners of our room will get darker, because they are farther away from the light (plus they don’t directly face the light, the angle of incidence is lower than the walls/floor/ceiling).
This is what we call the Inverse-Square law, it’s a very well-known behavior of the light in the field of photography and cinema. People have to deal with it to make sure to get the best exposure they can get.
This law is true when light spreads in all possible directions, but you can also focus light in one direction and reduce the spread, with lenses for example. This is why, when Valve decided to integrate a lighting falloff law in their engine, they decided to use a method not only following the inverse-square law but also giving to mapmakers the opportunity to alter the law for each light entity.
Constant, Linear, Quadratic... Wait, what?
In math, there is a very frequent type of functions, named polynomial functions. The concept is simple, it’s a sum of several terms, like this:
Every time, there is a constant factor (the “a” thing, a0 being the first one, a1 the second one, a2 the third one...), multiplied with the variable x at a certain degree:
x^0 = 1 : degree 0 x^1 = x : degree 1 x^2 : degree 2 x^3 : degree 3 ... And
a0 is the constant named “constant coefficient” (associated to degree 0) a1 is the constant named “linear coefficient” (associated to degree 1) a2 is the constant named “quadratic coefficient” (associated to degree 2) Usually, the function has an end, and we call it by the highest degree of x it uses. For example, a “polynomial of the second degree” is written:
Then, if we take the expression from the inverse-square law, which was:
With a2 = 1 and D being the variable of distance from the light origin.
In Source, the constant ♥ is actually the brightness (the value you configure here).
It is simply an inverse polynomial of the second degree, with a0 and a1 equal to zero. And we could write it like this:
And here you have it! This is approximately the equation used by VRAD to determine the intensity of light for each luxel during the compilation. And you can alter it by changing the values of the 3 variables constant, linear and quadratic, for any of your light / light_spot entity in your level.
Actually you set proportions of each variable against the other two, and only a percentage for each variable is saved. For example:
By default, constant and linear are set to 0 and quadratic to 1, which means a 100%quadratic lighting attenuation. Therefore, by default lights in Source Engine follows the classic Inverse-Square law.
If you look at the page dedicated to the constant-linear-quadratic falloff system on Valve’s Wiki, it’s explained that the intensity of light is boosted by 100 for the linear part of equation and 10 000 for the quadratic part of equation. This is due to the fact that inverse formulas in equations always drop drastically at the beginning, and therefore a light with a brightness of 200 would only be efficient in a distance of 5 units and therefore completely pointless.
You would have to boost your brightness a lot in hammer to make the light visible, that's what Valve decided to make automatically.
The following equation is a personal guess of what could be the one used by VRAD:
With constant, linear and quadratic being percentage values. The blue part is here to determine the brightness to apply, allowing to boost the value set in hammer if it is as least partially using linear or quadratic falloff. The orange part is the falloff part of equation, making the brightness attenuation depending of the distance the point studied is from the light origin.
The best way to see how this equation works is to visualize it in a 2D graph:
This website provides a great way to see 2D graphics associated to functions. On the left, you can find all the elements needed with at first the inputs (in a folder named “INPUTS”), which are:
a0 is the Constant coefficient that you enter in hammer a1 is the Linear coefficient a2 is the Quadratic coefficient B is the Brightness coefficient In another folder are the 3 coefficients constant, linear and quadratic, automatically transformed into a percentage form. And finally, the function I(D) is the Intensity function depending on the distance D. The drawing of the function is visible in the rest of the webpage.
Try to interact with it!
This concludes the first part, the second part will come in about two weeks. We will see some examples of application of this Constant-Linear-Quadratic Falloff system, and a simpler alternative. We will also see how lighting works on models and dynamic lighting systems integrated in source games.Thank you for reading!
Part Two : link
tomm reacted to Rick_D for an article, Making Agency, the popular CS:GO map
What is Agency?
Just in case you have never heard of Counter Strike: Global Offensive, it's a hugely popular online FPS, successor to Counter Strike: Source and the original Counter Strike. The original came out in 1999 and the core gameplay has remained almost unchanged. Players are split into two teams and challenge each other in various game modes such as Bomb Defusal (one team has to plant and detonate the bomb while the other tries to stop them) and Hostage Rescue (one team must rescue the hostages whilst the other attempts to prevent that). The Bomb Defusal mode is by far the most popular, with maps designed with such detail that players can predict down to the second when another player is due to arrive in a certain area of the level. It's also the only mode played in competitive events and for huge prize money.
This leaves the poor Hostage Rescue mode sitting on the sidelines twiddling it's thumbs and feeling a little rejected. In part this is because the Hostage Rescue mode is far more of a roleplaying experience, often with very poor odds of success for the team tasked with doing the rescuing. Often the levels are designed in such a way that the defending team has a large positional advantage, where simply staying-put will give them a good chance of winning.
That's where we can start talking about Agency. Agency is a Hostage Rescue level, created as a collaboration between level designer Patrick Murphy, and myself doing the art. The basic idea being that Hostage Rescue could be just as precise and exciting as Bomb Defusal. It's been included in three official releases from the games creator, Valve, as part of their community level packs: Operation Bravo, Operation Phoenix and Operation Bloodhound. Phoenix being a community-voted choice, which was especially great to see that players enjoyed the style of gameplay and visuals that Agency brought with it.
In this article I will go over the process of creating the art, from props to set dressing, texture creation and lighting, while maintaining a visually pleasing aesthetic and serving to enhance the gameplay. This isn't a postmortem but rather a walk-through of the various stages, hopefully to give some ideas to others, with lessons learned both positive and negative.
Iteration from Whitebox to Final
Starting out you should always have an idea of what you're going to create, even if it is quite vague, as it'll point you in the right direction for both creating architectural spaces and letting your imagination fill in the blanks as you build the basic shapes of the level. We knew we were going to build an office space, but style was leaning towards an older government building with red bricks and musty wood. As I started to put in some basic textures we decided it felt too bland, and similar to other levels in the game. In order to stand out and create something really interesting and intriguing that would entice players to want to explore the level we decided to modernize the space and use white as the primary colour - this would help players see each other more easily and provide a striking visual setting it apart from other levels.
"Modern Office" is not exactly a style that has a single look, if you search for images you'll get back a lot of contrasting designs and ideas, trying to put every single one of those into a level would create a visual mess with no consistency. It's important to choose the right references for what you are building, something that looks cool in a single image or from a specific location might not fit into the theme of the level, and in a worst-case-scenario it might actually start to detract from the level as a whole. Trying to cram in as much content as possible simply makes your level feel less unified and jarring.
Unfortunately when you are presented with so many fantastic designs and ideas it can be hard to pick out what is important. After settling on the location: a modern advertising agency's office, I broke down the needs of the level into a few different categories:
Area Specific General Use Overall Theme The Area Specific content is "hero assets" for each location in the level. These are the things that help the player tell different areas apart from each other, a reception desk, a kitchen, a bathroom, etc. Assets that won't be used anywhere else except in their specific location.
Examples of Area Specific Content
The General Use content is the backbone of the building, it's wall sockets, ventilation tubes, sprinklers, desks and chairs. The things that could be used anywhere and would blend in to the background and not stand out unless you were specifically looking for them.
Examples of General Use Content
The Overall Theme content is what sells the theme of the level to players, advertising boards, company logos, large art installations and so on. These can be used everywhere but sparingly and should only be used as a subtle reminder to the player of where they are thematically. They shouldn't detract from the Area Specific content but should stand out more than the General Use content. This came in the form of abstract paintings, corporate logos, rotating advertisement panels and so on - things that would subtly tie the level together.
Once these categories were laid out, searching through reference images became much simpler as you know what you need and only have to find an interesting design or detail that enhances a specific category.
This isn't to say that everything was completely planned out or that development was flawless. Sticking to a plan only works until you open the editor, and if you try to force something you'll end up frustrated when it consistently fails to work. As an example we originally had the level set on the ground floor of a tall skyscraper. I spent a few weeks working on content for the ground but never really getting it to feel right within the theme of the level: the contrast between a dirty exterior street section and a spotless interior didn't feel right for the level, and felt a little too similar to another Counter Strike level. Patrick played around with some ideas and tried something I was afraid of: simply deleting everything I had done on the outside and adding an epic city vista. Instantly it felt right. The important thing to take away from this is that just because you have worked on something doesn't mean it's the right thing to be working on, and that getting input from other people with different ideas can vastly improve what you are working on.
The first mockup of Agency's rooftop exterior
The same space after an art pass
Another incredibly important thing I realised is making use of modular assets. If you are going to duplicate something in your particular modelling software you should ask yourself: is this efficient? Chances are you're just making things harder to change later and locking yourself into a particular shape; eg: a walkway has a railing around it, you model the entire railing as a single object. Now if you need to change that walkway a month later you're going to have to go back and change your railing model. It's better to create a smaller tiling mesh that can be used multiple times, as often you'll find you can use that model in other areas and in different ways than you had initially intended. You're simply applying the concept of tiling textures to models, and in the process saving yourself a lot of time.
A Believable Clean Art Style
Creating a clean environment can often be more difficult and time consuming than a very dirty and cluttered one, simply because any mistakes are magnified by the lack of other objects to disguise them. A room with a single chair in the middle is going to end up with the focus being on that chair, if you fill that room with a hundred chairs you're going to be less concerned with the details of the chair and more worried about why someone would fill a room with a hundred chairs.
In the modern office setting of Agency it would have made little sense to fill it with props and clutter, but a large empty space would just feel unfinished. A delicate balance of larger architectural shapes and smaller objects was needed. I like to think of this as functional art: it serves a purpose in the lore of the game world. Window and door frames, electrical sockets, thermostats and card swipes along with the maintenance apparatus of ventilation systems. These are the general use objects mentioned earlier, they fill out space and prevent an empty wall or ceiling from actually looking empty and at the same time they contribute to the believability of the level. It's important to think of the infrastructure of the building when placing these assets - if a wall has an air vent on it then the wall needs to be thick enough to support the ventilation pipes that feed it, Card swiping mechanisms need to be placed near doors at the correct height, electrical sockets should be placed logically in areas where they would be of use to the fictional inhabitants of the level and so on.
Several examples of functional art details
One of the most important things to do right when creating clean environments is to get the most out of the materials. It's not possible to cover every surface in dirt or decals, so the surfaces themselves become your way of showing detail.
For Agency this was achieved by making liberal use of the phong shading techniques in the Source engine for models, and cubemaps for world textures. Almost all models in the level have some amount of phong shading, and although it doesn't produce a completely physically accurate result it can be used to create materials and surfaces that look relatively accurate. Simply by increasing or decreasing the intensity of the phong amount allowed for a vast majority of the levels surfaces to be rendered accurately. As I didn't need to have a lot of noisy detail in the materials due to the clean style I simply used a small phong texture as a mask for 75% of the models and let the lighting and general shapes of the models do the rest of the work.
Simple phong shading to mimic real world materials
As most of the surfaces had a single layer of material, ie paint or coloured metal, the phong shading could be completely even without breaking the illusion; however some of the dirtier surfaces such ventilation tubes and water pipes had several layers: a painted metal surface with area peeled away to reveal with metal underneath or a layer of dust. These had specific masks that would enhance the different materials, and showing wear and tear in the background assets added an extra layer of depth without compromising the clean style.
Most of these textures were created with dDo, an excellent tool for quickly creating textures. I generally started with quite a dirty texture preset and toned down the details and noise until they were barely perceptible surface imperfections.
Agency features probably close to 95% custom art, and that's a lot of work for a single person. Using dDo allowed me to make a lot of content relatively quickly, and kept it all visually consistent.
The process of creating the assets with dDo was quite simple: first I modeled the basic ingame asset, then did a very quick and dirty placement of edge loops that allowed me to smooth the mesh and get a workable high poly. A very rough normal map was baked (along with a more solid ambient occlusion map), this rough normal map would never make it into the game, it was used purely for texturing with dDo. This rough-and-dirty technique was mostly used on the more general purpose assets that nobody would spend a lot of time looking at. For the objects that were in high traffic areas or that required finer detail a more robust normal map was created.
Tiling textures used throughout the world were photo-sourced and tiled in Photoshop. A few examples worth pointing out are the plaster wall textures and the marble floors:
The image above shows the ingame result, the diffuse texture, and the normal map of the standard plaster that is used throughout the level. The normal map was authored at 1024x1024 compared to the diffuse texture which was 512x512. I created several colour variations of the diffuse texture and for a very plain surface using a 1024x1024 diffuse didn't make much sense. The final touch was to add a subtle cubemap effect to bring out the normal map and add interesting coloured reflections in various areas.
Another example is a marble floor used throughout the level. The normal map is unrealistic in that it portrays an uneven bumpy surface when in fact it is more likely to be uniformly flat. However to break up the reflections and add some visual interest to such a large and empty area I added a subtle bumpy normal map which warps the reflections, but is subtle enough that it doesn't get picked up by the lighting and actually appear like a lumpy mess.
Good shading only gets you part of the way there, however. A poorly scaled model can break immersion instantly, especially when you are trying to create a believable real-world environment. There are tried-and-true metrics for Counter Strike so having a base to work from helped immensely, but these only give you a good starting point or a bounding box for your object. It's important to study real world reference and make sure your object is proportional to the world around it and also to itself. A unit in Hammer is an inch, so having wood that's 2 units thick, or a doorway that is 1.5m wide quickly makes things look wrong.
Working with Designer Blockouts, and not Destroying Gameplay
Agency was a collaboration, with Patrick doing the design work and me doing the visuals, this meant there was a lot of potential for overlap and working on the same areas, the potential for breaking things was huge.
Often when you create things as an individual you don't have to worry about version control or stepping on someone else's toes, however when you work with other people either for pleasure or business you, as an artist, need to change your mindset. You are not creating a portfolio piece but rather something functional that has to withstand hundreds of hours of real people playing it.
Your first role is to support the designer, and this benefits you as well. By creating the basic structures of the level: doorways, window frames, stairs, railings, cover objects etc, you are allowing them to work with the final assets and tweak gameplay according to those assets. Nothing needs to be finalized instantly, it's better to provide a rough mockup of the intended asset so the designer can play around with it and give feedback on the shape, size and silhouette. Once you are both confident it's going to work they can populate the level with these assets which saves you time in the long run, and once you finalize the model and textures they are going to be updated across the entire level without having to manually replace assets.
It can be difficult to determine exactly when you should start an art pass, especially when a level is constantly evolving. Rather than sitting idly by whilst Patrick was ironing out the design of the level I started on the creation of a few visual test levels to explore materials, lighting and modular assets. Once the first iterations of Agency were created, with rough shapes for important cover and controlling lines-of-sight. I went in and created an art pass and altered many of these original gameplay ideas, simply experimenting with different shapes and designs for the rooms. We had a constant dialogue and never considered something finalized just because it was finished. Playtests would determine whether an idea was valid or not in a way that speculation can only hope for. The most important lesson learned during this process of constant iteration was that work is very rarely wasted, and it is far more important to stay true to a gameplay ideal than to have an area that looks interesting in a screenshot but utterly fails when players get their hands on it. A box is a box is a box, it is down to you as an artist to imagine how that box can be interpreted within the context of the environment.
Initial art pass ideas for the central area (above) versus the end result (below)
Initial art pass ideas for the reception (above) versus the end result (below)
Initial art pass ideas for a hostage (above) versus the end result (below)
An important part of any environment is the lighting. Too contrasted and moody and it becomes hard to identify players, too bright and monotone and it becomes boring and a strain on the eyes. For Agency I used a series of instanced lighting setups: a model to visualise the light source, a spot light to direct the light, and a sprite or light cone to add a visual effect around the light. Each light setup was unique to the type of model used for the actual light source, ie: all spotlights were identical, all fluorescent lights were identical etc. This meant I could change a single light and have the others update automatically, and always get an accurate result.
Then it was just a case of placing these different types of lights where they logically made sense in the environment, and if an area was too dark an appropriate light source was added, and if an area was too bright lights could be moved around or removed entirely. This made it quite easy to light as everything was guided by reality, which has plenty of reference material, and had the side effect of helping to make the environment more believable. By using various colours on the floor and walls I could direct lights towards them and take advantage of the Source engine's excellent radiosity and spread interesting colours to nearby surfaces.
In many areas the ceiling was opened up to reveal the sky and to let natural sunlight into the interior spaces, this was done to provide contrast to the electrical lights and to get extra radiosity bounces into the environment. Some areas had lights removed or toned down to allow other more important gameplay areas to stand out, for example the image below shows how the corridor here was darkened both by using darker textures and by using restrained lighting to make the room in the distance appear brighter as this is an area that enemy players will appear from.
This could have been taken even further by possibly using emergency exit signs to add hints of colour to important gameplay areas and chokepoints. A consistent lighting language would have helped guide players during the first few times playing the level. There are some large open spaces that would have benefited from some coloured screens or lighting panels, or possibly making some of the larger glass surfaces tinted, to add a little extra colour and prevent such a monotone look whilst not being over-bearing or detracting from the realistic style of lighting I was aiming for.
During the course of developing Agency I had a chance to learn a few things and come out the other end a, hopefully, better artist.
So, what went well?
The iteration process never had any hiccups, by using modular content and being prepared to discard ideas and art styles that weren't working we ended up with a better level. If we had tried to force the original idea of a ground-level government office we would have ended up with a completely different level, complete with underground parking lots and elevator shafts. Exciting stuff!
The power of iteration cannot be understated, and understanding that a mockup or a blockout of a level is simply a temporary phase that doesn't represent the end result. Areas changed drastically between versions, sometimes due to design requirements, and sometimes of shifts in art style; but each version was better than the last, more refined and polished.
What went less well?
In direct contrast to the statement above, sometimes the iteration interfered with more important tasks. I got stuck on areas trying to get them to work instead of letting them sit for a while and returning to them later. I tried to force an idea for the exterior part of the level and it never felt right and consumed way too much time, when all it took was getting some outside perspective. Luckily during the process I learnt to trust designers when it comes to art, just because they might not build high poly meshes doesn't mean they aren't artistic.
Another problem was building too much content completely unique for an area which meant when we inevitably changed things it became time consuming to shift assets around, and makes it less easy for others to re-use that content without creating an almost replica of the area it was designed for. These unique assets helped sell the realism of the level but made them harder to work with.
Hopefully this has been interesting and insightful!
tomm reacted to Sentura for an article, Exploring Unreal Engine 4 Scripting: Part One
On the other hand, UE4 has also been somewhat stripped of “default” content in order to emphasize the user-generated content located on Epic’s new marketplace. This tutorial series is designed to bring you up to speed on UE4 level-design by showing you how blueprints work and how you can create your very own blueprint building-blocks.
Understanding Blueprints The Blueprint system is a visual scripting language central to all game interaction in UE4.
Blueprints come in two flavors: Level blueprints and Class blueprints. Level blueprints are attached to your level, whereas Class blueprints are self-contained templates for a single type of object in your level (a “class”) only. Anything you do in a Level blueprint can also be done in a Class blueprint, but Level blueprints additionally enable you to set up communication between multiple Class blueprints.
Let’s take a look at what actually goes on inside these blueprints.
Inside Blueprints Let’s start with the two basic blueprint nodes: Functions and Variables. Variables can be explained as containers of object data, while functions essentially perform game logic upon variables.
The next section will cover these nodes in more detail.
A Player variable with a Jump function. As illustrated, executing the function (f) causes the player to jump
Object Data (Actors and Variables)
Although they are very versatile, variables are most commonly used to control actors, objects that exist inside the game world. Characters, weapons, doors, switches are all examples of actors. Additionally, every actor’s variables can potentially be manipulated by functions, for example the health of a character stored as an integer value.
A actor variable (player) with health and position stored as an integer variable (green) and a 3D-vector variable (yellow), respectively
Actors can also contain components: other actors incorporated inside the main actor. This enables static meshes to have component collision boxes, or to be paired with component particle effects, among other things.
The components of this door object are two meshes (a door and a doorframe) and a collision box that helps control the door’s physics behavior
Functions are nodes of logic which can be executed (called) to perform a certain task. If something needs to take place in-game, such as a player picking up a weapon, functions can enable as well as add additional consequences to that action.
A function execution string (the white line)
Functions present and modify variable information. For example, a function which acts upon information gathered by a variable could teleport players to specific game-world coordinates. A ‘getter’ or ‘pure’ function, on the other hand, merely relays information for use elsewhere, such as reporting a player’s current coordinates in the game world.
A ‘pure’ function (green). Notice that ‘pure’ functions do not have independent execution, only when linked with a regular function (blue) does this particular function have effect
So, we’ve covered Variables and Functions. But how does the Blueprint system know how and when to react to incidents inside the game world?
Events allow different actors to communicate with each other. For instance, an event controls when an actor collides with another actor, or what an actor should do if a collision actually occurs. More examples of an event are a door opening as a character nears it, a switch being thrown, or a barrel exploding after it has taken sufficient damage. An example of an event could even be as fundamental as a player using controls to move their character model. Customized events can be called much in the same way a function would be.
Event (red) called if an actor is hit. The event triggers a function linked to taking damage. This example is intended for learning purposes, not for practical use
Quick aside: In general, as a good practice, variables, functions and events should be named for their exact purpose. This helps both you and others read what’s going on in your blueprints. An actor named “player”, or an integer named “health” is easier to understand than one named “asdhjkashdj”!
For more information on variables, functions and events, please refer to Epic Games’ own documentation, which provides encyclopedic knowledge about the topic.
Case study Now that we understand the building blocks of UE4’s Blueprint system, let’s look at a practical example: the Class blueprint of a sliding door (If you want to create your own sliding door, I recommend taking a close look at Epic’s in-depth guide.
When a player gets close to it, the door opens. When a player leaves the door’s vicinity, it closes. Let’s examine the door’s blueprinting:
You can see that the door actor is composed of several components: a frame object, a door object and a triggering box
In this image, we can clearly see the nodes used to trigger the door’s opening and closing. For example, the event OnComponentBeginOverlap triggers once a player steps into the Box component actor listed. That triggered event starts executing anything along the execution logic path, such as the Timeline function and the Set Relative Location function.
The Timeline function changes an integer with decimals - the Driver float variable – between 0.0 and 1.0 over time, and sends execution updates every time the float changes. The float variable is called Driver in this case, because it drives the door to either open or close. The Lerp function’s Alpha parameter then uses this float value to determine the exact position of the door between being open (float value of 1.0) and closed (float value of 0.0). The Vector variables Door Closed Position and Door Open Position are end points for Alpha to blend between. This is to ensure that the door opens and closes smoothly over time rather than instantly.
Set Relative Location then executes the data received from the Lerp at intervals put forward by the Timeline’s update execution for the door that we use. The result is a door which slides opens when players are nearby.
Lastly, our OnEndComponentOverlap event triggers the closing of the door by reversing its operation when players leave the triggering box.
Here you can see our moving door in action:
To be fair, this case study is a bit over-simplified in order to provide an example that can be easily understood. The real version of this door (which will be shown in the next part of this series) is a bit more advanced, but its core principles are exactly the same.
So far, we’ve covered the structure of variables, functions, events, as well as a common gameplay element like a sliding door. In the part two of this tutorial series, we’ll learn some more advanced blueprint features, such as class recognition, level blueprints and blueprint communication.
Thanks for reading!
tomm reacted to Thrik for an article, A MapCore and RunThinkShootLive Mapping Challenge
The theme of the contest is quite wonderful and should appeal to all MapCorians whether you're participating or observing, and there are some lovely prizes on offer too. You'll find out more when the challenge is announced and kicked off in a week's time.
Stay tuned — we hope to see you involved!
tomm reacted to FMPONE for an article, 2014: MapCore's Year in Review
Overview of 2014's articles We published a ton of high-quality, original content in 2014. Take a look — you might spot something you missed!
Interview with Mateusz 'seir' Piaskiewicz, Techland Senior Level Artist
Interview with Rosin 'kikette' Geoffrey, Arkane Studios Environment Artist
Deus Ex: Human Revolution scene interview with KNJ
Virtual Reality: The Final Platform
Interview with Francois 'Furyo' Roughol, BioShock Infinite Level Designer
Interview with Thibault 'dkm' Courbet, Wolfenstein: The New Order Level Designer
Interview with Lenz 'penE' Monath, Environment and Lighting/VFX Artist
Interview with Thiago 'Minos' Klafke, Blizzard Environment Artist
Interview with Paul 'PaulH' Haynes, Homefront: The Revolution Senior Level Designer
Korath: The Witcher Saga scene interview? with Krzysztof 'Tepcio' Teper
Level Design in The Last of Us: Part One, Part Two, Part Three
13,500+ reads (all parts)
Contests and challenges Even better, MapCore continues to thrive as a close-knit community. We collaborated, playtested one another's work, and inspired eachother. Thanks to RZL for his great work organizing Counter-Strike: Global Offensive playtests. SpronyvanJohnson also did a great job organizing MapCore contests, where users pushed themselves to improve their skill set.
We had a fantastic contest and two thrilling challenges, all of which received unprecedented levels of support and engagement. You can relive the action here:
Quake 3 15th Anniversary Contest
CS:GO Sticks Mini Texturing Challenge
New logo and branding For the first time since the forums were established in 2003, 2014 saw the introduction of professional-grade branding, which was brought to life by our very own Arthur de Padua (AKA Thurnip), including a wonderful new logo! We also set up a small store for those wishing to spread the wonder of MapCore throughout the world, complete with Arthur's beautiful new designs, and we'll be updating the store with even more new products based on your feedback very soon!
New logo and branding by Thurnip
Babies! MapCore kids were also born in 2014! ...God help us all. A huge congratulations to Skjalg and SpronyvanJohnson for their ultimate creative projects: bringing new life into the world. If we missed anyone, let us know in the comments so we can add you!
By 2-D Chris
Employment As a community, MapCore has always been a mixture of veteran game developers, aspiring amateurs, and plain ol' gamers. One of the best parts about that mixture of experience-levels is when one of our members gets an awesome new job within the industry. In 2014, we got a LOT of great news on that front.
Martin "Sentura" Colith - Level Designer at IO Interactive (Copenhagen, Denmark)
Al "Intelect0" Anselmo - QA Tester at Top Free Games (Sao Paulo, Brazil)
Lenz "penE" Monath - Environment Artist at Yager (Berlin, Germany)
Oskmos - FX Artist at DICE (Stockholm, Sweden)
Morten "Mazy"Hedegren - Game Designer at Brain+ (Copenhagen, Denmark)
Skjalg "Skjalg" Sturlasson Maehre - Programmer at Megapop Games (Drammen, Norway)
mr.P - Senior World Designer at Avalanche Studios (NYC, NY, USA)
Pete_H - Game Designer at Gameloft (Barcelona, Spain)
Jobye-Kyle "deceiver" Karmaker - Level Artist at Ubisoft Toronto (Canada)
Alex "AlexM" McGilvray - Build/Tools Engineer at United Front Games (Vancouver, Canada)
Alexander "Taylor" Taylor - Game Designer at Space Ape (London, England)
Kacper "knj" Niepokólczycki - Environment Artist at CD Projekt Red (Krakow, Poland)
John "Ginger Lord" Crewe - Senior Technical Designer at Cloud Imperium Games (Manchester, England)
Paul "PaulH" Haynes - Senior Level Designer at Deep Silver Dambuster Studios (Nottingham, England)
Toni "SotaPoika" Seppänen - Junior Level designer at Next Games (Helsinki, Finland)
Austin "Setin" House - Designer at Escalation Studios (Dallas, Tx, USA)
Richard "KoKo5oVaR" Malinar - Environment Artist at Krysalide (Lyon, France)
Mateusz "seir" Piaskiewicz - Designer at Treyarch (Santa Monica, California, USA)
Jason "General Vivi" Mojica - Senior Level Designer at Overkill Software (Stockholm, Sweden)
Will "Vilham" Josephy - Senior Level Designer at Cloud Imperium Games/Foundry 42 (Manchester, England)
Chris "2d-chris" Kay - Senior Level Designer at Epic Games (Cary, NC, USA)
Liam "PogoP" Tart - Environment Artist at The Creative Assembly (Horsham, England)
Matthew "bawwwcas" Barcas - Level Designer at Pure F.P.S. (Los Angeles, California, USA)
Francois "Furyo" Roughol - Senior Mission Designer at Sucker Punch Productions (Bellevue, Wa, USA
Friedrich "FrieChamp" Bode - Level Designer at Goodgame Studios (Hamburg, Germany)
Our members' success rate at having their content (gun skins, maps) added into Counter-Strike: Global Offensive also continued to be astronomical.
Wrap-up At the end of the day though, MapCore has always been about one thing: sharing work in progress, receiving feedback, and learning from one another. In 2014, MapCore's WIP threads buzzed with life and activity, and our 2D and 3D forums were a goldmine of beautiful work, interesting ideas and fun experimentation.
Our community is working better than ever, and 2015 should mark even further progress in the growth of this awesome forum.
SpronyvanJohnson's map given feedback in the form of an overpaint by Seir