If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Blood: Fresh Supply

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

Blood: Fresh Supply

Also known as: Blood EX
Based on: Blood
Developers: Monolith Productions, Night Dive Studios
Publisher: Atari, SA
Platform: Windows
Released internationally: May 9, 2019


AreasIcon.png This game has unused areas.
CodeIcon.png This game has unused code.
DevTextIcon.png This game has hidden development-related text.
GraphicsIcon.png This game has unused graphics.
Carts.png This game has revisional differences.


PrereleaseIcon.png This game has a prerelease article
BugsIcon.png This game has a bugs page

Hmmm...
To do:
  • Mention Samuel "Kaiser" Villarreal's work on his Blood EX project in a prerelease article.
  • All of the bugs seen at launch need to be documented.
  • Have a look in the game's scripting for anything else unused.

Blood: Fresh Supply is the 2019 remastered edition of Blood, being released after issues over IP and publishing rights were resolved. It features both the Cryptic Passage and Plasma Pak expansions, achievements, and a ton of improvements.

Unfortunately, it also launched with a lot of bugs and other technical shortcomings thanks to being a recreation rather than being developed with the original source code on hand. However, Night Dive were quick to release patches fixing most of the issues and the game is in a much more acceptable state nowadays.

On December 4th, 2025, the game would be delisted in favor of the new, more accurate Blood: Refreshed Supply. Those that had owned Fresh Supply could get a discount prior to Refreshed Supply's release though this has since ended.

Much of the original's unused content still does not live... again, unless it has been upgraded to fully functioning form.

Sub-Pages

Read about prerelease information and/or media for this game.
Prerelease Info
Read about notable bugs and errors in this game.
Bugs

Changes and Differences from the DOS Original

Hmmm...
To do:
More.

Fresh Supply has made some changes to the DOS original, mostly quality of life improvements.

  • The game makes use of AngelScript for modern scripting.
  • The game uses a more widescreen friendly HUD. The Beast statues featured on the HUD have arms added to their sprites.
  • The game uses fan-made voxels from the Blood Voxel Pack by fgsfds for certain items that lacked them like props and items.
  • The remaster has some new cheat codes added.
    • NIGHTDIVE - Displays message Hey Larry? Am I going to get in trouble for adding this??, refers to Larry Kuperman, director of business development at Nightdive.
    • OAKISLAND - Added in the v1.9.5 patch, shows entity markers on the automap. Prints Map markers placed!/removed!. Can be toggled to disable effect.
    • TIMEGATE - Continuously bleed over the environment and slowly lose health over time, displays message Ahhh....fun times.... Can be toggled to disable effect. Likely a reference to lead Kex dev Samuel "Kaiser" Villarreal's previous employment at TimeGate Studios.

Most of the new content can be found in BloodEX.kpf.

Unused Voxels

A few unused voxels managed to sneak their way into the remaster.

Hmmm...
To do:
The wide coils seen in some levels like E4M1 and E6M9 have unused voxels, the original tiles are used by the game instead. Could be more besides this.

Unused Items

A few of the unused items have received voxels but since they are unused, these go unused too. These voxels would get used in an official compacity with the inclusion of Death Wish to Refreshed Supply.

0837_FIRESUIT.KVX depicts the Asbestos Suit.

2558_KEY7.KVX depicts Key7.

0783_FEATHER.KVX depicts the Feather Fall.

0517_HEALTHBOTTLE.KVX depicts the Red Potion.

Unused Life Seed

Present is 2433_SEED.KVX, an unused voxel for the frame of the Life Seed's "eye" being closed. It looks much rougher compared to the used 2433_SEED_A_0.KVX, with a noticeably red strip under the bottom. It also doesn't seem to be positioned correctly, as viewing it in a voxel viewer program has it orientated on its side.

This is also present in Refreshed Supply.

Unused Used
BloodFS-2433 SEED 0.png BloodFS-2433 SEED A 0.png
BloodFS-2433 SEED 1.png BloodFS-2433 SEED A 1.png
BloodFS-2433 SEED 2.png BloodFS-2433 SEED A 2.png
BloodFS-2433 SEED 3.png BloodFS-2433 SEED A 3.png

Unused Scripting

Found in ai_common.txt is commentated out scripting for the Gargoyles Statues to play their unused coming to life and a comment noted that they don't in the original DOS version.

        //pAI.Owner().PlaySEQ(SEQ_GARG1TR); // they don't play the animation in DOS
        //pAI.Owner().PlaySEQ(SEQ_GARG2TR); // they don't play the animation in DOS

Found in ai_gillbeast.txt is some commented-out scripting.

        // sprite_zvel[v28] = 8 * (v30 - v31);
        //
        // sub     eax, edx
        // shl     eax, 3
        // mov     [esp+38h+var_24], eax
        // mov     eax, [esp+38h+var_24]
        // mov     sprite_zvel[edx], eax
        //
        // 8 * (targZ - selfZ)
        // (8 * 128) / 65536.0f = 0.015625f
        // 1.0f / 0.015625f = 64.0f

commented out script in ai_eel.txt.

        // mov     ecx, 22222h

Found in weapon_napalm.txt.

                    // (&loc_66665 + ((&unk_177777 << 15) >> 16) + 1)

Unused Actor Code

The POWERUP_DeliriumShroom actor for the unused Delirium Shroom item defined in powerups.txt has a commented-out line.

    //pickup.powerup.type             PU_SHROOM_DELIRIUM

Developer Comments

The remaster's scripting contains a few interesting comments. Note that all comments have been written as is.

Main Scripts

Found in LifeleechStaff.txt.

        // fuck... where's the damn player object...
            // lets hope this is it

Found in sharedCallbask.txt.

        // FIXME: I am just making guesses at this point...
        // Need to verify if the beast plays this seq when killed by fire.
        // Also seems to invoke the dude to gib seq callback but not when
        // its playing its normal death seq? I dunno.

Found in utils.txt.

    // trying to reverse engineer these functions to use Kex's floating point unit keeps
    // breaking my brain for some reason, so just work off in BUILD's units to make things
    // easier for me

Weapon Scrips

Scripts found in the weapons sub-folder in the scripts.

Found in weapon_tesla.txt.

        // TODO: this pre-fire animation is skipped in the original..
        // was it intentional?

A silly comment presumably at the expense of hardcore purists.

        // NO! says the community, it ruins my expirence!!! REEEEEEEEEEEE

Found in weapon_voodo.txt

        // FIXME: crap... how do I save arrays with this?!

A comment that can also be found in ai_autoaim.txt.

        // I'll be working off completely in BUILD's world units for sanity purposes...
                // note: division was not part of the original. I did that so this attack would
                // be at least a bit more effective

AI Scripts

Scripts found in the ai sub-folder in the scripts.

Found in ai_autoaim.txt.

                                // This is a bug...
                                // apparently the direction will be pointing downward if the target is above the AI.
                                // this seems to be correct as its occuring in the original game so I'll be leaving it
                                // as is for authentic purposes

Foind in burningDudes.txt.

    // added for BloodEX: stay burning
    // also added for BloodEX: immediately switch back to original self if in water

Found in ai_common.txt.

    // TODO: condense all of this into definitions
        // okay.. how is this NOT weird?

Found in ai_cultist.txt is a large fix me note about the Fanatics. In the Refreshed Supply version of this comment, the first senetice has been chaned to In the DOS version,

                    //
                    // FIXME: More bizarre bullshit inbound: Tommy Gun Cultists do a pause right before firing if you're not
                    // completely within their 28 degree FOV while continuing to invoke the move-turn callback. I've search
                    // the assembly up and down and found no evidence of this behavior anywhere. For now, I will make a
                    // guess and throw in custom logic to replicate this behavior
                    //

Found in ai_eel.txt.

        // I like this better; make the eel adjust its z origin to the target's eye level
        // instead of its top/bottom sprite level

Found in ai_gillbeast.txt.

    // 3 vectors all along the same direction? weird

Found in ai_tchernobog.txt.

    // one missile autoaims while the other doesn't? The other has a inverted z slope??
    // I don't know what they were trying to go for here...

Actor Script Documentation

Found in e1m5.txt in defs/levelHacks is an explanation detailing the "xsectorid" used in this script.

/*
    I got a little sloppy here because I wanted this quickly done and over with, but here's a reference on what this means:
    
    xsectorid <A> <B> <C> <D>
    
    where
    A: id of xsector to modify
    B: offset in bytes of where to modify the xsector structure
    C: number of bits to modify
    D: value to be written to the xsector data
    
    xsector structure in BloodEX looks like this:
    
    bool                    bDrag;
    bool                    bUnderwater;

    uint16_t                triggerFlags;
    uint16_t                phaseFlags;
    uint16_t                panFlags;
    uint16_t                motionFlags;

    uint8_t                 depth;
    int                     shade;

    bool                    bColoredLighting;
    bool                    bCrush;
    bool                    bAlwaysWindy;
    bool                    bStoppedOn;
    bool                    bStoppedOff;

    int16_t                 marker1;
    int16_t                 marker2;
    int32_t                 onCeilingZ;
    int32_t                 onFloorZ;
    int32_t                 offCeilingZ;
    int32_t                 offFloorZ;

    struct offToOn_s
    {
        bool                bSendOn;
        bool                bWaitTime;
        int16_t             busyTime;
        int16_t             waitTime;
        busyWaveType_e      waveType;
    };

    offToOn_s               offToOn;

    struct onToOff_s
    {
        bool                bSendOff;
        bool                bWaitTime;
        int16_t             busyTime;
        int16_t             waitTime;
        busyWaveType_e      waveType;
    };

    onToOff_s               onToOff;

    struct lighting_s
    {
        uint8_t             waveType;
        int8_t              amplitude;
        uint8_t             freq;
        uint8_t             phase;
        uint8_t             ceilPal;
        uint8_t             florPal;
    };

    lighting_s              lighting;

    struct motionFx_s
    {
        uint16_t            speed;
        uint16_t            angle;
        uint16_t            windVel;
        uint16_t            windAngle;
    };

    motionFx_s              motionFx;

    struct contMotion_s
    {
        uint16_t            zRange;
        uint16_t            theta;
        uint16_t            speed;
    };

    contMotion_s            contMotion;

    uint8_t                 damageType;
    uint32_t                xFloorPan;
    uint32_t                yFloorPan;
    int32_t                 xCeilPan;
    int32_t                 yCeilPan;
*/

Unused Levels

Present in the DOS/resources/mapperfiles/xbox/ folder of the Steam version is a rather large number of maps (186 to be precise), presumably user-made ones. They were added along with the DOS version. Fresh Supply can read them and make them appear in the user maps option but isn't able to load them. A full list of them is bellow.

  • abreed.map
  • abreedta.map
  • actuas.map
  • aitd.map
  • aitd2.map
  • aitd3.map
  • aitdjack.map
  • aladdin.map
  • alienc.map
  • alienr.map
  • alientri.map
  • alphasto.map
  • alqadim.map
  • amok.map
  • another.map
  • batmanac.map
  • batmanf.map
  • bigredr.map
  • blam.map
  • blood.map
  • bluesb.map
  • bluesbja.map
  • bstone.map
  • bstone2.map
  • bthorne.map
  • cadillac.map
  • cataco3d.map
  • catapoc.map
  • chxquest.map
  • cite.map
  • ckeen1.map
  • clifd.map
  • coolspot.map
  • covertac.map
  • crusnreg.map
  • crusnrem.map
  • cyberm.map
  • d.map
  • dderby.map
  • dderby2.map
  • ddragon.map
  • ddragon2.map
  • ddragon3.map
  • descent.map
  • descent2.map
  • disc.map
  • dnukem.map
  • dnukem2.map
  • doom.map
  • doom2.map
  • drally.map
  • dstrike.map
  • duke3d.map
  • ecstatic.map
  • ecstatic2.map
  • eradicat.map
  • ewj.map
  • ewj2.map
  • exhumed.map
  • extremea.map
  • fadetb.map
  • fatalr.map
  • fb.map
  • fifa.map
  • fifa96.map
  • Dfifa97.map
  • firestrm.map
  • funtrack.map
  • fxfightr.map
  • gb2.map
  • gods.map
  • goldnaxe.map
  • gta.map
  • gtalond.map
  • heretic.map
  • hexen.map
  • hioctane.map
  • horde.map
  • hulkpant.map
  • humans.map
  • jazz.map
  • jbazooka.map
  • jdredd.map
  • jimpower.map
  • joemac.map
  • jstrike.map
  • jungbook.map
  • jurassic.map
  • krusty.map
  • lba.map
  • lba2.map
  • lionking.map
  • lollypop.map
  • lostv.map
  • Dlostv2.map
  • magicp.map
  • mars3d.map
  • mdk.map
  • megarac2.map
  • megarace.map
  • menace.map
  • microcsm.map
  • mk1.map
  • mk2.map
  • mk3.map
  • mktril.map
  • mm.map
  • mm2.map
  • moktar.map
  • moon.map
  • nba97.map
  • nbajamte.map
  • nfsse.map
  • nhl97.map
  • novas.map
  • oddworld.map
  • omf2097.map
  • panzakb.map
  • petesamp.map
  • pitfghtr.map
  • pop.map
  • pop2.map
  • prayfd.map
  • preh.map
  • preh2.map
  • primrage.map
  • pushover.map
  • quake.map
  • raiden.map
  • rallyc.map
  • raptor.map
  • rayman.map
  • redneck.map
  • redneck2.map
  • reloaded.map
  • rg97.map
  • rise.map
  • rise2.map
  • rott.map
  • scorchdp.map
  • screamr.map
  • screamr2.map
  • sf2.map
  • shadoww.map
  • shells.map
  • simparc.map
  • simpbvs.map
  • skynet.map
  • spacer.map
  • spearod.map
  • speedbl2.map
  • spidey.map
  • srally.map
  • ssf2t.map
  • stargunr.map
  • streetr.map
  • strife.map
  • superc.map
  • swdf.map
  • swiv3d.map
  • tbraider.map
  • term2.map
  • termfs.map
  • timec.map
  • timegate.map
  • timewar.map
  • tmnt.map
  • tmntarc.map
  • tmntman.map
  • trackatk.map
  • turric2.map
  • tvcd.map
  • tyrian.map
  • wacky.map
  • warriors.map
  • wcrew.map
  • whaven.map
  • whaven2.map
  • wilds.map
  • wipeout.map
  • wolf3d.map
  • wrallyf.map
  • wwfarc.map
  • wwfiyh.map
  • xenon2.map
  • xmcota.map

Project Name

The remaster's executable is named "anuket", in reference to the Egyptian deity of the same name.

Revisional Differences

Hmmm...
To do:
Beta branch versions need to be documented.

These are taken from Steam update posts and the game's PatchNotes.txt. This .txt should not be confused with the original game's PATCH.TXT readme.

v1.8.4

The launch version.

v1.8.8

Released on May 15th, 2019.

  • Fix video crash when switching from OpenGL to other renderers,
  • Fluidsynth now loads MIDI internally, resolving some instances of user crashes depending on the user's directory name,
  • Fix CD audio music not being present when reloading a level,
  • Fix MP monster settings not being respected,
  • Change "Show Player Weapons" to "Show Player Weapons Overhead",
  • Fix armour being affected by friendly fire if friendly fire was switched off,
  • Remove the three extra recoil SFX for Cultists,
  • Tesla blast projectile now renders as flat - adding custom definition entry for making it always pitch towards the viewer,
  • Bug fix with TNT/Spray can disappearing when exploding in hands while on the last ammo,
  • Removing the run glitch feature,
  • Fixed incorrect negative shade for candles, causing the sprite effect to appear brighter,
  • Removed the pre-fire animation for tesla weapon,
  • Removed the morphing animation for gargoyle statues,
  • Stone gargoyle now uses the correct recoil SFX,
  • Lightly Broiled is now always the default selected menu item when entering the difficulty menu,
  • Akimbo Napalm weapon now plays the correct firing animation as seen in DOS version 1.21 (was using the old 1.0 one),
  • Fix taunting when killing enemies with TNT not working,
  • Stop players using power ups when dead,
  • Disallow Quickloading if no saves are available to load,
  • Fix a bug that caused a crash at the start of Death Wish E2M1,
  • Autorun state is now saved between sessions,
  • Fix the FoV slider being uncapped when using the arrow keys or controller,
  • Key sprites now default to full shade values,
  • Importing updated extra voxels,
  • Major revision to virtual vram system and shaders. Height is now only padded for wall textures now. Fixes tiling issues with non power of 2 texture widths,
  • Padded textures and normal textures are now treated as separate virtual vram entries. Fixes issue with the monolith logo in the save game menu being distorted while in E3M2,
  • Concussion damage is now scaled against tick scale, making gibbing to occur more easily,
  • Changed jump height for getting out of water back to the original height. This broke E2M2,
  • Shade value for walls with back wall swap flag is now accounted for,
  • Proper shade and palette values are now inherited from sprite to voxels (they now appear correct in DWE3M1),
  • Texture UV mapping fixed for E1M1, E1M2, E1M3, E3M2, E1M8,
  • Fix a bug that would allow loading in multiplayer,
  • Fix issue when moving between menus if the current selected menu entry is too high or low,
  • Players are now always respawned with 100 health, regardless of what the level start has,
  • Spraycan and HellHound missiles now deal correct damage type and burn time,
  • Tesla weapon now fires one extra projectile at the end of its firing animation,
  • All TNT/Prox/Remote/dynamite explosions now play the correct sprite if not colliding with the floor first,
  • Fix players being able to cheat to acquire the E3M1 no-civilians-killed achievement,
  • Add support for private and friend lobbies,
  • Add missing Cerberus electrocution state,
  • Jumping boots now negate all pummel (includes fall) damage,
  • Make sure zombies are changed into dead actors on death, restores knockback force in the DOS version,
  • Add load screen messages when loading fails; allow loading from specific older versions. If, in this case, you want to load saves from the previous Fresh Supply version please type `developer 1` in console, load, save over your old save, then type `developer 0` in console.
  • Fixing timing of burn damage,
  • Enemies now correctly avoid water,
  • Fixing DWE2M1 bug with player start spawns,
  • Duplicate addon paths are now checked for,
  • Key 7 is now defined,
  • Remove a specific voxel on E2M2,
  • Scale voxels at the same ratio as sprites,
  • Show extra info in lobby list,
  • Pressing use now performs a standard hitscan operation. This resolves some issues in DWE1M9.
(Source: Update #1 (1.8.8) is available now!)

v1.9.5

Released on June 4th 2019.

  • Gargoyle Statues can be moved and bleed when shot,
  • Ecto Skull Projectile is now transparent,
  • Reflection effect appears on player when picking up the reflection powerup,
  • Fixed bug with pressing use on wall sprites very close to the wall (fixes some issues in Death Wish),
  • Crash fix for Bloody Pulp Fiction mod,
  • Phantasm bleeds when shot,
  • Fixed bug with pressing use on wall sprites with flip-y flag set. Fixes issue in DWE3M6,
  • Support for unused dude actor types,
  • INI parsing system now replicates Monolith's implementation (fixes numerous issues with user INIs),
  • Full rendering support for wall type 501,
  • Bug fix with Fat Zombies not seeing the player at the beginning of DWE3M2,
  • Sounds played by QAV animations now assigns to channel 16 and up - fixes some problems with them cutting off Caleb's speeches,
  • Reverse search order for linked sprites to sector stacks. Fixes DWE1M3,
  • Reversed CanSee ray direction for CheckProximity - fixes proximity behavior,
  • Fixed incorrect impact fx on vector firing on mid-textures via overpicnum,
  • Jump Boots now protects against pummel type damage,
  • Fixed crash when dropping items not defined in definition system,
  • Fixed issues when interacting with usable walls and sectors marked as ‘pushwall’,
  • RFF system is no longer case-sensitive when looking up data entries,
  • Dude sprite types now activates when receiving the TOUCH or PUSH command,
  • Dude sprite types now applies BLOCKING/HITSCAN/INTERACT flags on spawn,
  • Player can now interact with stone statues,
  • Corrected the bounceDamage factor for Spiders (was 1200 instead of 1600) which result in premature fall damage when they fall near the end of e2m7,
  • New actor flag for not dropping items/keys (Cerberus fix),
  • Various misc. Fixes involving Hitscan and Vectorscan,
  • Start/End parameters for the CanSee function has been reversed - fixes MANY behavior problems,
  • Fixed damage sectors not immediately damaging player on land impact,
  • Fixed scroll floors/ceilings in wrong direction in E2M6,
  • Fixed code to determine if wall should have decals (using proper logic now). Fixes decals not showing up in many areas in E1M1,
  • Fixed up A LOT of the Cultists behaviors. Only use a 2D hitscan vector for determining sightlight checks instead of 3D. Fixes several problems,
  • Cultists now play Gib SEQ based on type,
  • Cultists and Earth/Axe Zombies now ignore damaged based sectors (fixes AI issue in DWE1M1),
  • Proximity range for prox mines is now correct,
  • Fixed issue with gib objects and other types from spawning two of the same item,
  • Fixed a typo with Exp_Dynamite_Wall, resulting in no SEQ from playing when invoked,
  • Minor bug fix with the CanSee function. Fixes an issue in DWE3M2,
  • Art tile animation is now randomized for oscil,
  • Fixed mouse not working on main menu after loading lower saves,
  • Audio velocity option is now saved to config,
  • Player no longer falls while dead in water,
  • Camera no longer toggle chasecam while in menu,
  • Map markers now show with an exclusive cheat (new cheat code: OAKISLAND),
  • Can now switch weapons during any point of the gun's state that isn't lowering or holstering,
  • Fixed a bug where explosion objects would persist due to bad underflow of xSprite's data1 and data4 members,
  • Fixed hitscan wall detection and wall UV mapping,
  • Added scale console variable for the weapon wheel. Set g_weaponWheelScale in the console to change it (defaults to 1.0),
  • Changed player jump boot height to 24.0. Makes it easier to reach the rooms in BB1,
  • Bug fix with wall unlock commands sending a ON command,
  • Support for padlock actor,
  • Allowed loading of all old (day-0 public build or later) saves.
(Source: Update #2 (1.9.5) is available now!)

v1.9.6

Released on June 6th 2019.

  • Engine updates,
  • Fixed a potential crash with OpenAL playback of Vorbis buffers,
  • OpenAL32.dll updated,
  • Missles now pass through breakable windows.
(Source: Update #2.1 (1.9.6) is available now!)

v1.9.10

The most recent patch for the game, released on August 5th, 2019. PatchNotes.txt mistakenly refers to this having released on August 4th.

  • Sprite links and how they're handled on level load is now accurate,
  • Earth zombie accuracy behaviour fix. They immediately go into search state when woken,
  • Ghost sight check accuracy behaviour fix (does not use eye-height offset when calling hitscan),
  • Napalm damage type accuracy fixed. Now uses hitscan type,
  • Tommy Gun Alt-Fire attack now uses the correct vector type. Vector type 3 now identified as BV_BULLET_WIDE,
  • Gillbeasts now take flare/fire damage on land,
  • Speed optimizations when writing save games,
  • Sounds now pre-cached on start-up,
  • Correct logic for changing AI targets and kin (incorrect randomization weight),
  • Miscellaneous General Engine Improvements,
  • Explicitly check for link sprites when Z-Translating the sector,
  • Support for tilenums beyond 4095 for SEQ files,
  • Changed ActionScan interaction code,
  • Support to make the object do a small 'boost' when snapping between different floor heights,
  • Fixed Fat Zombie melee vector direction,
  • Fixed player damage from being over-aggressive to network clients,
  • Updated maphacks to include MLD offsets for Voxels,
  • Fixed several floor link collision issues,
  • Updated Steamworks to 1.46,
  • Misc. sprite link fixes,
  • Misc. respawn fixes,
  • Misc. fixes.
(Source: Update #3 (1.9.10) is available now!)

Platform Differences

The Steam version at launch lacked the option to play the DOS version, something the GOG version had, until it was added in an update on November 19th, 2023.

(Source: DOS version now included)