====== How to create a combination lock using XG ====== //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// ===== Overview ===== Chances are, you have felt somewhat limited by [[games: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. ===== Introduction ===== For this tutorial we will be utilizing XG to implement a combination lock. Be aware, that we will be chaining together multiple XG [[xg:line_type|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 [[xg:class:build_stairs|build stairs]], [[xg:class:end_level|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. ===== Concept ===== 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. ==== Requirements ==== * The player should be able to manipulate the switches of the combination lock by //using// them. * Each time a switch changes state, we must check whether the current configuration activates the door. ==== Features ==== It would also be nice if we didn't have to create a tailored set of [[:ded|definitions]] for each instance of the combination lock. Lets outline some features that would improve the re-usability of our combination lock. * Any number of switches should be supported by an individual combination lock. * Any number of combination locks should be able to co-exist within the same map. * We should not have to create a new set of definitions for each combination lock. * The combination should be specified in the map-editor and NOT in the definition. ===== Determining events ===== /writeme ===== The switches ===== /writeme ==== Definitions ==== 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 } ==== Explanation ==== /writeme ===== The combination validator ===== 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. ==== Definition ==== 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 } ==== Explanation ==== Notice that there are no [[xg:triggers|(de)activation trigger]]s specified at all (normally, a linetype requires at least one trigger, for example [[xg:triggers#player_cross|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).