OrangeMario wrote:I actually wanted to start making a map for WDI, but I'm not quite sure which wad's or pk3 files I should use as a base for testing while in Doom Builder 2 ( since the more popular servers use an array of addons ).
I've already checked this forum for anything regarding Doom Builder guidelines for this mod, but did not find anything...
Any actors or scripts I should keep in mind in order for maps to work with this overhaul, when I start making maps?
huh, I actually never really thought about writing out some tips or guidelines for this. Kind of funny in a way because all the people who have made maps for this mod seem to just somehow know what they are/were doing, yet it hadn't occurred that some people may not.
SO IN THAT CASE, I'LL WRITE A MINI-GUIDE NOW!
=============================
WhoDunIt: A mapping guide
mini-version
I. -- Scripts
WhoDunIt's scripting takes care of all the necessary gamemode stuff for you, as long as you set the gamemode to survival (testing your map in singleplayer or even co-op works fine too, but expect gamemode-specific things to break).
As Dr.Robotnik had mentioned, I do recommend pasting a copy of this script into your map:
Code: Select all
#Define MAP_NAME "{Insert Desired Map Name}"
#Define MAP_AUTHOR "{Insert Desired Author}"
Script 117 Enter
{
SetFont("BIGFONT");
HudMessage(s:MAP_NAME; HUDMSG_FADEINOUT, 9999, CR_RED, 0.75, 0.18, 3.0, 1.0, 1.0);
Delay(50);
SetFont("SMALLFONT");
HudMessage(s:"By: ", s:MAP_AUTHOR; HUDMSG_FADEINOUT, 9998, CR_WHITE, 0.78, 0.20, 3.0, 1.0, 1.0);
}
Change the strings for MAP_NAME and MAP_AUTHOR accordingly. This script is the same one used on every WDI map to show the map's name and author when players load in (the exception is WDI02, which due to it's long title uses a slightly different version, but nothing too different).
Speaking of scripts, WDI uses a -lot- of higher-numbered script ranges (because the dawn of named scripts had not come yet for Zan). Anything below Script 400 should be fine, but beyond that and you'll likely run into problems, especially near the 700-900 range.
WhoDunIt does provide a good handful of functions you can use in your own map scripts to interact with the gamemode. A list is provided here with some descriptions:
Spoiler: WDI Functions (Open)FORMAT: <function name> : <return type> - <description>
- WDI_GameState() : int - returns the current state of the gamemode. These are defined in redrum.acs as follows:
Code: Select all
#libdefine GAMESTATE_WAITFORPLAYERS 0 // the game is waiting for players to show up
#libdefine GAMESTATE_SAFETYCOUNTDOWN 1 // the game is in safety mode
#libdefine GAMESTATE_MURDERCHOOSE 2 // the game is choosing a murderer
#libdefine GAMESTATE_GAMEACTIVE 3 // the game is now active and awaiting an ending condition to be met
#libdefine GAMESTATE_GAMEOVER 4 // the game is over and the tally board is being shown
So for example, if you wanted to have your script see if the game is being played at the moment, you can do something like the following:
Code: Select all
if(WDI_GameState() == GAMESTATE_GAMEACTIVE)
{
<do stuff>
}
- WDI_Ending() : int -- returns the ending condition that triggered the GAMESTATE_GAMEOVER gamestate.
Similar to WDI_GameState(), you can use this to do stuff in your scripts for a specific condition. The endings are defined like so:
Code: Select all
#libdefine END_INOLOSE 0 // the innocents lost; all innocents died and the murderer is alive
#libdefine END_MURLOSE 1 // the murderer lost; the innocents have killed him or he fell victim to a trap of his own
#libdefine END_MURSUICIDE 2 // the murderer went insane and died
- WDI_EndFade(bool) : void -- sets whether the screen should fade out for all players when GAMESTATE_GAMEOVER is reached. By default it is enabled, but can be disabled on your map via a script. The best example of usage for this is in Zeberpal's "Marsis" map, where he shows ending images on the screen for special endings. In order for these to show up properly, the fade effect had to be disabled.
- WDI_MurdID() : int -- returns the player number (0-based) of the murderer. Combining this value with the define TID_START will give you the murderer's TID.
- WDI_IsFinale() : bool -- returns true if the game is in finale mode, false if it is not.
Because finale mode was a later addition, it never received a proper gamestate. So this will tell you if the gamemode is currently in finale (which is when the music changes, the murderer receives a legitimate 'wallhack' to find the other innocents, and a message "The Innocent's numbers are dwindling..." appears on the screen for a moment). An example usage of this is on the map "CastAway", which changes the weather to a thunderstorm when finale mode starts.
- WDI_ForceTracker(bool) : void -- if true is passed as a parameter, then the innocent tracker/wallhack from finale mode will be enabled immediately. Passing false will turn it off, but the tracker will still activate (and remain active) if the game is actually in finale mode.
- WDI_CheckForActivePlayers(int) : bool -- this will return true if int amount of players are currently in the game (including the murderer). This can be helpful if you want to modify your map via script depending on the amount of players.
- WDI_SetFinaleMusic(string) : void -- this sets the finale music to a custom track of your choosing. This MUST be set before finale mode is actually reached, otherwise it'll play the default tracks, as finale mode only changes the music once. If you have several custom tracks you want to use, you can stuff them in an array and access the index using the Random() function.
- WDI_CountInnocents() : int -- returns the amount of innocents currently in the game. Used by the gamemode, but could be used in map scripts if desired, so it is listed here.
To use these functions in your map, you will need to place the source files (.acs) in a directory that acc.exe can reach, or one that you can specify manually (HIGHLY recommend using relative paths! If you do not know what I mean, google it). At the top of your script, you must put:
or, say you have a folder outside of the ACC folder with it, you can do something like:
This will give you access to the functions and defines you need.
II. -- Things/Actors/Items/etc.
If you are using Doom Builder 2 (and you really should be), you'll find that most if not all of WDI's things are categorized quite nicely near the bottom of the list, each beginning with "WDI". There are probably some things to explain though:
Spawners: Any weapon or item you place will be there 100% of the time like a normal Doom thing. However, if you place a 'spawner' version, then it will have a random chance to spawn a something (or nothing at all). In particular, melee spawner has a chance to spawn a pipe or wrench, while gun spawner has a chance to spawn a shotgun or pistol. Likewise for the ammo spawners: they can spawn either a pistol magazine or a shotgun shell. Item spawners and health spawners should be self-explanatory as well.
Murderer Stuff: These are item refills for the murderer. Each item placed is deliberate: there are no random spawn chances for them. Be ABSOLUTELY SURE you place these in a "restock room" for the murderer, or at least somewhere you intend only the murderer to access! I can't recall if I added code to make sure the innocents cannot use murderer items, however they can still certainly pick them up and deny the murderer a 10-20 minute respawn time on them. Additionally, do not place them too close to walls that innocents can pass by; WDI02 had that problem and players could 'plasma bump' the bertholite gas if run into at the proper angle.
Action markers are the little floaty exclamation points you see that indicate a murderer door. Set their Z-height and position properly and that's all you need to do.
III. -- Mapping-specific
Murderer Doors
There is actually a decent amount of complexity to proper murderer doors. So I'll try to go over the steps to implementing them:
- Create your doorway and murderer hall as usual.
- Create a small sector in front of the door that is flush with the wall. This will be your 'fake' texture to hide the door's opening and closing (which allows the murderer to peer out of the door without being seen). Set the midtexture on the side facing OUT of the tunnel to whatever the nearby wall texture is (or something else if you feel like it I guess). Align as needed. Leave the line side facing into the murderer tunnel as untextured.
- Add a thing #1411: Sound Sequence Args to the door sector, and set its index to 60. This is an empty sound, and will silence the door's opening/closing noise.
- For the door itself, set the line action to 202: Door Generic, with the activation method as 'player bumps', the repeatable flag, and arguments set to the following:
Code: Select all
Tag: 0
Movement Speed: 100
Type: Open Close
Delay: 1
Lock: Red Skull Key
- Another thing you MUST do, is set either the fake texture wall OR the door lines to have the flag "Block Monster". This is what prevents the innocents from entering the murderer walls. DO NOT USE BLOCK MONSTER FOR ANYTHING ELSE ON THE MAP UNLESS IT IS IN AN UNREACHABLE AREA (Zeberpal did this in WDI03, and when I implemented the feature, it broke the morgue area entirely. Not his fault though).
- Be sure to add "Silent Sector" things to every sector in the murderer tunnels; this silences his footsteps, knife draw, and any other noises he could make.
Hopefully that will get you going for now. I'll update this later to add more and talk about some things like map balance and so-on. Oh, and definitely use WhoDunIt.pk3 or WhoDunIt_fixed2.pk3 for a base for resources. Anything else is just addons. I don't necessarily recommend using addons for a resource since you would be depending on other people's stuff to load with yours; instead I recommend just including whatever you need in your own wad/pk3. But you may do as you please.
EDIT: More content! :D
IV. -- Balancing your Map
Here I will go over aspects about a map that will affect how it plays in favor of the innocents or the murderer, and what can be done to shift the balance towards one or the other to try and reach a fine point.
Open Spaces vs. Closed Areas: In general, the more open your map is, the harder it will be for the murderer. While it is true that the murderer can utilize open areas to take full advantage of his speed over the innocents, the innocents have an easier time spotting his approach, spreading out, escaping an engagement, and so on. In more open areas, it's also easier for other innocents to aid one under attack from the murderer. The murderer will have an impossible time sneaking up on innocents out in the open, and lastly most if not all murderer traps are far less effective in large, open spaces, which further reduces the options he has for dispatching his victims. More closed areas, tight corridors and harsh corners or angles make it easier for the murderer to make kills. While the murderer can easily get cornered or ganged up on in these situations, he has a lot more options to deal with it, and on top of that, he'll usually have access to the murderer hall.
Room Entrances and Exits: This one is a bit tricky; smart murderer play can actually make rooms with 1 entrance a terrible place for innocents to camp out. But usually, if innocents are hard camping a room with a single entrance, and the room is large enough or has enough cover to make bertholite not quite as threatening, then the murderer will be at a serious disadvantage, especially if the innocents have guns. It's best to have at least 2 or more entrances and exits to each room FOR THE MURDERER. Innocents can have just 1, but if your map does this, then you should probably add some kind of murderer tunnel leading in/out of the room. Maybe even add 2 to avoid camping the doors. For example, on WDI04, the security room at the end of the long corridor has but 1 (rather narrow) entrance. However, there is also a murderer door leading into the room, which also leads to one of the cells in the nearby prison wing, allowing the murderer some easy navigation of the area. It's not entirely optimal, but the room is also easily gasable, and as witnessed when playing, many people don't usually camp in that room ever since that door was added.
Murderer tunnel connectivity: Depending on how you want to balance your map, you may need to make sure several murderer tunnels interconnect to give the murderer access to many areas from just one tunnel. Adding more tunnels helps the murderer by giving him mobility, and a better chance at surprising the innocents if they cannot figure out where he is. It also gives him more ways to escape a bad engagement, which can be crucial in helping the murderer avoid dying prematurely. Another example comes in WDI04 again. The original version of this map had very few murderer tunnels, while the map had a lot of choke points and 1-entrance rooms. While most players would congregate in the main hall, there were often small groups that would camp in these dead-end places, with no way for the murderer to escape should he enter to try and get the kills. This made is incredibly easy for gun-wielding innocents, especially if it got to finale mode: by that point, innocents would just camp wherever they are and kill anyone that approached. To help with this, a huge amount of murderer tunnels were added to give the murderer lots of inter-connectivity around the map. In fact, there is even a tunnel that leads from the locker room showers all the way to the basement cells. Since this addition, the map has felt more balanced and the murderer has stood a better chance.