BDLite [V1.1 RELEASED - 2019-02-15]

Projects that alter game functions but do not include new maps belong here.
Forum rules
The Projects forums are ONLY for YOUR PROJECTS! If you are asking questions about a project, either find that project's thread, or start a thread in the General section instead.

Got a cool project idea but nothing else? Put it in the project ideas thread instead!

Projects for any Doom-based engine (especially 3DGE) are perfectly acceptable here too.

Please read the full rules for more details.

Re: BDLite - a slimmed-down effects mod [2018-10-08]

Postby Kinsie » Wed Oct 10, 2018 3:49 am

GAA1992 wrote:small question: Are you going to allow modders to make forks out of your version of BD? Giving proper credits, obviously. =p
I'm pretty sure half the point of this mod is creating a more solid base for developers to work with.
User avatar
Kinsie
A Concept Utterly Obsolete
 
Joined: 22 Oct 2004
Location: MAP33
Discord: Find Me...
Twitch ID: thekinsie

Re: BDLite - a slimmed-down effects mod [2018-10-08]

Postby GAA1992 » Wed Oct 10, 2018 5:48 am

Went through my head but you never know. I don't want DavidN to see me as some kind of freeloader.
User avatar
GAA1992
Demons are a disease. Meet the cure.
 
Joined: 04 Jun 2015
Location: Killing spiders.

Re: BDLite - a slimmed-down effects mod [2018-10-08]

Postby Kinsie » Wed Oct 10, 2018 6:33 am

I'm pretty sure there was something about serving as a better base in the OP at first, but it looks like things got shortened.

I'm sure David can correct me if necessary, of course.
User avatar
Kinsie
A Concept Utterly Obsolete
 
Joined: 22 Oct 2004
Location: MAP33
Discord: Find Me...
Twitch ID: thekinsie

Re: BDLite - a slimmed-down effects mod [2018-10-08]

Postby Kroc » Wed Oct 10, 2018 6:34 am

You beautiful person! I want to hug you! Brutal DOOM got me interested in the modern DOOM scene and I didn't just stick to BD; many aspects of it were genuinely refreshing, such as the starting rifle being a practical gun at all levels rather than something immediately forgotten, but the terrible performance, bloat and over-inflated 'edge' just wasn't necessary. I switched to using v20 Black Edition which reigned it in a bit, but I think you're going to solve all my complaints and make BD worth playing again!
Kroc
 
Joined: 02 Oct 2016

Re: BDLite - a slimmed-down effects mod [2018-10-08]

Postby drfrag » Wed Oct 10, 2018 6:43 am

As you probably know i'm the author of that unofficial v20c patch to fix bugs. I wonder if this is based on v21.
I tried the latest v21 a few days ago and the same old game breaking bugs i reported are still there (was struck by the dissapearing weapon unrecoverable bug). I've found that now balance is completely broken and it's much harder than before compared to previous betas, extremely hard and unplayable i'd say.
However there's new cool stuff to watch there. :)
User avatar
drfrag
I.R developer, I.R smart
Vintage GZDoom Developer
 
Joined: 23 Apr 2004
Location: Spain

Re: BDLite - a slimmed-down effects mod [2018-10-08]

Postby DavidN » Wed Oct 10, 2018 8:18 am

I can't really remember which version BDLite is based on because I started it so long ago (I just started making a serious push at it over the last few weeks) - it's either 19 or 20 somewhere :) And yes, I definitely want to make this open to other people to extend and to build on - one of my update posts will be about how I'm building my own project on it, including where new monsters/weapons extend from and my build pipeline :)

For optimization, I was working on the theory that if my laptop can handle it then anything can, but I can definitely see that some removing of the many, many actors created over time would be a benefit. I'll have to look at what the best way to implement that is.
User avatar
DavidN
 
Joined: 28 Dec 2015

Re: BDLite - a slimmed-down effects mod [2018-10-10]

Postby DavidN » Wed Oct 10, 2018 9:17 pm

Okay, new snapshot posted with the file size trimmed down another 2MB :) It's now just under half the size of the full V20 PK3. It has the list of fixes on the Trello board - all the monsters are now there (not sure I'll bother with the nazis) and various other annoyances have been fixed.

Incidentally the gigantic tree in the first post looks like this now, though there's still some way to go:

Image
User avatar
DavidN
 
Joined: 28 Dec 2015

Re: BDLite - a slimmed-down effects mod [2018-10-10]

Postby John_Wheel » Thu Oct 11, 2018 8:51 am

This is really, really cool and I'm enjoying it even if it's unfinished. I noticed the following glitches:

- The Death Camera is always on even if I have it turned off on my config.
- The pinkies are extra fast on difficulty levels other than Nightmare. Maybe it's on purpose, but I didn't notice it on the previous snapshots.
- The shotgun reloading animation sort of shakes when you are walking through stairs.
- This decoration flickers constantly. Can be found on TNT MAP02 starting room https://i.imgur.com/ciRA2EK.jpg
John_Wheel
 
Joined: 26 Jun 2018

Re: BDLite - a slimmed-down effects mod [2018-10-10]

Postby Kroc » Thu Oct 11, 2018 3:30 pm

Tried this with D64D2 and aside the super-fast pinkies as noted before, I noticed that the enemies hidden in the walls (for later teleportation in) were taking actual shots at me, even though they shouldn't have any line-of-sight. Screenshot here, so you can see where they're hidden above/below the starting point on the map.

Screenshot_Doom_20181011_212428.png
IDDT map of D64D2 MAP01 with BDLite

Great work you're doing, this plays *so* well. I had forgotten how much fun BD can be; I had to give it up because of performance problems. Your version is significantly faster already, thank you.
Kroc
 
Joined: 02 Oct 2016

Re: BDLite - a slimmed-down effects mod [2018-10-10]

Postby DavidN » Thu Oct 11, 2018 8:59 pm

Thanks for bringing that up! I see the problem - this is actually the fault of a feature in the lowest-tier enemies that I thought was worth keeping around but didn't quite recreate properly. When the zombieman or sergeant are awake and are close to you, they take a few steps back, with a chance of going to their Missile label afterwards. The jump to Missile gets called whether the actor can actually see the player or not - the solution is to put a check in just after the Missile label for line-of-sight. I've lined that up to go out with the next snapshot :)

I've been thinking about the death camera and what a pain it was going to be to fix it (it used to really bother me that it swung through walls but I've sort of got used to it now) - it never really occurred to me before that I could just remove it and write my own slightly enhanced player deaths. I think that's what I'll do, unless anyone's particularly fond of the third person deaths.
User avatar
DavidN
 
Joined: 28 Dec 2015

Re: BDLite - a slimmed-down effects mod [2018-10-10]

Postby DavidN » Fri Oct 12, 2018 7:57 pm

New snapshot again, with some more things fixed and a bit more slimming down. I think I've removed the redundant special effects and just need to rewrite the remaining ones into a somewhat sane hierarchy, which is still a daunting task. Some time was spent on making sure all the necessary sprites existed - time for another big post!

Sprite tidying
One of the main reasons that Brutal Doom is so confusing, of course, is just how much of it there is. V20b contains 7,768 files in all, across all the added scripts, graphics and definitions. At the time of writing, I've pared down and consolidated things enough to get it down to 4,107. In both cases, the vast majority of the files are sprites, and they're in a random mixture of PNG and Doom format graphics which may or may not have file extensions.

ZDoom's state definition parsing is very permissive about the sprites that you define for each state, which can be more of a curse than a blessing - the game will still run if you're missing a sprite here and there, but it can make it very difficult to detect errors. In a project where you're just using a couple of custom actors, it's easy enough to browse through the code and match the frames mentioned in the state definitions with files in your sprites folder, but this is on another level entirely - I wrote a script to help me find references to sprites that didn't exist, and sprite files that were never referenced.

Code: Select allExpand view
<?php

class SpriteUseDetector {
   
   //Including the "r" in the last section is a hacky allowance for when a state lasts for a random() amount of time
   var $state_regex = '/^\h*[A-Za-z0-9]{4}\h+[a-zA-\]"]*\h+[-]?[0-9rR]+/m';
   var $sprite_file_regex = '/^[A-Za-z0-9]{4}[a-zA-\]\^]{1}[0-1]/';
   var $decorate_sprites_mentioned = [];
   var $sprites_available = [];
   var $sprite_errors = 0;
   var $sprites_unused = 0;
   var $zero_length_frames = [];
   
   public function run($decorate_folder, $sprite_folder) {

      $folders_to_run = explode(",", $decorate_folder);

      while(count($folders_to_run) > 0) {
         $decorate_folder = array_shift($folders_to_run);
         echo ("Examining DECORATE folder " . $decorate_folder . PHP_EOL);
         //Get the files in the folder
         $files = scandir($decorate_folder);
         foreach ($files as $key => $value) {
              if (!in_array($value,array(".",".."))) {
             
               $full_file_name = $decorate_folder . DIRECTORY_SEPARATOR . $value;
             
               if (is_dir($full_file_name)) {
                  //Add to the list
                  $folders_to_run[] = $full_file_name;
               }
               else {
                  $file_string = file_get_contents($full_file_name);
                  $this->examine_decorate_file($file_string);
               }
            }
         }
      }
      
      //Now run a similar search on the sprite folder, looking for filenames.
      
      $folders_to_run = explode(",", $sprite_folder);
      while(count($folders_to_run) > 0) {
         $sprite_folder = array_shift($folders_to_run);
         echo ("Examining sprite folder " . $sprite_folder . PHP_EOL);
         //Get the files in the folder
         $files = scandir($sprite_folder);
         foreach ($files as $key => $value) {
              if (!in_array($value,array(".",".."))) {
             
               $full_file_name = $sprite_folder . DIRECTORY_SEPARATOR . $value;
             
               if (is_dir($full_file_name)) {
                  //Add to the list
                  $folders_to_run[] = $full_file_name;
                  echo ("Adding " . $full_file_name . PHP_EOL);
               }
               else {
                  //This might be a sprite file, if we have a match on this.
                  $num_results = preg_match_all($this->sprite_file_regex, $value);
                  if ($num_results > 0) {
                     $sprite_name = strtoupper(substr($value, 0, 4));
                     $sprite_frame = strtoupper(substr($value, 4, 1));
                     $this->sprites_available[$sprite_name][$sprite_frame] = true;
                     //Check for a double rotation
                     $sprite_frame_2 = strtoupper(substr($value, 6, 1));
                     if ($sprite_frame_2 != '.' && !empty($sprite_frame_2)) {
                        $this->sprites_available[$sprite_name][$sprite_frame_2] = true;
                     }
                  }
               }
            }
         }
      }
      
      //We now have all the DECORATE mentions and sprites. Check to see if any of the DECORATE refers to a missing sprite.
      foreach ($this->decorate_sprites_mentioned as $dec_sprite_name => $dec_sprite_frames) {
         if (!isset($this->sprites_available[$dec_sprite_name])) {
            echo ("!!! $dec_sprite_name (" . count($dec_sprite_frames) . " frames) not found among the sprite files!" . PHP_EOL);
            $this->sprite_errors++;
            continue;
         }
         foreach ($dec_sprite_frames as $dec_sprite_frame => $blah) {
            if (!isset($this->sprites_available[$dec_sprite_name][$dec_sprite_frame])) {
               echo ("!!! File for $dec_sprite_name frame $dec_sprite_frame was not found!" . PHP_EOL);               
               $this->sprite_errors++;
            }
         }
      }
      echo ("Sprites missing: " . $this->sprite_errors . PHP_EOL);
      
      //And check to see if any sprites were never mentioned in the DECORATE.
      foreach ($this->sprites_available as $sprite_name => $sprite_frames) {
         if (!isset($this->decorate_sprites_mentioned[$sprite_name])) {
            echo ("??? $sprite_name (" . count($sprite_frames) . " frames) present but never used in DECORATE!" . PHP_EOL);
            $this->sprites_unused++;
            continue;
         }
         foreach ($sprite_frames as $sprite_frame => $blah) {
            if (!isset($this->decorate_sprites_mentioned[$sprite_name][$sprite_frame])) {
               echo ("??? No use found for $sprite_name frame $sprite_frame!" . PHP_EOL);               
               $this->sprites_unused++;
            }
         }
      }
      echo ("Sprites unused: " . $this->sprites_unused . PHP_EOL);

      echo (PHP_EOL . PHP_EOL);
      echo ("Sprites available" . PHP_EOL);
            
      //Output the full sprites available/sprites used arrays
      ksort($this->sprites_available);
      foreach ($this->sprites_available as $sprite_name => $sprite_frames) {
         ksort($sprite_frames);
         echo ($sprite_name . " ");
         foreach ($sprite_frames as $frame_letter => $frame_value) {
            echo $frame_letter;
         }
         echo PHP_EOL;
      }
      echo (PHP_EOL . PHP_EOL);
      ksort($this->decorate_sprites_mentioned);
      echo ("Sprites mentioned in DECORATE" . PHP_EOL);
      foreach ($this->decorate_sprites_mentioned as $sprite_name => $sprite_frames) {
         ksort($sprite_frames);
         echo ($sprite_name . " ");
         foreach ($sprite_frames as $frame_letter => $frame_value) {
            echo $frame_letter;
         }
         echo PHP_EOL;
      }
      
      echo (PHP_EOL . PHP_EOL);

   }
   
   public function examine_decorate_file($file_string) {
      $results = [];
      preg_match_all($this->state_regex, $file_string, $results);
      foreach ($results[0] as $result) {
         $result = trim($result);
         //If we now have fewer than 8 characters, this is a false result so discard it
         if (strlen($result) < 8) {
            continue;
         }
         //Our first four characters are the sprite name
         $sprite_name = strtoupper(substr($result, 0, 4));
         if ($sprite_name == 'TNT1') { //The blank sprite
            continue;
         }
         if ($sprite_name == 'GAME') {
            echo $result . PHP_EOL;
         }
         $result = strtoupper(substr($result, 4));
         if (!isset($this->decorate_sprites_mentioned[$sprite_name])) {
            $this->decorate_sprites_mentioned[$sprite_name] = [];
         }
         
         //TODO If we notice a sprite with a zero length that isn't TNT1, add it to the list

         //Next characters up until the next whitespace are the sprite frames
         $char = '0';
         $result = trim($result);
         while (!in_array($char, [' ', '\t', ''])) {
            $char = substr($result, 0, 1);
            $result = substr($result, 1);
            if (!in_array($char, [' ', '\t', ''])) {
               $this->decorate_sprites_mentioned[$sprite_name][$char] = true;
            }
         }
      }
   }
}

//

$decorate_folder = isset($argv[1]) ? $argv[1] : null;
if ($decorate_folder == null) {
   die("Please provide a DECORATE folder to search as the first command line arg!");
}
$sprite_folder = isset($argv[2]) ? $argv[2] : null;
if ($sprite_folder == null) {
   die("Please provide a sprite folder to search as the second command line arg!");
}
$sud = new SpriteUseDetector();
$sud->run($decorate_folder, $sprite_folder);


The PHP script takes two command line arguments - a DECORATE folder to examine (ZScript works equally well) and a SPRITES folder to compare it to. It recurses through the sprites folder adding the available sprites and frame letters to an array, then reads each file in the Decorate folder and does the same thing to anything that looks like a reference to a sprite.

Code: Select allExpand view
var $state_regex = '/^\h*[A-Za-z0-9]{4}\h+[a-zA-\]"]*\h+[-]?[0-9rR]+/m';
var $sprite_file_regex = '/^[A-Za-z0-9]{4}[a-zA-\]\^]{1}[0-1]/';


Do you know how regex was invented? A software architect fell asleep on his keyboard during a long night, rolled his head around a bit, woke up and said "Yes! That's exactly what a language should look like". I can barely ever actually read the ones I've written, and have to rebuild them from scratch each time to refresh my memory. Nevertheless, I can vaguely tell you that the first one of these looks for lines in DECORATE that look like references to sprites - four alphanumeric characters, some space, a string of letters (or the special characters used by the Archvile), some more space and then a number.

Code: Select allExpand view
CACO ABCDEF 6
TNT1 a 0
poss ab random(4, 6)


The duration of a state can also be declared as a random range, so the "r" at the end of the pattern is a bit of a hacky way to account for this.

Similarly, the second regex searches for any file that conforms to the Doom sprite naming scheme - four alphanumeric characters, a letter or one of the other special frame characters, and then a number representing direction (followed by anything else, for files that act as more than one direction).

Code: Select allExpand view
SPOSA2D8
BON1A0.png
SKULD1


After gathering both of these lists, the script compares the two and spits out an error for every time a frame is mentioned in one place but not in another. You can then use that list to hunt down any sprites that are unused, or to identify places where an expected sprite doesn't exist. (After removing classes that weren't useful for BDLite, the list of unused sprites was at about 700 before I went in on a pruning mission.)

Code: Select allExpand view
!!! PUFY (3 frames) not found among the sprite files!
!!! PUF2 (26 frames) not found among the sprite files!
!!! File for DIBR frame A was not found!
!!! File for BAL2 frame A was not found!

??? SHSL (5 frames) present but never used in DECORATE!
??? ST81 (6 frames) present but never used in DECORATE!
??? No use found for XBRN frame F!
??? No use found for DIBR frame X!


I don't think this script is perfect yet as I've bound to have forgotten some edge cases, and there are other ways to declare a sprite is needed other than in state declarations (for example, the Player.CrouchSprite). But it can be used to identify potential bloat or missing sprites that would take several months to find by looking through the state definitions manually. I run this periodically as I go through the code, and it's very satisfying to see the final size of the PK3 plummeting.
User avatar
DavidN
 
Joined: 28 Dec 2015

Re: BDLite - a slimmed-down effects mod [2018-10-10]

Postby Gollgagh » Fri Oct 12, 2018 9:37 pm

I wanna heap on some more praise for you actually doing this. I've wanted a redone version of the monsters for years now and broke down into tears every time looked at the code.

===================

Would it be possible to have a fire-select for the rifle? I'm kinda not a fan of burst fire that isn't actually burst fire. I realize removing full-auto is good for balance, but might I suggest a semi-auto mode so that the user can at least have some control over when the bullets come out of the barrel? Maybe even use the burst-fire for autofire --like you already have it-- and semi for spamming the trigger.
User avatar
Gollgagh
 
Joined: 16 Apr 2015

Re: BDLite - a slimmed-down effects mod [2018-10-12]

Postby Cacodemon345 » Sat Oct 13, 2018 4:26 am

@OP:
Are you planning on making another version that is pretty much solely a refactorized version of this mod? By that, no anti-features?

And yeah, gonna try this one at a later time. Looks cool.
Cacodemon345
 
Joined: 22 Dec 2017
Discord: Cacodemon345#9151

Re: BDLite - a slimmed-down effects mod [2018-10-12]

Postby wildweasel » Sat Oct 13, 2018 1:50 pm

Cacodemon345 wrote:anti-features?

....huh? :?
User avatar
wildweasel
「お前はもうトースト」[you are already toast.]
Moderator Team Lead
 
Joined: 15 Jul 2003

Re: BDLite - a slimmed-down effects mod [2018-10-12]

Postby Kroc » Sat Oct 13, 2018 2:41 pm

Found a bug! The mod is interfering with buttons / actions in D64D2.WAD. Using GZDoom 3.6.0 on MAP02 you'll find that the button on the blue key pedestal does not open the doors on the rear wall. In GZDoom 3.5.1, the switch in the centre of the dark room doesn't work. Should BDLite be loaded before the PWAD file?

Edit: Works if loaded before the PWAD!
Last edited by Kroc on Sat Oct 13, 2018 3:04 pm, edited 1 time in total.
Kroc
 
Joined: 02 Oct 2016

PreviousNext

Return to Gameplay Mods

Who is online

Users browsing this forum: DarkTalon25, mikecari and 12 guests