Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Magnus Norddahl 2016-06-12 00:08:05 +02:00
commit 351874be30
10 changed files with 123 additions and 69 deletions

View file

@ -1488,6 +1488,44 @@ FBaseCVar *FindCVarSub (const char *var_name, int namelen)
return var; return var;
} }
FBaseCVar *GetCVar(AActor *activator, const char *cvarname)
{
FBaseCVar *cvar = FindCVar(cvarname, nullptr);
// Either the cvar doesn't exist, or it's for a mod that isn't loaded, so return nullptr.
if (cvar == nullptr || (cvar->GetFlags() & CVAR_IGNORE))
{
return nullptr;
}
else
{
// For userinfo cvars, redirect to GetUserCVar
if (cvar->GetFlags() & CVAR_USERINFO)
{
if (activator == nullptr || activator->player == nullptr)
{
return nullptr;
}
return GetUserCVar(int(activator->player - players), cvarname);
}
return cvar;
}
}
FBaseCVar *GetUserCVar(int playernum, const char *cvarname)
{
if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum])
{
return nullptr;
}
FBaseCVar **cvar_p = players[playernum].userinfo.CheckKey(FName(cvarname, true));
FBaseCVar *cvar;
if (cvar_p == nullptr || (cvar = *cvar_p) == nullptr || (cvar->GetFlags() & CVAR_IGNORE))
{
return nullptr;
}
return cvar;
}
//=========================================================================== //===========================================================================
// //
// C_CreateCVar // C_CreateCVar

View file

@ -186,6 +186,10 @@ void C_BackupCVars (void);
FBaseCVar *FindCVar (const char *var_name, FBaseCVar **prev); FBaseCVar *FindCVar (const char *var_name, FBaseCVar **prev);
FBaseCVar *FindCVarSub (const char *var_name, int namelen); FBaseCVar *FindCVarSub (const char *var_name, int namelen);
// Used for ACS and DECORATE.
FBaseCVar *GetCVar(AActor *activator, const char *cvarname);
FBaseCVar *GetUserCVar(int playernum, const char *cvarname);
// Create a new cvar with the specified name and type // Create a new cvar with the specified name and type
FBaseCVar *C_CreateCVar(const char *var_name, ECVarType var_type, DWORD flags); FBaseCVar *C_CreateCVar(const char *var_name, ECVarType var_type, DWORD flags);

View file

@ -4657,7 +4657,11 @@ static int DoGetCVar(FBaseCVar *cvar, bool is_string)
{ {
UCVarValue val; UCVarValue val;
if (is_string) if (cvar == nullptr)
{
return 0;
}
else if (is_string)
{ {
val = cvar->GetGenericRep(CVAR_String); val = cvar->GetGenericRep(CVAR_String);
return GlobalACSStrings.AddString(val.String); return GlobalACSStrings.AddString(val.String);
@ -4674,44 +4678,6 @@ static int DoGetCVar(FBaseCVar *cvar, bool is_string)
} }
} }
static int GetUserCVar(int playernum, const char *cvarname, bool is_string)
{
if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum])
{
return 0;
}
FBaseCVar **cvar_p = players[playernum].userinfo.CheckKey(FName(cvarname, true));
FBaseCVar *cvar;
if (cvar_p == NULL || (cvar = *cvar_p) == NULL || (cvar->GetFlags() & CVAR_IGNORE))
{
return 0;
}
return DoGetCVar(cvar, is_string);
}
static int GetCVar(AActor *activator, const char *cvarname, bool is_string)
{
FBaseCVar *cvar = FindCVar(cvarname, NULL);
// Either the cvar doesn't exist, or it's for a mod that isn't loaded, so return 0.
if (cvar == NULL || (cvar->GetFlags() & CVAR_IGNORE))
{
return 0;
}
else
{
// For userinfo cvars, redirect to GetUserCVar
if (cvar->GetFlags() & CVAR_USERINFO)
{
if (activator == NULL || activator->player == NULL)
{
return 0;
}
return GetUserCVar(int(activator->player - players), cvarname, is_string);
}
return DoGetCVar(cvar, is_string);
}
}
static int SetUserCVar(int playernum, const char *cvarname, int value, bool is_string) static int SetUserCVar(int playernum, const char *cvarname, int value, bool is_string)
{ {
if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum]) if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum])
@ -5396,7 +5362,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
case ACSF_GetCVarString: case ACSF_GetCVarString:
if (argCount == 1) if (argCount == 1)
{ {
return GetCVar(activator, FBehavior::StaticLookupString(args[0]), true); return DoGetCVar(GetCVar(activator, FBehavior::StaticLookupString(args[0])), true);
} }
break; break;
@ -5417,14 +5383,14 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
case ACSF_GetUserCVar: case ACSF_GetUserCVar:
if (argCount == 2) if (argCount == 2)
{ {
return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), false); return DoGetCVar(GetUserCVar(args[0], FBehavior::StaticLookupString(args[1])), false);
} }
break; break;
case ACSF_GetUserCVarString: case ACSF_GetUserCVarString:
if (argCount == 2) if (argCount == 2)
{ {
return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), true); return DoGetCVar(GetUserCVar(args[0], FBehavior::StaticLookupString(args[1])), true);
} }
break; break;
@ -6048,7 +6014,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
PalEntry color = args[0]; PalEntry color = args[0];
bool fullbright = argCount > 1 ? !!args[1] : false; bool fullbright = argCount > 1 ? !!args[1] : false;
int lifetime = argCount > 2 ? args[2] : 35; int lifetime = argCount > 2 ? args[2] : 35;
int size = argCount > 3 ? args[3] : 1; double size = argCount > 3 ? args[3] : 1.;
int x = argCount > 4 ? args[4] : 0; int x = argCount > 4 ? args[4] : 0;
int y = argCount > 5 ? args[5] : 0; int y = argCount > 5 ? args[5] : 0;
int z = argCount > 6 ? args[6] : 0; int z = argCount > 6 ? args[6] : 0;
@ -6060,17 +6026,18 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
int accelz = argCount > 12 ? args[12] : 0; int accelz = argCount > 12 ? args[12] : 0;
int startalpha = argCount > 13 ? args[13] : 0xFF; // Byte trans int startalpha = argCount > 13 ? args[13] : 0xFF; // Byte trans
int fadestep = argCount > 14 ? args[14] : -1; int fadestep = argCount > 14 ? args[14] : -1;
double endsize = argCount > 15 ? args[15] : -1.;
startalpha = clamp<int>(startalpha, 0, 255); // Clamp to byte startalpha = clamp<int>(startalpha, 0, 255); // Clamp to byte
lifetime = clamp<int>(lifetime, 0, 255); // Clamp to byte lifetime = clamp<int>(lifetime, 0, 255); // Clamp to byte
fadestep = clamp<int>(fadestep, -1, 255); // Clamp to byte inc. -1 (indicating automatic) fadestep = clamp<int>(fadestep, -1, 255); // Clamp to byte inc. -1 (indicating automatic)
size = clamp<int>(size, 0, 65535); // Clamp to word size = fabs(size);
if (lifetime != 0) if (lifetime != 0)
P_SpawnParticle(DVector3(ACSToDouble(x), ACSToDouble(y), ACSToDouble(z)), P_SpawnParticle(DVector3(ACSToDouble(x), ACSToDouble(y), ACSToDouble(z)),
DVector3(ACSToDouble(xvel), ACSToDouble(yvel), ACSToDouble(zvel)), DVector3(ACSToDouble(xvel), ACSToDouble(yvel), ACSToDouble(zvel)),
DVector3(ACSToDouble(accelx), ACSToDouble(accely), ACSToDouble(accelz)), DVector3(ACSToDouble(accelx), ACSToDouble(accely), ACSToDouble(accelz)),
color, fullbright, startalpha/255., lifetime, size, fadestep/255.); color, startalpha/255., lifetime, size, endsize, fadestep/255., fullbright);
} }
break; break;
@ -9131,7 +9098,7 @@ scriptwait:
break; break;
case PCD_GETCVAR: case PCD_GETCVAR:
STACK(1) = GetCVar(activator, FBehavior::StaticLookupString(STACK(1)), false); STACK(1) = DoGetCVar(GetCVar(activator, FBehavior::StaticLookupString(STACK(1))), false);
break; break;
case PCD_SETHUDSIZE: case PCD_SETHUDSIZE:

View file

@ -252,7 +252,6 @@ void P_InitEffects ()
blood2 = ParticleColor(RPART(kind)/3, GPART(kind)/3, BPART(kind)/3); blood2 = ParticleColor(RPART(kind)/3, GPART(kind)/3, BPART(kind)/3);
} }
void P_ThinkParticles () void P_ThinkParticles ()
{ {
int i; int i;
@ -262,13 +261,19 @@ void P_ThinkParticles ()
prev = NULL; prev = NULL;
while (i != NO_PARTICLE) while (i != NO_PARTICLE)
{ {
BYTE oldtrans;
particle = Particles + i; particle = Particles + i;
i = particle->tnext; i = particle->tnext;
if (!particle->notimefreeze && ((bglobal.freeze) || (level.flags2 & LEVEL2_FROZEN)))
{
prev = particle;
continue;
}
BYTE oldtrans;
oldtrans = particle->trans; oldtrans = particle->trans;
particle->trans -= particle->fade; particle->trans -= particle->fade;
if (oldtrans < particle->trans || --particle->ttl == 0) particle->size += particle->sizestep;
if (oldtrans < particle->trans || --particle->ttl <= 0 || (particle->size <= 0))
{ // The particle has expired, so free it { // The particle has expired, so free it
memset (particle, 0, sizeof(particle_t)); memset (particle, 0, sizeof(particle_t));
if (prev) if (prev)
@ -309,8 +314,14 @@ void P_ThinkParticles ()
} }
} }
enum PSFlag
{
PS_FULLBRIGHT = 1,
PS_NOTIMEFREEZE = 1 << 5,
};
void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, bool fullbright, double startalpha, int lifetime, WORD size, double fadestep) void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size,
double fadestep, double sizestep, int flags)
{ {
particle_t *particle = NewParticle(); particle_t *particle = NewParticle();
@ -324,8 +335,10 @@ void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &a
if (fadestep < 0) particle->fade = FADEFROMTTL(lifetime); if (fadestep < 0) particle->fade = FADEFROMTTL(lifetime);
else particle->fade = int(fadestep * 255); else particle->fade = int(fadestep * 255);
particle->ttl = lifetime; particle->ttl = lifetime;
particle->bright = fullbright; particle->bright = !!(flags & PS_FULLBRIGHT);
particle->size = (WORD)size; particle->size = size;
particle->sizestep = sizestep;
particle->notimefreeze = !!(flags & PS_NOTIMEFREEZE);
} }
} }
@ -462,8 +475,8 @@ void P_RunEffect (AActor *actor, int effects)
speed = (M_Random () - 128) * (1./200); speed = (M_Random () - 128) * (1./200);
particle->Vel.X += speed * an.Cos(); particle->Vel.X += speed * an.Cos();
particle->Vel.Y += speed * an.Sin(); particle->Vel.Y += speed * an.Sin();
particle->Vel.Z -= 1. / 80; particle->Vel.Z += 1. / 80;
particle->Acc.Z -= 1. / 40; particle->Acc.Z += 1. / 40;
if (M_Random () & 7) if (M_Random () & 7)
particle->color = grey2; particle->color = grey2;
else else

View file

@ -59,13 +59,15 @@ struct particle_t
DVector3 Acc; DVector3 Acc;
BYTE ttl; BYTE ttl;
BYTE trans; BYTE trans;
WORD size; double size;
double sizestep;
BYTE bright; BYTE bright;
BYTE fade; BYTE fade;
int color; int color;
WORD tnext; WORD tnext;
WORD snext; WORD snext;
subsector_t * subsector; subsector_t * subsector;
bool notimefreeze;
}; };
extern particle_t *Particles; extern particle_t *Particles;
@ -83,7 +85,7 @@ particle_t *JitterParticle (int ttl);
particle_t *JitterParticle (int ttl, double drift); particle_t *JitterParticle (int ttl, double drift);
void P_ThinkParticles (void); void P_ThinkParticles (void);
void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, bool fullbright, double startalpha, int lifetime, WORD size, double fadestep); void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size, double fadestep, double sizestep, int flags = 0);
void P_InitEffects (void); void P_InitEffects (void);
void P_RunEffects (void); void P_RunEffects (void);

View file

@ -117,10 +117,7 @@ void P_Ticker (void)
// Since things will be moving, it's okay to interpolate them in the renderer. // Since things will be moving, it's okay to interpolate them in the renderer.
r_NoInterpolate = false; r_NoInterpolate = false;
if (!bglobal.freeze && !(level.flags2 & LEVEL2_FROZEN)) P_ThinkParticles(); // [RH] make the particles think
{
P_ThinkParticles (); // [RH] make the particles think
}
for (i = 0; i<MAXPLAYERS; i++) for (i = 0; i<MAXPLAYERS; i++)
if (playeringame[i] && if (playeringame[i] &&

View file

@ -2473,7 +2473,7 @@ void R_ProjectParticle (particle_t *particle, const sector_t *sector, int shade,
return; return;
yscale = xs_RoundToInt(YaspectMul * xscale); yscale = xs_RoundToInt(YaspectMul * xscale);
ty = FLOAT2FIXED(particle->Pos.Z - ViewPos.Z); ty = particle->Pos.Z - ViewPos.Z;
y1 = xs_RoundToInt(CenterY - (ty + psize) * yscale); y1 = xs_RoundToInt(CenterY - (ty + psize) * yscale);
y2 = xs_RoundToInt(CenterY - (ty - psize) * yscale); y2 = xs_RoundToInt(CenterY - (ty - psize) * yscale);

View file

@ -513,6 +513,36 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetCrouchFactor)
return 0; return 0;
} }
//==========================================================================
//
// GetCVar
//
// NON-ACTION function that works like ACS's GetCVar.
//
//==========================================================================
DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetCVar)
{
if (numret > 0)
{
assert(ret != nullptr);
PARAM_SELF_PROLOGUE(AActor);
PARAM_STRING(cvarname);
FBaseCVar *cvar = GetCVar(self, cvarname);
if (cvar == nullptr)
{
ret->SetFloat(0);
}
else
{
ret->SetFloat(cvar->GetGenericRep(CVAR_Float).Float);
}
return 1;
}
return 0;
}
//=========================================================================== //===========================================================================
// //
// __decorate_internal_state__ // __decorate_internal_state__
@ -3147,6 +3177,7 @@ enum SPFflag
SPF_RELVEL = 1 << 2, SPF_RELVEL = 1 << 2,
SPF_RELACCEL = 1 << 3, SPF_RELACCEL = 1 << 3,
SPF_RELANG = 1 << 4, SPF_RELANG = 1 << 4,
SPF_NOTIMEFREEZE = 1 << 5,
}; };
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnParticle) DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnParticle)
@ -3155,7 +3186,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnParticle)
PARAM_COLOR (color); PARAM_COLOR (color);
PARAM_INT_OPT (flags) { flags = 0; } PARAM_INT_OPT (flags) { flags = 0; }
PARAM_INT_OPT (lifetime) { lifetime = 35; } PARAM_INT_OPT (lifetime) { lifetime = 35; }
PARAM_INT_OPT (size) { size = 1; } PARAM_FLOAT_OPT (size) { size = 1.; }
PARAM_ANGLE_OPT (angle) { angle = 0.; } PARAM_ANGLE_OPT (angle) { angle = 0.; }
PARAM_FLOAT_OPT (xoff) { xoff = 0; } PARAM_FLOAT_OPT (xoff) { xoff = 0; }
PARAM_FLOAT_OPT (yoff) { yoff = 0; } PARAM_FLOAT_OPT (yoff) { yoff = 0; }
@ -3168,11 +3199,11 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnParticle)
PARAM_FLOAT_OPT (accelz) { accelz = 0; } PARAM_FLOAT_OPT (accelz) { accelz = 0; }
PARAM_FLOAT_OPT (startalpha) { startalpha = 1.; } PARAM_FLOAT_OPT (startalpha) { startalpha = 1.; }
PARAM_FLOAT_OPT (fadestep) { fadestep = -1.; } PARAM_FLOAT_OPT (fadestep) { fadestep = -1.; }
PARAM_FLOAT_OPT (sizestep) { sizestep = 0.; }
startalpha = clamp(startalpha, 0., 1.); startalpha = clamp(startalpha, 0., 1.);
if (fadestep > 0) fadestep = clamp(fadestep, 0., 1.); if (fadestep > 0) fadestep = clamp(fadestep, 0., 1.);
size = clamp<int>(size, 0, 65535); // Clamp to word size = fabs(size);
if (lifetime != 0) if (lifetime != 0)
{ {
if (flags & SPF_RELANG) angle += self->Angles.Yaw; if (flags & SPF_RELANG) angle += self->Angles.Yaw;
@ -3199,7 +3230,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnParticle)
acc.X = accelx * c + accely * s; acc.X = accelx * c + accely * s;
acc.Y = accelx * s - accely * c; acc.Y = accelx * s - accely * c;
} }
P_SpawnParticle(self->Vec3Offset(pos), vel, acc, color, !!(flags & SPF_FULLBRIGHT), startalpha, lifetime, size, fadestep); P_SpawnParticle(self->Vec3Offset(pos), vel, acc, color, startalpha, lifetime, size, fadestep, sizestep, flags);
} }
return 0; return 0;
} }
@ -6900,10 +6931,10 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FaceMovementDirection)
{ {
DAngle current = mobj->Angles.Pitch; DAngle current = mobj->Angles.Pitch;
const DVector2 velocity = mobj->Vel.XY(); const DVector2 velocity = mobj->Vel.XY();
DAngle pitch = VecToAngle(velocity.Length(), -mobj->Vel.Z); DAngle pitch = VecToAngle(velocity.Length(), mobj->Vel.Z);
if (pitchlimit > 0) if (pitchlimit > 0)
{ {
DAngle pdelta = deltaangle(current, pitch); DAngle pdelta = deltaangle(-current, pitch);
if (fabs(pdelta) > pitchlimit) if (fabs(pdelta) > pitchlimit)
{ {

View file

@ -47,6 +47,7 @@ ACTOR Actor native //: Thinker
native int GetSpawnHealth(); native int GetSpawnHealth();
native int GetGibHealth(); native int GetGibHealth();
native float GetCrouchFactor(int ptr = AAPTR_PLAYER1); native float GetCrouchFactor(int ptr = AAPTR_PLAYER1);
native float GetCVar(string cvar);
// Action functions // Action functions
// Meh, MBF redundant functions. Only for DeHackEd support. // Meh, MBF redundant functions. Only for DeHackEd support.
@ -214,7 +215,7 @@ ACTOR Actor native //: Thinker
native void A_SetScale(float scalex, float scaley = 0, int ptr = AAPTR_DEFAULT, bool usezero = false); native void A_SetScale(float scalex, float scaley = 0, int ptr = AAPTR_DEFAULT, bool usezero = false);
native void A_SetMass(int mass); native void A_SetMass(int mass);
native void A_SpawnDebris(class<Actor> spawntype, bool transfer_translation = false, float mult_h = 1, float mult_v = 1); native void A_SpawnDebris(class<Actor> spawntype, bool transfer_translation = false, float mult_h = 1, float mult_v = 1);
native void A_SpawnParticle(color color1, int flags = 0, int lifetime = 35, int size = 1, float angle = 0, float xoff = 0, float yoff = 0, float zoff = 0, float velx = 0, float vely = 0, float velz = 0, float accelx = 0, float accely = 0, float accelz = 0, float startalphaf = 1, float fadestepf = -1); native void A_SpawnParticle(color color1, int flags = 0, int lifetime = 35, float size = 1, float angle = 0, float xoff = 0, float yoff = 0, float zoff = 0, float velx = 0, float vely = 0, float velz = 0, float accelx = 0, float accely = 0, float accelz = 0, float startalphaf = 1, float fadestepf = -1, float sizestep = 0);
native state A_CheckSight(state label); native state A_CheckSight(state label);
native void A_ExtChase(bool usemelee, bool usemissile, bool playactive = true, bool nightmarefast = false); native void A_ExtChase(bool usemelee, bool usemissile, bool playactive = true, bool nightmarefast = false);
native void A_DropInventory(class<Inventory> itemtype); native void A_DropInventory(class<Inventory> itemtype);

View file

@ -539,6 +539,7 @@ enum
SPF_RELVEL = 1 << 2, SPF_RELVEL = 1 << 2,
SPF_RELACCEL = 1 << 3, SPF_RELACCEL = 1 << 3,
SPF_RELANG = 1 << 4, SPF_RELANG = 1 << 4,
SPF_NOTIMEFREEZE = 1 << 5,
SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG
}; };