Merge branch 'master' into scripting

Conflicts:
	src/p_effect.cpp
	src/p_effect.h
	src/p_local.h
	src/p_map.cpp
	src/thingdef/thingdef_codeptr.cpp
This commit is contained in:
Christoph Oelckers 2015-07-16 20:37:17 +02:00
commit d8ea128f38
27 changed files with 220 additions and 85 deletions

View file

@ -1260,18 +1260,20 @@ if( APPLE )
LINK_FLAGS "-framework Carbon -framework Cocoa -framework IOKit -framework OpenGL" LINK_FLAGS "-framework Carbon -framework Cocoa -framework IOKit -framework OpenGL"
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/zdoom-info.plist" ) MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/zdoom-info.plist" )
# Fix fmod link so that it can be found in the app bundle. if( NOT NO_FMOD )
find_program( OTOOL otool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" ) # Fix fmod link so that it can be found in the app bundle.
find_program( INSTALL_NAME_TOOL install_name_tool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" ) find_program( OTOOL otool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" )
execute_process( COMMAND "${OTOOL}" -L "${FMOD_LIBRARY}" find_program( INSTALL_NAME_TOOL install_name_tool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" )
COMMAND grep "libfmodex.dylib (compat" execute_process( COMMAND "${OTOOL}" -L "${FMOD_LIBRARY}"
COMMAND head -n1 COMMAND grep "libfmodex.dylib (compat"
COMMAND awk "{print $1}" COMMAND head -n1
OUTPUT_VARIABLE FMOD_LINK COMMAND awk "{print $1}"
OUTPUT_STRIP_TRAILING_WHITESPACE ) OUTPUT_VARIABLE FMOD_LINK
add_custom_command( TARGET zdoom POST_BUILD OUTPUT_STRIP_TRAILING_WHITESPACE )
COMMAND "${INSTALL_NAME_TOOL}" -change "${FMOD_LINK}" @executable_path/../Frameworks/libfmodex.dylib "$<TARGET_FILE:zdoom>" add_custom_command( TARGET zdoom POST_BUILD
COMMENT "Relinking FMOD Ex" ) COMMAND "${INSTALL_NAME_TOOL}" -change "${FMOD_LINK}" @executable_path/../Frameworks/libfmodex.dylib "$<TARGET_FILE:zdoom>"
COMMENT "Relinking FMOD Ex" )
endif( NOT NO_FMOD )
endif( APPLE ) endif( APPLE )
source_group("Assembly Files\\ia32" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/asm_ia32/.+") source_group("Assembly Files\\ia32" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/asm_ia32/.+")

View file

@ -1076,7 +1076,8 @@ FString BuildString (int argc, FString *argv)
// %x or %{x} in the command line with argument x. If argument x does not // %x or %{x} in the command line with argument x. If argument x does not
// exist, then the empty string is substituted in its place. // exist, then the empty string is substituted in its place.
// //
// Substitution is not done inside of quoted strings. // Substitution is not done inside of quoted strings, unless that string is
// prepended with a % character.
// //
// To avoid a substitution, use %%. The %% will be replaced by a single %. // To avoid a substitution, use %%. The %% will be replaced by a single %.
// //
@ -1091,19 +1092,12 @@ FString SubstituteAliasParams (FString &command, FCommandLine &args)
char *p = command.LockBuffer(), *start = p; char *p = command.LockBuffer(), *start = p;
unsigned long argnum; unsigned long argnum;
FString buf; FString buf;
bool inquote = false;
while (*p != '\0') while (*p != '\0')
{ {
if (*p == '%' && ((p[1] >= '0' && p[1] <= '9') || p[1] == '{' || p[1] == '%')) if (p[0] == '%' && ((p[1] >= '0' && p[1] <= '9') || p[1] == '{'))
{ {
if (p[1] == '%')
{
// Do not substitute. Just collapse to a single %.
buf.AppendCStrPart (start, p - start + 1);
start = p = p + 2;
continue;
}
// Do a substitution. Output what came before this. // Do a substitution. Output what came before this.
buf.AppendCStrPart (start, p - start); buf.AppendCStrPart (start, p - start);
@ -1115,14 +1109,50 @@ FString SubstituteAliasParams (FString &command, FCommandLine &args)
} }
p = (start += (p[1] == '{' && *start == '}')); p = (start += (p[1] == '{' && *start == '}'));
} }
else if (*p == '"') else if (p[0] == '%' && p[1] == '%')
{ {
// Don't substitute inside quoted strings. // Do not substitute. Just collapse to a single %.
p++; buf.AppendCStrPart (start, p - start + 1);
while (*p != '\0' && (*p != '"' || *(p-1) == '\\')) start = p = p + 2;
continue;
}
else if (p[0] == '%' && p[1] == '"')
{
// Collapse %" to " and remember that we're in a quote so when we
// see a " character again, we don't start skipping below.
if (!inquote)
{
inquote = true;
buf.AppendCStrPart(start, p - start);
start = p + 1;
}
else
{
inquote = false;
}
p += 2;
}
else if (p[0] == '\\' && p[1] == '"')
{
p += 2;
}
else if (p[0] == '"')
{
// Don't substitute inside quoted strings if it didn't start
// with a %"
if (!inquote)
{
p++; p++;
if (*p != '\0') while (*p != '\0' && (*p != '"' || *(p-1) == '\\'))
p++;
if (*p != '\0')
p++;
}
else
{
inquote = false;
p++; p++;
}
} }
else else
{ {

View file

@ -678,7 +678,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BFGSpray)
if (spray != NULL) if (spray != NULL)
{ {
if (spray->flags6 & MF6_MTHRUSPECIES && spray->GetSpecies() == linetarget->GetSpecies()) if (spray->flags6 & MF6_MTHRUSPECIES && self->target->GetSpecies() == linetarget->GetSpecies())
{ {
spray->Destroy(); // [MC] Remove it because technically, the spray isn't trying to "hit" them. spray->Destroy(); // [MC] Remove it because technically, the spray isn't trying to "hit" them.
continue; continue;

View file

@ -533,6 +533,10 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill
Printf (TEXTCOLOR_RED "Unloading scripts cannot exit the level again.\n"); Printf (TEXTCOLOR_RED "Unloading scripts cannot exit the level again.\n");
return; return;
} }
if (gameaction == ga_completed) // do not exit multiple times.
{
return;
}
if (levelname == NULL || *levelname == 0) if (levelname == NULL || *levelname == 0)
{ {

View file

@ -318,7 +318,7 @@ FString level_info_t::LookupLevelName()
checkstring[0] = '\0'; checkstring[0] = '\0';
} }
thename = strstr (lookedup, checkstring); thename = strstr (lookedup, checkstring);
if (thename == NULL || thename == lookedup) if (thename == NULL)
{ {
thename = lookedup; thename = lookedup;
} }

View file

@ -177,6 +177,11 @@ void D_LoadWadSettings ()
{ {
cmd[i] = conf[i]; cmd[i] = conf[i];
} }
if (i == 0)
{
conf++;
continue;
}
cmd[i] = 0; cmd[i] = 0;
conf += i; conf += i;
if (*conf == '\n') if (*conf == '\n')

View file

@ -586,12 +586,12 @@ void P_DrawSplash2 (int count, fixed_t x, fixed_t y, fixed_t z, angle_t angle, i
} }
} }
void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end, int color1, int color2, double maxdiff_d, int flags, PClassActor *spawnclass, angle_t angle, int duration, double sparsity, double drift, int SpiralOffset) void P_DrawRailTrail(AActor *source, const TVector3<double> &start, const TVector3<double> &end, int color1, int color2, double maxdiff, int flags, const PClassActor *spawnclass, angle_t angle, int duration, double sparsity, double drift, int SpiralOffset)
{ {
double length, lengthsquared; double length, lengthsquared;
int steps, i; int steps, i;
FAngle deg; TAngle<double> deg;
FVector3 step, dir, pos, extend; TVector3<double> step, dir, pos, extend;
bool fullbright; bool fullbright;
float maxdiff = (float)maxdiff_d; float maxdiff = (float)maxdiff_d;
@ -616,9 +616,9 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
// The railgun's sound is special. It gets played from the // The railgun's sound is special. It gets played from the
// point on the slug's trail that is closest to the hearing player. // point on the slug's trail that is closest to the hearing player.
AActor *mo = players[consoleplayer].camera; AActor *mo = players[consoleplayer].camera;
FVector3 point; TVector3<double> point;
double r; double r;
float dirz; double dirz;
if (abs(mo->x - FLOAT2FIXED(start.X)) < 20 * FRACUNIT if (abs(mo->x - FLOAT2FIXED(start.X)) < 20 * FRACUNIT
&& (mo->y - FLOAT2FIXED(start.Y)) < 20 * FRACUNIT) && (mo->y - FLOAT2FIXED(start.Y)) < 20 * FRACUNIT)
@ -631,7 +631,7 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
// Only consider sound in 2D (for now, anyway) // Only consider sound in 2D (for now, anyway)
// [BB] You have to divide by lengthsquared here, not multiply with it. // [BB] You have to divide by lengthsquared here, not multiply with it.
r = ((start.Y - FIXED2FLOAT(mo->y)) * (-dir.Y) - (start.X - FIXED2FLOAT(mo->x)) * (dir.X)) / lengthsquared; r = ((start.Y - FIXED2DBL(mo->y)) * (-dir.Y) - (start.X - FIXED2DBL(mo->x)) * (dir.X)) / lengthsquared;
r = clamp<double>(r, 0., 1.); r = clamp<double>(r, 0., 1.);
dirz = dir.Z; dirz = dir.Z;
@ -663,7 +663,7 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
minelem = fabs(dir[i]); minelem = fabs(dir[i]);
} }
} }
FVector3 tempvec(0,0,0); TVector3<double> tempvec(0, 0, 0);
tempvec[epos] = 1; tempvec[epos] = 1;
extend = tempvec - (dir | tempvec) * dir; extend = tempvec - (dir | tempvec) * dir;
// //
@ -674,16 +674,16 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
// Create the outer spiral. // Create the outer spiral.
if (color1 != -1 && (!r_rail_smartspiral || color2 == -1) && r_rail_spiralsparsity > 0 && (spawnclass == NULL)) if (color1 != -1 && (!r_rail_smartspiral || color2 == -1) && r_rail_spiralsparsity > 0 && (spawnclass == NULL))
{ {
FVector3 spiral_step = step * r_rail_spiralsparsity * sparsity; TVector3<double> spiral_step = step * r_rail_spiralsparsity * sparsity;
int spiral_steps = (int)(steps * r_rail_spiralsparsity / sparsity); int spiral_steps = (int)(steps * r_rail_spiralsparsity / sparsity);
color1 = color1 == 0 ? -1 : ParticleColor(color1); color1 = color1 == 0 ? -1 : ParticleColor(color1);
pos = start; pos = start;
deg = FAngle(SpiralOffset); deg = TAngle<double>(SpiralOffset);
for (i = spiral_steps; i; i--) for (i = spiral_steps; i; i--)
{ {
particle_t *p = NewParticle (); particle_t *p = NewParticle ();
FVector3 tempvec; TVector3<double> tempvec;
if (!p) if (!p)
return; return;
@ -696,7 +696,7 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
p->size = 3; p->size = 3;
p->bright = fullbright; p->bright = fullbright;
tempvec = FMatrix3x3(dir, deg) * extend; tempvec = TMatrix3x3<double>(dir, deg) * extend;
p->velx = FLOAT2FIXED(tempvec.X * drift)>>4; p->velx = FLOAT2FIXED(tempvec.X * drift)>>4;
p->vely = FLOAT2FIXED(tempvec.Y * drift)>>4; p->vely = FLOAT2FIXED(tempvec.Y * drift)>>4;
p->velz = FLOAT2FIXED(tempvec.Z * drift)>>4; p->velz = FLOAT2FIXED(tempvec.Z * drift)>>4;
@ -705,7 +705,7 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
p->y = FLOAT2FIXED(tempvec.Y); p->y = FLOAT2FIXED(tempvec.Y);
p->z = FLOAT2FIXED(tempvec.Z); p->z = FLOAT2FIXED(tempvec.Z);
pos += spiral_step; pos += spiral_step;
deg += FAngle(r_rail_spiralsparsity * 14); deg += TAngle<double>(r_rail_spiralsparsity * 14);
if (color1 == -1) if (color1 == -1)
{ {
@ -730,18 +730,18 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
// Create the inner trail. // Create the inner trail.
if (color2 != -1 && r_rail_trailsparsity > 0 && spawnclass == NULL) if (color2 != -1 && r_rail_trailsparsity > 0 && spawnclass == NULL)
{ {
FVector3 trail_step = step * r_rail_trailsparsity * sparsity; TVector3<double> trail_step = step * r_rail_trailsparsity * sparsity;
int trail_steps = xs_FloorToInt(steps * r_rail_trailsparsity / sparsity); int trail_steps = xs_FloorToInt(steps * r_rail_trailsparsity / sparsity);
color2 = color2 == 0 ? -1 : ParticleColor(color2); color2 = color2 == 0 ? -1 : ParticleColor(color2);
FVector3 diff(0, 0, 0); TVector3<double> diff(0, 0, 0);
pos = start; pos = start;
for (i = trail_steps; i; i--) for (i = trail_steps; i; i--)
{ {
// [XA] inner trail uses a different default duration (33). // [XA] inner trail uses a different default duration (33).
int innerduration = (duration == 0) ? 33 : duration; int innerduration = (duration == 0) ? 33 : duration;
particle_t *p = JitterParticle (innerduration, drift); particle_t *p = JitterParticle (innerduration, (float)drift);
if (!p) if (!p)
return; return;
@ -750,14 +750,14 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
{ {
int rnd = M_Random (); int rnd = M_Random ();
if (rnd & 1) if (rnd & 1)
diff.X = clamp<float> (diff.X + ((rnd & 8) ? 1 : -1), -maxdiff, maxdiff); diff.X = clamp<double>(diff.X + ((rnd & 8) ? 1 : -1), -maxdiff, maxdiff);
if (rnd & 2) if (rnd & 2)
diff.Y = clamp<float> (diff.Y + ((rnd & 16) ? 1 : -1), -maxdiff, maxdiff); diff.Y = clamp<double>(diff.Y + ((rnd & 16) ? 1 : -1), -maxdiff, maxdiff);
if (rnd & 4) if (rnd & 4)
diff.Z = clamp<float> (diff.Z + ((rnd & 32) ? 1 : -1), -maxdiff, maxdiff); diff.Z = clamp<double>(diff.Z + ((rnd & 32) ? 1 : -1), -maxdiff, maxdiff);
} }
FVector3 postmp = pos + diff; TVector3<double> postmp = pos + diff;
p->size = 2; p->size = 2;
p->x = FLOAT2FIXED(postmp.X); p->x = FLOAT2FIXED(postmp.X);
@ -792,9 +792,9 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
if (sparsity < 1) if (sparsity < 1)
sparsity = 32; sparsity = 32;
FVector3 trail_step = (step / 3) * sparsity; TVector3<double> trail_step = (step / 3) * sparsity;
int trail_steps = (int)((steps * 3) / sparsity); int trail_steps = (int)((steps * 3) / sparsity);
FVector3 diff(0, 0, 0); TVector3<double> diff(0, 0, 0);
pos = start; pos = start;
for (i = trail_steps; i; i--) for (i = trail_steps; i; i--)
@ -803,13 +803,13 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
{ {
int rnd = pr_railtrail(); int rnd = pr_railtrail();
if (rnd & 1) if (rnd & 1)
diff.X = clamp<float> (diff.X + ((rnd & 8) ? 1 : -1), -maxdiff, maxdiff); diff.X = clamp<double>(diff.X + ((rnd & 8) ? 1 : -1), -maxdiff, maxdiff);
if (rnd & 2) if (rnd & 2)
diff.Y = clamp<float> (diff.Y + ((rnd & 16) ? 1 : -1), -maxdiff, maxdiff); diff.Y = clamp<double>(diff.Y + ((rnd & 16) ? 1 : -1), -maxdiff, maxdiff);
if (rnd & 4) if (rnd & 4)
diff.Z = clamp<float> (diff.Z + ((rnd & 32) ? 1 : -1), -maxdiff, maxdiff); diff.Z = clamp<double>(diff.Z + ((rnd & 32) ? 1 : -1), -maxdiff, maxdiff);
} }
FVector3 postmp = pos + diff; TVector3<double> postmp = pos + diff;
AActor *thing = Spawn (spawnclass, FLOAT2FIXED(postmp.X), FLOAT2FIXED(postmp.Y), FLOAT2FIXED(postmp.Z), ALLOW_REPLACE); AActor *thing = Spawn (spawnclass, FLOAT2FIXED(postmp.X), FLOAT2FIXED(postmp.Y), FLOAT2FIXED(postmp.Z), ALLOW_REPLACE);
if (thing) if (thing)

View file

@ -88,7 +88,7 @@ void P_RunEffects (void);
void P_RunEffect (AActor *actor, int effects); void P_RunEffect (AActor *actor, int effects);
void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end, int color1, int color2, double maxdiff = 0, int flags = 0, PClassActor *spawnclass = NULL, angle_t angle = 0, int duration = 35, double sparsity = 1.0, double drift = 1.0, int SpiralOffset = 270); void P_DrawRailTrail(AActor *source, const TVector3<double> &start, const TVector3<double> &end, int color1, int color2, double maxdiff = 0, int flags = 0, const PClassActor *spawnclass = NULL, angle_t angle = 0, int duration = 35, double sparsity = 1.0, double drift = 1.0, int SpiralOffset = 270);
void P_DrawSplash (int count, fixed_t x, fixed_t y, fixed_t z, angle_t angle, int kind); void P_DrawSplash (int count, fixed_t x, fixed_t y, fixed_t z, angle_t angle, int kind);
void P_DrawSplash2 (int count, fixed_t x, fixed_t y, fixed_t z, angle_t angle, int updown, int kind); void P_DrawSplash2 (int count, fixed_t x, fixed_t y, fixed_t z, angle_t angle, int updown, int kind);
void P_DisconnectEffect (AActor *actor); void P_DisconnectEffect (AActor *actor);

View file

@ -2957,7 +2957,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_MonsterRail)
if (linetarget == NULL) if (linetarget == NULL)
{ {
// We probably won't hit the target, but aim at it anyway so we don't look stupid. // We probably won't hit the target, but aim at it anyway so we don't look stupid.
FVector2 xydiff(self->target->x - self->x, self->target->y - self->y); TVector2<double> xydiff(self->target->x - self->x, self->target->y - self->y);
double zdiff = (self->target->z + (self->target->height>>1)) - double zdiff = (self->target->z + (self->target->height>>1)) -
(self->z + (self->height>>1) - self->floorclip); (self->z + (self->height>>1) - self->floorclip);
self->pitch = int(atan2(zdiff, xydiff.Length()) * ANGLE_180 / -M_PI); self->pitch = int(atan2(zdiff, xydiff.Length()) * ANGLE_180 / -M_PI);

View file

@ -727,6 +727,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line,
floor->m_Type = DFloor::buildStair; //jff 3/31/98 do not leave uninited floor->m_Type = DFloor::buildStair; //jff 3/31/98 do not leave uninited
//jff 2/27/98 fix uninitialized crush field //jff 2/27/98 fix uninitialized crush field
floor->m_Crush = (!usespecials && speed == 4*FRACUNIT) ? 10 : -1; floor->m_Crush = (!usespecials && speed == 4*FRACUNIT) ? 10 : -1;
floor->m_Hexencrush = false;
floor->m_ResetCount = reset; // [RH] Tics until reset (0 if never) floor->m_ResetCount = reset; // [RH] Tics until reset (0 if never)
floor->m_OrgDist = sec->floorplane.d; // [RH] Height to reset to floor->m_OrgDist = sec->floorplane.d; // [RH] Height to reset to
} }

View file

@ -479,7 +479,7 @@ void P_TraceBleed (int damage, AActor *target); // random direction version
bool P_HitFloor (AActor *thing); bool P_HitFloor (AActor *thing);
bool P_HitWater (AActor *thing, sector_t *sec, fixed_t splashx = FIXED_MIN, fixed_t splashy = FIXED_MIN, fixed_t splashz=FIXED_MIN, bool checkabove = false, bool alert = true); bool P_HitWater (AActor *thing, sector_t *sec, fixed_t splashx = FIXED_MIN, fixed_t splashy = FIXED_MIN, fixed_t splashz=FIXED_MIN, bool checkabove = false, bool alert = true);
void P_CheckSplash(AActor *self, fixed_t distance); void P_CheckSplash(AActor *self, fixed_t distance);
void P_RailAttack (AActor *source, int damage, int offset_xy, fixed_t offset_z = 0, int color1 = 0, int color2 = 0, double maxdiff = 0, int flags = 0, PClassActor *puff = NULL, angle_t angleoffset = 0, angle_t pitchoffset = 0, fixed_t distance = 8192*FRACUNIT, int duration = 0, double sparsity = 1.0, double drift = 1.0, PClassActor *spawnclass = NULL, int SpiralOffset = 270); // [RH] Shoot a railgun void P_RailAttack (AActor *source, int damage, int offset_xy, fixed_t offset_z = 0, int color1 = 0, int color2 = 0, double maxdiff = 0, int flags = 0, const PClassActor *puff = NULL, angle_t angleoffset = 0, angle_t pitchoffset = 0, fixed_t distance = 8192*FRACUNIT, int duration = 0, double sparsity = 1.0, double drift = 1.0, const PClassActor *spawnclass = NULL, int SpiralOffset = 270); // [RH] Shoot a railgun
enum // P_RailAttack / A_RailAttack / A_CustomRailgun / P_DrawRailTrail flags enum // P_RailAttack / A_RailAttack / A_CustomRailgun / P_DrawRailTrail flags
{ {

View file

@ -1064,8 +1064,8 @@ bool PIT_CheckThing(AActor *thing, FCheckPosition &tm)
{ {
unblocking = true; unblocking = true;
} }
else if (abs(thing->x - tm.thing->x) < (thing->radius+tm.thing->radius)/2 && else if (abs(thing->x - tm.thing->x) < (thing->radius+tm.thing->radius) &&
abs(thing->y - tm.thing->y) < (thing->radius+tm.thing->radius)/2) abs(thing->y - tm.thing->y) < (thing->radius+tm.thing->radius))
{ {
fixed_t newdist = P_AproxDistance(thing->x - tm.x, thing->y - tm.y); fixed_t newdist = P_AproxDistance(thing->x - tm.x, thing->y - tm.y);
@ -4150,12 +4150,12 @@ static ETraceStatus ProcessRailHit(FTraceResults &res, void *userdata)
// //
// //
//========================================================================== //==========================================================================
void P_RailAttack(AActor *source, int damage, int offset_xy, fixed_t offset_z, int color1, int color2, double maxdiff, int railflags, PClassActor *puffclass, angle_t angleoffset, angle_t pitchoffset, fixed_t distance, int duration, double sparsity, double drift, PClassActor *spawnclass, int SpiralOffset) void P_RailAttack(AActor *source, int damage, int offset_xy, fixed_t offset_z, int color1, int color2, double maxdiff, int railflags, const PClassActor *puffclass, angle_t angleoffset, angle_t pitchoffset, fixed_t distance, int duration, double sparsity, double drift, const PClassActor *spawnclass, int SpiralOffset)
{ {
fixed_t vx, vy, vz; fixed_t vx, vy, vz;
angle_t angle, pitch; angle_t angle, pitch;
fixed_t x1, y1; fixed_t x1, y1;
FVector3 start, end; TVector3<double> start, end;
FTraceResults trace; FTraceResults trace;
fixed_t shootz; fixed_t shootz;
@ -4278,11 +4278,16 @@ void P_RailAttack(AActor *source, int damage, int offset_xy, fixed_t offset_z, i
// Spawn a decal or puff at the point where the trace ended. // Spawn a decal or puff at the point where the trace ended.
if (trace.HitType == TRACE_HitWall) if (trace.HitType == TRACE_HitWall)
{ {
SpawnShootDecal(source, trace); AActor* puff = NULL;
if (puffclass != NULL && puffDefaults->flags3 & MF3_ALWAYSPUFF) if (puffclass != NULL && puffDefaults->flags3 & MF3_ALWAYSPUFF)
{ {
P_SpawnPuff(source, puffclass, trace.X, trace.Y, trace.Z, (source->angle + angleoffset) - ANG90, 1, 0); puff = P_SpawnPuff(source, puffclass, trace.X, trace.Y, trace.Z, (source->angle + angleoffset) - ANG90, 1, 0);
} }
if (puff != NULL && puffDefaults->flags7 & MF7_FORCEDECAL && puff->DecalGenerator)
SpawnShootDecal(puff, trace);
else
SpawnShootDecal(source, trace);
} }
if (thepuff != NULL) if (thepuff != NULL)
@ -4302,9 +4307,9 @@ void P_RailAttack(AActor *source, int damage, int offset_xy, fixed_t offset_z, i
} }
// Draw the slug's trail. // Draw the slug's trail.
end.X = FIXED2FLOAT(trace.X); end.X = FIXED2DBL(trace.X);
end.Y = FIXED2FLOAT(trace.Y); end.Y = FIXED2DBL(trace.Y);
end.Z = FIXED2FLOAT(trace.Z); end.Z = FIXED2DBL(trace.Z);
P_DrawRailTrail(source, start, end, color1, color2, maxdiff, railflags, spawnclass, source->angle + angleoffset, duration, sparsity, drift, SpiralOffset); P_DrawRailTrail(source, start, end, color1, color2, maxdiff, railflags, spawnclass, source->angle + angleoffset, duration, sparsity, drift, SpiralOffset);
} }

View file

@ -177,11 +177,11 @@ bool P_CheckSwitchRange(AActor *user, line_t *line, int sideno)
if ((TexMan.FindSwitch(side->GetTexture(side_t::top))) != NULL) if ((TexMan.FindSwitch(side->GetTexture(side_t::top))) != NULL)
{ {
return (user->z + user->height >= open.top); return (user->z + user->height > open.top);
} }
else if ((TexMan.FindSwitch(side->GetTexture(side_t::bottom))) != NULL) else if ((TexMan.FindSwitch(side->GetTexture(side_t::bottom))) != NULL)
{ {
return (user->z <= open.bottom); return (user->z < open.bottom);
} }
else if ((flags & ML_3DMIDTEX) || (TexMan.FindSwitch(side->GetTexture(side_t::mid))) != NULL) else if ((flags & ML_3DMIDTEX) || (TexMan.FindSwitch(side->GetTexture(side_t::mid))) != NULL)
{ {
@ -194,7 +194,7 @@ bool P_CheckSwitchRange(AActor *user, line_t *line, int sideno)
else else
{ {
// no switch found. Check whether the player can touch either top or bottom texture // no switch found. Check whether the player can touch either top or bottom texture
return (user->z + user->height >= open.top) || (user->z <= open.bottom); return (user->z + user->height > open.top) || (user->z < open.bottom);
} }
} }

View file

@ -98,7 +98,7 @@ void FTagManager::AddSectorTag(int sector, int tag)
void FTagManager::RemoveSectorTags(int sect) void FTagManager::RemoveSectorTags(int sect)
{ {
if (startForSector.Size() > 0) if (startForSector.Size() > (unsigned int)sect)
{ {
int start = startForSector[sect]; int start = startForSector[sect];
if (start >= 0) if (start >= 0)

View file

@ -339,6 +339,7 @@ VideoModes[] =
{ 1600, 900 }, // 16:9 { 1600, 900 }, // 16:9
{ 1600, 1000 }, // 16:10 { 1600, 1000 }, // 16:10
{ 1600, 1200 }, { 1600, 1200 },
{ 1680, 1050 }, // 16:10
{ 1920, 1080 }, { 1920, 1080 },
{ 1920, 1200 }, { 1920, 1200 },
{ 2048, 1536 }, { 2048, 1536 },

View file

@ -178,6 +178,7 @@ static MiniModeInfo WinModes[] =
{ 1600, 900 }, // 16:9 { 1600, 900 }, // 16:9
{ 1600, 1000 }, // 16:10 { 1600, 1000 }, // 16:10
{ 1600, 1200 }, { 1600, 1200 },
{ 1680, 1050 }, // 16:10
{ 1920, 1080 }, { 1920, 1080 },
{ 1920, 1200 }, { 1920, 1200 },
{ 2048, 1536 }, { 2048, 1536 },

View file

@ -924,6 +924,8 @@ void OpenALSoundRenderer::SetSfxVolume(float volume)
schan = schan->NextChan; schan = schan->NextChan;
} }
alProcessUpdatesSOFT();
getALError(); getALError();
} }

View file

@ -395,6 +395,11 @@ void FTextureManager::ParseAnim (FScanner &sc, int usetype)
} }
else if (sc.Compare ("range")) else if (sc.Compare ("range"))
{ {
if (picnum.Exists() && Texture(picnum)->Name.IsEmpty())
{
// long texture name: We cannot do ranged anims on these because they have no defined order
sc.ScriptError ("You cannot use \"range\" for long texture names.");
}
if (defined == 2) if (defined == 2)
{ {
sc.ScriptError ("You cannot use \"pic\" and \"range\" together in a single animation."); sc.ScriptError ("You cannot use \"pic\" and \"range\" together in a single animation.");
@ -456,12 +461,20 @@ FAnimDef *FTextureManager::ParseRangeAnim (FScanner &sc, FTextureID picnum, int
type = FAnimDef::ANIM_Forward; type = FAnimDef::ANIM_Forward;
framenum = ParseFramenum (sc, picnum, usetype, missing); framenum = ParseFramenum (sc, picnum, usetype, missing);
ParseTime (sc, min, max); ParseTime (sc, min, max);
if (framenum == picnum || !picnum.Exists()) if (framenum == picnum || !picnum.Exists() || !framenum.Exists())
{ {
return NULL; // Animation is only one frame or does not exist return NULL; // Animation is only one frame or does not exist
} }
if (Texture(framenum)->Name.IsEmpty())
{
// long texture name: We cannot do ranged anims on these because they have no defined order
sc.ScriptError ("You cannot use \"range\" for long texture names.");
}
if (framenum < picnum) if (framenum < picnum)
{ {
type = FAnimDef::ANIM_Backward; type = FAnimDef::ANIM_Backward;
@ -570,7 +583,7 @@ void FTextureManager::ParseTime (FScanner &sc, DWORD &min, DWORD &max)
void FTextureManager::ParseWarp(FScanner &sc) void FTextureManager::ParseWarp(FScanner &sc)
{ {
const BITFIELD texflags = TEXMAN_Overridable | TEXMAN_TryAny | TEXMAN_ShortNameOnly; const BITFIELD texflags = TEXMAN_Overridable | TEXMAN_TryAny;
bool isflat = false; bool isflat = false;
bool type2 = sc.Compare ("warp2"); // [GRB] bool type2 = sc.Compare ("warp2"); // [GRB]
sc.MustGetString (); sc.MustGetString ();
@ -591,8 +604,16 @@ void FTextureManager::ParseWarp(FScanner &sc)
FTextureID picnum = CheckForTexture (sc.String, isflat ? FTexture::TEX_Flat : FTexture::TEX_Wall, texflags); FTextureID picnum = CheckForTexture (sc.String, isflat ? FTexture::TEX_Flat : FTexture::TEX_Wall, texflags);
if (picnum.isValid()) if (picnum.isValid())
{ {
FTexture *warper = Texture(picnum); FTexture *warper = Texture(picnum);
if (warper->Name.IsEmpty())
{
// long texture name: We cannot do warps on these due to the way the texture manager implements warping as a texture replacement.
sc.ScriptError ("You cannot use \"warp\" for long texture names.");
}
// don't warp a texture more than once // don't warp a texture more than once
if (!warper->bWarped) if (!warper->bWarped)
{ {

View file

@ -1782,7 +1782,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomRailgun)
if (linetarget == NULL && aim) if (linetarget == NULL && aim)
{ {
// We probably won't hit the target, but aim at it anyway so we don't look stupid. // We probably won't hit the target, but aim at it anyway so we don't look stupid.
FVector2 xydiff(self->target->x - self->x, self->target->y - self->y); TVector2<double> xydiff(self->target->x - self->x, self->target->y - self->y);
double zdiff = (self->target->z + (self->target->height>>1)) - double zdiff = (self->target->z + (self->target->height>>1)) -
(self->z + (self->height>>1) - self->floorclip); (self->z + (self->height>>1) - self->floorclip);
self->pitch = int(atan2(zdiff, xydiff.Length()) * ANGLE_180 / -M_PI); self->pitch = int(atan2(zdiff, xydiff.Length()) * ANGLE_180 / -M_PI);

View file

@ -110,6 +110,11 @@
#include "rawinput.h" #include "rawinput.h"
// Compensate for w32api's lack
#ifndef GET_XBUTTON_WPARAM
#define GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam))
#endif
#ifdef _DEBUG #ifdef _DEBUG
#define INGAME_PRIORITY_CLASS NORMAL_PRIORITY_CLASS #define INGAME_PRIORITY_CLASS NORMAL_PRIORITY_CLASS

View file

@ -47,6 +47,15 @@ FString I_GetFromClipboard (bool windows_has_no_selection_clipboard);
void I_GetEvent(); void I_GetEvent();
enum
{
INPUT_DIJoy,
INPUT_XInput,
INPUT_RawPS2,
NUM_JOYDEVICES
};
#ifdef USE_WINDOWS_DWORD #ifdef USE_WINDOWS_DWORD
#include "m_joy.h" #include "m_joy.h"
@ -121,14 +130,6 @@ public:
virtual IJoystickConfig *Rescan() = 0; virtual IJoystickConfig *Rescan() = 0;
}; };
enum
{
INPUT_DIJoy,
INPUT_XInput,
INPUT_RawPS2,
NUM_JOYDEVICES
};
extern FJoystickCollection *JoyDevices[NUM_JOYDEVICES]; extern FJoystickCollection *JoyDevices[NUM_JOYDEVICES];
void I_StartupMouse(); void I_StartupMouse();

View file

@ -106,6 +106,7 @@ LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
void CreateCrashLog (char *custominfo, DWORD customsize, HWND richedit); void CreateCrashLog (char *custominfo, DWORD customsize, HWND richedit);
void DisplayCrashLog (); void DisplayCrashLog ();
extern BYTE *ST_Util_BitsForBitmap (BITMAPINFO *bitmap_info); extern BYTE *ST_Util_BitsForBitmap (BITMAPINFO *bitmap_info);
void I_FlushBufferedConsoleStuff();
// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
@ -128,6 +129,7 @@ HANDLE MainThread;
DWORD MainThreadID; DWORD MainThreadID;
HANDLE StdOut; HANDLE StdOut;
bool FancyStdOut, AttachedStdOut; bool FancyStdOut, AttachedStdOut;
bool ConWindowHidden;
// The main window // The main window
HWND Window; HWND Window;
@ -644,6 +646,7 @@ void I_SetWndProc()
SetWindowLongPtr (Window, GWLP_USERDATA, 1); SetWindowLongPtr (Window, GWLP_USERDATA, 1);
SetWindowLongPtr (Window, GWLP_WNDPROC, (WLONG_PTR)WndProc); SetWindowLongPtr (Window, GWLP_WNDPROC, (WLONG_PTR)WndProc);
ShowWindow (ConWindow, SW_HIDE); ShowWindow (ConWindow, SW_HIDE);
ConWindowHidden = true;
ShowWindow (GameTitleWindow, SW_HIDE); ShowWindow (GameTitleWindow, SW_HIDE);
I_InitInput (Window); I_InitInput (Window);
} }
@ -675,8 +678,10 @@ void RestoreConView()
SetWindowLongPtr (Window, GWLP_WNDPROC, (WLONG_PTR)LConProc); SetWindowLongPtr (Window, GWLP_WNDPROC, (WLONG_PTR)LConProc);
ShowWindow (ConWindow, SW_SHOW); ShowWindow (ConWindow, SW_SHOW);
ConWindowHidden = false;
ShowWindow (GameTitleWindow, SW_SHOW); ShowWindow (GameTitleWindow, SW_SHOW);
I_ShutdownInput (); // Make sure the mouse pointer is available. I_ShutdownInput (); // Make sure the mouse pointer is available.
I_FlushBufferedConsoleStuff();
// Make sure the progress bar isn't visible. // Make sure the progress bar isn't visible.
if (StartScreen != NULL) if (StartScreen != NULL)
{ {

View file

@ -132,6 +132,7 @@ extern bool FancyStdOut;
extern HINSTANCE g_hInst; extern HINSTANCE g_hInst;
extern FILE *Logfile; extern FILE *Logfile;
extern bool NativeMouse; extern bool NativeMouse;
extern bool ConWindowHidden;
// PUBLIC DATA DEFINITIONS ------------------------------------------------- // PUBLIC DATA DEFINITIONS -------------------------------------------------
@ -912,12 +913,11 @@ void ToEditControl(HWND edit, const char *buf, wchar_t *wbuf, int bpos)
// //
//========================================================================== //==========================================================================
void I_PrintStr(const char *cp) static void DoPrintStr(const char *cp, HWND edit, HANDLE StdOut)
{ {
if (ConWindow == NULL && StdOut == NULL) if (edit == NULL && StdOut == NULL)
return; return;
HWND edit = ConWindow;
char buf[256]; char buf[256];
wchar_t wbuf[countof(buf)]; wchar_t wbuf[countof(buf)];
int bpos = 0; int bpos = 0;
@ -1049,6 +1049,30 @@ void I_PrintStr(const char *cp)
} }
} }
static TArray<FString> bufferedConsoleStuff;
void I_PrintStr(const char *cp)
{
if (ConWindowHidden)
{
bufferedConsoleStuff.Push(cp);
DoPrintStr(cp, NULL, StdOut);
}
else
{
DoPrintStr(cp, ConWindow, StdOut);
}
}
void I_FlushBufferedConsoleStuff()
{
for (unsigned i = 0; i < bufferedConsoleStuff.Size(); i++)
{
DoPrintStr(bufferedConsoleStuff[i], ConWindow, NULL);
}
bufferedConsoleStuff.Clear();
}
//========================================================================== //==========================================================================
// //
// SetQueryIWAD // SetQueryIWAD

View file

@ -793,6 +793,8 @@ void I_StartupXInput()
#else // NO_XINPUT #else // NO_XINPUT
#include "i_input.h"
void I_StartupXInput() void I_StartupXInput()
{ {
JoyDevices[INPUT_XInput] = NULL; JoyDevices[INPUT_XInput] = NULL;

View file

@ -209,7 +209,7 @@ finline static uint32 xs_FloorToUInt(real64 val)
finline static uint32 xs_CeilToUInt(real64 val) finline static uint32 xs_CeilToUInt(real64 val)
{ {
return (uint32)xs_CeilToUInt(val); return (uint32)xs_CeilToInt(val);
} }
finline static uint32 xs_RoundToUInt(real64 val) finline static uint32 xs_RoundToUInt(real64 val)

View file

@ -386,6 +386,7 @@ D62DCA9EC226DE49108D5DD9271F7631 // Cheogsh 2 map04
setthingz 1649 528 setthingz 1649 528
} }
E89CCC7E155F1032F693359CC219BE6C // hexen.wad map30
B9DFF13207EACAC675C71D82624D0007 // XtheaterIII map01 B9DFF13207EACAC675C71D82624D0007 // XtheaterIII map01
{ {
DisablePushWindowCheck DisablePushWindowCheck

View file

@ -0,0 +1,25 @@
/* British English */
[eng]
GOTARMOR = "Picked up the armour.";
GOTMEGA = "Picked up the MegaArmour!";
GOTARMBONUS = "Picked up an armour bonus.";
SCORE_COLOR = "COLOUR";
TAG_SHADOWARMOR = "Shadow Armour";
TAG_METALARMOR = "Metal Armour";
TAG_LEATHER = "Leather Armour";
TAG_ARMORER = "Armourer";
TXT_ARMOR1 = "MESH ARMOUR";
TXT_METALARMOR = "You picked up the Metal Armour.";
TXT_LEATHERARMOR = "You picked up the Leather Armour.";
TXT_SHADOWARMOR = "You picked up the Shadow armour.";
GOTCHEXARMOR = "Picked up the Chex(R) Armour.";
GOTSUPERCHEXARMOR = "Picked up the Super Chex(R) Armour!";
OB_BIPEDICUS2 = "%o was slimed by an armoured bipedicus.";