Older Doom versions

I've researched some older DOOM EXEs for possible improvement of compatibility with doom 1.2 (-complevel 0) and found a few changes which probably are worth to be mentioned here:
http://doom.wikia.com/wiki/Versions_of_Doom_and_Doom_II

1. Doom 1.4 and earlier versions do not check actor's radius in P_CheckMeleeRange:

static dboolean P_CheckMeleeRange(mobj_t *actor)
{
  mobj_t *pl = actor->target;

  return  // killough 7/18/98: friendly monsters don't attack other friends
    pl && !(actor->flags & pl->flags & MF_FRIEND) &&
    (P_AproxDistance(pl->x-actor->x, pl->y-actor->y) <
     (compatibility_level == doom_12_compatibility ?
      MELEERANGE :
      MELEERANGE - 20*FRACUNIT + pl->info->radius)) &&
    P_CheckSight(actor, actor->target);
}
http://prboom-plus.sf.net/P_CheckMeleeRange_14.png
http://prboom-plus.sf.net/P_CheckMeleeRange_15.png


2. A_SargAttack is completely different in doom 1.4 and earlier versions:
void A_SargAttack(mobj_t *actor)
{
  if (!actor->target)
    return;
  A_FaceTarget(actor);
  if (compatibility_level == doom_12_compatibility)
  {
    int damage = ((P_Random(pr_sargattack)%10)+1)*4;
    P_LineAttack(actor, actor->angle, MELEERANGE, 0, damage);
  }
  else
  {
    if (P_CheckMeleeRange(actor))
    {
      int damage = ((P_Random(pr_sargattack)%10)+1)*4;
      P_DamageMobj(actor->target, actor, actor, damage);
    }
  }
}
http://prboom-plus.sf.net/A_SargAttack_14.png
http://prboom-plus.sf.net/A_SargAttack_15.png

You should interpret (compatibility_level == doom_12_compatibility) as (compatibility_level < doom_15_compatibility)

Share this post


Link to post

Indeed, the original A_Sargattack, being a short range hitscan attack meant Demons could infight with eachother, hurt each other and were affected by the invisibility sphere.

Share this post


Link to post

I saw these patches go in yesterday. :) Nice work!

Share this post


Link to post

Versions 1.2 and earlier will need the old version of the line-of-sight checking code which operates more like the bullet tracer code rather than using a BSP crossing algorithm. This code can be found in Heretic, and has that quirk of occasionally allowing monsters to see the player through an arbitrary number of walls which I have dubbed the "Anywhere Moo" bug (because it is most noticeable with Maulotaurs, and in Doom, Cyberdemons).

Share this post


Link to post
Quasar said:

Versions 1.2 and earlier will need the old version of the line-of-sight checking code

Yes, I know.

Share this post


Link to post
Quasar said:

and has that quirk of occasionally allowing monsters to see the player through an arbitrary number of walls



That's a bug, not a quirk. A quirk would be odd behavior in otherwise correct code. This one's clearly broken though.

Share this post


Link to post

Another improvement:

void A_Chase(mobj_t *actor)
{
  if (actor->reactiontime)
    actor->reactiontime--;

  if (actor->threshold) { /* modify target threshold */
    if (compatibility_level == doom_12_compatibility)
    {
      actor->threshold--;
    }
    else
    {
      if (!actor->target || actor->target->health <= 0)
        actor->threshold = 0;
      else
        actor->threshold--;
    }
  }
  ...
All demos by never_again on uac_dead.wad are in sync for now

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now