-
.MAP
Path Sector SPRITE (Type 611) working similar to
classic Path Sector type, except that it moves sprites only and supports sector intersection.
This means that is possible to move sprites through whole map and their sector will be
changed properly. Up to 512 sectors supported.
Sprites inside sector that marked blue will travel to the current path direction. When marked green,
they will go reverse. If Drag option in sector FX dialog enabled, any physics affected sprites
(dudes, players etc...) that stays on one of marked sprites will be dragged as well.
Note that unlike classic Path Sector type, this one doesn't ignore Sector SFX sprite, which means
a single sound layout can be easily set. If you prefer to set sounds in path markers, just don't
insert Sector SFX sprite.
ADDITIONAL OPTIONS
-
[x]send at On = trigger path marker at arrival.
[x]send at Off = trigger path marker at departure.
-
.MAP
Laser (Type 505) is a fun type that allows
to create dynamic laser ray of sprites from point where laser sprite was inserted
to sprite object it hits and optionally trigger it or send command
to TX ID channel.
This allows to build nice puzzles and deadly traps, especially when used in conjunction
with other types such as Damager or IF conditions
and event causer TX channel.
When sprite is floor oriented, a vertical laser ray will be created,
horizontal otherwise. Use one-sided sprite flag to specify vertical ray direction
(top or bottom). Destination sprite must be hitscan sensitive.
Also laser nor destination sprites must be placed on wall line directly.
Up to 2048 lasers suported.
MAIN OPTIONS
-
data1 = ray color (0 - 9)
- 0: light red (default)
- 1: light green
- 2: light blue
- 3: yellow
- 4: light grey
- 5: white
- 6: red
- 7: green
- 8: brown
- 9: dark gray
data2 = ray thickness (0 - 255, default: 6)
data3 = max distance in units (0 - 32767).
1 unit = 256 pixels. 0 means no max distance.
BEHAVIOR OPTIONS
-
[x]going On =
If have TX ID, send command on it when laser hits object, otherwise trigger the hit object directly.
-
[x]going Off =
If have TX ID, send command on it, otherise trigger the recent hit object (only when going to OFF state).
-
hi-tag = additional flags:
- flag 1: trigger hit object/send command only once per hit.
- flag 2: trigger recent hit object/send command once per hit.
- flag 4: ignore dude sprites (types 200 - 254).
- flag 8: ignore player sprites (types 231 - 238).
- flag 16: ignore thing sprites (types 400 - 435).
- flag 64: ignore masked walls.
- flag 128: ignore dead sprites (switches, decorations etc...).
- flag 512: send strict command (ON for hit, OFF for miss).
- flag 1024: do not ignore transparent pixels.
-
flag 2048: check for changes in properties. Use it only when
you need to update properties dynamically (like changing data and
such).
Important note about flags 1024 and 2048: when have these enabled you
may find that source sprite looks flipped or not showing at all. This is due to conflict
with seq flip-x/y flags that sets by the game automatically. In this case you can make
laser sprite invisible and use another sprite as a decoration for laser.
Tip: to toggle flags easy in XMAPEDIT you can use flags picker helper in edit dialogs.
Press [F6] to edit sprite, select hi-tag field and press [F10] to open it.
-
.MAP
Velocity Changer (Type 506) allows to change X, Y or Z velocity
of any TX ID sprite.
If sprites are static, the physics attributes will be propagated automatically according
to current source physics attributes. This means that you must add physics to source first (for example,
using Properties Changer).
If destination object is a sector, the velocity will be changed for all sprites in
that sector.
-
busyTime = frequency of the generator in ticks.
-
data1 = X-velocity value.
data2 = Y-velocity value (ignored if force angle flags are set).
data3 = Z-velocity value.
Value -32767 or 32767 treated as ignore value for all 3 data fields,
which means that current destination velocity value
won't be affected.
hi-tag = additional options:
-
Patrol region (Type 16) intended to change sensitivity of the dudes
in patrol mode. For example, it allows to modify seeing and hearing distances or
chances to spot the target when dude or target (default) is in the radius of patrol region.

Patrol region
This type have 2 modes. You should use hi-tag field and toggle flag64 to select required mode.
By default the patrol region affects only dudes that have Stealh dude flag enabled, which only affects the chances to see or hear
the target, however, when flag64 on, it also allows to modify seeing and hearing distances
of the dude even if it doesn't have Stealth flag.
MODE 1 - Stealth (Flag64 off):
data1 = radius at which it treats as active.
-
0: active only in stealth region's sector.
data2 = value of hearing chance modifier (does not affect deaf enemies).
data3 = value of seeing chance modifier (does not affect blind enemies).
The values of data2 and data3 is a percent of hearing
and seeing chance relative to current by default. Positive value leads to greater chances, while
negative leads to less. Example: data2 = -100 leads to almost deaf enemy and 100
leads to the enemy that hears twice better than with no modifier.
If region have TX ID and spot progress get reached max value while target or enemy in this region,
it will be triggered. Note that Locked regions are ignored.
hi-tag = additional options:
- flag1: treat data2 and data3 values as fixed percent value.
- flag2: enemy must be in stealth region area instead of target.
- flag4: target and enemy must be in stealth region area.
- flag8: target must have crouch posture.
MODE 2 - Clip (Flag64 on):
data1 = radius at which it treats as active.
value must be greater than zero.
data2 = hear radius (does not affect deaf enemies).
data3 = sight radius (does not affect blind enemies).
The values of data2 and data3 can be greater or less
than data1, however, must be greater than zero. Note that Locked regions are ignored
as well.
-
Slope Changer (Type 504) allows to change slope of the destination floor, ceiling or sprite
via sending command on TX ID.
data2 = slope value.
By default it counts in percents, where 0
means no slope, -100 means -32767 (the max negative value of the slope), and 100 means 32767
(the max positive value of the slope). However, this behavior can be changed if you set flag 1
in hi-tag field (just in case when you need to use fixed values).
There is variety of options available depending on destination object type:
-
FOR SECTORS:
-
data1 = select which slope intended to be changed.
- 0: floor slope only.
- 1: ceiling slope only.
- 2: both.
If destination sector contains floor oriented sprites which Z is really close to floor
or ceiling, their slope will be changed automatically according current slope of the floor or
ceiling of the sector. You can change this behavior by setting flag 2
in hi-tag field.
-
FOR SPRITES:
-
data4 = sprite slope options.
- 0: none: just change the slope to the data2 value.
- 1: set slope according floor slope of the sector.
- 2: set slope according ceiling slope of the sector.
Note that any sprite affected by Slope Changer will become floor oriented automatically. If flag 2 is set
in hi-tag field, Z of the sprite will be changed to Z of floor or ceiling of the sector
accordingly.
-
.MAP
You already know that each source can send command to destination objects with same TX ID only.
Yes, RandomTX and SequentialTX allows to send command on
many TX ID objects, but imagine the next situation: we want spawn same effect on different TX IDs using just one
Effect generator. By default it's impossible and we have to create the following trigger sequence:

Spawning effect on different TX IDs objects normally
Looks pretty complicated! Especially if we need to spawn exactly same effect!
However, using RandomTX or SequentialTX in event redirection mode allows you to make things like that a lot easier.
To make it work in this mode, just set it's command to 5 (Link).

Spawning effect on different TX IDs objects using event redirection
Event redirection mode almost fully inherits normal behavior of these types, so RandomTX redirects to random TX ID, while
SequentialTX redirects it to TX ID which selected sequentially. To learn more about normal behavior please click here.
Note that redirector sends command of the source object (in this example command of the Effect Generator will be send instead
command of SequentialTX).
Each object can have as many redirectors as required - there is no limits for that. Further more - there is nested redirects
allowed, so redirectors can redirect events from another redirectors! The following types fully supports event redirection:
-
.MAP
IF and !IF (Type 501 and 502) is a very special conditional trigger types.
In simple terms: it sends command on TX ID (or object that pass check) only when selected condition returns true when type is
IF or false in case of !IF.
Imagine script when you need trigger something only if health of player or enemy is in range of specified values, touch walls
or another sprites, close to something or visible from specified distance? There is pretty wide range of different conditions which
makes it possible and available for you to use.

Basic condition
All conditions except game ones should have RX and TX IDs. It always must be triggered via command sent from object
that must be checked or from another condition. To simplify creation, some traditional parameters such as going on
and going off has been ommited and currently is not required. Data1 selects condition ID while
data2, data3 and data4 fields intended
for condition arguments.
CONDITIONS TYPES
There is two types of conditions available:
-
.MAP
Triggerable - a condition that requires to be triggered via command.
It works pretty same as triggering the switch. Take a look on picture with basic
example. Gargoyle have "Vector" flag checked, so every time it gets hit
with hitscan weapon, it sends command on condition with TX ID: 180 that checks if gargoyle
currently touching the floor.
You can use as many conditions of such type as you want, however, is not really suitable if we need to damage
gargoyle when it touch the floor any time. In this situation tracking condition could help.
-
.MAP
Tracking condition is an advanced type which checks all assigned objects with every N of ticks
specified in busyTime field independently from events. By default it starts working once you start playing the map
and ends when level end gets reached.

Basic tracking condition
Almost all commands from assigned objects in this mode are ignored, however some global such as Lock,
Unlock and Toggle Lock is still working. It can be used to specify when exactly tracking process should operate.
When condition is locked, it does not track objects. If you don't need it start working once game
started, just check "Locked" flag and unlock it later via sending "Unlock" command. This automatically
launch the object tracking process.
It's pretty easy to assign object to tracking condition. In fact, it performs automatically if TX ID
of object point to RX ID of tracking condition. There is no limit for amount of conditions and assigned objects.
Also, any object type is fine: walls, sprites, sectors, enemies or even players, however some exceptions is
presented: Toggle Switch (Type 20) and 1-Way Switch (Type 21) cannot be assigned and used to
control the condition.
SEQUENCE OF CONDITIONS
.MAP
The conditions allows you to create complex scripts by creating sequence of conditions,
such as: IF sprite in required sector -> AND IF sprite is burning -> AND IF is a player -> [do something].
It's allowed to mix the triggerable and tracking conditions (see examples below).
It can be as long as you want, however you should keep in mind that tracking condition must be always first!

Sequence of conditions
FOCUS CHANGE
.MAP
Another thing that is possible with conditions is passing and changing validated objects from one condition
to another. By default a condition that is successfuly validated the object, automatically passing it to the
next. Sometimes it may require to check objects that was affected by current as well.
For example, we want to know if gargoyle touching the floor of sector and that sector floor is lava, and then we want
to kill the gargoyle immediately. The commands 64, 65, 66 allows to override current object
by the one that was affected, so next condition in sequence addressed to that one.

Setting focus to affected object
FOCUS RESET
.MAP
Ouch! Now gargoyle will die always once it lands on any floors that have lava on it! But what if we want it die only if
it's HP in a range of specified percents? For sure we need to add HP percentage check, but must also reset focus back
to gargoyle sprite since right now we are focusing on a sector. COMMAND 100 allows to reset focus from current object to
the initial.

Reset focus to the first object
You also can use commands 101 or 102 to change focus to object that was saved previously with
commands 65 or 66 accordingly. If there is no saved objects, the focus will be changed to initial object.
BRANCHES
.MAP
Imagine a script: the map have lava sectors, but also have acid ones. Landing on lava sectors currently causes gargoyle to die immediately
if it have low health points, but landing on anything else does nothing, however we want damage gargoyle a little once it lands on acid
sector. This is where condition branches could help:

Condition branches
STANDARD ARGUMENTS AND COMPARISON OPERATORS
Many conditions are designed to compare numberic value (i.e. check if health in a range of value1 and value2, check if floor
picture equals to value1 and so on). It's just means that you have to specify value1 in data2
and, if required - value2 in data3 field. That's it! When comparsion type is BOOL all operators
are ignored.
In addition to arguments, conditions currently supports the following comparison operators that could be selected through changing
cstat of it's sprite. Use keys [K] and [B] in 2D Mode to choice.
| Operator | cstat |
| == data2 | normal sprite |
| >= data2 AND <= data3 | normal blocking sprite |
| >= data2 | blue painted sprite |
| > data2 | blue painted and blocking sprite |
| <= data2 | green pained sprite |
| < data2 | green painted and blocking sprite |
ADDITIONAL OPTIONS
The hi-tag field allows to specify additional flags
- flag1: send command to object that currently in the focus.
- flag2: send command to initial object.
- flag4: send command once per same state.
1-shot indicates that condition should work only once.
waitTime allows to specify a delay before sending command when condition is successful.
If using it with tracking conditions, it's busyTime ticks summing with waitTime.
GAME CONDITIONS
The following conditions does not require to have any objects assigned since it checks global game properties.
| Data1 |
Condition |
Arguments |
On focus change |
Bool |
| 0 |
This is a dummy condition. It always true and could serve as splitter or switch.
|
|
|
|
| 1 |
Compare level time in minutes |
[standard] |
|
no |
| 2 |
Compare level time in seconds |
[standard] |
|
no |
| 3 |
Compare level time in micro seconds |
[standard] |
|
no |
| 5 |
Compare global kills (current) |
[standard] |
|
no |
| 6 |
Compare global kills (total) |
[standard] |
|
no |
| 7 |
Compare secrets found |
[standard] |
|
no |
| 8 |
Compare total secrets |
[standard] |
|
no |
| 20 |
Compare global visibility (depth cueing) |
[standard] |
|
no |
| 30 |
Check chance in percents |
data4 = percent value, where 100% is 65536 (always true) |
|
yes |
| 31 |
Compare value of random in a range of data2 and data3 |
[standard] |
|
no |
| 47 |
Compare how many sprites with given statnum is created |
[standard],
data4 = statnum from 0 to 1024
|
|
no |
| 48 |
Compare how many sprites created in total |
[standard] |
|
no |
| 57 |
Is sector exists? |
data4 = sector number
|
If true, changes focus to that sector |
yes |
| 58 |
Check if wall exists |
data4 = wall number
|
If true, changes focus to that wall |
yes |
| 59 |
Check if sprite exists |
data4 = sprite number
|
If true, changes focus to that sprite |
yes |
| 60 |
Check if player connected |
data4 = player number
|
If true, changes focus to that player sprite |
yes |
ANY OBJECT CONDITIONS
The following conditions works for any object type that currently in the focus.
| Data1 |
Condition |
Arguments |
On focus change |
Bool |
| 100 |
Check if object is a sector |
|
|
yes |
| 105 |
Check if object is a wall |
|
|
yes |
| 110 |
Check if object is a sprite |
|
|
yes |
| 115 |
Check if object is an x-object |
|
|
yes |
| 120 |
Compare object type |
[standard] |
|
no |
| 124 |
Compare object picnum's surface type |
[standard], valid types:
- 0: none
- 1: stone
- 2: metal
- 3: wood
- 4: flesh
- 5: water
- 6: dirt
- 7: clay
- 8: snow
- 9: ice
- 10: leaves
- 11: cloth
- 12: plant
- 13: goo
- 14: lava
-
for sectors: data4
- 0: floor or ceiling picnum's surface
- 1: floor picnum's surface
- 2: ceiling picnum's surface
|
|
no |
| 125 |
Compare object picnum |
[standard],
-
for sectors: data4
- 0: floor or ceiling picnum
- 1: floor picnum
- 2: ceiling picnum
|
|
no |
| 126 |
Compare object palnum |
[standard],
-
for sectors: data4
- 0: floor or ceiling palnun
- 1: floor palnum
- 2: ceiling palnum
|
|
no |
| 127 |
Compare object shade |
[standard],
-
for sectors: data4
- 0: floor or ceiling shade
- 1: floor shade
- 2: ceiling shade
|
|
no |
| 128 |
Check object cstat |
-
data2 = required value
See all cstat values in Properties changer list.
-
for sectors: data4
- 0: floor or ceiling cstat
- 1: floor cstat
- 2: ceiling cstat
|
|
yes |
| 129 |
Check or compare object hi-tag |
If value of data4 is zero:
If value of data4 is not zero, the condition becomes non-bool. This means that you
have to use comparison operator to compare the value between standard arguments:
- [standard]
-
data4 = bit mask
|
|
mixed |
| 130 |
Compare sprite xrepeat, wall xrepeat or sector floor xpanning |
[standard] |
|
no |
| 131 |
Compare sprite xoffset, wall xpanning or sector ceiling xpanning |
[standard] |
|
no |
| 132 |
Compare sprite yrepeat, wall yrepeat or sector floor ypanning |
[standard] |
|
no |
| 133 |
Compare sprite yoffset, wall ypanning or sector ceiling ypanning |
[standard] |
|
no |
| 141 |
Compare sprite data1,
wall data or sector data
|
[standard] |
|
no |
| 142 |
Compare sprite data2,
wall data or sector data
|
[standard] |
|
no |
| 143 |
Compare sprite data3,
wall data or sector data
|
[standard] |
|
no |
| 144 |
Compare sprite data4,
wall data or sector data
|
[standard] |
|
no |
| 150 |
Compare object RX ID |
[standard] |
|
no |
| 151 |
Compare object TX ID |
[standard] |
|
no |
| 152 |
Check if object is Locked |
|
|
yes |
| 153 |
Check if "going On" is selected |
|
|
yes |
| 154 |
Check if "going Off" is selected |
|
|
yes |
| 155 |
Check if object can be triggered only once |
|
|
yes |
| 156 |
Check if object already triggered |
|
|
yes |
| 157 |
Check if object disabled (State: 0) |
|
|
yes |
| 158 |
Compare busy of object in %, where 100% = 65536. |
[standard] |
|
no |
| 159 |
Check if "dudeLockout" is selected |
|
|
yes |
| 170 |
Compare ID of SEQ animation spawned on an object |
[standard] |
|
no |
| 171 |
Compare SEQ animation frame number spawned on an object |
[standard] |
|
no |
| 195 |
Compare object index |
[standard] |
|
no |
| 196 |
Compare x-object index |
[standard] |
|
no |
| 198 |
Check event causer sprite |
|
If true, change focus to event causer sprite |
yes |
| 199 |
Check if condition received specified command |
[standard] |
|
no |
SPRITE CONDITIONS
The following conditions works for any sprite that currently in the focus.
| Data1 |
Condition |
Arguments |
On focus change |
Bool |
| 500 |
Compare angle |
[standard] |
|
no |
| 505 |
Compare statnum |
[standard] |
|
no |
| 506 |
Check if sprite is in respawn list |
|
|
yes |
| 507 |
Compare sprite slope |
[standard] |
|
no |
| 510 |
Compare clipdist |
[standard] |
|
no |
| 515 |
Check is sprite have owner sprite |
|
If true - changes focus to owner's sprite. |
yes |
| 520 |
Check if sprite is in sector |
|
If true - changes focus to that sector |
yes |
| 525 |
(DEPRECATED) Check if physics affected sprite is in movement |
data2 = velocity type
- 0: any (default)
- 1: x
- 2: y
- 3: z
|
|
yes |
| 526 |
Compare if physics affected sprite is in movement:
Unlike 525, this condition able to compare selected velocity against
negative and positive arguments. For example, if z-velocity greater than 0, it means that
sprite is falling and if less than 0, then sprite is flying.
|
[STANDARD]
data4 = velocity type
- 0: any (default)
- 1: x
- 2: y
- 3: z
|
|
no |
| 530 |
Check if sprite is in underwater sector |
|
If true - changes focus to that sector |
yes |
| 531 |
Check if sprite is immune to damage type |
data2 = damage type
- -1: all
- 0: fall
- 1: burn
- 2: bullet
- 3: explode
- 4: choke
- 5: spirit
- 6: electric
|
|
yes |
|
|
Check at which object sprite aims now using hitscan |
-
data2 = clipmask
- 0: block and hitscan
- 1: just block
- 2: just hitscan
-
data4 = max distance
|
- 535: If scans ceiling of sector - changes focus to the sector
- 536: If scans floor of sector - changes focus to the sector
- 537: If scans wall - changes focus to that wall
- 538: If scans another sprite - changes focus to that sprite
- 539: If scans masked area of the wall - changes focus to that wall
|
yes |
| 545 |
Check if this sprite is the target of some enemy |
|
If true - changes focus to that enemy |
yes |
| 550 |
Compare health in % where 100% = default health
|
[standard] |
|
no |
|
|
Check if sprite currently touching an object |
|
- 555: If touching ceiling of the sector - changes focus to sector
- 556: If touching floor of the sector - changes focus to the sector
- 557: If touching wall - changes focus to that wall
- 558: If touching another sprite - changes focus to that sprite
|
yes |
| 565 |
Compare burn timer of sprite in % |
[standard] |
If true - changes focus to the burn source sprite |
no |
| 566 |
Check if any burning flare stuck in this sprite |
|
If true - changes focus to that flare |
yes |
| 569 |
Check if this sprite have any sprite targets |
|
If true - changes focus to that sprite |
yes |
| 570 |
Check sprite mass in KG with getSpriteMassBySize function |
[standard] |
|
no |
PLAYER CONDITIONS
The following conditions works player sprite that currently in the focus.
Players range: 231 - 238. To detect if sprite is a player, you can use comparison by type (120) in
mixed conditions. To assign player as object for tracking condition, refer to Player Control
examples.
ENEMY CONDITIONS
The following conditions works for enemy sprites that currently in the focus.
| Data1 |
Condition |
Arguments |
On focus change |
Bool |
| 450 |
Check if have dude sprite targets |
|
If true - changes focus to the target sprite |
yes |
| 451 |
Check if enemy affected by Enemy Target Changer |
|
|
yes |
| 452 |
Compare distance to the target in meters |
[STANDARD] |
If true - changes focus to the target sprite |
no |
| 453 |
Check if target is visible |
|
If true - changes focus to the target sprite |
yes |
| 454 |
Check if target visible with periphery |
data2: periphery angle in BUILD units (2048 = 360deg).
If value is zero, the default periphery value of the enemy will be used.
|
If true - changes focus to the target sprite |
yes |
| 455 |
Check if Patrol dude flag is enabled |
|
|
yes |
| 456 |
Check if Deaf dude flag is enabled |
|
|
yes |
| 457 |
Check if Blind dude flag is enabled |
|
|
yes |
| 458 |
Check if Alarm dude flag is enabled |
|
|
yes |
| 459 |
Check if Stealth dude flag is enabled |
|
|
yes |
| 460 |
Check if other patrol dudes follow the marker |
|
If true - changes focus to that enemy sprite |
yes |
| 461 |
Check if this patrol dude reached the marker |
|
If true - changes focus to the marker |
yes |
| 462 |
Compare target spot progress in % for dudes with Stealth flag |
[STANDARD] |
|
no |
| 465 |
Check if dude can interact with objects |
|
|
yes |
| 467 |
Compare AI state timer |
[STANDARD] |
|
no |
The following are valid only for Custom Dude sprites
| Data1 |
Condition |
Arguments |
On focus change |
Bool |
| 470 |
Check if Life Leech is thrown |
|
If true - changes focus to the Life Leech sprite |
yes |
| 471 |
Check if Life Leech is destroyed |
|
If false - changes focus to the Life Leech sprite |
yes |
| 472 |
Compare amount of summoned dudes |
[STANDARD] |
|
no |
| 473 |
Check if custom dude able to... |
-
data4 = item to check
- 1: can attack
- 2: can turn in burning dude
- 3: can ducking
- 4: can electrocute
- 6: can recoil
- 7: can swim
- 8: can walk
|
|
yes |
SECTOR CONDITIONS
The following conditions works for any sectors that currently in the focus.
| Data1 |
Condition |
Arguments |
On focus change |
Bool |
| 300 |
Compare visibility |
[standard] |
|
no |
|
|
- Compare floor slope
- Compare ceiling slope
|
[standard] |
|
no |
| 310 |
Are required sprite type is in this sector? |
[standard] |
If true - changes focus to that sprite |
no |
| 350 |
It's an underwater sector? |
|
|
yes |
| 351 |
Compare depth level of the sector |
[standard] |
|
no |
|
|
Compare height of floor / ceiling in % where 0% = Off state, and 100% = On state
|
[standard] |
|
no |
| 357 |
Check if sector is in movement |
|
|
yes |
|
|
Check room over room markers or sectors |
-
data4 = item to check
- 1: room marker sprite
- 2: sprite owner of room marker sprite
- 3: sector
|
If true - changes focus to the data4 object
|
yes |
WALL CONDITIONS
The following conditions works for any walls that currently in the focus.
| Data1 |
Condition |
Arguments |
On focus change |
Bool |
| 200 |
Compare mask picnum |
[STANDARD] |
|
no |
| 205 |
Check wall's sector |
|
If true - changes focus to the sector |
yes |
| 210 |
Check if it's a mirror |
|
|
yes |
| 215 |
Check next sector it's connected |
|
If true - changes focus to the next sector |
yes |
| 220 |
Check if have next (other side) wall |
|
If true - changes focus to the next wall |
yes |
| 221 |
Check if have next wall is connected |
|
If true - changes focus to the next wall |
yes |
| 225 |
Check sector of 2-nd side of the wall |
|
If true - changes focus to the sector of 2-nd side |
yes |
-
Player Control (Type 500) created to give access for level designer to controlling properties related
to player. It allows to change movement speed, jump height, play screen effects or QAV animations and do many other stuff
with players just by triggering the sprite.
Unlike other types, this one performs operation type that should be selected with a numberic command. It's important
to remember that it should be set in current sprite and not received from the object which sends it. Thought,
Player Control supports conversion of commands from sender to receiver, it's recommended to always set it manually,
just because it's very handy in case when your map have a lot of triggers.
-
data1 = select player number for which you want to perform the operations
- 0: event causer
- 1: player #1
- 2: player #2
- 3: player #3
- 4: player #4
- 5: player #5
- 6: player #6
- 7: player #7
- 8: player #8
.MAP
COMMAND 5 (LINK): COPY PROPERTIES TO PLAYER'S SPRITE
This command allows to make player's sprite triggerable. This means that player sprite
could send commands to TX ID objects or receive it from player rx channels.
There is only one linker sprite for each player. Setting custom RX ID have no effect here, because
it triggeres automatically once game starts. The following properties of linker sprite will be inherited
by player:
- TX ID
- going on
- going off
- busyTime
- waitTime
- [all trigger flags]
- Interruptable
- DudeLockout
- [all data values]
Player sprite will be automatically added to objects list of tracking conditions,
if any presented, so conditions will be adressed to player directly, but not to player control sprite.
.MAP
COMMAND 64: CHANGE PLAYER RACE
.MAP
COMMAND 65: CHANGE PLAYER MOVEMENT SPEED AND JUMP HEIGHT
-
data2 = set movement speed (in percents)
- -1 or 32767: do not change
- 0: obviously, this makes player non-movable
- 100: reset to default movement speed
Any other value will also adjust the speed. The max is 65535.
-
data3 = set jump height (in percents)
- -1 or 32767: do not change
- 0: this makes player not able to jump at all
- 100: reset to default jump height
Any other value will also adjust the height.
.MAP
COMMAND 66: SET PLAYER SCREEN EFFECT
-
data2 = select screen effect
- 0: clear all the following effects
- 1: tilting
- 2: pain
- 3: blind (darkening the screen)
- 4: pickup
- 5: quake (the more is time, the more is strength)
- 6: visibility (bright the screen)
- 7: delirium (the more is time, the stronger is effect)
-
data3 = set time of the effects
The greater value, the more is time. The max is 432000.
It's about of 10 minutes in real time.
.MAP
COMMAND 67: START PLAYING QAV ANIMATION
By default animation is playing as weapon. This means that weapon will be lowered, the animation
is played and after that weapon will be raised again.
If animation is not set up to play forever, after it played required amount of times, the sprite
will send the command to next TX ID. This allows you to create sequences of animations if command
will be sent to another Player Control type which intended to play the animation.
COMMAND 68: STOP PLAYING QAV ANIMATION
Use this command to stop animation play. It's useful if you need to
interrupt amimation immediately via trigger. See an example map for command 67.
.MAP
COMMAND 69: CHANGE PLAYER LOOK ANGLE
The value must be between -128 and 128. Positive values forcing player to
look up, while negative treated as look down. If you don't want change look angle, just
set the value out of a range.
.MAP
COMMAND 70: CLEAR PLAYER ITEMS OR WEAPONS
.MAP
COMMAND 71: GIVE PLAYER ITEMS OR WEAPONS
-
data2 = select what exactly should be given.
- 1: give player a weapon N
- 2: give player ammo for weapon N
-
data3:
- in case of giving the weapon: sets weapon number that should be given
- in case of giving the ammo: sets weapon number for which ammo should be given
-
data4:
- in case of giving the weapon: if set to 1 - disables auto-switch on given weapon
- in case of giving the ammo: sets amount of ammo that should be be given
.MAP
COMMAND 72: ACTIVATE / DEACTIVATE INVENTORY ITEM
When receiving command from a sender: 1: On - activate item,
0: Off - deactivate item, any other - toggle.
-
data2 = specify inventory item number.
- 1: Doctor's Bag
- 3: Crystal Ball (useless in single player)
- 4: Beast vision
- 5: Jump Boots
-
data4 = additional options.
- 0: switch on it
- 1: remove item from inventory
- 2: both
COMMAND 73: CHANGE PLAYER SPRITE ANGLE
-
data2 = specify player angle
Max angle is 2048 build units. It basically
equals to 360deg, so 1024 = 180 and so on. If you don't want to change player angle, just set
the value out of a range.
-
hi-tag = force change angle according control sprite angle
For map example, please refer to command 69.
COMMAND 74: ACTIVATE / DEACTIVATE POWERUP
-
data2 = select powerup ID
| 1 - feather fall |
2 - invisibility |
| 3 - invulnerability |
4 - jump boots |
| 5 - raven flight |
6 - guns akimbo |
| 7 - diving suit |
8 - gas mask |
| 9 - clone |
10 - crystall ball |
| 11 - decoy |
12 - doppleganger |
| 13 - reflective shots |
14 - beast vision |
| 15 - cloak of shadow |
16 - rage shroom |
| 17 - delirium shroomw |
18 - grow shroom |
| 19 - shrink shroom |
20 - death mask |
| 21 - wine goblet |
22 - wine bottle |
| 23 - skull grail |
24 - silver grail |
| 25 - tome |
26 - black chest |
| 27 - wooden chest |
28 - asbestos armor |
Many powerups in this list are obsolete and have no effect in the game, still you can activate it to
probably simulate it's behaviour with other modern types. Just be creative. ;)
-
data3 = powerup duration in seconds
-
hi-tag = additional options
-
Inc-Dec (Type 37) can perform increment and decrement
operations with data fields of destination objects in real-time. It's similar to Data Changer type, except
this one allows you to set step value and iterate it every N time. It can be used for many things
where having dynamic data is preferable. For instance, using it in conjunction with Ambient Sound allows
you to smoothly change volume or radius. You will often see it in example maps attached to articles.
-
busyTime = frequency of the generator in ticks.
-
data1 = destination object data field
- 1: data1 of sprite / data of sector / data of wall.
- 2: data2 of sprite.
- 3: data3 of sprite.
- 4: data4 of sprite.
You can type multiple values to iterate selected data fields at the same time.
For instance value "12" means that data1 and data2
should be iterated, value "134" - data1, data3,
data4 and so on.
-
data2 = minimum value
The minimum value of destination data object where start from. This will
first set value to this minimum and then start iterate.
-
data3 = maximal value
The maximum value after iteration process is stops.
-
data4 = iteration value
Data field of destination object will be iterated by this value. Must be greater than 0.
If minimal value less than maximal value, it will cause
increment operation, else if maximal value is less than minimal value -
decrement operation will be performed.
By default, when goal value is reached in all destination objects, the iteration process stops and
generator goes to OFF state. This means, when you need perform any operations again, you have to enable
it by sending ON command on it. However, this behavior can be altered by setting it's
hi-tag value to one of following:
-
Custom dude (Type 254) and Custom Dude Spawn (Type 24) allows
to create new enemy and fine tune it in many ways. The new system using textual files with INI format structure.
For example, it is possible to define weapons, animations, sounds, damage parameters, effects and
much more.
Download manual available at http://cruo.bloodgame.ru/xxsystem/cdud/v2 which
contains detailed description of each parameter with syntax examples and whole written files that is ready for use.
-
.MAP
It's possible to set any missile for Missile generator (Type 704).
The missile will spawn on generator's sprite or TX ID sprite in case if TX ID is non-zero. You also able
to control it's velocity, slope and make it split up. To make it fire vertically, the sprite must be floor oriented.
One-sided flag controls the missile direction.
-
busyTime = frequency in 120th of a second.
-
data1 = select missile type
- 300: ButcherKnife
- 301: Flare (Regular)
- 302: Tesla (Alt)
- 303: Flare (Alt)
- 304: Aerosol flame
- 305: Fireball (used by Fireball Gen in MAPEDIT)
- 306: Tesla (Regular)
- 307: EctoSkull (Phantasm projectile)
- 308: HellHound / Cerberus Flame
- 309: ButcherPuke
- 310: [ Reserved ]
- 311: Stone Gargoyle projectile
- 312: Napalm (Regular)
- 313: Cerberus Fireball
- 314: Tchernobog Blue Fireball
- 315: Life Leech (Regular)
- 316: Life Leech (Alt - when dropped and enough ammo)
- 317: Life Leech (Alt - when dropped and zero ammo)
-
data2 = set missile velocity
- 0: predefined velocity.
The greater value, the greater speed. Max value is 1000.
-
data3 = set missile slope
- 0: no slope.
Positive values - bottom slope, while negative - top.
The value should be between -500 and 500.
-
data4 = set delay before missile splits up
- 0: no split up.
After a delay, the missile will split up in another 8 smaller missiles,
just like alt fire of flare gun. Max delay is 500.
-
hi-tag = additional options
- flag1: inherit shade, xrepeat, yrepeat and palette from current sprite.
- flag2: inherit shade, xrepeat, yrepeat and palette from TX ID sprite.
-
.MAP
RandomTX (Type 25) - takes value from random data field and uses it as
TX ID and sends command on it. This type allows to not just generate random item or spawn dude, but also create
completely random event. Just like in examples above, it will work only if at least 2 data fields are not empty.
But what if you want to use more than 4 TX ID? There is support of ranged TX ID has been added. Just
type in data1 value of first TX ID, then in data4 value of last TX ID
and leave both data2 and data3 fields empty.
-
Example (ranged TX ID):
- data1: 100
- data2: 0
- data3: 0
- data4: 120
This will send command to random TX ID in range of 100 and 120.
The random is pretty nice, so you can be 95% sure that next TX ID will not be the same as previous. Also this type can
work as event redirector.
-
.MAP
SequentialTX (Type 26) - sequentially takes value from data fields starting
from data1 or first non-empty data field and uses it as TX ID to send command on it.
-
Example:
- data1: 100
- data2: 101
- data3: 102
- data4: 103
Command 0: Off -
The first trigger will send command to TX ID 103,
the second trigger will send command to TX ID 102,
the third trigger will send command to TX ID 101,
and fourth trigger will send command to TX ID 100.
After data1 field will be used, it will start from data4 again.
Command 1: On / Command 3: Toggle -
The first trigger will send command to TX ID 100,
the second trigger will send command to TX ID 101,
the third trigger will send command to TX ID 102,
and fourth trigger will send command to TX ID 103.
After data4 field will be used, it will start from data1 again.
Note that in this mode empty data fields are ignored.
-
Example (range of TX IDs):
- data1: 100
- data2: 0
- data3: 0
- data4: 150
Command 0: Off
- sequentially take value starting from 149 and send command on it. After last
value will be used, it will start from 150.
Command 1: On / Command 3: Toggle
- sequentially take value from 100 and send command on it. After last
value will be used, it will start from 100 again.
You can force sending command to all TX IDs in the same time by setting hi-tag value of
the sprite. All objects that able to receive the command, will receive it and current index of TX ID will reset.
Also this type can work as event redirector.
-
DataChanger (Type 35) - a very powerful type that allows change data fields of any sprite, sector
or wall on the fly. For instance, it allows change required object for Counter Sector or enemy type that
will spawned by Dude Spawn or even Combination Switch settings!
-
FOR SECTORS:
-
FOR SPRITES:
-
data1 = data1 field of destination sprite
- -1 or 32767: keep current value
-
data2 = data2 field of destination sprite
- -1 or 32767: keep current value
-
data3 = data3 field of destination sprite
- -1 or 32767: keep current value
-
data4 = data4 field of destination sprite
- -1 or 65535: keep current value
-
FOR WALLS:
Sometimes it may require to set "ignore values" (
-1,
32767 or
65535) in some
destination objects to make them ignore some params dynamically, and so you can do it with setting
hi-tag value.
-
.MAP
Sector Lighting changer (Type 34) - can change
destination sector lighting effects on the fly. You may change amplitude, frequency, phase and even color
lighting with this type. If TX ID is empty, a current sector will be used.
-
.MAP
Damager (Type 36) - damages players or enemies if it can
be damaged with given amount and type. Note that some enemies could be immune to specified damage type. For instance,
Hound cannot be damaged with burn damage. However, when you killing the sprite, this rule is ignored.
-
busyTime = frequency of the damage generation in ticks.
-
data2 = damage type
- -1: force reduce hp by data3 value.
- 0: fall damage.
- 1: burn damage.
- 2: bullet damage.
- 3: explode damage.
- 4: drown damage.
- 5: spirit damage.
- 6: tesla damage.
-
-
hi-tag = additional options
- 0: none.
- flag1: treat data3 as fixed value (default is percent).
- flag2: do not show damage effects such as flames or tesla recoil.
- flag4: force recoil for any damage type.
TX ID POINTS ON A SPRITE:
This means that destination sprite will receive the damage. It must be an enemy or player (see Player RX channels).
TX ID POINTS ON A SECTOR:
This means that any enemy or player in that sector will receive the damage. In this case, however, there is additional
options available that defines when exactly it's true:
- If damager placed on the ceiling of sector: damage only when objects touching the ceiling.
- If damager placed on the floor of sector: damage only when objects touching the floor.
- If damager is a wall sprite: damage only when objects touching the walls of the sector.
- If none of variants above: damage when objects enters destination sector.
You can combine options: place the damager on the ceiling or floor and make it wall sprite. This will lead to result
when objects receive the damage if touching the ceiling or floor and walls.
TX ID IS ZERO:
-
data1 = specify target that receive the damage.
- 0: any enemy or player in damager's sector.
- 1: player 1.
- 2: player 2.
- 3: player 3.
- 4: player 4.
- 5: player 5.
- 6: player 6.
- 7: player 7.
- 8: player 8.
- 666: everyone on the map.
- 667: just all enemies on the map.
- 668: just all players on the map.
-
Enemy Target Changer (Type 33) - allows to change target for enemies and
force them fight each other, act like team to fight only specified targets (or everyone), ignore or
follow to player and many other options.
Since it's a generator, it sends command every N it's busyTime to destination object, just like Trigger Gen
and basically all generators does. The less busyTime, the better result is, so i suggest to use busyTime in
range from 1 to 10. The default value is 5. Once target changer is Off
or Locked, every enemy affected by it will return back to normal and will try to kill you.
-
busyTime = frequency of the generator in ticks.
-
data1 = forces AI to fight only targets that have in their data1 the same value.
-
0: AI will attack all monsters that have empty data1 field.
-
666: fight every enemy, even if it's data1 field have different value or empty.
-
data2 = specify current battle mode for AI. By default "DeathMatch" is selected.
-
0: DeathMatch
Enemies with same RX ID in this mode will fight each other and search for targets
that have data1 id. Fine example: Axe Zombies attack each other for food :>.
It's worth to note that not all monsters of the same type can attack each other. For instance,
Tommy Cultist can't attack Tommy Cultist.
-
1: Team DeathMatch
Enemies in this mode with same RX ID will act like team and search for targets
that have data1 id. If data1 of target changer is 666, they will fight everyone except team
mates (same RX ID monsters). Fine example: Few cultists lose control on Cerberus and his Hound helpers and
trying to kill them.
-
data3 = specify if target of AI should be forced to fight. By default target is not forced.
-
0: no force, target will react on AI fire only when it hits the target.
-
1: once AI selected this target to fight, aim of the target will be changed to AI.
-
2: same as 1, but target can also disturb some monsters which in idle state. Disturbed monsters
will not fight and just walk around in map, until AI will not select them to fight.
-
data4 = specify how AI should react when note player(s). By default player(s) is not ignored.
-
0: do not ignore player(s) even if enough other targets in sight.
-
1: AI may or may not attack player(s) when enough targets in sight.
-
2: AI will attack player(s) only when no targets in sight at all. Once there is new targets
appear, AI will attack on targets instead of player(s).
-
3: AI will go to Idle state when no targets in sight, and will ignore player(s) always, even when
player(s) fire in AI.
-
4: AI will follow player(s) in sight, when no targets. Once new targets appear, AI will attack on
targets. Note that not all monsters can follow player thought, for instance, Zombies, Gillbeasts
or Beasts can't.
-
.MAP
SEQ Spawner (Type 27) - spawns and plays any existing SEQ animation
from data2 field. Since it's a generator, you can make it play animation in a loop
by setting it's busyTime. Animation can be spawned on it's sprite if there is no TX ID specified or on all
TX ID objects include walls, masked walls, floors or ceilings of the sector.
-
Sector Wind Generator (Type 39) - creates wind effect on TX ID sector or in
a sector it's currently placed on, even if is not an x-object. Unlike wind options in sector FX dialog, the generator
can use higher values for wind velocity and can change direction of wind randomly or according generator's sprite angle.
The higher values can be useful to wind away player or dudes, while
randomness settings can be useful for FX effects such as dynamic flame, rain or snow. This type is
generator, so you can use it same as other generators by setting it's busy and wait times according
your needs. Also note this generator does not changes state of the sector, it just deal with it's
effects.
-
busyTime = frequency of the generator in ticks.
-
sprite angle = destination sector's wind direction
It's possible to use additional wind direction control. If sprite angle is not randomized, you could
set sprite step rotation value in data4 field and then paint sprite in blue
or green using key [K] in 2D Mode. Blue sprite rotates to right side, green one - to left.
-
data1 = randomness settings (optionally)
- 0: no randomness
- 1: randomize wind velocity in range of data2
- 2: randomize generator sprite angle. (will cause change of wind direction).
- 3: randomize both
-
data2 = wind velocity from 0 to 32 767.
-
data3 = enable panning texture according generator wind settings
- 0: use sector pan settings
- 1: pan just floor
- 2: pan just ceiling
- 3: pan both
-
hi-tag = panAlways and windAlways options
- 0: use sector settings.
- 1: force "pan always" and "wind always" even if not selected in sector.
-
.MAP
Effect Generator (Type 38) spawns FX Effect (smoke, flames, bullet holes, water
splashes, etc.) specified in data2 field. There is pretty wide range of effects in game and you
probably want to try them all. Some effects can inherit appearance such as palette and size of the generator.
-
busyTime = frequency of the generator in 120th of a second.
-
data1 = randomize busyTime
-
data2 = FX Effect ID
| 1: Bullet hit (flesh 1) |
2: Bullet hit (flesh 2) |
| 3: Bullet hit (flesh 3) |
4: Bullet hit (water) |
| 5: Bullet hit (metal) |
6: Bullet hit (wood) |
| 7: Bullet hit (snow) |
8: Water splash 1 |
| 9: Water splash 2 |
10: Lava splash |
| 11: Smoke (big) |
12: Smoke (small) |
| 13: Blood chunks |
14: Burn spark |
| 15: Blue spark |
16: Burning broken wood |
| 17: Broken wood |
18: Broken glass (white 1) |
| 19: Broken glass (blue) |
20: Broken glass (red) |
| 21: Broken glass (green) |
22: Broken glass (orange) |
| 23: Single bubble (big) |
24: Single bubble (small) |
| 25: Single bubble (smaller) |
26: Multi bubble |
| 27: Red blood trail |
28: Flare spark |
| 29: Respawn effect |
30: Metal shard |
| 31: Broken glass (white 2) |
32: Flame lick 1 |
| 33: Flame lick (blue, bigger) |
34: Blood wall splash (big) |
| 35: Blood wall splash (small) |
36: Blood on floor |
| 37: Tommy bullet casing 1 |
38: Tommy bullet casing 2 |
| 39: Tommy bullet casing 3 |
40: Sawed-off shell casing 1 |
| 41: Sawed-off shell casing 2 |
42: Sawed-off shell casing 3 |
| 43: Bullet hole |
44: Leaf (yellow) |
| 45: Leaf (green) |
46: Broken stone |
| 47: Burning paper |
48: Blood drip splash |
| 49: Electric spark 1 |
50: Electric spark 2 |
| 52: Tesla circle |
53: Green blood trail |
| 54: Fire blood trail |
55: Green blood on floor |
| 56: Flame lick 2 (long) |
There is few predefined effects available to use (data4
and hi-tag options are ignored here)
| 200: Bunch Flame licks |
201: Bunch of flare sparks |
| 202: Bunch of flare sparks (lower velocity) |
203: Bunch of blood sprays 1 |
| 204: Bunch of blood sprays 2 |
205: Bunch of arc sparks |
| 206: Bunch of electric sparks |
-
data3 = random range of effects
-
data4 = specify where exactly effect should be spawned
- 0: at the top of the sprite (default)
- 1: at the bottom of the sprite
- 2: at the middle of the sprite
- 3: at the floor of sprite's sector
- 4: at the ceiling of sprite's sector
-
hi-tag = force inherit effect generator appearance by effect
- 0: do not inherit (default)
- flag 1: inherit following properties: palette, xrepeat, yrepeat, xoffset, yoffset and shade
- flag 2: inherit sprite cstat
- flag 4: inherit sprite angle
- flag 16: inherit picnum
Effects can be spawned on all TX ID sprites if TX ID of Effect Generator is not empty. This means you can use
single generator for a few sprites where effect should be appear.
-
.MAP
PropertiesChanger (Type 28) - can change various properties for sectors, walls or sprites on the fly. For instance,
changing cstat of the sector makes it parallaxed or non-parallaxed, or if you change cstat of the sprite, you
can make it face, wall or floor oriented, visible or invisible etc.
-
hi-tag = additional options.
- flag 0: none.
-
flag 1: relative attribute adding / removing.
Sometimes it's handy to set new attributes or remove it relative to current.
First you need to set this flag to tell the game you want to do it. Then,
if you want to remove attribute, you must add flag 4, otherwise new attribute will be
added to current.
-
flag 2: do not check for exceptional attributes.
Some attributes cannot be normally altered because of security reasons. Often changing such attributes
may lead to unexpected results, so you must set this flag to get attributes marked as exception changed
as well. Do it if you really sure.
- flag 4: remove attribute (in conjunction with flag1).
-
TX ID IS ZERO:
-
data2 = set global visibility (from 0 to 4096).
-
FOR SECTORS:
-
data1 = sector underwater and depth options.
- -1 or 32767: don't change anything.
- 0: mark sector as non-underwater.
- 1: mark sector as underwater.
- 2 - 9: set depth level in range from 0 to 7.
If enemies or players are in current sector, their underwater status will be changed dynamically as well.
-
data2 = set sector visibility.
- -1 or 32767: keep current sector visibility
The value can be between 0 and 255. The greater
value, the less sector visibility.
-
data3 = sector ceiling cstat flags.
- -1 or 32767: keep current ceiling cstat flags
Available sector cstat list:
- 1: Sector parallaxed.
- 2: Sector sloped.
- 8: Expanded texture.
- 16: FlipX sector texture.
- 32: FlipY sector texture.
- 64: Relative texture alignment.
-
data4 = sector floor cstat flags.
- -1 or 65535: keep current floor cstat flags
-
FOR SPRITES:
-
There was added a better physics! Currently it's possible to add physics for any sprite.
Objects affected with physics can be moved via wind, panning, touching, explosions or vector
weapons. You may also control how exactly physics will work.
Unlike vanilla, where physics for sprites acts always the same, new one takes in
account mass (automatically counted with given sprite size, it's surface type and clipdist
property) and underwater status. So, heavy objects will drown faster and moving slower etc.
data2 = enter sprite physics attributes.
- -1 or 32767: keep current attributes
- 0: deactivate physics for destination object
-
FIRST DIGIT (MAIN PHYSICS ATTRIBUTES):
- 1: destination object is affected by movement physics only.
- 2: destination object is affected by gravity only.
- 3: all attributes are available for destinaton object.
-
SECOND DIGIT (TOUCH PHYSICS ATTRIBUTES):
- 0: destination object cannot be impulsed with touching.
- 1: destination object can be impulsed with touching.
-
THIRD DIGIT (WEAPON PHYSICS ATTRIBUTES):
- 0: all attributes are disabled for destination object.
- 1: destination object can be impulsed with vector weapons only.
- 2: destination object can be impulsed with explosions only.
- 3: all attributes are available for destinaton object.
-
FOURTH DIGIT (FLOATING, SWIMMING AND FLYING ATTRIBUTES):
- 0: all attributes are disabled for destination object.
- 1: destination object can only swim underwater.
- 2: destination object can only swim and float underwater.
- 3: destination object can only fly while on the ground.
- 4: destination object can fly while on the ground and float underwater.
- 5: destination object can fly while on the ground and swim underwater.
- 6: all attributes are available for destinaton object.
-
data3 = enter sprite hi-tag.
- -1 or 32767: keep current hi-tag
Changing hi-tag of sprite is mainly useful if you want change some options in modern types which
support it dynamically.
-
data4 = enter sprite cstat flags
- -1 or 32767: keep current sprite cstat flags
Available sprite cstat list:
- 1: Blocking sprite.
- 2: Double translucent sprite.
- 4: Sprite is X-flipped.
- 8: Sprite is Y-flipped.
- 16: Wall sprite.
- 32: Floor sprite.
- 64: One sided sprite.
- 128: [exception] Sprite origin aligned (bottom aligned otherwise).
- 256: Hit-scan sensitivity.
- 514: Normal translucent sprite.
- 4096: [exception] Sprite is pushable (Push flag).
- 8192: [exception] Sprite can be moved with movable sectors in sector direction.
- 16384: [exception] Sprite can be moved with movable sectors in reverse direction.
- 32768: Sprite is invisible.
-
FOR WALLS:
-
data1 = set this wall as first wall of the sector or auto-align wall.
- -1 or 32767: don't change anything.
- 1: set this wall as first.
- 2: set this wall as auto-align wall for sector.
data4 = wall cstat flags.
- -1 or 65535: keep current wall cstat flags
Available wall cstat list:
- 1: Wall is blocking.
- 2: [exception] Wall is bottom-swapped.
- 4: [exception] Wall is bottom / outside oriented.
- 8: Wall texture X-flipped.
- 16: Wall is masked.
- 32: [exception] Wall is one-sided.
- 64: Wall is hit-scan sensitive.
- 128: Double translucent wall.
- 256: Wall texture is Y-flipped.
- 640: Normal translucency.
- 16384: [exception] Wall will move by movable sector in sector direction.
- 32768: [exception] Wall will move by movable sector in reverse direction.
It's possible to actually mix cstat or hi-tag values to get various results. For instance, you want make sprite
floor and blocking - then you need mix values SpriteFloor (32) and SpriteBlocking (1), and so you got
33. So, data4: 33 will cause sprite to be blocking and floor oriented.
What if you want create wall oriented, blocking and hit-scan sensitive sprite? Same here: take SpriteWall value (16),
then SpriteBlocking value (1), and SpriteHitscan (256). 16 + 1 + 256 = 273. So, data4: 273 will cause wall
oriented, blocking and hit-scan sensitive sprite. Easy enough?
Next example: you want make sprite to be movement physics and gravity affected. Take
PhysicsMovement value (1) and PhysicsGravity value (2). 1 + 2 = 3, So, data3: 3 will make sprite gravity
and movement affected.
-
Picture changer (Type 29) can change picture of sector, sprite or wall according to it's data values. It
also can change sprite palette.
-
FOR SECTORS:
-
data1 = picture number of sector's floor.
- -1 or 32767: keep current picture
-
data2 = picture number of sector's ceiling.
- -1 or 32767: keep current picture
-
data3 = palette number of the sector's floor.
- -1 or 32767: keep current palette
-
data4 = palette number of the sector's ceiling.
- -1 or 65535: keep current palette
-
FOR SPRITES:
-
data1 = picture number of the sprite.
- -1 or 32767: keep current picture
-
data2 = shade level of the sprite.
-
data3 = palette number of the sprite.
- -1 or 32767: keep current palette
-
FOR WALLS:
-
data1 = picture number of the wall.
- -1 or 32767: keep current picture
-
data2 = picture number of mask for masked walls.
- -1 or 32767: keep current picture
-
data3 = palette number of the wall.
- -1 or 32767: keep current palette
-
.MAP
Resizer (Type 31) can change sprite picture size, panning of sector's floor or ceiling and wall
texture settings on the fly. The values should be greater than 0 and less than 255.
-
FOR SECTORS:
-
data1 = panning of sector's floor by X.
- -1 or 32767: keep current panning
-
data2 = panning of sector's floor by Y.
- -1 or 32767: keep current panning
-
data3 = panning of sector's ceiling by X.
- -1 or 32767: keep current panning
-
data4 = panning of sector's ceiling by Y.
- -1 or 65535: keep current panning
-
FOR SPRITES:
It's possible to resize sprite with two methods: by changng it's xrepeat and yrepeat values
directly or by scaling SEQ animation. The last method is mainly useful when you have sprite with SEQ
animation spawned on it and there is non-zero XR and YR values in that animation. For instance, it
makes resizing of any dude in game way easier.
1-st method:
-
data1 = size of sprite picture by X.
- -1 or 32767: keep current size
-
data2 = size of sprite picture by Y.
- -1 or 32767: keep current size
2-nd method:
-
hi-tag = enable SEQ scaling method.
- 0: do not enable (default)
- 1: enable
-
data1 = scale value
The value should be in a range of -25 and +25. Negative
values leads to smaller size, while positive makes sprite larger. Value 0
will reset sprite size back to normal. -255 treated as "ignore value" which
means current scale will not be changed.
-
data3 = offset of sprite by X.
- -1 or 32767: keep current offset
-
data4 = offset of sprite by Y.
- -1 or 65535: keep current offset
-
FOR WALLS:
-
data1 = texture size of wall by X.
- -1 or 32767: keep current size
-
data2 = texture size of wall by Y.
- -1 or 32767: keep current size
-
data3 = texture offset of wall by X.
- -1 or 32767: keep current offset
-
data4 = texture offset of wall by Y.
- -1 or 65535: keep current offset