Strife: Bloodbath is *too* aggressive

Is there something that doesn't work right in the latest GZDoom? Post about it here.

Moderator: GZDoom Developers

Forum rules
Please construct and post a simple demo whenever possible for all bug reports. Please provide links to everything.

If you can include a wad demonstrating the problem, please do so. Bug reports that include fully-constructed demos have a much better chance of being investigated in a timely manner than those that don't.

Please make a new topic for every bug. Don't combine multiple bugs into a single topic. Thanks!

Strife: Bloodbath is *too* aggressive

Postby Gez » Thu Apr 17, 2014 5:40 pm

When playing in Bloodbath mode in Strife, monsters such as acolyte open fire practically as soon as they see you and then will not do anything else but shoot at you until you hide behind cover. However, in vanilla, they do move around quite a lot, making the start of the game a lot more survivable, as demonstrated here by Belial:

Or here by someone else:


You'll notice that despite the acolytes moving and shooting faster than they do in ZDoom (their states lack the fast flag, as shown here), they're quite easier to kill without getting shredded because they waste a lot of time moving around. In ZDoom, they don't.
Gez
 
 
 
Joined: 06 Jul 2007

Re: Strife: Bloodbath is *too* aggressive

Postby FishyClockwork » Fri Apr 18, 2014 11:17 am

Hell, I was about to report this. :P

In this case I would suggest something like "StrifeFastMonsters" to be implemented and replace "FastMonsters" in Strife's "Bloodbath" skill definition.

The only thing "StrifeFastMonsters" would do is halve the tic duration of states that are marked with the 'Fast' state flag but otherwise does not influence aggressiveness (i.e. does not make monsters spam their 'Missile' state sequence like they do with "FastMonsters").

Does this sound reasonable?

EDIT: Instead of "StrifeFastMonsters", it could be called "FastMonsters2".
User avatar
FishyClockwork
 
Joined: 23 Feb 2011

Re: Strife: Bloodbath is *too* aggressive

Postby Graf Zahl » Fri Apr 18, 2014 11:42 am

I'd call it 'FastStates' and rename 'SlowMonsters' to 'SlowStates' because this has nothing to do with monsters exclusively.
User avatar
Graf Zahl
Lead GZDoom Developer
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany

Re: Strife: Bloodbath is *too* aggressive

Postby Gez » Fri Apr 18, 2014 12:49 pm

Or something like Heretic/Hexen's nightmarefast?

Thinking about it, having FastStates, FastChase (for nightmarefast), and FastAim (for this thread's effect) as separate skill settings instead of lumping everything under FastMonsters possibly modified by nightmarefast would be better.
Gez
 
 
 
Joined: 06 Jul 2007

Re: Strife: Bloodbath is *too* aggressive

Postby FishyClockwork » Fri Apr 18, 2014 1:51 pm

Just to clarify, is "FastAim" supposed to just make monsters spam their 'Missile' state sequence and ignore nightmarefast and the 'Fast' state flag i.e. not modify tic duration?

If so then how about calling it "FastAttack" or "SpamAttacks" since they're not really 'aiming' as much as they are mindlessly standing in place and gunning for you like there's no tomorrow.
User avatar
FishyClockwork
 
Joined: 23 Feb 2011

Re: Strife: Bloodbath is *too* aggressive

Postby Gez » Fri Apr 18, 2014 2:00 pm

So, effects of isFast:

AActor::StaticSpawn():
Code: Select allExpand view
   if (actor->isFast() && actor->flags3 & MF3_ISMONSTER)
      actor->reactiontime = 0;


A_DoChase():
Code: Select allExpand view
   // do not attack twice in a row
   if (actor->flags & MF_JUSTATTACKED)
   {
      actor->flags &= ~MF_JUSTATTACKED;
      if (!actor->isFast() && !dontmove)
      {
         P_NewChaseDir (actor);
      }
      actor->flags &= ~MF_INCHASE;
      return;
   }

and
Code: Select allExpand view
      // check for missile attack
      if (missilestate)
      {
         if (!actor->isFast() && actor->movecount)
         {
            goto nomissile;
         }
         
         if (!P_CheckMissileRange (actor))
            goto nomissile;
         
         actor->SetState (missilestate);
         actor->flags |= MF_JUSTATTACKED;
         actor->flags4 |= MF4_INCOMBAT;
         actor->flags &= ~MF_INCHASE;
         return;
      }

as well as:
Code: Select allExpand view
   if (nightmarefast && G_SkillProperty(SKILLP_FastMonsters))
   { // Monsters move faster in nightmare mode
      if (actor->tics > 3)
      {
         actor->tics -= actor->tics / 2;
         if (actor->tics < 3)
         {
            actor->tics = 3;
         }
      }
   }


AActor::GetTics():
Code: Select allExpand view
   if (isFast() && newstate->Fast)
   {
      return tics - (tics>>1);
   }



isFast() itself works like this:
Code: Select allExpand view
bool AActor::isFast()
{
   if (flags5&MF5_ALWAYSFAST) return true;
   if (flags5&MF5_NEVERFAST) return false;
   return !!G_SkillProperty(SKILLP_FastMonsters);
}

and interestingly enough, G_SkillProperty(SKILLP_FastMonsters) doesn't look just for the skill property, but also for the DM flag:
Code: Select allExpand view
      case SKILLP_FastMonsters:
         return AllSkills[gameskill].FastMonsters  || (dmflags & DF_FAST_MONSTERS);


So we have five effects in total. Four of them can be influenced by actor flags; the fifth cannot but can be influenced by A_Chase flags. That last effect comes from Heretic and therefore doesn't apply to Strife. Of the remaining four, one is definitely here (fast states). So which of the three others aren't?
  • reactiontime: interestingly, this one in vanilla is purely a skill setting and cannot be obtained just by -fast. Since ZDoom bundles the DM flag with the skill setting, -fast gives it fast reaction time too. It's difficult to guess whether it applies to Strife or not because reactiontime's effect is exceedingly subtle
  • do not attack twice in a row: this one seems interesting, if I understand what it does it forces the actor to move when calling A_Chase after having attacked. So it's definitely something missing from Strife.
  • shoot even if movecount is non-null: this one is subtle too
Gez
 
 
 
Joined: 06 Jul 2007

Re: Strife: Bloodbath is *too* aggressive

Postby Graf Zahl » Fri Apr 18, 2014 2:32 pm

Gez wrote:Or something like Heretic/Hexen's nightmarefast?

Thinking about it, having FastStates, FastChase (for nightmarefast), and FastAim (for this thread's effect) as separate skill settings instead of lumping everything under FastMonsters possibly modified by nightmarefast would be better.


Correct. But FastMonsters needs to stay for compatibility with existing mods.
User avatar
Graf Zahl
Lead GZDoom Developer
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany

Re: Strife: Bloodbath is *too* aggressive

Postby Graf Zahl » Fri Jan 29, 2016 8:34 pm

Lots of code fragments, no solution, though. Can you give some pointers? It's been too long that I thought about this.
User avatar
Graf Zahl
Lead GZDoom Developer
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany

Re: Strife: Bloodbath is *too* aggressive

Postby Gez » Fri Jan 29, 2016 10:17 pm

Well we're still stuck in "what do we do about this" mode.

Here's what I'd suggest: split the fast effect into its different constituent parts:
-FastReaction (for setting reactiontime to 0)
-RepeatAttacks (for skipping the "do not attack twice in a row") thing
-FastStates (for the effect on actor states with the fast flag)
-FastChase (for the nightmarefast effect)

The existing FastMonsters property would be a combo deal for backward compatibility.

If that's okay I can prepare a PR for that, unless you'd rather do it yourself.
Gez
 
 
 
Joined: 06 Jul 2007

Re: Strife: Bloodbath is *too* aggressive

Postby Graf Zahl » Sat Jan 30, 2016 3:41 am

If you got time do do it I'd appreciate it so I can look at other bugs in parallel.
User avatar
Graf Zahl
Lead GZDoom Developer
Lead GZDoom Developer
 
Joined: 19 Jul 2003
Location: Germany


Return to Bugs

Who is online

Users browsing this forum: No registered users and 1 guest