- sync 3D floor branch with trunk.

SVN r3123 (3dfloors2)
This commit is contained in:
Christoph Oelckers 2011-01-29 10:54:06 +00:00
parent 264ab6b076
commit c7584cace6
39 changed files with 352 additions and 133 deletions

View file

@ -112,6 +112,7 @@ Note: All <bool> fields default to false unless mentioned otherwise.
checkswitchrange = <bool>;// Switches can only be activated when vertically reachable. checkswitchrange = <bool>;// Switches can only be activated when vertically reachable.
blockprojectiles = <bool>;// Line blocks all projectiles blockprojectiles = <bool>;// Line blocks all projectiles
blockuse = <bool>; // Line blocks all use actions blockuse = <bool>; // Line blocks all use actions
blocksight = <bool>; // Line blocks monster line of sight
} }
@ -162,8 +163,8 @@ Note: All <bool> fields default to false unless mentioned otherwise.
alphafloor = <float>; // translucency of floor plane (only has meaning with Sector_SetPortal) Default is 1.0. alphafloor = <float>; // translucency of floor plane (only has meaning with Sector_SetPortal) Default is 1.0.
alphaceiling = <float>; // translucency of ceiling plane (only has meaning with Sector_SetPortal) Default is 1.0. alphaceiling = <float>; // translucency of ceiling plane (only has meaning with Sector_SetPortal) Default is 1.0.
gravity = <float>; // Sector's gravity. Default is 1.0. gravity = <float>; // Sector's gravity. Default is 1.0.
lightcolor = <integer>; // Sector'S light color as RRGGBB value, default = 0xffffff. lightcolor = <integer>; // Sector's light color as RRGGBB value, default = 0xffffff.
fadecolor = <integer>; // Sector'S fog color as RRGGBB value, default = 0x000000. fadecolor = <integer>; // Sector's fog color as RRGGBB value, default = 0x000000.
desaturation = <float>; // Color desaturation factor. 0 = none, 1 = full, default = 0. desaturation = <float>; // Color desaturation factor. 0 = none, 1 = full, default = 0.
silent = <bool>; // Actors in this sector make no sound, silent = <bool>; // Actors in this sector make no sound,
nofallingdamage = <bool>; // Falling damage is disabled in this sector nofallingdamage = <bool>; // Falling damage is disabled in this sector
@ -183,12 +184,8 @@ Note: All <bool> fields default to false unless mentioned otherwise.
thing thing
{ {
skill# = <bool> // Unlike the base spec, # can range from 1-8. skill# = <bool> // Unlike the base spec, # can range from 1-16.
// 8 is the maximum amount of skills the skill class# = <bool> // Unlike the base spec, # can range from 1-16.
// menu can display.
class# = <bool> // Unlike the base spec, # can range from 1-8.
// 8 is the maximum amount of classes the class
// menu can display.
conversation = <int> // Assigns a conversation dialogue to this thing. conversation = <int> // Assigns a conversation dialogue to this thing.
// Parameter is the conversation ID, 0 meaning none. // Parameter is the conversation ID, 0 meaning none.
countsecret = <bool>; // Picking up this actor counts as a secret. countsecret = <bool>; // Picking up this actor counts as a secret.
@ -292,6 +289,10 @@ Added 'countsecret' actor property.
1.15 14.12.2010 1.15 14.12.2010
Added vertex floor and ceiling height properties Added vertex floor and ceiling height properties
1.16 23.01.2011
Added blocksight linedef flag
Removed remarks of 8 being the maximum number of player classes/skill levels the menu can handle so the spec now properly lists 16 as limit.
=============================================================================== ===============================================================================
EOF EOF
=============================================================================== ===============================================================================

View file

@ -227,7 +227,7 @@ DEFINE_SPECIAL(Elevator_LowerToNearest, 247, 2, 2, 2)
DEFINE_SPECIAL(HealThing, 248, 1, 2, 2) DEFINE_SPECIAL(HealThing, 248, 1, 2, 2)
DEFINE_SPECIAL(Door_CloseWaitOpen, 249, 3, 4, 4) DEFINE_SPECIAL(Door_CloseWaitOpen, 249, 3, 4, 4)
DEFINE_SPECIAL(Floor_Donut, 250, 3, 3, 3) DEFINE_SPECIAL(Floor_Donut, 250, 3, 3, 3)
DEFINE_SPECIAL(FloorAndCeiling_LowerRaise, 251, 3, 3, 3) DEFINE_SPECIAL(FloorAndCeiling_LowerRaise, 251, 3, 3, 4)
DEFINE_SPECIAL(Ceiling_RaiseToNearest, 252, 2, 2, 2) DEFINE_SPECIAL(Ceiling_RaiseToNearest, 252, 2, 2, 2)
DEFINE_SPECIAL(Ceiling_LowerToLowest, 253, 2, 2, 2) DEFINE_SPECIAL(Ceiling_LowerToLowest, 253, 2, 2, 2)
DEFINE_SPECIAL(Ceiling_LowerToFloor, 254, 2, 2, 2) DEFINE_SPECIAL(Ceiling_LowerToFloor, 254, 2, 2, 2)

View file

@ -39,6 +39,7 @@
#include "textures/textures.h" #include "textures/textures.h"
#include "r_blend.h" #include "r_blend.h"
#include "s_sound.h" #include "s_sound.h"
#include "memarena.h"
struct subsector_t; struct subsector_t;
// //
@ -324,6 +325,7 @@ enum
MF6_ADDITIVEPOISONDAMAGE = 0x00100000, MF6_ADDITIVEPOISONDAMAGE = 0x00100000,
MF6_ADDITIVEPOISONDURATION = 0x00200000, MF6_ADDITIVEPOISONDURATION = 0x00200000,
MF6_NOMENU = 0x00400000, // Player class should not appear in the class selection menu. MF6_NOMENU = 0x00400000, // Player class should not appear in the class selection menu.
MF6_BOSSCUBE = 0x00800000, // Actor spawned by A_BrainSpit, flagged for timefreeze reasons.
// --- mobj.renderflags --- // --- mobj.renderflags ---
@ -760,6 +762,7 @@ public:
fixed_t GetGravity() const; fixed_t GetGravity() const;
bool IsSentient() const; bool IsSentient() const;
const char *GetTag(const char *def = NULL) const; const char *GetTag(const char *def = NULL) const;
void SetTag(const char *def);
// info for drawing // info for drawing
@ -855,7 +858,8 @@ public:
int activationtype; // How the thing behaves when activated with USESPECIAL or BUMPSPECIAL int activationtype; // How the thing behaves when activated with USESPECIAL or BUMPSPECIAL
int lastbump; // Last time the actor was bumped, used to control BUMPSPECIAL int lastbump; // Last time the actor was bumped, used to control BUMPSPECIAL
int Score; // manipulated by score items, ACS or DECORATE. The engine doesn't use this itself for anything. int Score; // manipulated by score items, ACS or DECORATE. The engine doesn't use this itself for anything.
FNameNoInit Tag; // Strife's tag name. FIXME: should be case sensitive! FString * Tag; // Strife's tag name.
int DesignatedTeam; // Allow for friendly fire cacluations to be done on non-players.
AActor *BlockingMobj; // Actor that blocked the last move AActor *BlockingMobj; // Actor that blocked the last move
line_t *BlockingLine; // Line that blocked the last move line_t *BlockingLine; // Line that blocked the last move
@ -927,6 +931,7 @@ public:
private: private:
static AActor *TIDHash[128]; static AActor *TIDHash[128];
static inline int TIDHASH (int key) { return key & 127; } static inline int TIDHASH (int key) { return key & 127; }
static FSharedStringArena mStringPropertyData;
friend class FActorIterator; friend class FActorIterator;

View file

@ -1028,8 +1028,8 @@ static void PrintSecretString(const char *string, bool thislevel)
break; break;
} }
} }
if (foundone) colstr = TEXTCOLOR_YELLOW; if (foundone) colstr = TEXTCOLOR_RED;
else colstr = TEXTCOLOR_RED; else colstr = TEXTCOLOR_GREEN;
} }
} }
FBrokenLines *brok = V_BreakLines(ConFont, screen->GetWidth()*95/100, string); FBrokenLines *brok = V_BreakLines(ConFont, screen->GetWidth()*95/100, string);

View file

@ -269,6 +269,10 @@ void FIWadManager::ParseIWadInfos(const char *fn)
} }
delete resfile; delete resfile;
} }
if (mIWadNames.Size() == 0 || mIWads.Size() == 0)
{
I_FatalError("No IWAD definitions found");
}
} }

View file

@ -152,6 +152,7 @@ enum ELineFlags
ML_FIRSTSIDEONLY = 0x00800000, // activated only when crossed from front side ML_FIRSTSIDEONLY = 0x00800000, // activated only when crossed from front side
ML_BLOCKPROJECTILE = 0x01000000, ML_BLOCKPROJECTILE = 0x01000000,
ML_BLOCKUSE = 0x02000000, // blocks all use actions through this line ML_BLOCKUSE = 0x02000000, // blocks all use actions through this line
ML_BLOCKSIGHT = 0x04000000, // blocks monster line of sight
}; };

View file

@ -142,6 +142,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BrainSpit)
} }
// [GZ] Calculates when the projectile will have reached destination // [GZ] Calculates when the projectile will have reached destination
spit->special2 += level.maptime; spit->special2 += level.maptime;
spit->flags6 |= MF6_BOSSCUBE;
} }
if (!isdefault) if (!isdefault)

View file

@ -612,6 +612,17 @@ void DIntermissionScreenScroller::Init(FIntermissionAction *desc, bool first)
mScrollDir = static_cast<FIntermissionActionScroller*>(desc)->mScrollDir; mScrollDir = static_cast<FIntermissionActionScroller*>(desc)->mScrollDir;
} }
int DIntermissionScreenScroller::Responder (event_t *ev)
{
int res = Super::Responder(ev);
if (res == -1)
{
mBackground = mSecondPic;
mTicker = mScrollDelay + mScrollTime;
}
return res;
}
void DIntermissionScreenScroller::Drawer () void DIntermissionScreenScroller::Drawer ()
{ {
FTexture *tex = TexMan[mFirstPic]; FTexture *tex = TexMan[mFirstPic];

View file

@ -268,6 +268,7 @@ public:
DIntermissionScreenScroller() {} DIntermissionScreenScroller() {}
virtual void Init(FIntermissionAction *desc, bool first); virtual void Init(FIntermissionAction *desc, bool first);
virtual int Responder (event_t *ev);
virtual void Drawer (); virtual void Drawer ();
}; };

View file

@ -373,4 +373,5 @@ void FSharedStringArena::FreeAll()
FreeBlocks = block; FreeBlocks = block;
} }
memset(Buckets, 0, sizeof(Buckets)); memset(Buckets, 0, sizeof(Buckets));
TopBlock = NULL;
} }

View file

@ -31,6 +31,9 @@
** **
*/ */
#ifndef __MEMARENA_H
#define __MEMARENA_H
#include "zstring.h" #include "zstring.h"
// A general purpose arena. // A general purpose arena.
@ -81,3 +84,6 @@ protected:
private: private:
void *Alloc(size_t size) { return NULL; } // No access to FMemArena::Alloc for outsiders. void *Alloc(size_t size) { return NULL; } // No access to FMemArena::Alloc for outsiders.
}; };
#endif

View file

@ -507,11 +507,7 @@ bool M_Responder (event_t *ev)
// do we want mouse input? // do we want mouse input?
if (ev->subtype >= EV_GUI_FirstMouseEvent && ev->subtype <= EV_GUI_LastMouseEvent) if (ev->subtype >= EV_GUI_FirstMouseEvent && ev->subtype <= EV_GUI_LastMouseEvent)
{ {
// FIXME: Mouse events in SDL code are mostly useless so mouse is
// disabled until that code is fixed
#ifdef _WIN32
if (!m_use_mouse) if (!m_use_mouse)
#endif
return true; return true;
} }

View file

@ -98,19 +98,13 @@ void DReadThisMenu::Drawer()
prevpic = TexMan[gameinfo.infoPages[mScreen-2].GetChars()]; prevpic = TexMan[gameinfo.infoPages[mScreen-2].GetChars()];
} }
screen->Dim(0, 1.0, 0,0, SCREENWIDTH, SCREENHEIGHT);
alpha = MIN<fixed_t> (Scale (gametic - mInfoTic, OPAQUE, TICRATE/3), OPAQUE); alpha = MIN<fixed_t> (Scale (gametic - mInfoTic, OPAQUE, TICRATE/3), OPAQUE);
if (alpha < OPAQUE && prevpic != NULL) if (alpha < OPAQUE && prevpic != NULL)
{ {
screen->DrawTexture (prevpic, 0, 0, screen->DrawTexture (prevpic, 0, 0, DTA_Fullscreen, true, TAG_DONE);
DTA_DestWidth, screen->GetWidth(),
DTA_DestHeight, screen->GetHeight(),
TAG_DONE);
} }
screen->DrawTexture (tex, 0, 0, screen->DrawTexture (tex, 0, 0, DTA_Fullscreen, true, DTA_Alpha, alpha, TAG_DONE);
DTA_DestWidth, screen->GetWidth(),
DTA_DestHeight, screen->GetHeight(),
DTA_Alpha, alpha,
TAG_DONE);
} }

View file

@ -443,6 +443,7 @@ xx(smoothlighting)
xx(blockprojectiles) xx(blockprojectiles)
xx(blockuse) xx(blockuse)
xx(hidden) xx(hidden)
xx(blocksight)
xx(Renderstyle) xx(Renderstyle)

View file

@ -256,10 +256,11 @@ bool P_GetMidTexturePosition(const line_t *line, int sideno, fixed_t *ptextop, f
// //
//============================================================================ //============================================================================
bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, fixed_t &opentop, fixed_t &openbottom) bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, fixed_t &opentop, fixed_t &openbottom, bool *above)
{ {
fixed_t tt, tb; fixed_t tt, tb;
*above = false;
if (P_GetMidTexturePosition(linedef, 0, &tt, &tb)) if (P_GetMidTexturePosition(linedef, 0, &tt, &tb))
{ {
if (thing->z + (thing->height/2) < (tt + tb)/2) if (thing->z + (thing->height/2) < (tt + tb)/2)
@ -268,8 +269,11 @@ bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, fixed_t &opent
} }
else else
{ {
if(tt > openbottom) openbottom = tt; if(tt > openbottom)
{
openbottom = tt;
*above = true;
}
// returns true if it touches the midtexture // returns true if it touches the midtexture
return (abs(thing->z - tt) <= thing->MaxStepHeight); return (abs(thing->z - tt) <= thing->MaxStepHeight);
} }

View file

@ -14,7 +14,7 @@ void P_Start3dMidtexInterpolations(TArray<DInterpolation *> &list, sector_t *sec
void P_Attach3dMidtexLinesToSector(sector_t *dest, int lineid, int tag, bool ceiling); void P_Attach3dMidtexLinesToSector(sector_t *dest, int lineid, int tag, bool ceiling);
bool P_GetMidTexturePosition(const line_t *line, int sideno, fixed_t *ptextop, fixed_t *ptexbot); bool P_GetMidTexturePosition(const line_t *line, int sideno, fixed_t *ptextop, fixed_t *ptexbot);
bool P_Check3dMidSwitch(AActor *actor, line_t *line, int side); bool P_Check3dMidSwitch(AActor *actor, line_t *line, int side);
bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, fixed_t &opentop, fixed_t &openbottom); bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, fixed_t &opentop, fixed_t &openbottom, bool *above);
bool P_MoveLinkedSectors(sector_t *sector, int crush, fixed_t move, bool ceiling); bool P_MoveLinkedSectors(sector_t *sector, int crush, fixed_t move, bool ceiling);
void P_StartLinkedSectorInterpolations(TArray<DInterpolation *> &list, sector_t *sector, bool ceiling); void P_StartLinkedSectorInterpolations(TArray<DInterpolation *> &list, sector_t *sector, bool ceiling);

View file

@ -1964,6 +1964,7 @@ DLevelScript::~DLevelScript ()
{ {
if (localvars != NULL) if (localvars != NULL)
delete[] localvars; delete[] localvars;
localvars = NULL;
} }
void DLevelScript::Unlink () void DLevelScript::Unlink ()
@ -2542,6 +2543,7 @@ enum
APROP_ScaleX = 29, APROP_ScaleX = 29,
APROP_ScaleY = 30, APROP_ScaleY = 30,
APROP_Dormant = 31, APROP_Dormant = 31,
APROP_Mass = 32,
}; };
// These are needed for ACS's APROP_RenderStyle // These are needed for ACS's APROP_RenderStyle
@ -2709,7 +2711,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value)
actor->Score = value; actor->Score = value;
case APROP_NameTag: case APROP_NameTag:
actor->Tag = FBehavior::StaticLookupString(value); actor->SetTag(FBehavior::StaticLookupString(value));
break; break;
case APROP_DamageFactor: case APROP_DamageFactor:
@ -2730,6 +2732,10 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value)
actor->scaleY = value; actor->scaleY = value;
break; break;
case APROP_Mass:
actor->Mass = value;
break;
default: default:
// do nothing. // do nothing.
break; break;
@ -2795,6 +2801,7 @@ int DLevelScript::GetActorProperty (int tid, int property)
case APROP_WaterLevel: return actor->waterlevel; case APROP_WaterLevel: return actor->waterlevel;
case APROP_ScaleX: return actor->scaleX; case APROP_ScaleX: return actor->scaleX;
case APROP_ScaleY: return actor->scaleY; case APROP_ScaleY: return actor->scaleY;
case APROP_Mass: return actor->Mass;
default: return 0; default: return 0;
} }
@ -2832,6 +2839,7 @@ int DLevelScript::CheckActorProperty (int tid, int property, int value)
case APROP_WaterLevel: case APROP_WaterLevel:
case APROP_ScaleX: case APROP_ScaleX:
case APROP_ScaleY: case APROP_ScaleY:
case APROP_Mass:
return (GetActorProperty(tid, property) == value); return (GetActorProperty(tid, property) == value);
// Boolean values need to compare to a binary version of value // Boolean values need to compare to a binary version of value
@ -3052,6 +3060,7 @@ enum EACSFunctions
ACSF_GetPolyobjX, ACSF_GetPolyobjX,
ACSF_GetPolyobjY, ACSF_GetPolyobjY,
ACSF_CheckSight, ACSF_CheckSight,
ACSF_SpawnForced,
}; };
int DLevelScript::SideFromID(int id, int side) int DLevelScript::SideFromID(int id, int side)
@ -3523,6 +3532,9 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
return 0; return 0;
} }
case ACSF_SpawnForced:
return DoSpawn(args[0], args[1], args[2], args[3], args[4], args[5], true);
default: default:
break; break;
} }
@ -6021,8 +6033,7 @@ int DLevelScript::RunScript ()
} }
else else
{ {
STACK(1) = 0 == stricmp (FBehavior::StaticLookupString (STACK(1)), STACK(1) = activator->player->ReadyWeapon->GetClass()->TypeName == FName(FBehavior::StaticLookupString (STACK(1)), true);
activator->player->ReadyWeapon->GetClass()->TypeName.GetChars());
} }
break; break;
@ -6725,9 +6736,18 @@ DLevelScript::DLevelScript (AActor *who, line_t *where, int num, const ScriptPtr
script = num; script = num;
numlocalvars = code->VarCount; numlocalvars = code->VarCount;
localvars = new SDWORD[code->VarCount]; localvars = new SDWORD[code->VarCount];
if (code->VarCount > 0)
{
localvars[0] = arg0; localvars[0] = arg0;
if (code->VarCount > 1)
{
localvars[1] = arg1; localvars[1] = arg1;
if (code->VarCount > 2)
{
localvars[2] = arg2; localvars[2] = arg2;
}
}
}
memset (localvars+code->ArgCount, 0, (code->VarCount-code->ArgCount)*sizeof(SDWORD)); memset (localvars+code->ArgCount, 0, (code->VarCount-code->ArgCount)*sizeof(SDWORD));
pc = module->GetScriptAddress (code); pc = module->GetScriptAddress (code);
activator = who; activator = who;

View file

@ -44,6 +44,7 @@
#include "thingdef/thingdef.h" #include "thingdef/thingdef.h"
#include "d_dehacked.h" #include "d_dehacked.h"
#include "g_level.h" #include "g_level.h"
#include "teaminfo.h"
#include "gi.h" #include "gi.h"
@ -308,7 +309,7 @@ bool P_CheckMissileRange (AActor *actor)
{ {
fixed_t dist; fixed_t dist;
if (!P_CheckSight (actor, actor->target, SF_SEEPASTBLOCKEVERYTHING|SF_SEEPASTSHOOTABLELINES)) if (!P_CheckSight (actor, actor->target, SF_SEEPASTBLOCKEVERYTHING))
return false; return false;
if (actor->flags & MF_JUSTHIT) if (actor->flags & MF_JUSTHIT)
@ -1150,7 +1151,7 @@ bool P_IsVisible(AActor *lookee, AActor *other, INTBOOL allaround, FLookExParams
} }
// P_CheckSight is by far the most expensive operation in here so let's do it last. // P_CheckSight is by far the most expensive operation in here so let's do it last.
return P_CheckSight(lookee, other, SF_SEEPASTBLOCKEVERYTHING); return P_CheckSight(lookee, other, SF_SEEPASTSHOOTABLELINES);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -1417,9 +1418,7 @@ AActor *LookForEnemiesInBlock (AActor *lookee, int index, void *extparam)
other = NULL; other = NULL;
if (link->flags & MF_FRIENDLY) if (link->flags & MF_FRIENDLY)
{ {
if (deathmatch && if (!lookee->IsFriend(link))
lookee->FriendPlayer != 0 && link->FriendPlayer != 0 &&
lookee->FriendPlayer != link->FriendPlayer)
{ {
// This is somebody else's friend, so go after it // This is somebody else's friend, so go after it
other = link; other = link;
@ -1581,7 +1580,7 @@ bool P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params)
} }
#endif #endif
// [SP] If you don't see any enemies in deathmatch, look for players (but only when friend to a specific player.) // [SP] If you don't see any enemies in deathmatch, look for players (but only when friend to a specific player.)
if (actor->FriendPlayer == 0) return result; if (actor->FriendPlayer == 0 && (!teamplay || actor->DesignatedTeam == TEAM_NONE)) return result;
if (result || !deathmatch) return true; if (result || !deathmatch) return true;
@ -1664,10 +1663,8 @@ bool P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params)
// We're going to ignore our master, but go after his enemies. // We're going to ignore our master, but go after his enemies.
if ( actor->flags & MF_FRIENDLY ) if ( actor->flags & MF_FRIENDLY )
{ {
if ( actor->FriendPlayer == 0 ) if ( actor->IsFriend(player->mo) )
continue; // I have no friends, I will ignore players. continue;
if ( actor->FriendPlayer == player->mo->FriendPlayer )
continue; // This is my master.
} }
if ((player->mo->flags & MF_SHADOW && !(i_compatflags & COMPATF_INVISIBILITY)) || if ((player->mo->flags & MF_SHADOW && !(i_compatflags & COMPATF_INVISIBILITY)) ||

View file

@ -1087,6 +1087,21 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
} }
} }
// [RH] Avoid friendly fire if enabled
if (!(flags & DMG_FORCED) && source != NULL &&
((player && player != source->player) || !player) &&
target->IsTeammate (source))
{
if (player)
FriendlyFire = true;
if (damage < TELEFRAG_DAMAGE)
{ // Still allow telefragging :-(
damage = (int)((float)damage * level.teamdamage);
if (damage <= 0)
return;
}
}
// //
// player specific // player specific
// //
@ -1115,17 +1130,6 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
return; return;
} }
// [RH] Avoid friendly fire if enabled
if (source != NULL && player != source->player && target->IsTeammate (source))
{
FriendlyFire = true;
if (damage < TELEFRAG_DAMAGE)
{ // Still allow telefragging :-(
damage = (int)((float)damage * level.teamdamage);
if (damage <= 0)
return;
}
}
if (!(flags & DMG_NO_ARMOR) && player->mo->Inventory != NULL) if (!(flags & DMG_NO_ARMOR) && player->mo->Inventory != NULL)
{ {
int newdam = damage; int newdam = damage;

View file

@ -2473,6 +2473,7 @@ FUNC(LS_Line_SetBlocking)
ML_BLOCKEVERYTHING, ML_BLOCKEVERYTHING,
ML_RAILING, ML_RAILING,
ML_BLOCKUSE, ML_BLOCKUSE,
ML_BLOCKSIGHT,
-1 -1
}; };

View file

@ -232,6 +232,7 @@ struct FLineOpening
FTextureID ceilingpic; FTextureID ceilingpic;
FTextureID floorpic; FTextureID floorpic;
bool touchmidtex; bool touchmidtex;
bool abovemidtex;
}; };
void P_LineOpening (FLineOpening &open, AActor *thing, const line_t *linedef, fixed_t x, fixed_t y, fixed_t refx=FIXED_MIN, fixed_t refy=0); void P_LineOpening (FLineOpening &open, AActor *thing, const line_t *linedef, fixed_t x, fixed_t y, fixed_t refx=FIXED_MIN, fixed_t refy=0);
@ -348,6 +349,7 @@ struct FCheckPosition
FTextureID ceilingpic; FTextureID ceilingpic;
sector_t *ceilingsector; sector_t *ceilingsector;
bool touchmidtex; bool touchmidtex;
bool abovemidtex;
bool floatok; bool floatok;
bool FromPMove; bool FromPMove;
line_t *ceilingline; line_t *ceilingline;

View file

@ -148,10 +148,12 @@ static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPos
tmf.floorz = open.bottom; tmf.floorz = open.bottom;
tmf.floorsector = open.bottomsec; tmf.floorsector = open.bottomsec;
tmf.touchmidtex = open.touchmidtex; tmf.touchmidtex = open.touchmidtex;
tmf.abovemidtex = open.abovemidtex;
} }
else if (open.bottom == tmf.floorz) else if (open.bottom == tmf.floorz)
{ {
tmf.touchmidtex |= open.touchmidtex; tmf.touchmidtex |= open.touchmidtex;
tmf.abovemidtex |= open.abovemidtex;
} }
if (open.lowfloor < tmf.dropoffz) if (open.lowfloor < tmf.dropoffz)
@ -250,6 +252,7 @@ void P_FindFloorCeiling (AActor *actor, bool onlyspawnpos)
FBoundingBox box(tmf.x, tmf.y, actor->radius); FBoundingBox box(tmf.x, tmf.y, actor->radius);
tmf.touchmidtex = false; tmf.touchmidtex = false;
tmf.abovemidtex = false;
validcount++; validcount++;
FBlockLinesIterator it(box); FBlockLinesIterator it(box);
@ -262,7 +265,7 @@ void P_FindFloorCeiling (AActor *actor, bool onlyspawnpos)
if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz; if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz;
if (!onlyspawnpos || (tmf.touchmidtex && (tmf.floorz <= actor->z))) if (!onlyspawnpos || (tmf.abovemidtex && (tmf.floorz <= actor->z)))
{ {
actor->floorz = tmf.floorz; actor->floorz = tmf.floorz;
actor->dropoffz = tmf.dropoffz; actor->dropoffz = tmf.dropoffz;
@ -314,6 +317,8 @@ bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefr
tmf.x = x; tmf.x = x;
tmf.y = y; tmf.y = y;
tmf.z = z; tmf.z = z;
tmf.touchmidtex = false;
tmf.abovemidtex = false;
P_GetFloorCeilingZ(tmf, true); P_GetFloorCeilingZ(tmf, true);
spechit.Clear (); spechit.Clear ();
@ -325,10 +330,14 @@ bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefr
FBlockLinesIterator it(box); FBlockLinesIterator it(box);
line_t *ld; line_t *ld;
// P_LineOpening requires the thing's z to be the destination ín order to work.
fixed_t savedz = thing->z;
thing->z = z;
while ((ld = it.Next())) while ((ld = it.Next()))
{ {
PIT_FindFloorCeiling(ld, box, tmf); PIT_FindFloorCeiling(ld, box, tmf);
} }
thing->z = savedz;
if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz; if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz;
@ -731,7 +740,8 @@ bool PIT_CheckLine (line_t *ld, const FBoundingBox &box, FCheckPosition &tm)
// so don't mess around with the z-position // so don't mess around with the z-position
if (ld->frontsector->floorplane==ld->backsector->floorplane && if (ld->frontsector->floorplane==ld->backsector->floorplane &&
ld->frontsector->floorplane==tm.thing->Sector->floorplane && ld->frontsector->floorplane==tm.thing->Sector->floorplane &&
!ld->frontsector->e->XFloor.ffloors.Size() && !ld->backsector->e->XFloor.ffloors.Size()) !ld->frontsector->e->XFloor.ffloors.Size() && !ld->backsector->e->XFloor.ffloors.Size() &&
!open.abovemidtex)
{ {
open.bottom=INT_MIN; open.bottom=INT_MIN;
} }
@ -768,11 +778,13 @@ bool PIT_CheckLine (line_t *ld, const FBoundingBox &box, FCheckPosition &tm)
tm.floorsector = open.bottomsec; tm.floorsector = open.bottomsec;
tm.floorpic = open.floorpic; tm.floorpic = open.floorpic;
tm.touchmidtex = open.touchmidtex; tm.touchmidtex = open.touchmidtex;
tm.abovemidtex = open.abovemidtex;
tm.thing->BlockingLine = ld; tm.thing->BlockingLine = ld;
} }
else if (open.bottom == tm.floorz) else if (open.bottom == tm.floorz)
{ {
tm.touchmidtex |= open.touchmidtex; tm.touchmidtex |= open.touchmidtex;
tm.abovemidtex |= open.abovemidtex;
} }
if (open.lowfloor < tm.dropoffz) if (open.lowfloor < tm.dropoffz)
@ -1258,6 +1270,7 @@ bool P_CheckPosition (AActor *thing, fixed_t x, fixed_t y, FCheckPosition &tm)
tm.ceilingpic = newsec->GetTexture(sector_t::ceiling); tm.ceilingpic = newsec->GetTexture(sector_t::ceiling);
tm.ceilingsector = newsec; tm.ceilingsector = newsec;
tm.touchmidtex = false; tm.touchmidtex = false;
tm.abovemidtex = false;
//Added by MC: Fill the tmsector. //Added by MC: Fill the tmsector.
tm.sector = newsec; tm.sector = newsec;
@ -2864,6 +2877,7 @@ bool aim_t::AimTraverse3DFloors(const divline_t &trace, intercept_t * in)
nextsector=NULL; nextsector=NULL;
nexttopplane=nextbottomplane=NULL; nexttopplane=nextbottomplane=NULL;
if (li->backsector == NULL) return true; // shouldn't really happen but crashed once for me...
if (li->frontsector->e->XFloor.ffloors.Size() || li->backsector->e->XFloor.ffloors.Size()) if (li->frontsector->e->XFloor.ffloors.Size() || li->backsector->e->XFloor.ffloors.Size())
{ {
int frontflag; int frontflag;

View file

@ -212,9 +212,9 @@ void P_LineOpening (FLineOpening &open, AActor *actor, const line_t *linedef,
if (actor != NULL && linedef->frontsector != NULL && linedef->backsector != NULL && if (actor != NULL && linedef->frontsector != NULL && linedef->backsector != NULL &&
linedef->flags & ML_3DMIDTEX) linedef->flags & ML_3DMIDTEX)
{ {
open.touchmidtex = P_LineOpening_3dMidtex(actor, linedef, open.top, open.bottom); open.touchmidtex = P_LineOpening_3dMidtex(actor, linedef, open.top, open.bottom, &open.abovemidtex);
} }
else open.touchmidtex = false; else open.abovemidtex = open.touchmidtex = false;
open.range = open.top - open.bottom; open.range = open.top - open.bottom;
} }

View file

@ -299,9 +299,12 @@ void AActor::Serialize (FArchive &arc)
<< BlockingLine << BlockingLine
<< pushfactor << pushfactor
<< Species << Species
<< Score << Score;
<< Tag if (SaveVersion >= 3113)
<< lastpush << lastbump {
arc << DesignatedTeam;
}
arc << lastpush << lastbump
<< PainThreshold << PainThreshold
<< DamageFactor << DamageFactor
<< WeaveIndexXY << WeaveIndexZ << WeaveIndexXY << WeaveIndexZ
@ -309,6 +312,17 @@ void AActor::Serialize (FArchive &arc)
<< PoisonDamage << PoisonDuration << PoisonPeriod << PoisonDamage << PoisonDuration << PoisonPeriod
<< ConversationRoot << Conversation; << ConversationRoot << Conversation;
{
FString tagstr;
if (arc.IsStoring() && Tag != NULL && Tag->Len() > 0) tagstr = *Tag;
arc << tagstr;
if (arc.IsLoading())
{
if (tagstr.Len() == 0) Tag = NULL;
else Tag = mStringPropertyData.Alloc(tagstr);
}
}
if (arc.IsLoading ()) if (arc.IsLoading ())
{ {
touching_sectorlist = NULL; touching_sectorlist = NULL;
@ -765,6 +779,7 @@ void AActor::CopyFriendliness (AActor *other, bool changeTarget)
flags3 = (flags3 & ~(MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS)) | (other->flags3 & (MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS)); flags3 = (flags3 & ~(MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS)) | (other->flags3 & (MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS));
flags4 = (flags4 & ~MF4_NOHATEPLAYERS) | (other->flags4 & MF4_NOHATEPLAYERS); flags4 = (flags4 & ~MF4_NOHATEPLAYERS) | (other->flags4 & MF4_NOHATEPLAYERS);
FriendPlayer = other->FriendPlayer; FriendPlayer = other->FriendPlayer;
DesignatedTeam = other->DesignatedTeam;
if (changeTarget && other->target != NULL && !(other->target->flags3 & MF3_NOTARGET)) if (changeTarget && other->target != NULL && !(other->target->flags3 & MF3_NOTARGET))
{ {
// LastHeard must be set as well so that A_Look can react to the new target if called // LastHeard must be set as well so that A_Look can react to the new target if called
@ -2735,6 +2750,11 @@ void AActor::Tick ()
//Added by MC: Freeze mode. //Added by MC: Freeze mode.
if (bglobal.freeze || level.flags2 & LEVEL2_FROZEN) if (bglobal.freeze || level.flags2 & LEVEL2_FROZEN)
{ {
// Boss cubes shouldn't be accelerated by timefreeze
if (flags6 & MF6_BOSSCUBE)
{
special2++;
}
return; return;
} }
} }
@ -2765,6 +2785,11 @@ void AActor::Tick ()
if (!(flags5 & MF5_NOTIMEFREEZE)) if (!(flags5 & MF5_NOTIMEFREEZE))
{ {
// Boss cubes shouldn't be accelerated by timefreeze
if (flags6 & MF6_BOSSCUBE)
{
special2++;
}
//Added by MC: Freeze mode. //Added by MC: Freeze mode.
if (bglobal.freeze && !(player && !player->isbot)) if (bglobal.freeze && !(player && !player->isbot))
{ {
@ -5286,12 +5311,18 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
bool AActor::IsTeammate (AActor *other) bool AActor::IsTeammate (AActor *other)
{ {
if (!player || !other || !other->player) if (!other)
return false; return false;
if (!deathmatch) else if (!deathmatch && player && other->player)
return true; return true;
if (teamplay && other->player->userinfo.team != TEAM_NONE && int myTeam = DesignatedTeam;
player->userinfo.team == other->player->userinfo.team) int otherTeam = other->DesignatedTeam;
if (player)
myTeam = player->userinfo.team;
if (other->player)
otherTeam = other->player->userinfo.team;
if (teamplay && myTeam != TEAM_NONE &&
myTeam == otherTeam)
{ {
return true; return true;
} }
@ -5343,6 +5374,11 @@ bool AActor::IsFriend (AActor *other)
{ {
if (flags & other->flags & MF_FRIENDLY) if (flags & other->flags & MF_FRIENDLY)
{ {
if (deathmatch && teamplay)
return IsTeammate(other) ||
(FriendPlayer != 0 && other->FriendPlayer != 0 &&
players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo));
return !deathmatch || return !deathmatch ||
FriendPlayer == other->FriendPlayer || FriendPlayer == other->FriendPlayer ||
FriendPlayer == 0 || FriendPlayer == 0 ||
@ -5368,6 +5404,11 @@ bool AActor::IsHostile (AActor *other)
// Both monsters are friendly and belong to the same player if applicable. // Both monsters are friendly and belong to the same player if applicable.
if (flags & other->flags & MF_FRIENDLY) if (flags & other->flags & MF_FRIENDLY)
{ {
if (deathmatch && teamplay)
return !IsTeammate(other) &&
!(FriendPlayer != 0 && other->FriendPlayer != 0 &&
players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo));
return deathmatch && return deathmatch &&
FriendPlayer != other->FriendPlayer && FriendPlayer != other->FriendPlayer &&
FriendPlayer !=0 && FriendPlayer !=0 &&
@ -5521,11 +5562,13 @@ bool AActor::IsSentient() const
} }
FSharedStringArena AActor::mStringPropertyData;
const char *AActor::GetTag(const char *def) const const char *AActor::GetTag(const char *def) const
{ {
if (Tag != NAME_None) if (Tag != NULL)
{ {
const char *tag = Tag.GetChars(); const char *tag = Tag->GetChars();
if (tag[0] == '$') if (tag[0] == '$')
{ {
return GStrings(tag + 1); return GStrings(tag + 1);
@ -5545,6 +5588,18 @@ const char *AActor::GetTag(const char *def) const
} }
} }
void AActor::SetTag(const char *def)
{
if (def == NULL || *def == 0)
{
Tag = NULL;
}
else
{
Tag = mStringPropertyData.Alloc(def);
}
}
void AActor::ClearCounters() void AActor::ClearCounters()
{ {

View file

@ -256,7 +256,7 @@ bool SightCheck::P_SightCheckLine (line_t *ld)
} }
// try to early out the check // try to early out the check
if (!ld->backsector || !(ld->flags & ML_TWOSIDED)) if (!ld->backsector || !(ld->flags & ML_TWOSIDED) || (ld->flags & ML_BLOCKSIGHT))
return false; // stop checking return false; // stop checking
// [RH] don't see past block everything lines // [RH] don't see past block everything lines

View file

@ -874,6 +874,10 @@ public:
Flag(ld->flags, ML_BLOCKUSE, key); Flag(ld->flags, ML_BLOCKUSE, key);
continue; continue;
case NAME_blocksight:
Flag(ld->flags, ML_BLOCKSIGHT, key);
continue;
default: default:
break; break;
} }

View file

@ -1115,6 +1115,7 @@ void R_InitSkins (void)
for (k = 0; k < MAX_SPRITE_FRAMES; ++k) for (k = 0; k < MAX_SPRITE_FRAMES; ++k)
{ {
sprtemp[k].Flip = 0; sprtemp[k].Flip = 0;
sprtemp[k].Voxel = NULL;
} }
maxframe = -1; maxframe = -1;

View file

@ -21,7 +21,7 @@
static void I_CheckGUICapture (); static void I_CheckGUICapture ();
static void I_CheckNativeMouse (); static void I_CheckNativeMouse ();
static bool GUICapture; bool GUICapture;
static bool NativeMouse = true; static bool NativeMouse = true;
extern int paused; extern int paused;
@ -36,6 +36,9 @@ EXTERN_CVAR (Bool, fullscreen)
extern int WaitingForKey, chatmodeon; extern int WaitingForKey, chatmodeon;
extern constate_e ConsoleState; extern constate_e ConsoleState;
extern SDL_Surface *cursorSurface;
extern SDL_Rect cursorBlit;
static BYTE KeySymToDIK[SDLK_LAST], DownState[SDLK_LAST]; static BYTE KeySymToDIK[SDLK_LAST], DownState[SDLK_LAST];
static WORD DIKToKeySym[256] = static WORD DIKToKeySym[256] =
@ -114,6 +117,11 @@ static void I_CheckGUICapture ()
GUICapture = wantCapt; GUICapture = wantCapt;
if (wantCapt) if (wantCapt)
{ {
int x, y;
SDL_GetMouseState (&x, &y);
cursorBlit.x = x;
cursorBlit.y = y;
FlushDIKState (); FlushDIKState ();
memset (DownState, 0, sizeof(DownState)); memset (DownState, 0, sizeof(DownState));
repeat = !sdl_nokeyrepeat; repeat = !sdl_nokeyrepeat;
@ -260,15 +268,14 @@ static void I_CheckNativeMouse ()
if (wantNative != NativeMouse) if (wantNative != NativeMouse)
{ {
NativeMouse = wantNative; NativeMouse = wantNative;
SDL_ShowCursor (wantNative ? cursorSurface == NULL : 0);
if (wantNative) if (wantNative)
{ {
SDL_ShowCursor (1);
SDL_WM_GrabInput (SDL_GRAB_OFF); SDL_WM_GrabInput (SDL_GRAB_OFF);
FlushDIKState (KEY_MOUSE1, KEY_MOUSE8); FlushDIKState (KEY_MOUSE1, KEY_MOUSE8);
} }
else else
{ {
SDL_ShowCursor (0);
SDL_WM_GrabInput (SDL_GRAB_ON); SDL_WM_GrabInput (SDL_GRAB_ON);
CenterMouse (); CenterMouse ();
} }
@ -299,7 +306,10 @@ void MessagePump (const SDL_Event &sev)
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
case SDL_MOUSEMOTION:
if (!GUICapture || sev.button.button == 4 || sev.button.button == 5) if (!GUICapture || sev.button.button == 4 || sev.button.button == 5)
{
if(sev.type != SDL_MOUSEMOTION)
{ {
event.type = sev.type == SDL_MOUSEBUTTONDOWN ? EV_KeyDown : EV_KeyUp; event.type = sev.type == SDL_MOUSEBUTTONDOWN ? EV_KeyDown : EV_KeyUp;
/* These button mappings work with my Gentoo system using the /* These button mappings work with my Gentoo system using the
@ -338,11 +348,22 @@ void MessagePump (const SDL_Event &sev)
} }
} }
} }
else if (sev.button.button >= 1 && sev.button.button <= 3) }
else if (sev.type == SDL_MOUSEMOTION || (sev.button.button >= 1 && sev.button.button <= 3))
{ {
int x, y;
SDL_GetMouseState (&x, &y);
cursorBlit.x = event.data1 = x;
cursorBlit.y = event.data2 = y;
event.type = EV_GUI_Event; event.type = EV_GUI_Event;
if(sev.type == SDL_MOUSEMOTION)
event.subtype = EV_GUI_MouseMove;
else
{
event.subtype = sev.type == SDL_MOUSEBUTTONDOWN ? EV_GUI_LButtonDown : EV_GUI_LButtonUp; event.subtype = sev.type == SDL_MOUSEBUTTONDOWN ? EV_GUI_LButtonDown : EV_GUI_LButtonUp;
event.subtype += (sev.button.button - 1) * 3; event.subtype += (sev.button.button - 1) * 3;
}
D_PostEvent(&event); D_PostEvent(&event);
} }
break; break;

View file

@ -60,6 +60,9 @@
#include "i_system.h" #include "i_system.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "templates.h" #include "templates.h"
#include "v_palette.h"
#include "textures.h"
#include "bitmap.h"
#include "stats.h" #include "stats.h"
#include "hardware.h" #include "hardware.h"
@ -830,7 +833,39 @@ unsigned int I_MakeRNGSeed()
return seed; return seed;
} }
SDL_Surface *cursorSurface = NULL;
SDL_Rect cursorBlit = {0, 0, 32, 32};
bool I_SetCursor(FTexture *cursorpic) bool I_SetCursor(FTexture *cursorpic)
{
if (cursorpic != NULL && cursorpic->UseType != FTexture::TEX_Null)
{
// Must be no larger than 32x32.
if (cursorpic->GetWidth() > 32 || cursorpic->GetHeight() > 32)
{ {
return false; return false;
} }
if (cursorSurface == NULL)
cursorSurface = SDL_CreateRGBSurface (0, 32, 32, 32, MAKEARGB(0,255,0,0), MAKEARGB(0,0,255,0), MAKEARGB(0,0,0,255), MAKEARGB(255,0,0,0));
SDL_ShowCursor(0);
SDL_LockSurface(cursorSurface);
BYTE buffer[32*32*4];
memset(buffer, 0, 32*32*4);
FBitmap bmp(buffer, 32*4, 32, 32);
cursorpic->CopyTrueColorPixels(&bmp, 0, 0);
memcpy(cursorSurface->pixels, bmp.GetPixels(), 32*32*4);
SDL_UnlockSurface(cursorSurface);
}
else
{
SDL_ShowCursor(1);
if (cursorSurface != NULL)
{
SDL_FreeSurface(cursorSurface);
cursorSurface = NULL;
}
}
return true;
}

View file

@ -76,6 +76,9 @@ void DoBlending (const PalEntry *from, PalEntry *to, int count, int r, int g, in
// EXTERNAL DATA DECLARATIONS ---------------------------------------------- // EXTERNAL DATA DECLARATIONS ----------------------------------------------
extern IVideo *Video; extern IVideo *Video;
extern SDL_Surface *cursorSurface;
extern SDL_Rect cursorBlit;
extern bool GUICapture;
EXTERN_CVAR (Float, Gamma) EXTERN_CVAR (Float, Gamma)
@ -405,6 +408,12 @@ void SDLFB::Update ()
SDL_UnlockSurface (Screen); SDL_UnlockSurface (Screen);
if (cursorSurface != NULL && GUICapture)
{
// SDL requires us to draw a surface to get true color cursors.
SDL_BlitSurface(cursorSurface, NULL, Screen, &cursorBlit);
}
SDLFlipCycles.Clock(); SDLFlipCycles.Clock();
SDL_Flip (Screen); SDL_Flip (Screen);
SDLFlipCycles.Unclock(); SDLFlipCycles.Unclock();

View file

@ -2037,6 +2037,21 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SetScale)
self->scaleY = scaley ? scaley : scalex; self->scaleY = scaley ? scaley : scalex;
} }
//===========================================================================
//
// A_SetMass(int mass)
//
// Sets the actor's mass.
//
//===========================================================================
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SetMass)
{
ACTION_PARAM_START(2);
ACTION_PARAM_INT(mass, 0);
self->Mass = mass;
}
//=========================================================================== //===========================================================================
// //
// A_SpawnDebris // A_SpawnDebris

View file

@ -61,6 +61,7 @@ DEFINE_MEMBER_VARIABLE(args, AActor)
DEFINE_MEMBER_VARIABLE(ceilingz, AActor) DEFINE_MEMBER_VARIABLE(ceilingz, AActor)
DEFINE_MEMBER_VARIABLE(floorz, AActor) DEFINE_MEMBER_VARIABLE(floorz, AActor)
DEFINE_MEMBER_VARIABLE(health, AActor) DEFINE_MEMBER_VARIABLE(health, AActor)
DEFINE_MEMBER_VARIABLE(Mass, AActor)
DEFINE_MEMBER_VARIABLE(pitch, AActor) DEFINE_MEMBER_VARIABLE(pitch, AActor)
DEFINE_MEMBER_VARIABLE(special, AActor) DEFINE_MEMBER_VARIABLE(special, AActor)
DEFINE_MEMBER_VARIABLE(special1, AActor) DEFINE_MEMBER_VARIABLE(special1, AActor)

View file

@ -67,6 +67,7 @@
#include "r_translate.h" #include "r_translate.h"
#include "a_morph.h" #include "a_morph.h"
#include "colormatcher.h" #include "colormatcher.h"
#include "teaminfo.h"
//========================================================================== //==========================================================================
@ -299,7 +300,7 @@ DEFINE_PROPERTY(skip_super, 0, Actor)
DEFINE_PROPERTY(tag, S, Actor) DEFINE_PROPERTY(tag, S, Actor)
{ {
PROP_STRING_PARM(str, 0); PROP_STRING_PARM(str, 0);
defaults->Tag = str; defaults->SetTag(str);
} }
//========================================================================== //==========================================================================
@ -1120,6 +1121,17 @@ DEFINE_PROPERTY(activation, N, Actor)
defaults->activationtype = val; defaults->activationtype = val;
} }
//==========================================================================
//
//==========================================================================
DEFINE_PROPERTY(designatedteam, I, Actor)
{
PROP_INT_PARM(val, 0);
if(val < 0 || (val >= (signed) Teams.Size() && val != TEAM_NONE))
I_Error("Invalid team designation.\n");
defaults->DesignatedTeam = val;
}
//========================================================================== //==========================================================================
// //
// Special inventory properties // Special inventory properties

View file

@ -75,7 +75,7 @@
// SAVESIG should match SAVEVER. // SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded. // MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 3085 #define MINSAVEVER 3100
#if SVN_REVISION_NUMBER < MINSAVEVER #if SVN_REVISION_NUMBER < MINSAVEVER
// If we don't know the current revision write something very high to ensure that // If we don't know the current revision write something very high to ensure that

View file

@ -2,7 +2,7 @@ cmake_minimum_required( VERSION 2.4 )
add_custom_command( OUTPUT ${ZDOOM_OUTPUT_DIR}/zdoom.pk3 add_custom_command( OUTPUT ${ZDOOM_OUTPUT_DIR}/zdoom.pk3
COMMAND ${CMAKE_BINARY_DIR}/tools/zipdir/zipdir -udf ${ZDOOM_OUTPUT_DIR}/zdoom.pk3 ${CMAKE_CURRENT_SOURCE_DIR}/static ${CMAKE_CURRENT_BINARY_DIR}/generated COMMAND ${CMAKE_BINARY_DIR}/tools/zipdir/zipdir -udf ${ZDOOM_OUTPUT_DIR}/zdoom.pk3 ${CMAKE_CURRENT_SOURCE_DIR}/static
DEPENDS zipdir ${CMAKE_CURRENT_SOURCE_DIR}/static ) DEPENDS zipdir ${CMAKE_CURRENT_SOURCE_DIR}/static )
add_custom_target( pk3 ALL add_custom_target( pk3 ALL

View file

@ -21,6 +21,7 @@ ACTOR Actor native //: Thinker
PushFactor 0.25 PushFactor 0.25
WeaveIndexXY 0 WeaveIndexXY 0
WeaveIndexZ 16 WeaveIndexZ 16
DesignatedTeam 255
// Variables for the expression evaluator // Variables for the expression evaluator
// NOTE: fixed_t and angle_t are only used here to ensure proper conversion // NOTE: fixed_t and angle_t are only used here to ensure proper conversion
@ -32,6 +33,7 @@ ACTOR Actor native //: Thinker
native fixed_t ceilingz; native fixed_t ceilingz;
native fixed_t floorz; native fixed_t floorz;
native int health; native int health;
native int mass;
native angle_t pitch; native angle_t pitch;
native int special; native int special;
native int tid; native int tid;
@ -207,6 +209,7 @@ ACTOR Actor native //: Thinker
action native A_FadeOut(float reduce = 0.1, bool remove = true); action native A_FadeOut(float reduce = 0.1, bool remove = true);
action native A_FadeTo(float target, float amount = 0.1, bool remove = false); action native A_FadeTo(float target, float amount = 0.1, bool remove = false);
action native A_SetScale(float scalex, float scaley = 0); action native A_SetScale(float scalex, float scaley = 0);
action native A_SetMass(int mass);
action native A_SpawnDebris(class<Actor> spawntype, bool transfer_translation = false, float mult_h = 1, float mult_v = 1); action native A_SpawnDebris(class<Actor> spawntype, bool transfer_translation = false, float mult_h = 1, float mult_v = 1);
action native A_CheckSight(state label); action native A_CheckSight(state label);
action native A_ExtChase(bool usemelee, bool usemissile, bool playactive = true, bool nightmarefast = false); action native A_ExtChase(bool usemelee, bool usemissile, bool playactive = true, bool nightmarefast = false);

View file

@ -122,6 +122,8 @@ ACTOR MinotaurFriend : Minotaur native
MNTR A 15 A_SetTranslucent(0.66, 0) MNTR A 15 A_SetTranslucent(0.66, 0)
MNTR A 3 A_SetTranslucent(1, 0) MNTR A 3 A_SetTranslucent(1, 0)
Goto Super::Spawn Goto Super::Spawn
Idle:
Goto Super::Spawn
Death: Death:
Goto FadeOut Goto FadeOut
} }

View file

@ -526,12 +526,9 @@ OptionMenu "MouseOptions"
{ {
Title "MOUSE OPTIONS" Title "MOUSE OPTIONS"
Option "Enable mouse", "use_mouse", "YesNo" Option "Enable mouse", "use_mouse", "YesNo"
IfOption(Windows) // GUI mouse not operable in SDL interface right now.
{
Option "Enable mouse in menus", "m_use_mouse", "MenuMouse", "use_mouse" Option "Enable mouse in menus", "m_use_mouse", "MenuMouse", "use_mouse"
Option "Show back button", "m_show_backbutton", "Corners", "use_mouse" Option "Show back button", "m_show_backbutton", "Corners", "use_mouse"
Option "Cursor", "vid_cursor", "Cursors" Option "Cursor", "vid_cursor", "Cursors"
}
StaticText "" StaticText ""
Slider "Overall sensitivity", "mouse_sensitivity", 0.5, 2.5, 0.1 Slider "Overall sensitivity", "mouse_sensitivity", 0.5, 2.5, 0.1
Option "Prescale mouse movement", "m_noprescale", "NoYes" Option "Prescale mouse movement", "m_noprescale", "NoYes"

View file

@ -37,7 +37,7 @@
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
Description="Checking zdoom.pk3..." Description="Checking zdoom.pk3..."
CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &quot;$(InputDir)generated&quot;&#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;" CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
@ -59,7 +59,7 @@
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
Description="Checking zdoom.pk3..." Description="Checking zdoom.pk3..."
CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &quot;$(InputDir)generated&quot;&#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;" CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
@ -81,7 +81,7 @@
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
Description="Checking zdoom.pk3..." Description="Checking zdoom.pk3..."
CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &quot;$(InputDir)generated&quot;&#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;&#x0D;&#x0A;" CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;&#x0D;&#x0A;"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
@ -103,7 +103,7 @@
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
Description="Checking zdoom.pk3..." Description="Checking zdoom.pk3..."
CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &quot;$(InputDir)generated&quot;&#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;&#x0D;&#x0A;" CommandLine="&quot;$(SolutionDir)tools\zipdir\zipdir.exe&quot; -ud &quot;$(InputDir)zdoom.pk3&quot; &quot;$(InputDir)static&quot; &#x0D;&#x0A;copy &quot;$(InputDir)zdoom.pk3&quot; &quot;$(SolutionDir)..\zdoom.pk3&quot;&#x0D;&#x0A;"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>