Work In Progress: This tutorial is not yet complete. It is published in the hopes that it might be of use but errors and omissions should be expected –danij, 12 October 2007
Chances are, you have felt somewhat limited by doom's key-locked doors when creating maps. Being continually faced with the same gameplay challenges is pretty un-interesting huh? Have you ever wanted to add a combination lock to secure an area in your map? Perhaps there is a secret laboratory in that deep space research lab with dangerous experimental weaponry hidden inside? This tutorial teaches you how to do just that.
For this tutorial we will be utilizing XG to implement a combination lock. Be aware, that we will be chaining together multiple XG line types to create a re-usable lock mechanism that can be used to activate another mechanism (here, we will use a simple door but in your own maps you could build stairs, end the level etc…).
In the process, we will discuss the event-driven nature of XG and how it can be used in different ways to replicate complex mechanisms. As such, this technique may not be suitable for those new to XG.
As already mentioned, we are aiming to create a combination lock, which (when the right combination is entered) will open a door. Before we go any further, lets first embelish this somewhat basic concept and try to define exactly the behavior we are trying to create.
It would also be nice if we didn't have to create a tailored set of definitions for each instance of the combination lock. Lets outline some features that would improve the re-usability of our combination lock.
/writeme
/writeme
Line Type { Id = 1000 Comment = "Combo Lock ON Switch" Class = none Flags = player_use Flags2 = when_act | when_deact | any Type = flip Count = -1 Event Chain = 32767 Act sound = "swtchn" Act tag = 1 }
Line Type { Id = 1001 Comment = "Combo Lock OFF Switch" Class = none Flags = player_use | active Flags2 = when_act | when_deact | any Type = flip Count = -1 Event Chain = 32767 Act sound = "swtchn" Act tag = 2 }
/writeme
The final definition we need is that of the combination validator. Recall that earlier, when defining the switches we made use of the Event Chain paramater (=32767) to execute another linetype on activation/deactivation? This is that linetype.
Line Type { Id = 32767 Comment = "Combination validator" Act message = "Access Granted"; Flags2 = any | when_act | line_act | line_inact Class = activate Count = -1 Line act lref = act_tagged Line act lrefd = 1 Line inact lref = act_tagged Line inact lrefd = 2 Ip0 = "lpref_tagged_ceilings" Ip1 = 7 }
Notice that there are no (de)activation triggers specified at all (normally, a linetype requires at least one trigger, for example player_cross). As our switch linetypes are calling the combination validator by way of their Event Chain paramater, there is no need to specify trigger(s). Furthermore this, means that this is a virtual linetype and cannot be used on a linedef in your map directly (note, that even if you do use it directly on a linedef - it will have no effect).