.::Russian Blood Community Forum::. »Blood: The Game We Playing In » Editing Center » Документация по X-System
Страниц (2): [1] 2 »
1. Blackwinged - 26 Октября, 2005 - 02:15:13
Да-да, эта та самая неизвестная система Blood, по которой до настоящего времени не было никакой информации, но которую можно вызвать в MapEdit'е через клавишу Tab в режиме 2D. :) Сразу предупреждаю - документация здоровая, целиком не лезет, выложу по кускам. :up:

Итак, оригинал:

This file documents the XSystem used in Blood. The XSystem is a system of
communication between dynamic world objects. A firm grasp of the XSystem is
crucial for Blood level designers. The XSystem provides basic building blocks
for creating simple doors, switches, and platforms, as well as the
flexibility for building extremely complex scenarios and puzzles.


==============================================================================
Overview
==============================================================================


XSectors, XWalls, and XSprites

The XSystem is based on extending the three simple object types used
in the Build engine: sectors, walls, and sprites. The extensions to
these are referred to as XSectors, XWalls, and XSprites, or
collectively as XObjects. Internally, the XSystem manages a list of
each of each XObject and maintains links between its related object.
The links are stored in the extra field, which you cannot edit in
MapEdit, but can view with the Tab key in 2D mode.


State

Fundamental to every XObject is the concept of state. In the XSystem,
state is a simple boolean condition: ON or OFF. The meaning of state
changes within different contexts, and can mean such things as open
or closed for a door, alive or dead for a creature, or moving or
still for a platform. For some types of XObjects, the implementation
of state is hardwired, i.e., the meaning of ON and OFF are fixed. In
most cases, however, you are free to manipulate the meaning of the
two states as you see fit. Nevertheless, consistency and protocol
will go a long way towards creating maintainable maps that are easy
to debug. For example, it is recommended that you create doors such
that ON is open, and OFF is closed, but this is by no means enforced.

There are many sector effects that are implicitly tied to state. The
two most commonly used effects, lighting and panning, are both by
default directly controlled by sector state, and you will need to
understand state in order to make full use of these effects.

Simply put, the effect is active when the state is ON, and the effect
is inactive when the state is OFF. This means that the water in a
sector could be made to flow or be still, depending on the sector's
state. In the same way, a sector's lighting effect can be made to go
on and off by changes in the state of the sector. The lighting wave
form (if any) and amount of lighting (positive or negative) are
independently configurable, which means the implementation of ON and
OFF are still up to you.

Switches are XSprites that work by changing their state in response
to some stimulus, such as being pressed by the player, or impacted by
a projectile. Nearly every XObject can change state in this fashion,
although you can also effect state changes through the use of
messages transmitted from one XObject to another.


Triggers

All changes in state ultimately originate as a result of some
physical event, usually an action by the player. These events are
known as triggers, and XObjects can be made sensitive to triggers by
setting the appropriate trigger flags:

[x] Push
[x] Impact
[x] Explode
[x] Pickup
[x] Touch
[x] Sight
[x] Proximity
[x] Enter
[x] Exit
[x] WallPush

The Push trigger flag can be set for all XObjects, and is activated
when the player presses the action key while facing the XObject. The
player must be within a certain distance (currently 64 pixels) in
order to activate the trigger. However, if the player is in an
XSector that has the Push flag set, the trigger can be activated if
no other XObject within push range has the Push flag set. Push
triggers have many uses, such as switches that control other
XObjects, swinging doors, or walls the player can push back.

An Impact trigger is generated when the XObject is hit by a vector
weapon, such as the shotgun or the tommy gun, regardless of whether
the source of the vector was a player or a creature. The Impact
trigger flag can be set for all XObjects. Use the Impact trigger flag
to make glass windows change state (and break) when shot.

The Explode trigger is similar to the Impact trigger, except it is
created when the XObject is affected by an explosion. All XObjects
can have Explode triggers. Explode triggers can be used for walls
that can be demolished with TNT.

The Pickup trigger flag can only be set for XSprites. This trigger is
generated when an item is picked up by a player. If you use the
Pickup trigger, you should use the XSprite to send out a message to
another XObject, since it will be deleted immediately after being
triggered. The Pickup trigger makes it easy to create an ambush
where picking up a crucial item causes doors to open exposing hordes
of enemies. This differs from DOOM, which requires that the player
step into a sector that actuates a trigger. Use of the sprite Pickup
flag is preferable to using an XSector's Enter flag where the intent
is to trigger another XObject when a special item is picked up.

The Touch trigger is generated when the player is standing on (and
being supported by) a particular XSprite. Only XSprites can use Touch
triggers. A good use for Touch triggers is to create a break away
floor section using floor sprites that drops the player into some
other hazard.

The Sight trigger flag allows XSprites to generate a trigger when a
player is visible from the XSprite's location. The visibility test is
computationally expensive, so use this trigger flag very sparingly!

The Proximity trigger flag can be set for XSprites to allow them to
trigger when a Dude (not just players) is within a finite distant
from the XSprite. The dude must be with 64 pixels AND be visible from
the location of the XSprite. The visibility test ensures that
proximity triggers don't get generated for Dudes that are on the
other sides of walls. Proximity triggers are used automatically for
player placed proximity bombs, but you can create preset proximity
bombs with this trigger flag.

XSectors can generate triggers when a player enters and exits a
sector by using the Enter and Exit trigger flags. It is not yet
determined whether teleporting from or dying in a sector constitute
leaving, so be careful when using these flags together not to create
potential deadlocks.

The WallPush is an XSector flag that is the equivalent of setting the
Push trigger flag for all of the outward facing walls of a sector.
Setting the WallPush trigger flag makes it easy to trigger red sector
doors. This Flag may be used in conjunction with the Push flag in
sectors where the intent is to have the player activate the XSector
from the inside or outside.

For most XObjects, the effect of a physical trigger is to toggle the
state of the object. This is not always the case, however, and the
implementation of an XObject's response to a physical trigger is
dependent on the type of XObject. In the descriptions of each
specific XObject type, you can assume that a physical trigger toggles
state unless explicitly stated otherwise.


Keys

You can limit what triggers the player is able to generate by
specifying a key requirement. There are up to 7 different keys that
the player can acquire each level. If the key field is set to a value
other than 0, the XObject will not generate a trigger unless the
player possesses the appropriate key. For example, a wall tile might
possess a key hole. If the player has the silver key, pressing the
action button while facing the wall will open the adjoining door (via
a command message to the door). If the player does not have the
silver key, the door will not open.

(Добавление)
Messages

The XSystem enables you to create highly interactive and complex
environments, and the primary mechanism for accomplishing this
complexity is the message system. Every XObject has the ability to
send and receive messages to and from other XObjects. Communication
between XObjects is what allows a wall switch to open a door, a trap
to open upon entering a secret area, or a combination lock to
activate a teleporter.

Communication takes places in the form of commands which can be
broadcast on any of 1023 different 'channels'. Each XObject has a
separate transmit and receive channel, called txID and rxID,
respectively. These can be set to the same channel, but usually they
will be different. Think of the receive channel as the channel that
the XObject is listening to. A message will have as many receivers as
there are listeners. If a command is broadcast on channel 200, then
every other XObject with an rxID of 200 can react to that message.
Different types of XObjects can be listening to channel, and each
react differently on reception of a message.

The conditions for when to transmit a message are defined by an
XObject's Send Mask, which is described later.


Commands

The primary reason for sending a message to an XObject is to alter
the state of the recipient. To that end, there are several different
commands that a message may encapsulate:

OFF
ON
state
toggle
!state
link
LOCK
UNLOCK
*LOCK

The simplest of these are the OFF command and the ON command. As you
would expect, these force the recipient to the specified state. To
turn an XObject ON, send an ON command on the channel to which it is
listening. To turn it OFF, send an OFF command on the same channel.

For example, a wall switch could transmit an ON message on channel
142 when the player presses the action key on the front of the
switch. An XSector with an rxID of 142 would change from OFF to ON
when receiving the message. If the XSector had a lighting effect
defined, it would be activated by the change in state. This is how
you would create a room with a light switch on the wall.

The state command allows an XObject to transmit an OFF or ON command,
depending on what its current state is. If the XObject is OFF, it
transmits an OFF command. If it is ON, it transmits an ON command.
The state command provides a convenient way to synchronize the states
of two or more XObjects.

Any XObject receiving a toggle command will invert its state. Use
this command when you don't care what the original or resulting state
will be, and you just want to ensure that the receiving XObject
changes state.

The !state (read "not state") works similar to the state command,
except the state of the sender is inverted. If it is OFF, it
transmits an ON command. If it is ON, it transmits an OFF command.

The link command is used to synchronize the state of two or more
XObjects at a more fundamental level than the state command, and is
described in detail under "Linking".


Locking

The LOCK and UNLOCK commands alter the state of the recipients locked
status. When an XObject is locked, it will ignore any physical
triggers sent to it. It will still respond to any messages it
receives. The *LOCK command will toggle the locked state of the objects
recieving the message.


System Channels

Channels 0 - 99 are system channels and are reserved for certain global
tasks. Some of these should be transmitted on to trigger global events,
and others can only be received.

Here are the uses of the system channels:

0 Null channel. No commands are ever sent on channel 0.
1 RESERVED
2 RESERVED
tx я3 Voice/text over
tx 4 End level A
tx 5 End level B
tx 6 Lightning
rx 7 Called at startup
rx 8 Called at BloodBath startup
rx 9 Called at Coop startup
10..89 RESERVED
90..99 Used internally for remote detonators
tx/rx 100+ Miscellaneous level channels

Channels from 100 to 1023 are free and should be used by the level
designer for communication between XObjects. The uses of the system
channels is further described in the section on System Triggers.


Send Flags

XObjects broadcast messages as a result of a state change. You can
specify which state changes will cause the XObject to transmit by the
send flags:

[x] going ON
[x] going OFF

When the state changes from OFF to ON, a message will be broadcast if
the "going ON" flag is set. When the state changes from ON to OFF, a
message will be sent if the "going OFF" flag is set. If neither flag
is set, the XObject will not broadcast any messages as a result of
state changes. If both flags are set, it will broadcast at any state
change.

For example, suppose you want to use a lever to control a portcullis.
When the lever is pulled one way, you want it to raise the
portcullis, and when it is pulled the other way, you want to lower
the portcullis. You would set the command to "state" and set both
send flags, so the level would send an ON or OFF command every time
the lever is moved.

If, on the other hand, you wanted to use two switches to control the
portcullis, you might have switch A raise the portcullis when it is
turned on, and switch B lower it when turned off. In this case you
would set switch A's "going ON" send flag and set its command to
"ON"; and switch B's "going OFF" send flag and set its command to
"OFF". Switch A would then send an ON command only when its state
changed to ON, and switch B would send an OFF command only when its
state changed to OFF.


The Busy state

For many XObjects, such as doors or lifts, state is used to indicate
one of two spatial positions that it can move between. By definition,
however, transitions between the two states cannot occur
instantaneously, but must progress over some finite period of time.
In this case, the state change will not be considered complete until
the object reaches its destination.

While the object is undergoing a state change, the state field will
remain unchanged, but an internal variable, called "busy" will track
the progress of the state change. The busy value is a binary fraction
that ranges from 0 (OFF) to 1 (ON). You can control how long the
state change takes (for the appropriate XObject types) by specifying
a value for busyTime in 1/10ths of a second. A door with a busy time
of 50 will take 5.0 seconds to open or close. The current maximimum
busyTime is 25.5 seconds, though this may be raised to accommodate
the longer waitTimes used with Momentary Switches.

Once the object reaches its goal state, the state field is changed,
and a message is broadcast, depending on the send flags. The effect
of delaying the state change until transition is complete allows
actions of objects to be sequenced.

For example, imagine what is necessary to move a boat through a set
of locks. First one door opens, and when the door is completely open,
it sends a message to the boat to move it through the door. When the
boat reaches it's destination, it sends a message to the door, which
starts closing. Once the door is closed, it sends a message to the
sector, which raises the water level. When the water reaches its
desired level, it sends a message to the other door, etc.




(Добавление)
Callbacks

For many of the XObjects in a level, you will want them to be reset
after a period of time. For example, you might want to create a
vertical door that closes automatically after being open for 10
seconds. The XSystem supports this through the use of callbacks.
Callbacks are a special message type that is generated internally and
gets delivered to the XObject after a time period that you specify.

You control the generation of callbacks through two fields, the
waitTime and the restState. If waitTime is 0, the XObject will not
generate a callback, otherwise it specifies the delay in 1/10ths of a
second between a state change and receiving the callback. The
restState is either OFF or ON, and indicates the default "resting"
state for the XObject. It will post a callback when changing away
from the restState, and when it receives the callback message, it
will set its state to the restState.

In the above example of a vertical door that closes after 10 seconds,
you would create a door such that OFF is closed, and ON is open. Set
the waitTime to 100, and the restState to OFF. Whenever the door
opens, changing state from OFF to ON, it will post a callback message
to itself. After 10.0 seconds, the callback is delivered, and the
door will close.

Unlike broadcast messages which are sent out on a particular channel,
callbacks are delivered directly to the XObject which generated them,
and are not concerned with rxID or txID. Callbacks also work
irrespective of the XObject's send flags. This allows callbacks to
work independently of any other messaging you might involve the
XObject in. You can still broadcast messages on a state change,
regardless of whether that state change occured as a result of a
physical trigger, a command message, or a callback message.

In most cases you will want to leave restState at its default value
of FALSE. There are a few cases where having a restState of ON can
solve some rather unusual design problems, but a description here
would only be confusing. It will suffice to say that you'll know when
you need to change it.


Linking

Imagine opening the door to a dark closet, and as the door opens, the
interior of the closet gets brighter. Imagine raising a flood gate,
and as the gate opens, the water downstream begins to move, slowly at
first, but them more rapidly as the gate gets higher. These are some
of the effects you can accomplish with link messages.

The link command essentially allows an XObject, a master, to
broadcast its busy state. It is not necessary to set send flags for
the link command. The link command will be sent out continuously as
the master changes state. This will cause any XObjects receiving the
link commands, slaves, to synchronize with the master by copying the
master's busy value. When the master finishes its transition, its
state field will change, and so too will that of all the slaves.

The interpretation of the busy value will depend entirely on the type
of XObject receiving the command. Certain sector attributes, such as
lighting amplitude and pan velocity are by default controlled by
state, and therefore busy value. Sending link commands from a door
XSector to a room XSector is an easy to synchronize the illumination
of the room with how far the door is open.

The XSystem makes no checks for slaves starting out in the same state
as masters. If a slave is ON and the master is OFF when a map is
loaded, and the master broadcasts a link command as it changes state
from OFF to ON, the slave will seem to 'pop' to OFF when it receives
the first link command, and then slowly change to the ON state
simultaneously with the master. You should avoid this by ensuring
that slaves start out in the same state as masters.


Decoupling

Each XObject can be thought of as having several components: a
component which handles state and the sending and receiving of
messages, a component which interprets and implements state in an
object specific way, and a part which detects physical triggers.
Normally, these components all function as a single unit. When an
XObject is triggered, its state is modified, the physical
representation changes, and a message may be sent out. This 'unit'
functionality is intuitive, and it makes creating the most common
types of XObjects quite simple.

Suppose, however, that you want to control the lighting in a room
with a wall switch, but you also want to be able to detect when a
player enters the room in order to trigger some sort of trap. You
might set up a static lighting effect controlled by state, so that
when the sector is ON the room is bright and when it is OFF the room
is dark. Pressing a wall switch could send a toggle command to the
room XSector, turning the lights on and off. If you simply set the
Enter trigger flag in the sector, then a player entering the room
would toggle the state of the sector, turning the lights on or off.
And any message sent out would have to depend on a state change,
which would mean it would be triggered not only by physical
triggers, but by state changes caused by the light switch.

Fortunately, there is a way to isolate the functioning of the
XObject's physical trigger component from its state mechanism. The
decouple bit, when set, causes physical triggers not to affect the
XObject's state, and to directly generate a physical trigger message.
This message is broadcast on the txID channel, and causes the
physical trigger to be applied to all receiving XObjects. In other
words, to any XObject receiving the message, the trigger will be
handled exactliy as if it were generated by that XObject itself.


(Добавление)
==============================================================================
XSPRITES
==============================================================================


Data1 .. Data3

The data fields are a catch all storage area for miscellaneous data
with no place to go. Their use is type dependant.


Difficulty

This specifies at what difficulty level the object appears. Level 0
is the easiest, and level 3 is the hardest. Not yet implemented.


Detail

Not yet implemented.


Map flags

( ) when seen
( ) never
( ) initial
( ) secret

These allow you to specify the conditions under which the object will
be visible on the players 2D map. The default is "when seen", which
means that it must be first seen in 3D mode before it will be
displayed on the map. XSprites marked as "never" will be invisible
in 2D map mode. To have an XSprite start on the map, use "initial".
"Secret" is not yet defined.


Sound kit

Not yet implemented. See Ideas section.


Respawn flags

Not yet implemented. See Ideas section.


XSprite types

Markers

None implemented yet.

Switches

Toggle Switches:

The most basic of all switch types. It will display as one of two
pictures in 3D mode, depending on the state. The picnum should be set
to the OFF state picture. The ON picture (picnum + 1) will be displayed
when the switch is on. All physical triggers toggle the state of the
Toggle switch.

Momentary Switches:

Like the Toggle switch, except physical triggers can only change its
state to ON. You'll need a callback or a message from another XObject
to reset the switch to the OFF position.

Combination Switches:

Combination switches are multi-way switches which change to an ON state
when they are set to a certain combination. These switches can be used
for combination locks, or even counters, as I will demonstrate. Their
behavior is controlled through 3 data fields:

data1 Current value ( 0 <= x < N-1 )
data2 Key value
data3 Number of values (N)

The switch can have a value from 0 to N-1, where N is specified in the
data3 field. If data3 = 5, for example, the switch can have a value
from 0 to 4, for a total of different values, or positions. Each value
is represented by a different tile. You specify the base tile, which
is the picture it will have when value = 0. For example, if you pick
tile 2300 for the switch, and data3 = 5, the switch will cycle through
tiles 2300-2304.

The current value for the switch is specified in the data1 field.
Normally value is manipulated by the program, but you can set the
initial value so when the map starts a switch will be in a particular
position.

If you enable a trigger for a combination switch, such as the Push
trigger, whenever the trigger occurs the value (data1) for the switch
will increment, wrapping around if it reaches N (data3). In this way
you can cycle continuously through all the different combinations for a
particular switch.

You can also control a combination switch with messages. By sending an
ON command to a combination switch, it will cycle UP. By sending an
OFF command to a combination switch, it will cycle DOWN. In this
manner, you can create a counter. The switch will have a value equal
to the number of ON messages it has received, minus the number of OFF
messages, assuming it starts out with a value of 0 and you don't have
any physical triggers enabled.

The real power of combination switches comes from the ability to set a
key value in the data2 field. The switch will changes its state
depending on whether data1 = data2. In other words, data2 is the
"combination" of the lock. If data2 = 3, whenever the switch cycles to
3, its state will change to ON, and whenever it cycles away from 3, its
state will go to OFF.

With this knowledge, you can create a combination lock consisting of
multiple switches like the example in the hallway of FXTEST.MAP. This
combination lock actually consists of 4 combination switches: 3 used as
tumblers, and one used as a counter. The tumblers as set up pretty
much as you would expect. For each, data3 specifies the number of
tiles to cycle through, and data2 specifies the key value for each.
Each tumbler sends State to the counter. Unlike the tumblers, the
counter does not have any physical triggers set, so it is only cycled
by messages it receives from the tumblers. Since each tumbler sends a
State command to the counter, it effectively "counts" how many of the
tumblers are in the correct position to open the door.

Since the door should open only when all three tumblers are in the
correct position, the counter switch has data2 = 3. Thus, when it
reaches a value of 3, it will go to an ON state, and send a message to
the door to open. The data3 field for the counter is set to a
arbitrary high value to prevent the switch from cycling around to 0
before it reaches 3. I just checked the code, and it will work just as
well if data3 = 0. So, if you don't want a counter to "wrap around",
just store a value of 0 in data3. In the example, the counter is
visible so you can see how it works, but you should probably hide it in
the real game maps.

The multi-way door setup in the outside area of FXTEST.MAP is only
slightly more complicated than the combination lock. In this setup,
there are also 4 switches, but 3 of them are hidden by embedding them
in the wall next to each door. The combination switch in the center of
the pool is a Master switch, and the 3 hidden switches are slaves. The
master switch sends Link commands to the 3 slaves. The Master switch is
the only one which responds to physical triggers, in this case, a Push
trigger. Whenever the Master switch cycles to a new value, it sends a
Link command to all the slaves, and they all change to the same value.
The value of data2 is irrelevant for a Master switch, and the value of
data3 is irrelevent for a Slave.

Each slave switch has a key value (data2) set so that whenever the
Master (and all the slaves) cycles to a certain value, it will go ON
and send a message to the door it controls to open. In the example in
FXTEST.MAP, the slaves have key values of 1, 2, and 3, in clockwise
order starting with the west most slave.

There is no limit to the number of Slaves switches you can tie to a
Master. They simply all receive on the same channel the Master
transmits on. There is also no limit to the number of tumblers you can
use in creating a combination lock.


(Добавление)
Weapons

Ammo

Keys

Items

Dudes

Creatures can use their state to indicate whether they are alive or
dead. Thus, they can send commands when they are killed. It is also
possible for creatures to respond to command words to change their
state -- ergo, they can be killed and brought back to life by remote
control. Creatures can, of course, have many more states than can be
represented by a simple binary state variable. The state bit here can
be considered to mean active/inactive. For example, a creature could
start out life as an inactive statue, and become animated when the
player reaches a certain location. This has the potential for some
really neat stuff.

A creature with a non-zero value in the key field will drop a key of
the specified ID upon death.


Generators

Timer events are used to generate triggers at regular or semi-regular
intervals.

txID command is broadcast on txID channel at each interval, and
optionally going on or off depending on the sendWhen
parameter.

rxID used to turn the generator on or off.

state on = triggers every busyTime +/- data1 tenths of a second.
off = no triggers generated

command used for trigger generation, and normal messages

sendWhen used only for normal messages, ignored for trigger generation

busyTime trigger interval in tenths of a second.
If busyTime is zero then the object will activate only once
for each trigger on.

waitTime time before shutting off

data1 random interval, added or subtracted from data1.
data2 reserved for specific generator types (see kGenFireball)
data3 used internally as callback semaphore to prevent multiple callbacks

What all this means is that the kGenTrigger type, and future
generator types, support being turned on and off by other triggers
(like switches), or OFF by its own waitTime.

The specified command is sent on the specified txID at specified
(busyTime +|- data1) intervals while the kGenTrigger object's state is
ON, regardless of what the sendWhen parameter is set to.

The kGenTrigger will also send the specified command on the specified
txID when the state is turned ON or OFF, if one or both of the
sendWhen fields are set.

kGenFireball
data2 == 0 : no animation, shoots fireball immediately
data2 == 1 : gargoyle "green man" sequence triggers fireball
data2 == 2 : gargoyle "bat face" sequence triggers fireball

kGenSound
soundID == Sound ID

kGenWaterDrip & kGenBloodDrip
The falling object will automatically determine which splash
and sound to make based on the impacted surface type.

Q. What should these be used for?
A. Almost any event that you want to be triggered repeatedly and
regular intervals. In future versions, specific kGen??? types will be
added to generate blood drips, water drips, fireballs, etc. These
will work in much the same way as kGenTrigger except that they will
spawn a special sprite at each interval instead of sending a message.

Q. What should these NOT be used for?
A. DO NOT use the kGenTrigger object to simulate any continuous
motion. We will be adding a continuous motion feature to some of our
sector effects in the near future. If you use the kGenTrigger feature
to simulate this, you will only be hurting your map and wasting
precious time.

Tricks and traps

Tricks/Traps/Hazards

80 TNT barrels - large barrels of explosive material. Will blow
up after receiving a certain amount of damage. Blowing up is
considered a state change. You can also blow them up with
command messages.

81 Floor spike - sort of like a sharp stalagmite. Does damage
when touched. Damage once or continuous.

82 Falling rock trap - several rocks fall to the ground. Needs
to be triggered via command.

83 Gas emitting statue - when triggered, emits a cloud of
poisonous gas.


==============================================================================
XWALLS
==============================================================================

Panning

Types


==============================================================================
XSECTORS
==============================================================================

Shade effects

Wave forms
Period
Amplitude
Phase

Panning effects

pan floor
pan ceiling
velocity
angle


Water depth

Underwater

Types



==============================================================================
SYSTEM TRIGGERS
==============================================================================

Voice/Text overs

You can specify one of several messages to display during the game by
sending a message on system channel 3. To choose which message is
displayed, set the XObjects Command field to a user ID from 0 to 63.
Corresponding messages must be defined in the map definition (.DEF)
file for each map. Up to 64 messages may be declared in a .DEF file,
using the syntax defined below.

The idea is to provide the ability to present some sort of plot
element during game play. The message would be associated with a
sound effect which would be played on top of the rest of the
music/audio (like Katarn's voice in Dark Forces). This is NOT the way
to create a sound effect that is supposed to come from some location
in the map.

Perhaps we could create a a level definition file (INI file, perhaps)
that would allow level designers to specify the text of messages and
associated sound resource, rather that having a fixed set for the
game.

Using the data field has some problems, since it is needed for some
specific XObject types, such as combination switches.




==============================================================================
LEVEL DEFINITION FILES
==============================================================================

A level definition file is used for each level to store information that is not
easily editable with the map editor. The definition file is a plain text file
with a format similar to that of INI files. There is only one anonymous
section, and it consists of various keys.

Author=string

This is where you get to put your name.

Description=string

The long name of your map. Be creative.

Song=string

The name of the music (midi) file for the level. Do NON include
the extension.

Message?=string

Messages generated by voice over triggers. ? is a value 0 to 63.


(Добавление)
==============================================================================
Experimental
==============================================================================

This section describes new features of the XSystem that are being tested. The
implementation of these is subject to change, so while you are encouraged to
experiment, please do not rely heavily on them heavily.

Fog:

By adding the line "Fog=1" to your level definition file, you can cause
a level to use fog depth cueing instead of the normal light
diminishing. Having fog enabled will dramatically limit the number of
shade levels available. Fog is global for the level, so you will
probably want to consider using it only for an all outdoor level.


Linking:

Sector linking is now working. To link two sectors place an upper link
marker in one, and a lower link marker in the other. The upper link
goes in the sector where you move upward to end up in the other sector,
and the lower link goes in the sector where you can move downward to
enter the other sector. If this seems backward to people, I can change
it.

The markers are paired by specifying a unique value for the data1
field. This value is shown in 2D mode in the editor. There should be
exactly 2 markers for each value, an upper and a lower marker.

When linking two areas, you should either place them very far apart on
the map, or overlap them properly in the XY plane. This will allows 3D
sound effects to either be out of ear shot, or heard correctly,
respectively.


==============================================================================
Ideas
==============================================================================


Damage:

Sector damage:
Damage frequency (every n.nn seconds)
[ ] in sector
[ ] on floor
DAMAGE DESCRIPTOR

Damage descriptor
Damage period (every 1/10th seconds)
[ ] Damage on floor only
[ ] Damage only when ON

Damage Descriptor

Type:
Pummel Punch, pummel, impact or crush
Burn Burn from heat or fire
Bullet Bullets or other piercing projectile
Cut Cutting or cleaving from a blade or sharp edge
Stab Stabbing or impaling
Explode Explosion concussion
Gas Poison gas
Drown Lack of air underwater
Sonic
Psyche
Spirit
Magic

Amount:
# hit points


Sound effects

Each sound effect will have the following properties:

Sample length
Sample rate
Looping flag

Sound Kits

Since it would be difficult, if not cumbersome, to assign sounds for
each possible sound effect that an object might make, sound kits
provide a predefined collection of sounds for object state changes.

(0) -> 1
0 (->) 1 (loop)
0 -> (1)

(1) -> 0
1 (->) 0 (loop)
1 -> (0)

Respawning

permanent // 0=not permanent, 1=permanent (respawn ignored)
respawn // 0=never, 1=always, 2=optional never, 3=optional always
respawnTime // 0=instant, >0=time in tenths of a second,
launchMode // 0=all, 1=bloodbath, 2=ally, 3=ally&bloodbath,


Surface Kits

Surfaces are used to describe the way that materials react to damage,
object collisions, and interaction with the player.

Surfaces have the following properties:

Footfall sound
Impact sound
Impact effect

Predefined surface types are:

Stone
Wood
Dirt
Metal
Water
Lava
Air


Miscellaneous

a boat

mine cart

mausoleum - door opens, and a platform slides out with a body on it

moving platforms, such as one in ShadowWarrior

You walk by a window and hear the sound of rain coming from outside.
Occasionally, the sky flashes, and then you hear the sound of thunder
from far away.

Floor lightning: Connect a bunch of floor sprites together to create
a lightning-like effect. Imagine a guy pounding a staff on the ground,
and lightning radiates outward on the floor from his staff. When it
hits the player it does damage.


Elevators:

At each floor, there is a call switch for the elevator. Pressing the
switch will illuminate a light, which will stay lit until the elevator
arrives. Above or to one side of the elevator is a panel which
displays the current floor the elevator is on. When the elevator
arrives, a door splits open to allow access to the elevator interior.
Once inside the elevator, the player can press one of several floor
buttons.

Elevator is open on same level as player. Player enters. Player
presses action bar => elevator closes, moves to next floor. Player
presses action bar => elevator opens.


Rachel

She will appear, walk towards her target location (a marker sprite),
and then disappear. Any actions you wish her to perform should be
accomplished with the initial trigger.


Sound generator

Place one of these where you want to create a custom sound, e.g., a
creaky floor or mysterious laugh. When it gets triggered, it will
play the sound id specified in its data field. The sprite's waitTime,
if non-zero, specifies that the sound generator is self triggering,
and determines the average period between sounds in 1/10 seconds. The
interval will vary by +/- 50%.


Wall traps

Force field wall. Blocks all movement when energized (including
bullets).

Crushing wall - moves forward until it meets another wall, crushing
anything and anyone in between. Use two opposing walls to make a nice
sandwich.

Swinging pendulum trap. A large bladed pendulum swings out of a niche
in the wall.

Guillotine - huge blade drops from above.

For flexibility, the blade and projectile wall traps are not
self-triggered. You need something else to trigger them. This allows
you to adjust their timing to suit your needs. For example, you can
trigger the razor doors by placing a player-cross trigger (see below)
a short distant before the blade wall. Adjust the distance so that a
player walking at a normal pace gets sliced neatly in two!


Kinetic effects:

warp to marker sprite
warp to sector
stair case sectors
Sinusoidal floor heights
Sinusoidal walls
Collapsing stairs
[x] Drag objects

Container effects:

Teleport
Relocate
Sinking through floor
Linking

Upper linked sector
Lower linker sector

Upper linked water
Lower linked water

Linked sectors are combined vertically so that the ceiling of one is
the floor of another. This means it is possible for the player to move
between them, and to partially be in both.

Teleport when enter once to target location
Teleport when enter always to target location


Combination Switches:

* Counter switches cycled by messages from something other than a
combination switch. For example, you can keep track of the number of
times a Player enters a sector. On the 10th time -- Zap!

* Combination locks with more than one set on combinations. You could
do this by have a set of tumblers which are used as Masters, controlling
several sets of Slaves each with their own combinations. In this
manner, you could have a combination lock which causes one action when
one combination is entered, and another action for a different
combination.

* Combine tumblers with a momentary switch so the Player needs to enter
a combination and then press a switch to perform an action. The
momentary switch would send state when going ON and OFF just like the
tumblers, but would provide an extra value to the count.

* Lots of other cool stuff. These things are really powerful -- there's
an almost unlimited potential in using hidden switches that nobody's
using yet. If you have something you want to try, but can't figure out
how to do it, just tell me and I'll try to create an example for you. I
welcome any challenges!

==============================================================================
TROUBLESHOOTING
==============================================================================

WHY DON'T MY DOORS WORK?

Make sure the doors are receiving triggers. If they are triggered externally,
you need a matching txId->rxId pair. If they are triggered internally, check
your trigger flags. Make sure the sector is not decoupled.


WHY DO DOORS START IN THE WRONG POSITION?

Remember that you must draw your doors in the OPEN position, but set their
state to reflect how you want the door to first appear in the level.


WHY DOES A TEXTURE STRETCH ON A SLIDING DOOR?

You may have an extra wall tagged for movement. If not all your walls move,
then at least some of the wall textures will stretch. Try to make them hidden.


WHY DO DOORS 'POP' FROM OPEN TO CLOSED?

Make sure that busyTime is non-zero.


MOMENTARY SWITCHES DON'T RESET.

Momentary switches do not automatically reset, although you can cause any
XObject to reset to a rest state after a period of time by setting the
waitTime.

XSYSTEM Documentation.

Вот и вся документация. Всё, что раскопалось.

С уважением, Blackwinged from -<<NEPTUNE TOWERS>>- :)

(Отредактировано автором: 26 Октября, 2005 - 02:15:38)

Отредактировано администратором: Slava, 28 Октября, 2005 - 18:49:02


Powered by ExBB 1.9.1
Original Style v1.5a2 created by Daemon.XP