- fixed: A_PainShootSkull was missing a NULL pointer check for the spawn type.

- implemented Vavoom's vertex height things (1504, 1505) that can explicitly
  define slopes for triangular sectors. The height is specified as the thing's
  z-coordinate.


SVN r804 (trunk)
This commit is contained in:
Christoph Oelckers 2008-03-14 09:27:02 +00:00
parent 9b17dea727
commit 091c73969d
4 changed files with 124 additions and 1 deletions

View file

@ -1,3 +1,9 @@
March 14, 2008 (Changes by Graf Zahl)
- fixed: A_PainShootSkull was missing a NULL pointer check for the spawn type.
- implemented Vavoom's vertex height things (1504, 1505) that can explicitly
define slopes for triangular sectors. The height is specified as the thing's
z-coordinate.
March 13, 2008
- Fixed: When returning to a hub map, inventory belonging to the temporary
copies of the players stored in the archive would be destroyed and break

View file

@ -155,7 +155,7 @@ inline void SPC_DSP::init_counter()
// counters start out with this synchronization
m.counters [0] = 1;
m.counters [1] = 0;
m.counters [2] = -0x20u;
m.counters [2] = unsigned(-0x20);
m.counters [3] = 0x0B;
int n = 2;

View file

@ -35,6 +35,7 @@ void A_PainShootSkull (AActor *self, angle_t angle, const PClass *spawntype)
angle_t an;
int prestep;
if (spawntype == NULL) return;
if (self->DamageType==NAME_Massacre) return;
// [RH] check to make sure it's not too close to the ceiling

View file

@ -1483,8 +1483,122 @@ enum
THING_CopyCeilingPlane = 9511,
THING_VavoomFloor=1500,
THING_VavoomCeiling=1501,
THING_VertexFloorZ=1504,
THING_VertexCeilingZ=1505,
};
//==========================================================================
//
// P_SetSlopesFromVertexHeights
//
//==========================================================================
static void P_SetSlopesFromVertexHeights(mapthing2_t *firstmt, mapthing2_t *lastmt)
{
TMap<int, fixed_t> vt_heights[2];
mapthing2_t *mt;
bool vt_found = false;
for (mt = firstmt; mt < lastmt; ++mt)
{
if (mt->type == THING_VertexFloorZ || mt->type == THING_VertexCeilingZ)
{
for(int i=0; i<numvertexes; i++)
{
if (vertexes[i].x == mt->x << FRACBITS && vertexes[i].y == mt->y << FRACBITS)
{
if (mt->type == THING_VertexFloorZ)
{
vt_heights[0][i] = mt->z << FRACBITS;
}
else
{
vt_heights[1][i] = mt->z << FRACBITS;
}
vt_found = true;
}
}
mt->type = 0;
}
}
if (vt_found)
{
for (int i = 0; i < numsectors; i++)
{
sector_t *sec = &sectors[i];
if (sec->linecount != 3) continue; // only works with triangular sectors
FVector3 vt1, vt2, vt3, cross;
FVector3 vec1, vec2;
int vi1, vi2, vi3;
vi1 = sec->lines[0]->v1 - vertexes;
vi2 = sec->lines[0]->v2 - vertexes;
vi3 = (sec->lines[1]->v1 == sec->lines[0]->v1 || sec->lines[1]->v1 == sec->lines[0]->v2)?
sec->lines[1]->v2 - vertexes : sec->lines[1]->v1 - vertexes;
vt1.X = FIXED2FLOAT(vertexes[vi1].x);
vt1.Y = FIXED2FLOAT(vertexes[vi1].y);
vt2.X = FIXED2FLOAT(vertexes[vi2].x);
vt2.Y = FIXED2FLOAT(vertexes[vi2].y);
vt3.X = FIXED2FLOAT(vertexes[vi3].x);
vt3.Y = FIXED2FLOAT(vertexes[vi3].y);
for(int j=0; j<2; j++)
{
fixed_t *h1 = vt_heights[j].CheckKey(vi1);
fixed_t *h2 = vt_heights[j].CheckKey(vi2);
fixed_t *h3 = vt_heights[j].CheckKey(vi3);
fixed_t z3;
if (h1==NULL && h2==NULL && h3==NULL) continue;
vt1.Z = FIXED2FLOAT(h1? *h1 : j==0? sec->floortexz : sec->ceilingtexz);
vt2.Z = FIXED2FLOAT(h2? *h2 : j==0? sec->floortexz : sec->ceilingtexz);
z3 = h3? *h3 : j==0? sec->floortexz : sec->ceilingtexz;
vt3.Z = FIXED2FLOAT(z3);
if (P_PointOnLineSide(vertexes[vi3].x, vertexes[vi3].y, sec->lines[0]) == 0)
{
vec1 = vt2 - vt3;
vec2 = vt1 - vt3;
}
else
{
vec1 = vt1 - vt3;
vec2 = vt2 - vt3;
}
FVector3 cross = vec1 ^ vec2;
double len = cross.Length();
if (len == 0)
{
// Only happens when all vertices in this sector are on the same line.
// Let's just ignore this case.
continue;
}
cross /= len;
// Fix backward normals
if ((cross.Z < 0 && j == 0) || (cross.Z > 0 && j == 1))
{
cross = -cross;
}
secplane_t *srcplane = j==0? &sec->floorplane : &sec->ceilingplane;
srcplane->a = FLOAT2FIXED (cross[0]);
srcplane->b = FLOAT2FIXED (cross[1]);
srcplane->c = FLOAT2FIXED (cross[2]);
srcplane->ic = DivScale32 (1, srcplane->c);
srcplane->d = -TMulScale16 (srcplane->a, vertexes[vi3].x,
srcplane->b, vertexes[vi3].y,
srcplane->c, z3);
}
}
}
}
//===========================================================================
//
// P_SpawnSlopeMakers
@ -1542,6 +1656,8 @@ static void P_SpawnSlopeMakers (mapthing2_t *firstmt, mapthing2_t *lastmt)
mt->type = 0;
}
}
P_SetSlopesFromVertexHeights(firstmt, lastmt);
}
//===========================================================================