The following features was made by me (NoOne) and support of these started since BloodGDX 0.800 and NBLOOD 1.10. As author i'm not against to add same features in all other existing ports, include Blood EX and continue support of existing or by updating current and adding new features. 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 set custom ammo for weapon pick up using it's data1 field. The value should be greater than 0 and less max ammo of the weapon, otherwise default value will be used.
Now you can specify team in data2 of BloodBath player start marker which is actually used for all multiplayer modes. When playing Teams you probably want if team 1 players get spawned on team 1 base and team 2 on team 2 base, however in vanilla players in any mode spawning at random locations.
There should be 4 spawn positions for each team, otherwise default player spawn location will be used if not enough start positions for players. If no team specified in all spawn markers, the vanilla way to spawn player will be used.
It possible now to make spawned dude inherit some values of DudeSpawn (Type 18) such as TX id to being it able to send commands. This way you can control, for example, quantity of spawned enemies.
SFX Gen (Type 708) now can play sounds with custom pitch specified in data4. The value can be between 2000 and 65535. Normal value is ~35000. If value is zero or below minimum, the default pitch will be used.
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 hi-tag value is 1. As result they can stay forever in game and do not disappear after liveTime ends.
The values greater than 0 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 possible to make generated item inherit some values of the spawner such as TX ID to make it able to send commands after being picked up.
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. 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 modern object types you will need any PMAPEDIT version (latest recommended) with "Unlock hidden types" patch enabled. Named modern types in 2d mode list available since PMAPEDIT BETA10 release. You may also use Alt+T combination and enter lo-tag (type) manually. To download PMAPEDIT, please visit http://cruo.bloodgame.ru/pmapedit.
Custom dude (Type 254) allows to create enemy and customize it in many ways such as selecting weapon, seq animation base, sounds base and even movement speed using it's data fields. This type is perfectly fits for ground and underwater enemies with various distances and weapon types! It can fire vector (hitscan), missile projectiles as well as throw things such as proxy detonators or spray cans.
This leads to "scared" dude with no weapon. It will try escape target with low chance to melee attack it.
At the moment of writing this text, there is 21 vector, 17 missile and 15 thrown weapons available. More than enough to make enemies in your maps unique plus on that you can combine weapons by using Trigger Gen and DataChanger to change type of the weapon on the fly. ;)
Melee enemies receive a bit less damage and have less chance to hinder, so they have higher chance to come closer to target and attack it, while enemies on longer distance will act similar to tommy cultist AI, except it have less dispersion modifiers.
|1 - Shotgun Shell||Any||4|
|2 - Tommy Cultist bullet||Any||7|
|3 - Tommy Gun AP bullet||Any||20|
|4 - Shotgun shell AP||Any||6|
|5 - Tommy Gun regular bullet||Any||12|
|6 - Bat bite||Melee||4|
|7 - Bone Eel bite||Melee||12|
|8 - Gill Beast bite||Melee||9|
|9 - Beast claw slash||Melee||50|
|10 - Axe of zombie||Melee||18|
|11 - Cleaver of fat zombie||Melee||9|
|12 - Phantasm's scythe||Melee||20|
|13 - Gargoyle's slash||Melee||16|
|14 - Cerberus bite||Melee||19|
|15 - Hound bite||Melee||16|
|16 - Rat bite||Melee||4|
|17 - Spider bite||Melee||8|
|18 - [ Unknown ]||Melee||9|
|20 - Burning damage||Any||2|
|21 - Spirit damage||Any||25|
|22 - Melee attack of custom dude||Melee||37|
Monsters with thrown weapons on longer distance will act similar to Dynamite Cultist. Once target get closer, they will try to dodge or melee attack.
|400 - TNT Barrel||Don't ask|
|401 - Proximity Detonator||The same player can throw|
|402 - Remote Detonator||The same player can throw|
|415 - Kickable pail||Don't ask|
|418 - Dynamite Stick||The same cultists can throw|
|419 - Dynamite Bundle||The same cultists and player can throw|
|420 - Spray Can||The same player can throw.|
|421 - Bone||Used by flesh gargoyle.|
|427 - Axe zombie head||Don't ask|
|428 - Napalm ball||Used by alt fire for Napalm Launcher. The quantity depends on difficulty level.|
|429 - Fire Pod projectile||Similar to spray explosion, just less radius|
|430 - Green Pod projectile||The target can have bad day with those ;)|
|431 - Life leech||
Once dropped, start work like player's life leech. Enemy with this type of weapon can throw only one unit, but can re-throw it (causes remove of previous) in case if distance is too long or previous unit can't see the target.
When life leech is dropped, the enemy will try to stay in longer distance, behind the life leech actually, but once target is close, will try to melee attack. If life leech destroyed, the enemy will always attack the target with melee attack only.
If enemy is killed, the life leech will be destroyed too. Players can't pickup this weapon.
|433 - Proximity Detonator 2||This is an modern thing. Works same as 401, except it detects only players.|
|434 - Debris||Modern thing. Acts similar to 421 and does small damage. It have random gib picture when thrown. I just had idea to use it with some aggressive innocents maybe.|
|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)|
Monsters with flame missiles (304,308) is treated like melee ones, they also can't use it while underwater, so they will try to get closer to target as much as possible and attack it with melee vector (22).
Enemies with explosive missiles such as various fireballs will fire it on longer distance. Once target is in explosion radius, they will try melee attack.
If enemy have regular life leech missile (315) and life leech was thrown by enemy previously (see thrown weapons), the enemy will pickup that life leech before attack.
There is shotgun cultist animations used by default which can use custom palette number.
For using custom seq animations, you should prepare full set which contains various states of enemy. Currently, there is 17 states available and 3 is reserved in total. When map with custom dude is started, it checking for each seq file id starting from data2 and ending with data2 + 18. If no seq file for enemy state found, the game will inform you about it and will switch to using default animation.
You are free to not add seq files for states which is optional or reserved, but still must keep state offset correctly according their order. You should also know that same filename can use more than just one id. This means you can use same file for different enemy states.
If you want to custom dude transform in another one, go following steps:
After custom dude first incarnation is killed, it will be transformed in second dude you select. The following properties of the incarnation will be inherited by dude: type, all data fields, all dude flags, TX ID, command, goingOn, goingOff and busyTime. You are free to create as many incarnations as you want using next incarnation as custom dude again. Please note that if you want to trigger something after dude's final death, you should use TX ID of last incarnation as RX ID of destination object.
It's possible set up to 2 custom sounds for each state of enemy. The sound will selected randomly, but if file does not exist, the first existing sound which found will be used, so you don't have to add 2 sounds, but still must keep state offset correctly.
If no sounds for states which is marked as optional exist, predefined sounds will be played then.
This is global setting which work for any dude, click here to read more.
The greater value, the greater movement speed. Using greater values can be probably useful for melee units. Max speed is 146603 (twice faster than Beast movement speed).
Custom dude spawn (Type 24) - works similar to regular dude spawn, except it designed for type 254 only. It allows to define all properties which supported by custom dude plus some others.
It possible to make spawned dude inherit some other values such as RX or TX id to being it able to send commands. This way you can control, for example, quantity of spawned enemies.
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 and uses it as TX ID to send command on it.
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.
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.
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.
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) - 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.
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 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.
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.
SEQ Spawner (Type 27) - spawns and plays any existing SEQ animation from data1 field.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.