The following features was made by me (NoOne) and it's support started since BloodGDX 0.800. At the moment of writing this text none of features from this list compatible with other ports or DOS version of Blood. As author i'm not against to add same features in all existing ports include Blood EX and NBlood. If authors is interesting, they can just mail me to firstname.lastname@example.org or search for me in Discord channel dedicated to Blood.
I'm hope this help you to make your maps better than ever and turn map editing to the next level. Adding even more new features is planning as well. If you have any questions, problems, bug reports or suggestions, you may use contacts above to talk with me. The same you can do if you want to update, for example, my "perfect" english in this documentation.
You can now move any sector markers with slide and other movable sectors (include Z-motion). To create a movable marker, add hi-tag 1 (Alt + H) to marker sprite and don't forget to paint marker with blue or green in MAPEDIT using K key.
For example, this feature allows to change location of teleport target or path sector way dynamically, but this is just a simple examples and as always you limited only by your imagination.
Path Marker (Type 15) now supports "Link" command. This may be useful when you actually want to change way of Path Sector on the fly. If you want to do it, just create 2 different path markers and send "Link" command from one to another to change it's properties. TX path marker will inherit all data field values, waitTime and busyTime of RX one.
The value above max will selects default explosion.
The liveTime of sprite statnum 2 (explosions) is no longer count down if their data4 value is 1. As result they can stay forever in game and do not disappear after liveTime ends.
The values greater than 1 used for custom explosion radius. Normal radius value is ~2000, the greater may work not in way you expect, so you have to experiment there.
Flesh Statue (Type 208) and Stone Statue (Type 209) can now play gargoyle statue breaking animation from Blood Alpha before spawning gargoyle if their data1 value is set to 1. It probably won't look as good as you may expect, but hey... it's alpha stuff :>. You should at least try it.
It's possible now to set "global" (player's screen) palette of underwater by setting data2 of Upper Water (Type 9) or Upper Goo (Type 13) to one of following values:
Custom palettes support is planned.
Upper water, link, goo and lower water, link, goo stacks now supports "Link" command and can swap their data values. This way you can make sector water or non-underwater, change it's floor or ceiling picture. Just create 2 different stacks and send "Link" command from one to another to swap their properties. After this data1, data2 fields and type of stack will be swapped.
Random Ammo (Type 80) and RANDOM (Type 40) are now working in single player and multiplayer modes! These sprites takes values from data fields to select item that should be generated. To make it work in game, at least 2 data fields must be non-zero.
Since these sprites is actually creates new item sprite instead of transforming in it, they re-triggerable. This means you can send "Toggle" command on it and they will drop new item.
Also, items will be generated and dropped at level start automatically if sprite state is set to 1 (On). You should not care about different sprite names as both of them acts identically and can drop any existing item type (not just ammo or weapon).
It's now possible to spawn random dude with Dude Spawn (Type 18) sprite. Just like in examples shown above, at least 2 data fields must be non-zero.
Now you can put Pods (Types 221, 223) and Tentacles (222, 224) on ceilings. Just flipY it's sprites and enter 1 in hi-tag (Alt + H) field. This makes them not to fall back on floor when game starts.
Counter Sector (Type 619) can now work more than just 1 time. Once sector triggered, it will send commands and then become Locked. So, you need just unlock it by "Unlock" command. Once unlocked, the sector is ready to work (wait for N objects) again.
In some cases (let's say you need the same objects and their amount again) you may need first remove previous objects from sector. This can be done with sector panning (with "drag" function enabled) or via wind.
Now it also supports "Link" command as well. This allows to change type of object and how many objects sector is waiting for. Just create 2 different counter sectors and send "Link" command from one to another to change it's properties. Make sure sector is not locked.
New "End Level" TX ID: 6 channel added. It designed rather for episodes than just maps as it allows to set custom number of next map in episode via numbered command. Let's say you want to jump directly from E1M1 to E1M3. Then send command field to Cmd 66: 2. You can place sprites with this channel on your maps as many as you want. Say "Hello!" to non-linearity.
Counting is always absolute. This means first level is 0, second one is 1 and so on. It does not matter what level is now; you should count always from first level i.e from 0.
Now it's possible to set custom start HP for monsters by enterring value in data4 field. The value can be between 1 and 65 535!
For using new GDX Types you will need any PMAPEDIT version (latest recommended) with "Unlock hidden types" patch enabled. At the moment of writing this text, adding names for gdx types in 2d mode list is planned. Until it's done, you may use Alt+T combination and enter lo-tag (type) manually. To download PMAPEDIT, please visit http://cruo.bloodgame.ru/pmapedit.
RandomTX(Type 25) - takes value from random data field of the sprite and uses it as TX ID, then sends command on it. This type allows to not just generate random item or spawn dude, but also create 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.
This will send command to random TX ID in range of 100 and 120.
SequentialTX(Type 26) - sequentially takes value from data fields starting from data1 or first non-empty data field +1 and uses it as TX ID to send command on it.
The first trigger will send command to TX ID 101, the second trigger will send command to TX ID 102, the third trigger will send command to TX ID 103, and fourth trigger will send command to TX ID 100.
After last data field will be used, it will start from data2 again. Command "On" selects next data field, and command "Off" selects previous. Note that empty data fields is ignored.
Actually, same result can be achieved by using Combination Switches, but i created this type to just simplify process and leave combination switches for some other, more serious stuff. Also note: this type now supports ranged TX IDs (see in examples above).
DataChanger (Type 35) - a very powerful type that allows change data fields of any sprite, sector or wall on the fly. For example, it allows change required object for Counter Sector or enemy type that will spawned by Dude Spawn or even Combination Switch settings!
Sector Lighting changer (Type 34) - can change sector lighting effects on the fly. You may also change amplitude, frequency and phase with this.
Negative values = less shade, while positive = more shade. -1 is reserved.
Damager (Type 36) - damages sprite (enemies, things etc.) if it can be damaged with given damage and damage type. The damage amount can be big enough to also kill the sprite.
The value greater than 6 will cause random damage.
Enemy Target Changer (Type 33) - most advanced and flexible type. It allows to change target for enemies and force them fight each other, act like team to fight only specified targets (or everyone), ignore player 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 5. Once target changer is Off, every enemy affect by it, will return back to normal and will try to kill you.
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.
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 example, 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.
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 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.
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 example, Zombies, Gillbeasts or Beasts can't.
At the moment of writing this text there was performance problems with really big groups of controlled AI (more than 50 monsters in the same time and small intervals (less than 10) of dude spawning) was noted. I plan to rewrite algorithm, so it's up to you to decide use it with big groups of monsters or not. The options will remain the same, so you should not be afraid about future compatibility.
SEQ Spawner (Type 27) - spawns and plays any existing SEQ animation from data1 field. You may also select callback function. Since it's a generator, you can make it play animation in a loop by setting it's busyTime.
Sector Wind Generator (Type 39) - creates wind effect on TX ID sector. 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.
Panning velocity and angle in sector settings should be greater than 0.
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 palette, shade, xrepeat and yrepeat of the generator.
You can see all FX effect in my upcoming test map. If you want to add text list here, go ahead.
PropertiesChanger (Type 28) - can change various properties for sectors, walls or sprites on the fly. For example, changing cstat of sector you can make it parallaxed or non-parallaxed, or if you change cstat of sprite, you can make it face, wall or floor oriented, visible or invisible etc.
Marked as underwater sector will work correctly only before player reaches it using common way (trough stacks).
The value can be between 0 and 255. The greater value, the less sector visibility.
True value is 512 actually, but "double translucency" must be added to activate this type of translucency.
True value is 512 actually, but "double translucency" must be added to activate this type of translucency.
It's possible to actually mix cstat or hi-tag values to get various results. For example, 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 SpriteMovement value (1) and SpriteGravity 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.
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.
The value below 4 for both X and Y will make sprite invisible.
Don't fear to experiment - it won't make your maps worse.