Creating flexible maps (WIP)


(Ifurita) #1

Just a couple of thoughts

Creating Flexible Maps
Is it possible to create a map that competes equally well for stopwatch (SW) and campaign matches? I’m going to take the position that, "yes, you can build such a map, with a little bit of foresight. First, let’s examine the requirements of a SW map vs. a campaign match.

Different Game Modes Require Different Map Designs

  • First, game objectives are different. In a campaign match, teams play over a series of 3 different maps. The first team to win 2 maps wins the match. The MAXIMUM number of games a team will play in a match is 3. Conversely, in SW matches and depending on the league rules, teams play the same map in rounds. The first team on offense tries to set a time, then the sides switch and the new attacking team tries to beat the time. The team with the lowest time in the set wins the round. First team to win 2 rounds wins the match. This means that each team will play a MINIMUM of 4 games.
  • In a campaign game, a full hold is a win for the defender. In a stopwatch game, a double full hold is a tie and therefore may not count towards the 2 round win requirement. It is not unheard of for teams to have many tie rounds resulting in very very long matches.
  • Since the time-to-complete is the primary determinant of victory in SW, maps should favor the offense. Full holds, given totally equal teams, should be rare. On the other hand, campaign maps SHOULD result in full holds (e.g., defender victory) approximately 50% of the time, given equal teams - now you can see why it’s tough to design a map that plays equally for both gametypes.
  • Stopwatch matches typically involve more games, so if you want to keep match times approximately the same, stopwatch matches need to play faster and have shorter map times.

The Scripting Engine Is Very Powerful and Flexible

So how do you create map that does both things well, when it seems like the requirements are so different? The answer is creative scripting and thoughtful map construction. What do you mean? Let’s take a look at what you can actually change by just editing the .SCRIPT file, meaning that you don’t have to recompile a whole new map. Naturally, this assumes that you’ve added the proper entity keys (e.g., targetname, scriptname keys) during the mapping process. I’ll use my map Vengeance_final as an example:

  • Remove barriers (completely remove side door)
  • Make barriers easier to destroy (make the Main Gate satchelable)
  • Remove or add constructibles (remove ammo bunker doors, add/remove constructible MG’s)
  • Change spawn times (make attacking axis spawn every 15 seconds vs 20 seconds)
  • Reduce game length (reduce the map time from 30 minutes to 20 minutes)
  • Make spawn bonuses contingent on holding CP (axis gain 5 second bonus when CP is built)
  • Add or remove spawn points (make CP a spawn point only when Axis build CP)
  • Reduce the number of objectives required to win game (need to only blow one rocket instead of both)
    -Make vehicles move faster

OK, big deal. So what?

Effective Use of Scripts Allows You To Radically Tailor Your Maps

Given the differences in game requirements we discussed above, and assuming that you are starting with a pretty balanced map, what do you need to change to make a map designed for campaign, into one more suited for stopwatch?

  • Speed up vehicles
  • Remove constructible MGs
  • Remove barriers or make them easier to destroy
  • Increase the attacker-defender spawn time differential
  • Give the attackers spawn time bonuses based on the completion of key tasks (e.g., building CP)

What about the reverse. How do we take a map designed for stopwatch more suitable for campaign?

  • Add barriers
  • Make barriers harder to destroy (e.g., require dyno for previously satchelable barriers
  • Add constructible MGs

All It Takes Is A Little Forethought

So what do I need to do to make this all possible? As I’ve been editing scripts for Vengeance_final for various leagues and game types, I would recommend the following:

  • Give every entity (team doors, MG’s etc) a targetname and scriptname
  • Decide what gametype your map is built for and focus on that, but keep in mind what your map would need should you want to tailor it for the other gametype.
  • You can add entities to a map that you can simply turn off via your script. I came to this realization purely through luck. I started out with constructible MGs on top of 2 bunker, but received feedback that this just made it too hard for the attackers. I was lazy and didn’t want to remove them from my .MAP file, so I just setstated everything to invisible. What this allowed me to do later, is to add the MG’s back into the map when I wanted to tweak my map for a campaign match. You could also do the same thing with barriers and team doors.
  • Tweak your .SCRIPT and .ARENA files and add them to a new pk3 file that comes later alphabetically. This will make the server override your original files with the new ones. I like adding a new .ARENA file to visually show players 1) that they are playing a “new” map and 2) what changes were made to the game play.
  • Tweak game length to get your map to the point where you think the defenders will hold the full time approximately 50% of the time.

One of the really nice things about being able to do this, is that you can nearly create a new map in less than 5 minutes. If you’re looking to test maps and gameplay, it gives you an option to rapidly tweak gameplay, easily distribute new files (<10Kb in size), and get it into the hands of people who will be playing your map. OK, that’s enough rambling for now. Comments? Feedback?


(pgh) #2

Iffy owns me :confused: - sticky this. \o/


(thore) #3

setstate invisible indeed is a nice feature to rape for balancing purposes (rather than use it for what is was made for… ctf objs and constructables)
but one shouldn’t get crazy about it. more than 2 different map types will confuse players. even months after etpro’s first attempt to make the
battery backdoor dynamiteable, i still hear a ‘WTF?’ on the servers, when the ‘dynamite plantet’ vo comes out of the speakers. sure, most of
them are new to the game - but one cannot assume there are only semi-pros playing the game, who know every map and its variants by default.

thx to ifurita for pointing the possibilities out, i am quite sure those will get attention, although it is again more work to do on the loved scripting,
but pleeeeeeeese be careful. i hate joining servers - every one running a different setup on available weapons, charge times, sticky charge, limited
weapon numbers and so on…going crazy with the map scripts may lead players to the point, that they cannot even guess what game they have
to deal with when joining an unknown server.

i would appreciate some clear notification for the player, whethre he’s going to play the pub, the campaign or the sw version of a given map.
don’t really know how to do it. maybe a commandmap icon?


(Kendle) #4

Personally I think it’s an excellent concept, and I’d rather confuse a few noobs than see good maps go to waste (any map that doesn’t play well in SW is a waste from my perspective) for want of a bit of scripting. The concept of “TE” (Tournament Edition) maps isn’t a new one, this is just another (simpler) way of implementing them.


(DG) #5

Maybe if you have some noticable object near each spawn which is there in “campaign version” and is not there in stopwatch version, or vice-versa, and only have the two versions - unlike battery which sometimes has the back door destructable, but this is no indicator to wether the ramp needs a satchel or dyna to blow.

maybe it’s even possible to tie the scripting with g_gametype? mp_village in rtcw is very different depending upon if server is in objective/sw or CTF.


(Mean Mr. Mustard) #6

Yes, you can script things according to g_gametype. SiliconSlick and I did so in V2 Factory - since it was dual-objective, it didn’t play well in SW. So, we removed a win option using scripting and cvar g_gametype which made more sense for SW


(Ifurita) #7

@DG, yes, you can make gameplay change based on gametype. Mean Mr. Mustard did that with V2_Factory

@Everyone else. Totally agree that you don’t want to go crazy with changes. However, I’m focused on a pretty well defined group of people - leagues who are looking for SW and campaign maps. Right now, it’s just easier to prototype thru script changes rather than recompile and rerelease new maps (which is a big deal for mappers). I’ll add things to the .map file and recompile later, when we’ve had good solid feedback on gameplay and all.

That is also why I include the .ARENA file - it changes the map name in the splash screen as well as specifying in the flavor text which version is playing and a summary of the changes. If your command map is reasonalby sized, you could also include that with the new name


(Detoeni) #8

Another thing to bear in mind when setting a map up for this, is if you have objectives in the map sutch as bridges or a fuel dump, dont make them the objective, set them as script movers and use clip brushies for the objective entities. This way you can swap out the objective and leave the model/scriptmove for use in the new game verson. Our Bergen map was set up in this maner after we were approched about doing a custom verson (didn’t get the go on that, but it seamed a good idea to make the changes anyway) and it also made things easier when swaping the map to LMS mode.


(Ifurita) #9

Good idea.

I actually got lucky (and was a little lazy). I started thinking about this because the objectives in Vengeance randomly spawn in one of 3 ammo bunkers. When we started talking about making a TE version, it was just a matter of editing one line of code (accum n set x vs accum n random 3) to fix it in any one bunker - and we could try out different layouts since the objective entities were already in place in the other 2 bunkers.

The whole part of the constructible MGs came about because I didn’t want to delete them in the .map file and have to recompile.

In hindsight, if I had to/when I recompile the map, I would make the other two fixed MGs have target names and assign a targetname to the remaining team door