mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-02 08:53:42 +00:00
- added a compatibility option to render all segs of a polyobject in the center's subsector and automatically set it for Hexen MAP36 and HEXDD MAP47.
SVN r2543 (trunk)
This commit is contained in:
parent
a0d16bc99a
commit
66f6115c86
9 changed files with 55 additions and 6 deletions
|
@ -118,6 +118,7 @@ static FCompatOption Options[] =
|
||||||
{ "spritesort", COMPATF_SPRITESORT, 0 },
|
{ "spritesort", COMPATF_SPRITESORT, 0 },
|
||||||
{ "hitscan", COMPATF_HITSCAN, 0 },
|
{ "hitscan", COMPATF_HITSCAN, 0 },
|
||||||
{ "lightlevel", COMPATF_LIGHT, 0 },
|
{ "lightlevel", COMPATF_LIGHT, 0 },
|
||||||
|
{ "polyobj", COMPATF_POLYOBJ, 0 },
|
||||||
{ NULL, 0, 0 }
|
{ NULL, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -266,6 +267,19 @@ void CheckCompatibility(MapData *map)
|
||||||
ib_compatflags = 0;
|
ib_compatflags = 0;
|
||||||
ii_compatparams = -1;
|
ii_compatparams = -1;
|
||||||
}
|
}
|
||||||
|
else if (Wads.GetLumpFile(map->lumpnum) == 1 && (gameinfo.flags & GI_COMPATPOLY1) && Wads.CheckLumpName(map->lumpnum, "MAP36"))
|
||||||
|
{
|
||||||
|
ii_compatflags = COMPATF_POLYOBJ;
|
||||||
|
ib_compatflags = 0;
|
||||||
|
ii_compatparams = -1;
|
||||||
|
}
|
||||||
|
else if (Wads.GetLumpFile(map->lumpnum) == 2 && (gameinfo.flags & GI_COMPATPOLY2) && Wads.CheckLumpName(map->lumpnum, "MAP47"))
|
||||||
|
{
|
||||||
|
ii_compatflags = COMPATF_POLYOBJ;
|
||||||
|
ib_compatflags = 0;
|
||||||
|
ii_compatparams = -1;
|
||||||
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
map->GetChecksum(md5.Bytes);
|
map->GetChecksum(md5.Bytes);
|
||||||
|
|
|
@ -60,8 +60,8 @@ const IWADInfo IWADInfos[NUM_IWAD_TYPES] =
|
||||||
// banner text, autoname, fg color, bg color
|
// banner text, autoname, fg color, bg color
|
||||||
{ "Final Doom: TNT - Evilution", "TNT", MAKERGB(168,0,0), MAKERGB(168,168,168), GAME_Doom, "mapinfo/tnt.txt", GI_MAPxx | GI_COMPATSHORTTEX | GI_COMPATSTAIRS },
|
{ "Final Doom: TNT - Evilution", "TNT", MAKERGB(168,0,0), MAKERGB(168,168,168), GAME_Doom, "mapinfo/tnt.txt", GI_MAPxx | GI_COMPATSHORTTEX | GI_COMPATSTAIRS },
|
||||||
{ "Final Doom: Plutonia Experiment", "Plutonia", MAKERGB(168,0,0), MAKERGB(168,168,168), GAME_Doom, "mapinfo/plutonia.txt", GI_MAPxx | GI_COMPATSHORTTEX },
|
{ "Final Doom: Plutonia Experiment", "Plutonia", MAKERGB(168,0,0), MAKERGB(168,168,168), GAME_Doom, "mapinfo/plutonia.txt", GI_MAPxx | GI_COMPATSHORTTEX },
|
||||||
{ "Hexen: Beyond Heretic", NULL, MAKERGB(240,240,240), MAKERGB(107,44,24), GAME_Hexen, "mapinfo/hexen.txt", GI_MAPxx },
|
{ "Hexen: Beyond Heretic", NULL, MAKERGB(240,240,240), MAKERGB(107,44,24), GAME_Hexen, "mapinfo/hexen.txt", GI_MAPxx | GI_COMPATPOLY1 },
|
||||||
{ "Hexen: Deathkings of the Dark Citadel", "HexenDK", MAKERGB(240,240,240), MAKERGB(139,68,9), GAME_Hexen, "mapinfo/hexen.txt", GI_MAPxx },
|
{ "Hexen: Deathkings of the Dark Citadel", "HexenDK", MAKERGB(240,240,240), MAKERGB(139,68,9), GAME_Hexen, "mapinfo/hexen.txt", GI_MAPxx | GI_COMPATPOLY1 | GI_COMPATPOLY2 },
|
||||||
{ "Hexen: Demo Version", "HexenDemo",MAKERGB(240,240,240), MAKERGB(107,44,24), GAME_Hexen, "mapinfo/hexen.txt", GI_MAPxx | GI_SHAREWARE },
|
{ "Hexen: Demo Version", "HexenDemo",MAKERGB(240,240,240), MAKERGB(107,44,24), GAME_Hexen, "mapinfo/hexen.txt", GI_MAPxx | GI_SHAREWARE },
|
||||||
{ "DOOM 2: Hell on Earth", "Doom2", MAKERGB(168,0,0), MAKERGB(168,168,168), GAME_Doom, "mapinfo/doom2.txt", GI_MAPxx | GI_COMPATSHORTTEX },
|
{ "DOOM 2: Hell on Earth", "Doom2", MAKERGB(168,0,0), MAKERGB(168,168,168), GAME_Doom, "mapinfo/doom2.txt", GI_MAPxx | GI_COMPATSHORTTEX },
|
||||||
{ "Heretic Shareware", NULL, MAKERGB(252,252,0), MAKERGB(168,0,0), GAME_Heretic, "mapinfo/hereticsw.txt",GI_SHAREWARE },
|
{ "Heretic Shareware", NULL, MAKERGB(252,252,0), MAKERGB(168,0,0), GAME_Heretic, "mapinfo/hereticsw.txt",GI_SHAREWARE },
|
||||||
|
|
|
@ -104,6 +104,7 @@
|
||||||
#include "compatibility.h"
|
#include "compatibility.h"
|
||||||
#include "m_joy.h"
|
#include "m_joy.h"
|
||||||
#include "sc_man.h"
|
#include "sc_man.h"
|
||||||
|
#include "po_man.h"
|
||||||
#include "resourcefiles/resourcefile.h"
|
#include "resourcefiles/resourcefile.h"
|
||||||
|
|
||||||
EXTERN_CVAR(Bool, hud_althud)
|
EXTERN_CVAR(Bool, hud_althud)
|
||||||
|
@ -480,7 +481,12 @@ static int GetCompatibility(int mask)
|
||||||
|
|
||||||
CUSTOM_CVAR (Int, compatflags, 0, CVAR_ARCHIVE|CVAR_SERVERINFO)
|
CUSTOM_CVAR (Int, compatflags, 0, CVAR_ARCHIVE|CVAR_SERVERINFO)
|
||||||
{
|
{
|
||||||
|
int old = i_compatflags;
|
||||||
i_compatflags = GetCompatibility(self) | ii_compatflags;
|
i_compatflags = GetCompatibility(self) | ii_compatflags;
|
||||||
|
if ((old ^i_compatflags) & COMPATF_POLYOBJ)
|
||||||
|
{
|
||||||
|
FPolyObj::ClearAllSubsectorLinks();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_CVAR(Int, compatmode, 0, CVAR_ARCHIVE|CVAR_NOINITCALL)
|
CUSTOM_CVAR(Int, compatmode, 0, CVAR_ARCHIVE|CVAR_NOINITCALL)
|
||||||
|
@ -559,6 +565,7 @@ CVAR (Flag, compat_noblockfriends,compatflags,COMPATF_NOBLOCKFRIENDS);
|
||||||
CVAR (Flag, compat_spritesort, compatflags,COMPATF_SPRITESORT);
|
CVAR (Flag, compat_spritesort, compatflags,COMPATF_SPRITESORT);
|
||||||
CVAR (Flag, compat_hitscan, compatflags,COMPATF_HITSCAN);
|
CVAR (Flag, compat_hitscan, compatflags,COMPATF_HITSCAN);
|
||||||
CVAR (Flag, compat_light, compatflags,COMPATF_LIGHT);
|
CVAR (Flag, compat_light, compatflags,COMPATF_LIGHT);
|
||||||
|
CVAR (Flag, compat_polyobj, compatflags,COMPATF_POLYOBJ);
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
|
|
@ -329,6 +329,7 @@ enum
|
||||||
COMPATF_SPRITESORT = 1 << 27, // Invert sprite sorting order for sprites of equal distance
|
COMPATF_SPRITESORT = 1 << 27, // Invert sprite sorting order for sprites of equal distance
|
||||||
COMPATF_HITSCAN = 1 << 28, // Hitscans use original blockmap anf hit check code.
|
COMPATF_HITSCAN = 1 << 28, // Hitscans use original blockmap anf hit check code.
|
||||||
COMPATF_LIGHT = 1 << 29, // Find neighboring light level like Doom
|
COMPATF_LIGHT = 1 << 29, // Find neighboring light level like Doom
|
||||||
|
COMPATF_POLYOBJ = 1 << 30, // Draw polyobjects the old fashioned way
|
||||||
};
|
};
|
||||||
|
|
||||||
// Emulate old bugs for select maps. These are not exposed by a cvar
|
// Emulate old bugs for select maps. These are not exposed by a cvar
|
||||||
|
|
|
@ -1404,6 +1404,7 @@ MapFlagHandlers[] =
|
||||||
{ "compat_noblockfriends", MITYPE_COMPATFLAG, COMPATF_NOBLOCKFRIENDS},
|
{ "compat_noblockfriends", MITYPE_COMPATFLAG, COMPATF_NOBLOCKFRIENDS},
|
||||||
{ "compat_spritesort", MITYPE_COMPATFLAG, COMPATF_SPRITESORT},
|
{ "compat_spritesort", MITYPE_COMPATFLAG, COMPATF_SPRITESORT},
|
||||||
{ "compat_light", MITYPE_COMPATFLAG, COMPATF_LIGHT},
|
{ "compat_light", MITYPE_COMPATFLAG, COMPATF_LIGHT},
|
||||||
|
{ "compat_polyobj", MITYPE_COMPATFLAG, COMPATF_POLYOBJ},
|
||||||
{ "cd_start_track", MITYPE_EATNEXT, 0, 0 },
|
{ "cd_start_track", MITYPE_EATNEXT, 0, 0 },
|
||||||
{ "cd_end1_track", MITYPE_EATNEXT, 0, 0 },
|
{ "cd_end1_track", MITYPE_EATNEXT, 0, 0 },
|
||||||
{ "cd_end2_track", MITYPE_EATNEXT, 0, 0 },
|
{ "cd_end2_track", MITYPE_EATNEXT, 0, 0 },
|
||||||
|
|
4
src/gi.h
4
src/gi.h
|
@ -43,7 +43,9 @@
|
||||||
#define GI_MENUHACK_EXTENDED 0x00000004 // (Heretic)
|
#define GI_MENUHACK_EXTENDED 0x00000004 // (Heretic)
|
||||||
#define GI_TEASER2 0x00000008 // Alternate version of the Strife Teaser
|
#define GI_TEASER2 0x00000008 // Alternate version of the Strife Teaser
|
||||||
#define GI_COMPATSHORTTEX 0x00000010 // always force COMPAT_SHORTTEX for IWAD maps.
|
#define GI_COMPATSHORTTEX 0x00000010 // always force COMPAT_SHORTTEX for IWAD maps.
|
||||||
#define GI_COMPATSTAIRS 0x00000010 // same for stairbuilding
|
#define GI_COMPATSTAIRS 0x00000020 // same for stairbuilding
|
||||||
|
#define GI_COMPATPOLY1 0x00000040 // Hexen's MAP36 needs old polyobject drawing
|
||||||
|
#define GI_COMPATPOLY2 0x00000080 // so does HEXDD's MAP47
|
||||||
|
|
||||||
#include "gametype.h"
|
#include "gametype.h"
|
||||||
|
|
||||||
|
|
|
@ -1133,6 +1133,7 @@ static menuitem_t CompatibilityItems[] = {
|
||||||
{ bitflag, "Invert sprite sorting", {&compatflags}, {0}, {0}, {0}, {(value_t *)COMPATF_SPRITESORT} },
|
{ bitflag, "Invert sprite sorting", {&compatflags}, {0}, {0}, {0}, {(value_t *)COMPATF_SPRITESORT} },
|
||||||
{ bitflag, "Use Doom code for hitscan checks", {&compatflags}, {0}, {0}, {0}, {(value_t *)COMPATF_HITSCAN} },
|
{ bitflag, "Use Doom code for hitscan checks", {&compatflags}, {0}, {0}, {0}, {(value_t *)COMPATF_HITSCAN} },
|
||||||
{ bitflag, "Cripple sound for silent BFG trick", {&compatflags}, {0}, {0}, {0}, {(value_t *)COMPATF_MAGICSILENCE} },
|
{ bitflag, "Cripple sound for silent BFG trick", {&compatflags}, {0}, {0}, {0}, {(value_t *)COMPATF_MAGICSILENCE} },
|
||||||
|
{ bitflag, "Draw polyobjects like Hexen", {&compatflags}, {0}, {0}, {0}, {(value_t *)COMPATF_POLYOBJ} },
|
||||||
|
|
||||||
{ discrete, "Interpolate monster movement", {&nomonsterinterpolation}, {2.0}, {0.0}, {0.0}, {NoYes} },
|
{ discrete, "Interpolate monster movement", {&nomonsterinterpolation}, {2.0}, {0.0}, {0.0}, {NoYes} },
|
||||||
};
|
};
|
||||||
|
|
|
@ -1752,8 +1752,8 @@ static void TranslateToStartSpot (int tag, int originX, int originY)
|
||||||
po->OriginalPts[i].y = po->Vertices[i]->y - po->StartSpot.y;
|
po->OriginalPts[i].y = po->Vertices[i]->y - po->StartSpot.y;
|
||||||
}
|
}
|
||||||
po->CalcCenter();
|
po->CalcCenter();
|
||||||
// subsector assignment no longer done here.
|
// For compatibility purposes
|
||||||
// Polyobjects will be sorted into the subsectors each frame before rendering them.
|
po->CenterSubsector = R_PointInSubsector(po->CenterSpot.x, po->CenterSpot.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -2193,7 +2193,29 @@ void FPolyObj::CreateSubsectorLinks()
|
||||||
seg->v2 = side->V2();
|
seg->v2 = side->V2();
|
||||||
seg->wall = side;
|
seg->wall = side;
|
||||||
}
|
}
|
||||||
SplitPoly(node, nodes + numnodes - 1, dummybbox);
|
if (!(i_compatflags & COMPATF_POLYOBJ))
|
||||||
|
{
|
||||||
|
SplitPoly(node, nodes + numnodes - 1, dummybbox);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
subsector_t *sub = CenterSubsector;
|
||||||
|
|
||||||
|
// Link node to subsector
|
||||||
|
node->pnext = sub->polys;
|
||||||
|
if (node->pnext != NULL)
|
||||||
|
{
|
||||||
|
assert(node->pnext->state == 1337);
|
||||||
|
node->pnext->pprev = node;
|
||||||
|
}
|
||||||
|
node->pprev = NULL;
|
||||||
|
sub->polys = node;
|
||||||
|
|
||||||
|
// link node to polyobject
|
||||||
|
node->snext = node->poly->subsectorlinks;
|
||||||
|
node->poly->subsectorlinks = node;
|
||||||
|
node->subsector = sub;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
|
@ -53,6 +53,7 @@ struct FPolyObj
|
||||||
FPolyVertex StartSpot;
|
FPolyVertex StartSpot;
|
||||||
FPolyVertex CenterSpot;
|
FPolyVertex CenterSpot;
|
||||||
FBoundingBox Bounds; // Bounds in map coordinates
|
FBoundingBox Bounds; // Bounds in map coordinates
|
||||||
|
subsector_t *CenterSubsector;
|
||||||
|
|
||||||
angle_t angle;
|
angle_t angle;
|
||||||
int tag; // reference tag assigned in HereticEd
|
int tag; // reference tag assigned in HereticEd
|
||||||
|
|
Loading…
Reference in a new issue