mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-10 23:01:50 +00:00
- Added the MF2_PASSMOBJ for P_Thing_Spawn() from January 4, 2003, to
DLevelScript::DoSpawn(). - Changed VectorNormalize() (and VectorNormalize2) to use doubles for storing the vector lengths, fixing desyncs between GCC/VC++ games that happened because the two compilers produced slightly different results for some slopes. GCC kept them in registers, so they were never truncated to floats. VC++ stored them to memory and reloaded them in order to truncate them to the defined precision. Lesson learned: Floating point numbers in local variables should always be doubles to produce the best code with VC++ that has the best chance of matching GCC's default behavior. - Removed netget and netsend function pointers. PacketGet and PacketSend are now called directly. - Fixed: Watching a demo from the point of view of someone other than the first player could cause a crash when the demo ended. - Removed invcount from the expression evaluator at Grubber's suggestion, because it doesn't work. - Fixed: vid_nowidescreen should fire off setsizeneeded so that changes to it can happen immediately instead of at the next resolution change. SVN r355 (trunk)
This commit is contained in:
parent
7c1fbe7ee5
commit
35ca16ba4f
8 changed files with 47 additions and 61 deletions
|
@ -1,4 +1,22 @@
|
|||
October 19, 2006
|
||||
- Added the MF2_PASSMOBJ for P_Thing_Spawn() from January 4, 2003, to
|
||||
DLevelScript::DoSpawn().
|
||||
- Changed VectorNormalize() (and VectorNormalize2) to use doubles for storing
|
||||
the vector lengths, fixing desyncs between GCC/VC++ games that happened
|
||||
because the two compilers produced slightly different results for some
|
||||
slopes. GCC kept them in registers, so they were never truncated to floats.
|
||||
VC++ stored them to memory and reloaded them in order to truncate them to
|
||||
the defined precision. Lesson learned: Floating point numbers in local
|
||||
variables should always be doubles to produce the best code with VC++ that
|
||||
has the best chance of matching GCC's default behavior.
|
||||
- Removed netget and netsend function pointers. PacketGet and PacketSend are
|
||||
now called directly.
|
||||
- Fixed: Watching a demo from the point of view of someone other than the
|
||||
first player could cause a crash when the demo ended.
|
||||
- Removed invcount from the expression evaluator at Grubber's suggestion,
|
||||
because it doesn't work.
|
||||
- Fixed: vid_nowidescreen should fire off setsizeneeded so that changes to it
|
||||
can happen immediately instead of at the next resolution change.
|
||||
- Modified the way autosaves are done. Instead of setting gameaction to
|
||||
ga_autosave, write DEM_CHECKAUTOSAVE to the net stream. When this is
|
||||
processed, it will check if it's okay to do an autosave. If it is, it writes
|
||||
|
|
|
@ -2526,6 +2526,8 @@ bool G_CheckDemoStatus (void)
|
|||
playeringame[i] = 0;
|
||||
}
|
||||
consoleplayer = 0;
|
||||
players[0].camera = NULL;
|
||||
StatusBar->AttachToPlayer (&players[0]);
|
||||
|
||||
if (singledemo || timingdemo)
|
||||
{
|
||||
|
|
|
@ -96,9 +96,6 @@ static SOCKET mysocket = INVALID_SOCKET;
|
|||
static sockaddr_in sendaddress[MAXNETNODES];
|
||||
static BYTE sendplayer[MAXNETNODES];
|
||||
|
||||
void (*netget) (void);
|
||||
void (*netsend) (void);
|
||||
|
||||
#ifdef __WIN32__
|
||||
char *neterror (void);
|
||||
#else
|
||||
|
@ -351,8 +348,6 @@ void StartNetwork (bool autoPort)
|
|||
|
||||
atterm (CloseNetwork);
|
||||
|
||||
netsend = PacketSend;
|
||||
netget = PacketGet;
|
||||
netgame = true;
|
||||
multiplayer = true;
|
||||
|
||||
|
@ -828,11 +823,11 @@ void I_NetCmd (void)
|
|||
{
|
||||
if (doomcom.command == CMD_SEND)
|
||||
{
|
||||
netsend ();
|
||||
PacketSend ();
|
||||
}
|
||||
else if (doomcom.command == CMD_GET)
|
||||
{
|
||||
netget ();
|
||||
PacketGet ();
|
||||
}
|
||||
else
|
||||
I_Error ("Bad net cmd: %i\n",doomcom.command);
|
||||
|
|
|
@ -1908,6 +1908,8 @@ int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, i
|
|||
actor = Spawn (info, x, y, z, ALLOW_REPLACE);
|
||||
if (actor != NULL)
|
||||
{
|
||||
DWORD oldFlags2 = actor->flags2;
|
||||
actor->flags2 |= MF2_PASSMOBJ;
|
||||
if (P_TestMobjLocation (actor))
|
||||
{
|
||||
actor->angle = angle << 24;
|
||||
|
@ -1915,6 +1917,7 @@ int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, i
|
|||
actor->AddToHash ();
|
||||
if (actor->flags & MF_SPECIAL)
|
||||
actor->flags |= MF_DROPPED; // Don't respawn
|
||||
actor->flags2 = oldFlags2;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -1318,7 +1318,6 @@ static void P_SlopeLineToPoint (int lineid, fixed_t x, fixed_t y, fixed_t z, boo
|
|||
return;
|
||||
}
|
||||
VectorNormalize (cross);
|
||||
|
||||
// Fix backward normals
|
||||
if ((cross[2] < 0 && !slopeCeil) || (cross[2] > 0 && slopeCeil))
|
||||
{
|
||||
|
|
|
@ -88,7 +88,6 @@ enum ExpOp
|
|||
EX_Random, // random (min, max)
|
||||
EX_Sin, // sin (angle)
|
||||
EX_Cos, // cos (angle)
|
||||
EX_InvCount, // invcount (type)
|
||||
EX_ActionSpecial,
|
||||
EX_Right,
|
||||
};
|
||||
|
@ -264,10 +263,7 @@ struct ExpData
|
|||
{
|
||||
if (Children[i])
|
||||
{
|
||||
if (Type == EX_InvCount)
|
||||
free (Children[i]);
|
||||
else
|
||||
delete Children[i];
|
||||
delete Children[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -307,7 +303,7 @@ struct ExpData
|
|||
delete data;
|
||||
}
|
||||
}
|
||||
else if (Type != EX_Random && Type != EX_Sin && Type != EX_Cos && Type != EX_InvCount && Type != EX_ActionSpecial)
|
||||
else if (Type != EX_Random && Type != EX_Sin && Type != EX_Cos && Type != EX_ActionSpecial)
|
||||
{
|
||||
if (Children[0]->Type == EX_Const && Children[1]->Type == EX_Const)
|
||||
{
|
||||
|
@ -751,22 +747,6 @@ static ExpData *ParseExpressionA ()
|
|||
|
||||
return data;
|
||||
}
|
||||
else if (SC_CheckString ("invcount"))
|
||||
{
|
||||
if (!SC_CheckString ("("))
|
||||
SC_ScriptError ("'(' expected");
|
||||
|
||||
ExpData *data = new ExpData;
|
||||
data->Type = EX_InvCount;
|
||||
|
||||
SC_MustGetString ();
|
||||
data->Children[0] = (ExpData *)strdup (sc_String);
|
||||
|
||||
if (!SC_CheckString (")"))
|
||||
SC_ScriptError ("')' expected");
|
||||
|
||||
return data;
|
||||
}
|
||||
else if (SC_CheckNumber ())
|
||||
{
|
||||
ExpData *data = new ExpData;
|
||||
|
@ -1473,24 +1453,6 @@ static ExpVal EvalExpression (ExpData *data, AActor *self)
|
|||
}
|
||||
break;
|
||||
|
||||
case EX_InvCount:
|
||||
{
|
||||
const char *name = (const char *)data->Children[0];
|
||||
const PClass *type = PClass::FindClass (name);
|
||||
|
||||
val.Type = VAL_Int;
|
||||
val.Int = 0;
|
||||
|
||||
if (!type)
|
||||
break;
|
||||
|
||||
AInventory *item = self->FindInventory (type);
|
||||
|
||||
if (item)
|
||||
val.Int = item->Amount;
|
||||
}
|
||||
break;
|
||||
|
||||
case EX_ActionSpecial:
|
||||
{
|
||||
int parms[5] = { 0, 0, 0, 0 };
|
||||
|
|
|
@ -942,7 +942,14 @@ void V_Shutdown()
|
|||
}
|
||||
|
||||
EXTERN_CVAR (Bool, vid_tft)
|
||||
CVAR (Bool, vid_nowidescreen, false, CVAR_GLOBALCONFIG|CVAR_ARCHIVE)
|
||||
CUSTOM_CVAR (Bool, vid_nowidescreen, false, CVAR_GLOBALCONFIG|CVAR_ARCHIVE)
|
||||
{
|
||||
setsizeneeded = true;
|
||||
if (StatusBar != NULL)
|
||||
{
|
||||
StatusBar->ScreenSizeChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// Tries to guess the physical dimensions of the screen based on the
|
||||
// screen's pixel dimensions. Can return:
|
||||
|
|
|
@ -64,39 +64,39 @@ int VectorCompare (const vec3_t v1, const vec3_t v2)
|
|||
|
||||
vec_t VectorNormalize (vec3_t v)
|
||||
{
|
||||
float length, ilength;
|
||||
double length, ilength;
|
||||
|
||||
length = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
|
||||
length = sqrtf (length);
|
||||
length = sqrt (length);
|
||||
|
||||
if (length)
|
||||
{
|
||||
ilength = 1/length;
|
||||
v[0] *= ilength;
|
||||
v[1] *= ilength;
|
||||
v[2] *= ilength;
|
||||
v[0] = vec_t(v[0] * ilength);
|
||||
v[1] = vec_t(v[1] * ilength);
|
||||
v[2] = vec_t(v[2] * ilength);
|
||||
}
|
||||
|
||||
return length;
|
||||
return vec_t(length);
|
||||
|
||||
}
|
||||
|
||||
vec_t VectorNormalize2 (const vec3_t v, vec3_t out)
|
||||
{
|
||||
float length, ilength;
|
||||
double length, ilength;
|
||||
|
||||
length = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
|
||||
length = sqrtf (length);
|
||||
length = sqrt (length);
|
||||
|
||||
if (length)
|
||||
{
|
||||
ilength = 1/length;
|
||||
out[0] = v[0]*ilength;
|
||||
out[1] = v[1]*ilength;
|
||||
out[2] = v[2]*ilength;
|
||||
out[0] = vec_t(v[0] * ilength);
|
||||
out[1] = vec_t(v[1] * ilength);
|
||||
out[2] = vec_t(v[2] * ilength);
|
||||
}
|
||||
|
||||
return length;
|
||||
return vec_t(length);
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue