Modern features for Blood mappers
[Aug 18 2022]

This is off-line version! Please visit http://cruo.bloodgame.ru/xxsystem to stay updated!

The following features was made by NoOne and it's fully supported by NBlood and Raze source ports. The latest dev builds always available on https://lerppu.net/wannabethesis/nblood/latest/ (for NBlood) or https://devbuilds.drdteam.org/raze (for Raze).

I'm not against to add same features in all other existing ports and maintain it. If authors is interested, they can just mail me to baitd@yandex.ru or search for me in Discord channel dedicated to Blood so we can discuss it. Coders may also visit modern features on GitHub.

Hope this helps to make maps better than ever and generally 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 instance, my "perfect" english in this documentation.

IMPORTANT! HOW TO ACTIVATE THE MODERN FEATURES

There is two ways to let the port(s) know that you are aiming for modern level design:

  1. Put an magic sprite in the map.

    1. Put an sprite.
    2. Press [ALT] + [F6] on it in 2d mode to edit it's properties.
    3. Set RX ID and TX ID to 60.
    4. Set Cmd to 100: 36.
  2. Enable save map file with new version in the editor.

    If you are using XMAPEDIT, you must open XMAPEDIT.INI, which usually can be found in XMAPEDIT directory, search for [General] section and change "SaveAsModernMap" value to 1. If you stick with PMAPEDIT, you must apply a patch that makes the edtor save the map with version 7.1. Note that using it is not recommended since is not supported anymore.

Changelog

  1. Aug 18 2022

  2. Mar 25 2022

  3. Aug 03 2021

  4. May 09 2020

  5. Jan 14 2020

    • Support of BloodGDX port is discontinued.
    • New modern type Player Control was added! It designed to change many various player properties right in the game. It can do:
      • Change movement speed and jump height.
      • Set player's look and rotate angles.
      • Play QAV animations instead of weapon or in fullscreen.
      • Play screen effects (delirium, pain, darkening and so on).
      • Copy properties of it's sprite to player sprite, so it's possible to use player RX channels.
      • Operate with inventory: give or erase weapons, items, keys and so on.
    • Player RX channels was added.
    • Update for Properties changer type.
    • Update for Effect Gen type.
    • Update for Resizer type.
    • Update for Damager type.
    • Update for Custom Dude Spawn type.
    • There is some cool features has been added for Custom dude
      • Dynamic dispersion.
      • Dynamic damage resistance.
      • Dynamic attack distance.
      • Much better behavior when attacking the target.
  6. Sep 09 2019

    • There was added physics control for PropertiesChanger type!
    • New features has been added for Path Marker type.
    • 1-way switch type now working for walls.
    • Teleport Target type can now be triggered!
    • New features has been added for Ecto Skull Gen (aka Missile Gen) type.
    • New features has been added for Data changer type.
    • New features has been added for Picture changer type.
    • New features has been added for Damager type.
    • New features has been added for SFX Gen.
    • New features has been added for RandomTX type.
    • New modern type Inc-Dec has been added.
    • New features for SEQ Spawner type.
    • New features for Effect Gen type.
    • Update and new features for Sector wind generator type.
    • New features for SequentialTX type.
    • Custom dude
      • Can have different mass: the bigger sprite and clipdist, the greater mass.
      • Can use custom clipdist (mass multiplier).
      • Can damage target by stomp if heavy enough.
      • Recoil chance now counts by taking in account weapon type and mass. The greater mass, the less chance to recoil dude. If is melee, the chance is even less than usual.
      • Burning state is now optional.
      • Electrocution state is now optional.
      • Underwater states is now optional.
      • Duck states is now optional.
      • Can be Kamikaze.
      • Can summon other enemies.
    • Updates for random item generators.
    • Proximity trigger flag has been updated.
    • Touch trigger flag has been updated.
    • Sight trigger flag is now working.
    • New features for PropertiesChanger type.
    • Item Shrink Shroom is now working.
    • Item Grow Shroom is now working.
    • New features for weapon, ammo and health pickups, also check this one.
    • General update for most of modern types. It now supports to send any command to destination object. Command 5: Link = just perform operations and don't change state or trigger destination object, while other commands will trigger object after generator operations was performed.
    • A lot of minor changes and fixes.
  7. May 05 2019

    • I'm happy to announce that NBLOOD port officially support all of the features! I will now add new features to both GDX and NBLOOD and continue their support.
    • Changes for SequentialTX type
  8. Mar 07 2019

  9. Feb 03 2019

    • Initial release of this document.

Modern features

Aug 18 2022

  1. Event Causer TX Channel (TX ID 50)

    Every action in the game can be treated as an event. For example when you pressing a switch, enter sector, touching walls or even destroying gib objects, the game produces an event, which may send command on given TX ID. Sometimes we may need to send command on object if it does not have an RX ID assigned or it's ID is unknown. For that a special TX ID 50 is created.

    event causer

    In this example the Damager have TX 50 (event causer channel) which leads to interesting result: it does the damage (sends the command) to any sprite in proximity radius even if the destination sprite RX ID is unknown. This allows to create a complex and very flexible trigger sequences, especially in conjunction with conditional triggers (IF).

    There is some limitations, however: objects that using TX 50 must send the command immediately - using waitTime is not safe, because the command may be send to the wrong object.

  2. Move outside sprites with movable sector

    It's possible to make sprites that were attached to outside walls of movable sector to travel with that sector automatically. This means that there is no need to create a second sector which duplicates properties of the first one anymore.

    sprites near z-motion sector

    In this example the sprites placed outside the Z-motion sector, but still close enough to it's walls. Once that sector activates and ceiling moves, the sprites will travel in tact.

    For obvious reason this feature intended for all sectors that is supposed to move, but not for marked sector types. For example it works for "Rotate" type, but not for "Rotate Marked", works for "Slide" and "Z-motion", but doesn't for "Slide marked" and "Z-motion SPRITE".

    To make this feature work, you need to place sprites close to the walls of sector you want to travel sprites with. Each sector can move up to 256 sprites. The distance between walls and the sprite cannot be longer than 16. Also, to avoid conflicts, sector which contains the sprites cannot be movable and always must be next to the walls of the target sector.

    After that you need setup sprites just like you do it for common traveling e.g. blue sprites travels in sector direction and green sprites in opposite. For Z-Motion blue sprites means that it travels with floor and green means that it travels with ceiling.

  3. Command 16: Kill Events (full)

    This command allows to immediately kill all the events in the queue for destination object. For example it can interrupt fuse counter for dropped TNT bundle. Use it only when really sure as it may lead to unexpected results if not enough controlled.

Aug 03 2021

  1. Dude flags and patrolling

    .MAP It's possible to make patrol location by any enemy that can move with using Path Marker (type 15) and dude flags. Basically, this means that AI will follow from one marker to another and go back when is not found. The next marker can be referenced to any of previous markers and can be inserted in underwater sectors, so you can make loops and do many other interesting things which makes your maps more alive.

    You must first actually create at least one marker; just put sprite and set type 15. The first marker enemy selects is always the closest marker it can see and it must have no "Locked" or "DudeLockout" flags enabled. There is two ways to make enemy to follow it:

    • The first one and the easiest way is to just set dude flag "P" (aka "Reserved" in vanilla MAPEDIT) in the enemy sprite properties. This means that dude will follow markers once level started.
    • The second one allows to start (or stop) patrol by sending command "Set Dude Flags" to the destination enemy sprite from any source sprite by RX/TX system. Enemy that receive this command will inherit states of all dude flags.

    What if you want the enemy to follow another marker after first one is reached? Just create second marker same way you did it for the first, but set data1 (id of the marker) value, then get back to the first marker and set data2 (id of the next marker) according to data1 of the second one. This is very same way you setup path for sectors. If you create two or more markers with same ID, the AI will select next marker randomly, which could make path a bit unpredictable for the player.

    image Linear patrolling

    image Marker branches

    Path marker that gets reached (see clipdist) by the enemy will be automatically triggered if have TX ID or Command 15 (Set Dude Flags). If it have no TX ID, but still have "Set Dude Flags" command, all dude flags that marker have will be inherited by the enemy that just reached it. This allows you to change dude flags dynamically, but may also lead to unexpected results such as breaking the patrol when is not supposed to be stopped, so you have to be carefully.

    Sometimes it may be useful make enemy to stay for some period of time before it goes to the next marker. There is two ways to make it possible: by enterring fixed value in the waitTime field of the marker after which it starts the move again (similar to path sector) or set same values in both data1 (marker id) and data2 (next marker id) which makes the enemy stay until target is spotted. The second way is very useful to build dynamic path using Data Changer or Inc-Dec since you can change data values.

    If you want to break the patrol once marker gets reached, you may set value of the data2 (next marker) to -1 or set it to -2 if you want enemy to go back same path.

    ADDITIONAL OPTIONS:

    • clipDist = defines the radius at which the marker treats as reached for the enemy.
    • goingOn = trigger marker when enemy reached it.
    • goingOff = trigger marker when enemy leaves it.
    • 1-shot = enemy can visit this marker only once.
    • busyTime = enemy velocity.
    • hi-tag = flags:
      • 1: enable enemy crouching.
      • 2: disable enemy crouching.
      • 3: toggle enemy crouching.
      • 4: do not turn to the marker's angle at all.
      • 8: do not turn 180deg relative to marker's angle when coming back.
      • 16: enables turning in random direction with random delay while waiting.

    Let's back to the dude flags.
    The rest of it ((D)eaf, (B)lind, (A)larm, (S)tealth) currently are working only when patrol flag is active and brings additional effects to the enemy:

    Deaf The enemy is deaf, so the player can be spotted with a sight or touch only.
    Blind The enemy is blind, so the player can be spotted with a hear or touch only. This flag also known as dudeGuard in vanilla mapedit.
    Alarm The enemy will activate all other enemies in sight radius once player is spotted. If there is other enemies in patrol and have Alarm flag checked, it will activate enemies that they see too. This flag also known as dudeAmbush in vanilla mapedit.
    Stealth A special flag that brings some kind of stealth mechanics. This allows the player to sneak around while enemies patrol the location without being spotted immediately. In case if enemy is not Blind nor Deaf, there is spot progress bar will appear on the top of enemy sprite. Player's velocity, race, some sounds, as well as crouching affects spot radius and speed of spot progress.

    See also IF conditions related to dude flags and Stealth region markers that allows to modify spot chance of the enemy.

  2. Pause or continue sector motion

    You can pause or continue motion of any sector by sending command 13 (pause) or 14 (continue) from any source to the destination sector. The sector that in pause, will continue it's movement with exactly same position and velocity that have before it stopped once gets Continue command. If sector have "Interruptable" flag enabled, you may also send commands such as On, Off, Toggle to force it go the opposite way.

  3. Enable or disable Damage Sectors

    Damage Sector will do the damage only when is enabled (State: 1 On). This allows you to control it via TX/RX system and commands.

Jan 14 2020

  1. .MAP Sometimes it may be useful to send command on player's sprite. For instance, you could make Effect Generator to spawn any of effects directly on player's location. This way you could achieve bleeding, if you select "Red blood Trail" effect. For that special Player RX Channels was created.

    • TX ID: 30 - Player 1
    • TX ID: 31 - Player 2
    • TX ID: 32 - Player 3
    • TX ID: 33 - Player 4
    • TX ID: 34 - Player 5
    • TX ID: 35 - Player 6
    • TX ID: 36 - Player 7
    • TX ID: 37 - Player 8
    • TX ID: 38 - All players

    Player channels supported by all types, include vanilla ones. So, you probably want to experiment with those a lot to get interesting results.

Sep 09 2019

  1. .MAP Teleport target (Type 8) can be triggered via RX ID channel and teleport any TX ID sprite or player from any to it's sprite location! It may be useful to teleport path markers to change path sector's way or player without need to enter the sector. It can also teleport other teleport targets, so it's possible to create complex combinations! There is also few options to control how exactly sprite should be teleported available:

    • data1 = number of player to teleport (if TX ID is not specified)
      • 0: [ player that caused the event ]
      • 1: player #1
      • 2: player #2
      • 3: player #3
      • 4: player #4
      • 5: player #5
      • 6: player #6
      • 7: player #7
      • 8: player #8
    • data2 = set destination object angle according to teleport target angle
      • 0: destination object stay with same angle after teleportation
      • 1: destination object take angle of teleport target after teleportation
    • data3 = destination object velocity control
      • 0: does nothing
      • value 1: set velocity to zero (blood-like)
      • flag  2: change X and Y velocity according to source sprite angle (quake-like)
      • flag  4: set Z velocity to zero
    • data4 = sound id to play
      • 0: do not play any sound
    • hi-tag = enable telefrag
      • 0: do not enable (default)
      • 1: enable
  2. .MAP There is few cool updates for trigger flags available. Previously, "DudeLockout" has no effect when used in conjunction with "Proximity" or "Touch" flags, but now it does. If sprite is not a dude, you can define proximity radius through sprite's clipdist property. Aside from this, "Touch" flag is working for almost every type of sprite and for walls. The name explains itself: sprite or wall with this flag checked triggers something when player or enemy (in case if no DudeLockout checked) touching it.

    "Sight" flag was renamed to "Sees Player". Sprite with this flag checked, will be triggered once it can see one of players from it's location.

    "Screen" flag means that sprite will trigger when it drawn on the screen of one of players and "Aim" triggers sprite when one of players aims in it.

    If sprite have "Impact" flag enabled, this means that it will be triggered once get hit with projectile, affected by explosion or touch another object (like wall, sprite or sector). Note that not all projectiles can make sprite to trigger.

    There is 512 of additional sprites with these flags available for you to use. If you want Toggle Switch to send command when player fire a flare in it, or Blood Drip Gen spawn drips only when player can see or at close distance, these flags will help you a lot and save much of time.

    If you plan to use any of additional sprites, you probably want to set it properly, because sprites from this arrays triggers a little bit different and more safely than in vanilla.

    • Example 1: [x]going on, [x]going off, waitTime = 0 - will send cmd only once, because waiTime is zero.

    • Example 2: [x]going on, [x]going off, waitTime = N - will send cmd always, with period specifid in waitTime.

    • Example 3: [x]going on, []going off, waitTime = N - will send cmd when going to Off state, skip sending when coming from Off, with period specifid in waitTime.

    • Example 4: []going on, [x]going off, waitTime = N - will skip sending cmd when going to On state, send cmd when coming from Off, with period specifid in waitTime.

    Make sure the restState is equals to state of the sprite, however in case of thing types (400 - 432), there is required to set restState to On in the level editor. If you want to ignore these rules, just set "Interruptable" trigger flag.

  3. .MAP Grow (Type 129) and Shrink (Type 130) shroom items is working! When player is grown, it receives less damage, jumps higher and become heavier, which means it can easily damage by stomp and push back enemies that have less mass than player. Be carefully when pickup this powerup as you may lose your invisibility or can even die if place is too tight to grow ;)

    When player is shrink, the enemies can do same thing to player as it becomes very small and receives way more damage than it usually does. However, player can go to really tight place.

  4. .MAP You can set custom value for the following types of items using it's data1 field:

    • Health (life essence, red potion etc.)
    • Weapons (sawed-off, tesla gun etc.)
    • Ammo(box of shotgun shells, casoline can etc.)

    The value should be greater than 0. If value is greater than max value of the pickup, max value will be used.

    • Example #1: data1: 1 - will give 1 ammo for sawed-off instead of 8.

    • Example #2: data1: 0 - will give 8 ammo for sawed-off.

    • Example #3: data1: 200 - will give 100 ammo for sawed-off.

  5. .MAP You can specify number of INI message that will be displayed instead of "Picked Up ..." message when item was actually picked up. Just specify it in Lock msg field.

Mar 07 2019

Feb 03 2019

MODERN OBJECTS

Aug 18 2022

Jun 20 2021

May 09 2020

Jan 14 2020

Sep 09 2019

Mar 02 2019

Feb 03 2019