radius trigger scripting
Contents | Quick Start | What is it? | Block Definitions | Trigger Tags | Functions
Parser Rules | Tips | Error Codes | Examples

Contact: John Cole (jcole@eisa.net.au)

Contents

...Quick start.
...What is it? And How does it work? (Small Example)
...Block Definitions
...Trigger Tags
...Functions
...Parser Rules (Overview)
...Tips
...Error Codes
...Examples
Quick Start
To launch a script just use the parameter "-script <scriptname.ext>".


What is RTS?

Radius trigger scripts are a new way of defining events in DOSDoom,
they are similar to your standard lindef triggers but will have the ability
to do many other things, which are not available to lindef triggers.

You must realise though, they are meant to compliment the current
trigger types available, so they're here to hopefully enhance rather than
eradicate.

The limit on the number of triggers and events that can be created is
determined by the amount of free memory you have.
 

How do they work?
It's really quite simple, an event handler monitors the players movements
relative to the radius triggers, when a player goes within the radius of one
the defined actions for that trigger take place.

MAP 1 - SubSection

RT1 = Radius Trigger 1 (x=64,y=128,r=40)
RT2 = Radius Trigger 2 (x=32,y=32 ,r=16)
 

A radius trigger needs an x,y coordinate (this is it's centerpoint) and a 
radius value (this determines the distance a player must be within that point
to trigger it).

The coordinates can be gathered easily either by using the "idinfo" cheat,
or by loading up a map editor and just moving the cursor around the map and
checking out the x,y coordinates that it outputs.

So now I want to make these triggers do something for me, lets say for RT1 we
want to make it difficult for the player to get at the skull key, we can
spawn in a monster there and have RT2 give me 5% health at a 2 second interval
just to make things different.

(Very simple & ficticious Example based on diagram, 
NOTE! Line numbers are in only as an example! )

File : test.scr

1 #define CYBERDEMON 21
2 #define DEFAULT_TIME 2
3 #define DEFAULT_HEAL 5
4
5 start_map MAP01
6
7 ;Triggers once only.
8 radiustrigger 64 128 40
9 tip "you're in trouble now" DEFAULT_TIME TRUE
10 spawnThing CYBERDEMON 0 ;Spawns a cyberdemon
11 end_radiustrigger
12
13 ;Can be triggered many times.
14 radiustrigger 32 32 16
15 tagged_repeatable 0 DEFAULT_TIME 35;Infinite, 2 sec delay
16 healplayer DEFAULT_HEAL 150 ;Give 5% health
17 end_radiustrigger
18
19 end_map
 

Okay so your probably saying to yourself "Huh? What does all that mean?", 
well then time to go through it line by line.

Line 1 through 3- Basically sets up meaninful identifiers, any occurrence of
CYBERDEMON will be substituted with the value 21 and so on.
Line 5 - This tells the parser that this is the beginning of a block
of triggers for map 1. This must be included otherwise an
error would occur.

REMEMBER: A map block can contain many triggers.

Line 7 - Comment
Line 8 - This is the begining of the first radius trigger. Defined
is it's x,y cordinates plus it's radius.
Line 9 - Basically displays a quake like tip to the screen. The true
value just means make a noise to alert the player, false and
no sound would be made.
Line 10 - spawns the object, by using the radius triggers x,y
coordinates (you can do more with spawnthing but you'll
see that later on).
Line 11 - Tells the parser that this is the end of this trigger
definition.
Line 14 - Definition of RT2 this is the same as the definition for
RT1 (different coordinates and radius though).
Line 15 - When a radiustrigger is flagged as tagged_repeatable it
means that it can occur "n" times, where n is a number
greater than or equal to 0, and it's frequency which is
in tics(35 tics=1 second). So in this case it is 0 (which
is infinite) at a 2 second interval (2 * 35).
Line 16 - Gives the player(s) within the radius trigger 5% health, at
the tagged_repeatable rate, and cannot go over 150%.
Line 17 - Same as line 11, but for the 2nd trigger on map 1.
Line 19 - Defines the end of the map block.

To launch this script you would use the "-script <filename.extenstion>"
parameter.

Just remember that every map block must be started and terminated with a
"start_map <n>" and an "end_map". And all triggers for that map are located
within the map block, which they must be defined as 
"radius_trigger <n> <n> <n>" and terminated with "end_radiustrigger".

Note : You cannot put multiples of the same command into a trigger block, with 
exception of the following functions:

SpawnThing
PlaySound
SectorV
SectorL

Which are allowed.

eg.
; WRONG!!!!!!!!!!!!!!!
radiustrigger -65 1289 200
damage 25
damage 28
end_radiustrigger
 

; CORRECT!!!!!!!!!!!!!
radiustrigger -65 1289 200
damage 53 ; You're Dead
end_radiustrigger

Also if you wanted to use the same command over and over again (eg. spawn 25%
health at the same map position) you can just tag the trigger as being
tagged_repeatable.

eg.
; 100% Health made up of Medikits
radiustrigger 416 678 150
tagged_repeatable 4 0 1 ; 4 Times, Instantaneously
spawnthing HEALTH25 0 ; HEALTH25 would be #defined
end_radiustrigger

Hopefully you should now have an understanding of how they are set up, if you
don't then "Don't worry" look at the example again, check out the working
examples included.

Note about the following:
These are Subject to change, expect many more functions to be added, and some
of the current ones may be tweaked.

(The parser is NOT case sensitive)
 

Block Definitions
A block definition either defines the start & end of a map block or the
start and end block for a radius trigger, radius trigger blocks must be
contained within a map block.
 

start_map <mapid>

<mapid> - string

Specifies this is the begining of this map's triggers, everything
after this will be allocated to that map.

NOTE: In v1.0 and later maps are no longer referred to by Episode and
Map.  Episode 2 Map 4 becomes E2M4 and DOOM 2 map 16 becomes MAP16.
---
 

end_map

This is used to terminate a map block. Once again both of the above are
needed to successfully define a map block.
---
 

radiustrigger <x> <y> <radius>

<x> - INT converted to fixed point.
<y> - INT converted to fixed point.
<radius> - INT > 0

This is the start of the block definition for the radius trigger it sets up
the x-coordinate/y-coordinate and radius out from center. This x,y
coordinates can be overridden. (See spawnthing, playsound)

Without the "tagged_repeatable" attribute a trigger will only occur once.
---
 

end_radiustrigger

Terminates the current radius trigger, must be used in conjunction with
"radiustrigger" to successfully define a trigger otherwise a parser error
will occur.
---
 

Trigger Tags
Trigger Tags allow triggers to inherit different types attributes. All these
are defined within the "radiustrigger" block.
 

tagged_repeatable <# times> <multiplier> <rate>

<# times> - INT >= 0 where 0 is infinite
<multiplier> - INT >= 0 where 0 is instantaneous
<rate> - INT > 0

This allows the trigger to become a repeatable one. A trigger without
"tagged_repeatable" will only hapen once.

To determine a triggers speed you use the formula:

multiplier * rate = (leveltime + result) is the next occurance.

In Doom 35 game tics = 1 second.

eg.
<multiplier> <rate> <multiplier> <rate>
No delay 0 0
1/16 Second 1 2
1/8 Second 1 4
1/4 Second 1 9
1/2 Second 1 18
3/4 Second 1 26
1 Second 1 35
2 Seconds 2 35 or 1 70
3 Seconds 3 35 or 1 105
.
.
5.5 Seconds 11 18

and so on....
---
 

tagged_immedate

Makes the trigger become active immediately. (No player interaction required)
---
 

tagged_independant

Once the trigger is activated it will continue running until all required
functions have been completed.
---
 

tagged_use

For the trigger to become active the player must be within it's radius and
then press the use key to set it off.
---
 
 
 

Functions & Definitions
#version <value>

<value> - DECIMAL

Used to make sure the parser can take care of all your triggers.  If the version
on your file is greater than the parser version it will abort.

#version 1.0
---
 

#define <identifier> <value>

<identifier> - CHAR[80]
<value> - INT

Used for creating aliases to make code easier to read, by substituting the
<identifier> for it's <value> at compile time.
---
 

spawnthing <thingid> <angle>
spawnthing <thingid> <x> <y> <angle>

<thingid> - INT >= 0

Optional:
<x> - INT converted to fixed point.
<y> - INT converted to fixed point.
<angle> - INT 

Spawns a map object at either the radius triggers location or an alternate
map location specified by the optional x,y coordinates and it angle. Note that monsters 
use angles where a 0 value will be good enough for bonus items/weapons etc.

NOTE: <thingid> is no longer a special radius trigger value.  It is now the thing's
map number, like in level editors.
Tip:

Place these defines at the top of you code to make angle setting easier.

#define ANG0 0 ; N
#define ANG45 -8192 ; NE
#define ANG90 -16384 ; E
#define ANG135 -24576 ; SE
#define ANG180 32768 ; S
#define ANG225 24576 ; SW
#define ANG270 16384 ; W
#define ANG315 8192 ; NW
---
 

healplayer <value> <limit>

<value> - INT > 0
<limit> - INT > 0 and < MAXHEALTH

Give the player <value> health, this function will not go above the players
MAXHEALTH which is 200.

If no <limit> value is specified a parse error will not occur but it will
have the value of 0, so therefore it won't effect the players health.
---
 

givearmor <value> <limit>

<value> - INT > 0
<limit> - INT > 0 and < MAXARMOR

Essentially the same as "healplayer" but it increments the armour of the
player. (Will not got above MAXARMOR 200)

If no <limit> value is specified a parse error will not occur but it will
have the value of 0, so therefore it won't effect the players armor.
---
 

damageplayer <value>

<value> - INT > 0

Damages player health/armour, higher skill levels do more damages, so make
sure you don't use too high a number (50 with skill 5) otherwise the poor
marine will be clobbered by the radius trigger. :)
---
 

exitlevel

Exits the level.

---
 

gotomap <mapid>

<mapid> - STRING

Warps to any map specified. Can be used in a way similar to quakes
start map, several triggers on map 1 point to various maps. Can go backwards
as well, but at the moment all the monsters come back.

NOTE: in version v1.0 and later maps are no longer referred to by number. 
Episode 1 Map 1 becomes E1M1 and Map 2 becomes MAP02.

---
 

ondeath <thingid>

<thinkid> - INT

The trigger will not activate until all objects of type <thingid> have been
killed. NOTE: 'killed' does not have to mean they were once living,
eg items are 'killed' when they are picked up.  What this trigger really
does is stop the trigger from occuring until there are no more things of
type <thingid> on the map.

---
 

playsound <sound string> {<x> <y>}

<sound name> - STRING

Optional:
<x> - INT converted to fixed point.
<y> - INT converted to fixed point.

Spawns a sound at either the location of the radius trigger, or at an
optional x,y coordinate located somewhere else on the map. Can be used for
making ambient sounds when used with "tagged_repeatable" and 
"tagged_immediate".

NOTE: In v1.0 and later sounds are no longer referenced by number.
---
 

tip "<text>" <displaytime> <sound>

<text> - CHAR
<displaytime> - INT > 0
<sound> - Boolean (True/False)

Displays a tip on the screen. A tip which uses sound to alert a player(True)
has a higher priority over one which doesn't. This type of tip only is
displayed to the player that has triggered it.
---
 

skill <num> <respawnmonsters> <fastmonsters>

<num> - INT (0 - 4)
<respawnmonsters> - Boolean {false/true/0/1}
<fastmonsters> - Boolean {false/true/0/1}

Changes the skill level while actually playing, to select nightmare the
skill level must be set to 4 and <respawnmonsters> & <fastmonsters> should
be set to "true".
---
 

sectorv <sector num> <height> <type>

<sector num> - INT
<height> - INT converted to fixed point.
<type> - Boolean (True/1 = Floor, False/0 = Ceiling)

Allows the raising or lowering of sectors ceilings and floors. To find a
sector number I suggest you use a map editor for this. The height value
determines how far a sector moves, for example a ceiling with a positive
number will move down, but when the number is made negative it obviously
reverses it, the same applies to the floor except the technique is reversed.

eg. (for MAP01 of Doom 2 Entryway)
.
.
RadiusTrigger 416 672 300
Tagged_Repeatable 30 1 1
SectorV 20 2 CEILING
End_RadiusTrigger

RadiusTrigger 416 672 300
Tagged_Repeatable 30 1 1
SectorV 20 1 FLOOR
End_RadiusTrigger
.
.

Will change the height of the ceiling and the floor of the first box in the
main room (the one with the window, see demo script for this example).

HINT: To get a floor/ceiling to move smoothly, use tagged_repeatable and
a low movement value.
---
 

sectorl <sector num> <light change>

<sector num> - INT
<light change> - SHORT.

Changes the light intensity in the specified sector.

Positive number : Brighter
Negative number : Darker
---
 
 


Parser Rules (Overview)

1. Must contain one command per line and can be either upper/lowercase or a
mixture as the parser is not case sensitive.
(Everything is converted to uppercase before parsing the line.)
2. Anything following a ";" is regarded as a comment and is therefore ignored.
3. Must begin a map trigger block with "start_map" and terminate with 
"end_map".
4. Radius trigger definitions only occur within a map block and nowhere else.
5. A radius trigger definition must begin with "radiustrigger" and end with 
"end_radiustrigger".
6. Within the radius trigger block this is where the events are assigned.
7. A map block may contain many radius triggers.
8. Radius triggers can be separated / overlapped or stacked onto on another.
10.Tagged Repeatable is a radius trigger function an not a map block function.
11.It is possible (but not recommended) to create two map blocks of the same
map number throughout the scripting code.
12."#define" can be used anywhere, but you have to remember if you define
something below where it is referenced then the parser will return an
error as it has not been added to the parsers namespace yet.
This is why I would recommend that all your "#defines" are set at the
top before anything else.
 
Tips
* Use #define as much as you can!
1. Your scripts will be easier to read.
2. You can make more sense of the boolean variables.

#define CEILING 0 ;sectorv function
#define FLOOR 1

#define NOSOUND 0 ;tip function
#define SOUND 1

At least make these 4 mandatory, you won't regret it.

* Set it out nicely, the nicer it's set out the easier it is to understand:).

eg.

;defines here

start_map map

radiustrigger n n n
;Tags
Tagged_Use
;etc.

;Code
sectorl n n
;etc.

end_radiustrigger

end_map
 

start_map n
.
.
.
 

* Playsound, SectorV/SectorL & SpawnThing functions can be set many times
within one radius trigger all others cannot and will produce a parse error.
 
 

Error Codes
The parser will produce message like this when an error occurs in the script:

[WIN[1].d:\dds\exe]DOSDOOM.EXE -script DOOM2.SCR -warp 1 -nomonsters

DosDoom v0.64 DOOM 2: Hell on Earth Doom V2.0

Radius Trigger Script Parser v0.1
Script Found, Parsing......
Error: START_MAP, block not terminated, at line 82.
START_MAP 2

-= or =-

[WIN[1].d:\dds\exe]DOSDOOM.exe -script DOOM2.SCR -warp 1 -nomonsters
(DosDoom v0.66) DOOM 2: Hell on Earth v1.10

Radius Trigger Script Parser v0.1
Script Found, Parsing.....
Error: Unknown Function, at line 71.
RADIUSTRIGGERED -688 704 300
 

Here it will wait for the user to press return, the script will not be
enabled if an error occurs.


Error List

Unknown Error

- Will never happen, so don't worry about ever seeing this one.
(Just here for the record)

START_MAP, block not terminated

- Parser was unable to find the "end_map" command to terminate the
current map block.

END_MAP with no START_MAP

- Pretty obvious, the parser came accross a "end_map" but there was no
"start_map" previously defined.

RADIUS_TRIGGER, block not terminated

- Parser found "radiustrigger" or "end_map" instead of 
"end_radiustrigger".

END_RADIUSTRIGGER with no RADIUS_TRIGGER

- Parser came accross an "end_radiustrigger" but there was no
"radiustrigger" to mark the beginning of the trigger block.

Unknown Function

- Cannot locate the function name.

Parameter is not of integer type

- The input is not an integer.

Wrong number of parameters

- Either too little or too many parameters were passed through to
the function.

Invalid number of quotes

- Either no starting or closing quotes (or neither). "tip" function.

Variable Unknown

- Has tried to look up a #define declared in one the functions in the
defines namespace but was unsuccessful. Will only occur when redefining
boolean types.

Function cannot be redefined

- An attempt has been made to reuse a function which is allowed only one
in a trigger block.

Integer not within range specified

- A number was passed to a function which was out of the parameters
given range.

This Radius Script uses features not implemented in this version of DOSDoom

- A #version directive was found that was bigger than this version of 
DOSDoom can handle.  Get a new version of DOSDoom.


 
Examples

Examples
Example 1

; ----------------------------------------------------------------------
;RadiusTrigger Test Script
;
;Author : John Cole
;Email : jcole@eisa.net.au
;
; ----------------------------------------------------------------------
; This is a Doom2 Script

; Thing Angles
#define ANG0 0
#define ANG45 -8192
#define ANG90 -16384
#define ANG135 -24576
#define ANG180 32768
#define ANG225 24576
#define ANG270 16384
#define ANG315 8192

; Ceiling/Floor Booleans
#define CEILING 0
#define FLOOR 1

; Sound Booleans (TIP)
#define NOSOUND 0
#define SOUND 1

; Skill Booleans
#define M_RESPAWN_OFF 0
#define M_RESPAWN_ON 1
#define M_FAST_OFF 0
#define M_FAST_ON 1

; Misc.
#define DEFAULT_RADIUS 180
#define TIP_DISPLAY_TIME 2 ; 2 Seconds

#define NORM_HEAL 5 ; This is 5%

#define CYBERDEMON 16
#define BONUS_HEALTH 2014
#define MEGASPHERE 83
#define SUPERSHOTGUN 82
#define BFG 2006

start_map map01 ; This is Doom2 Only

; This is really a dummy trigger. It's Immediate so the player
; has no control over it. Triggered at the very start of the level, it
; places a bonus health down in front of player 1.

RadiusTrigger 0 0 0
; Tags
Tagged_Immediate ; Go NOW! (Level Start)

; Code
SpawnThing BONUS_HEALTH -56 1300 ANG0 ; Spawns a 1% Health
SpawnThing BONUS_HEALTH -56 1250 ANG0
SpawnThing BONUS_HEALTH -56 1200 ANG0
SpawnThing BONUS_HEALTH -56 1150 ANG0
SpawnThing BONUS_HEALTH -56 1100 ANG0
SpawnThing BONUS_HEALTH -56 1050 ANG0
End_RadiusTrigger
 

; Displays the tip for 3 Seconds with a beep, and spawns a
; Megasphere. On the box in the main room coming from the
; corridor.

; These are stacked RadiusTriggers
; And Demonstrates Tagged repeatable.

RadiusTrigger 416 672 DEFAULT_RADIUS
; Tags
Tagged_Repeatable 4 3 17 ; Loop 4 Times with a 1.5 sec gap

; Code
DamagePlayer 25 ; Will end up dying (Skill 5)
End_RadiusTrigger ; if you had 100% health

RadiusTrigger 416 672 300
; Code
Tip "THIS MIGHT MAKE YOU FEEL BETTER!" TIP_DISPLAY_TIME NOSOUND
SpawnThing MEGASPHERE ANG0 ; Spawns a MegaSphere
PlaySound pstart
PlaySound pstop -56 1296
End_RadiusTrigger

RadiusTrigger 416 672 300
; Tags
Tagged_Repeatable 34 0 1
Tagged_Independant ; Once triggered continue automatically

; Code
SectorV 20 2 CEILING ; Lower the ceiling
SectorV 20 1 FLOOR ; Raise the floor
SectorL 1 -1 ; Lower the lighting
SectorL 52 -3 ; Lower the lighting
End_RadiusTrigger
 

; Spawns a supershotgun on the other box near the exit. Notice there
; is no tip displayed for this one!

RadiusTrigger 920 736 DEFAULT_RADIUS
; Code
SpawnThing SUPERSHOTGUN ANG0 ; Spawns a SuperShotgun
End_RadiusTrigger
 

; Displays a tip near the pillars, that there may be a secret
; nearby, this one does not spawn a map thing.
; Then display "SECRET FOUND" when they go into the secret area.

RadiusTrigger 1048 544 150
; Code
Tip "THERE IS A SECRET NEARBY" TIP_DISPLAY_TIME SOUND
End_RadiusTrigger

RadiusTrigger 1229 607 60
; Code
Tip "SECRET FOUND" TIP_DISPLAY_TIME SOUND
End_RadiusTrigger
 

; Spawn a cyberdemon at the start of map 1

RadiusTrigger -688 704 300
; Code
Tip "YOU CAN'T GO OUT HERE, THERE ARE MAP ERRORS" 3 NOSOUND
SpawnThing CYBERDEMON ANG0 ; Cyberdemon
End_RadiusTrigger

end_map
 

; ----------------------------------------------------------------------

start_map map02

; Triggered near the steps at the start of the level.

RadiusTrigger 1062 1781 50
; Tags
Tagged_Repeatable 0 0 1

; Code
GotoMap 1
Skill 4 M_RESPAWN_ON M_FAST_ON
; Tip "-= This May help =-" TIP_DISPLAY_TIME SOUND
; SpawnThing BFG ; Spawns a BFG!
End_RadiusTrigger

end_map

; ----------------------------------------------------------------------
; BTW You don't have to place the maps in any particular order.
;
start_map map01

; Another example of stacked triggers.

RadiusTrigger 600 1592 140
; Code
Tip "You found the well of lost souls" TIP_DISPLAY_TIME SOUND
End_RadiusTrigger
 

RadiusTrigger 600 1592 140
; Tags
Tagged_Repeatable 0 1 35 ; Infinite Loop with a 1 second gap

; Code
HealPlayer NORM_HEAL 200
GiveArmor NORM_HEAL 100
End_RadiusTrigger
 

RadiusTrigger 600 1592 140
; Tags
Tagged_Repeatable 0 3 35 ; Infinite Loop with a 3 second gap

; Code
PlaySound podth?
End_RadiusTrigger

end_map

; ----------------------------------------------------------------------
 
 

Example 2
 

; ----------------------------------------------------------------------
; Another RadiusTrigger Test Script
;
;Author : John Cole
;Email : jcole@eisa.net.au
;
; For use with testme.wad.

; ----------------------------------------------------------------------

#define ANG0 0
#define ANG45 -8192
#define ANG90 -16384
#define ANG135 -24576
#define ANG180 32768
#define ANG225 24576
#define ANG270 16384
#define ANG315 8192

#define CEILING 0
#define FLOOR 1

#define NOSOUND 0
#define SOUND 1

#define DEFAULT_RADIUS 180
#define TIP_DISPLAY_TIME 2 ; 2 Seconds

#define CYBERDEMON 16
#define MEGASPHERE 83
#define BFG 2006

start_map map01

RadiusTrigger 0 0 0
; Tags
Tagged_Repeatable 2 0 1
Tagged_Immediate

; Code
Tip "Go in get the megasphere and get out!" TIP_DISPLAY_TIME SOUND
End_RadiusTrigger

; Door simulation (Open)
; Opens from the middle.
RadiusTrigger -8 80 60
; Tags
Tagged_Repeatable 40 0 1
Tagged_Independant

; Code
SectorV 1 -2 CEILING ; Raise the ceiling
SectorV 1 -1 FLOOR ; Lower the floor
End_RadiusTrigger

; Door simulation (Close)
RadiusTrigger -8 200 60
; Tags
Tagged_Repeatable 40 0 1
Tagged_Use

; Code
SectorV 1 2 CEILING ; Lower the ceiling
SectorV 1 1 FLOOR ; Raise the floor
End_RadiusTrigger

RadiusTrigger -8 200 60
; Code
Tip "Press USE to close" TIP_DISPLAY_TIME SOUND
End_RadiusTrigger

; Spawn a BFG when the door opens.
; and make a platform noise.
RadiusTrigger -8 80 60
; Code
PlaySound pstart
SpawnThing BFG -8 200 ANG0
End_RadiusTrigger

; Make a noise when the door is closed
RadiusTrigger -8 200 80
; Tags
Tagged_Use

; Code
PlaySound pstart
End_RadiusTrigger


RadiusTrigger 216 640 200
; Tags
Tagged_Repeatable 56 0 1
Tagged_Independant

; Code
SectorV 2 -2 CEILING ; Lower the ceiling
SectorV 2 -1 FLOOR ; Raise the floor
SectorL 3 -2 ; Dim the room
End_RadiusTrigger

RadiusTrigger 216 640 200
; Code
SpawnThing MEGASPHERE 400 848 ANG0
SpawnThing CYBERDEMON -240 208 ANG0
End_RadiusTrigger
 

end_map
 
 

Example 3
 

Here's a small Doom 1 script just for the record, to show the difference
with "start_map" and "goto_map":

; ----------------------------------------------------------------------
; Doesn't do much just allows you to go between maps 1 & 4 of episode 1
start_map e1m1

radiustrigger 1055 -3291 140
;tags
TAGGED_REPEATABLE 0 0 1

;code
gotomap e1m4
end_radiustrigger

end_map

start_map e1m4

radiustrigger 1926 932 75
;tags
TAGGED_REPEATABLE 0 0 1

;code
gotomap e1m1
end_radiustrigger

end_map
; ----------------------------------------------------------------------

DOSDoom © 1998 DOSDoom Team.