mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-24 13:01:48 +00:00
- sync 3D floor branch with trunk.
SVN r3123 (3dfloors2)
This commit is contained in:
parent
264ab6b076
commit
c7584cace6
39 changed files with 352 additions and 133 deletions
|
@ -112,6 +112,7 @@ Note: All <bool> fields default to false unless mentioned otherwise.
|
|||
checkswitchrange = <bool>;// Switches can only be activated when vertically reachable.
|
||||
blockprojectiles = <bool>;// Line blocks all projectiles
|
||||
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.
|
||||
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.
|
||||
lightcolor = <integer>; // Sector'S light color as RRGGBB value, default = 0xffffff.
|
||||
fadecolor = <integer>; // Sector'S fog color as RRGGBB value, default = 0x000000.
|
||||
lightcolor = <integer>; // Sector's light color as RRGGBB value, default = 0xffffff.
|
||||
fadecolor = <integer>; // Sector's fog color as RRGGBB value, default = 0x000000.
|
||||
desaturation = <float>; // Color desaturation factor. 0 = none, 1 = full, default = 0.
|
||||
silent = <bool>; // Actors in this sector make no sound,
|
||||
nofallingdamage = <bool>; // Falling damage is disabled in this sector
|
||||
|
@ -183,12 +184,8 @@ Note: All <bool> fields default to false unless mentioned otherwise.
|
|||
|
||||
thing
|
||||
{
|
||||
skill# = <bool> // Unlike the base spec, # can range from 1-8.
|
||||
// 8 is the maximum amount of skills the skill
|
||||
// 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.
|
||||
skill# = <bool> // Unlike the base spec, # can range from 1-16.
|
||||
class# = <bool> // Unlike the base spec, # can range from 1-16.
|
||||
conversation = <int> // Assigns a conversation dialogue to this thing.
|
||||
// Parameter is the conversation ID, 0 meaning none.
|
||||
countsecret = <bool>; // Picking up this actor counts as a secret.
|
||||
|
@ -292,6 +289,10 @@ Added 'countsecret' actor property.
|
|||
1.15 14.12.2010
|
||||
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
|
||||
===============================================================================
|
||||
|
|
|
@ -227,7 +227,7 @@ DEFINE_SPECIAL(Elevator_LowerToNearest, 247, 2, 2, 2)
|
|||
DEFINE_SPECIAL(HealThing, 248, 1, 2, 2)
|
||||
DEFINE_SPECIAL(Door_CloseWaitOpen, 249, 3, 4, 4)
|
||||
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_LowerToLowest, 253, 2, 2, 2)
|
||||
DEFINE_SPECIAL(Ceiling_LowerToFloor, 254, 2, 2, 2)
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "textures/textures.h"
|
||||
#include "r_blend.h"
|
||||
#include "s_sound.h"
|
||||
#include "memarena.h"
|
||||
|
||||
struct subsector_t;
|
||||
//
|
||||
|
@ -324,6 +325,7 @@ enum
|
|||
MF6_ADDITIVEPOISONDAMAGE = 0x00100000,
|
||||
MF6_ADDITIVEPOISONDURATION = 0x00200000,
|
||||
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 ---
|
||||
|
||||
|
@ -760,6 +762,7 @@ public:
|
|||
fixed_t GetGravity() const;
|
||||
bool IsSentient() const;
|
||||
const char *GetTag(const char *def = NULL) const;
|
||||
void SetTag(const char *def);
|
||||
|
||||
|
||||
// info for drawing
|
||||
|
@ -855,7 +858,8 @@ public:
|
|||
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 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
|
||||
line_t *BlockingLine; // Line that blocked the last move
|
||||
|
@ -927,6 +931,7 @@ public:
|
|||
private:
|
||||
static AActor *TIDHash[128];
|
||||
static inline int TIDHASH (int key) { return key & 127; }
|
||||
static FSharedStringArena mStringPropertyData;
|
||||
|
||||
friend class FActorIterator;
|
||||
|
||||
|
|
|
@ -1028,8 +1028,8 @@ static void PrintSecretString(const char *string, bool thislevel)
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (foundone) colstr = TEXTCOLOR_YELLOW;
|
||||
else colstr = TEXTCOLOR_RED;
|
||||
if (foundone) colstr = TEXTCOLOR_RED;
|
||||
else colstr = TEXTCOLOR_GREEN;
|
||||
}
|
||||
}
|
||||
FBrokenLines *brok = V_BreakLines(ConFont, screen->GetWidth()*95/100, string);
|
||||
|
|
|
@ -269,6 +269,10 @@ void FIWadManager::ParseIWadInfos(const char *fn)
|
|||
}
|
||||
delete resfile;
|
||||
}
|
||||
if (mIWadNames.Size() == 0 || mIWads.Size() == 0)
|
||||
{
|
||||
I_FatalError("No IWAD definitions found");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -152,6 +152,7 @@ enum ELineFlags
|
|||
ML_FIRSTSIDEONLY = 0x00800000, // activated only when crossed from front side
|
||||
ML_BLOCKPROJECTILE = 0x01000000,
|
||||
ML_BLOCKUSE = 0x02000000, // blocks all use actions through this line
|
||||
ML_BLOCKSIGHT = 0x04000000, // blocks monster line of sight
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -142,6 +142,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BrainSpit)
|
|||
}
|
||||
// [GZ] Calculates when the projectile will have reached destination
|
||||
spit->special2 += level.maptime;
|
||||
spit->flags6 |= MF6_BOSSCUBE;
|
||||
}
|
||||
|
||||
if (!isdefault)
|
||||
|
|
|
@ -612,6 +612,17 @@ void DIntermissionScreenScroller::Init(FIntermissionAction *desc, bool first)
|
|||
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 ()
|
||||
{
|
||||
FTexture *tex = TexMan[mFirstPic];
|
||||
|
|
|
@ -268,6 +268,7 @@ public:
|
|||
|
||||
DIntermissionScreenScroller() {}
|
||||
virtual void Init(FIntermissionAction *desc, bool first);
|
||||
virtual int Responder (event_t *ev);
|
||||
virtual void Drawer ();
|
||||
};
|
||||
|
||||
|
|
|
@ -373,4 +373,5 @@ void FSharedStringArena::FreeAll()
|
|||
FreeBlocks = block;
|
||||
}
|
||||
memset(Buckets, 0, sizeof(Buckets));
|
||||
TopBlock = NULL;
|
||||
}
|
||||
|
|
|
@ -31,6 +31,9 @@
|
|||
**
|
||||
*/
|
||||
|
||||
#ifndef __MEMARENA_H
|
||||
#define __MEMARENA_H
|
||||
|
||||
#include "zstring.h"
|
||||
|
||||
// A general purpose arena.
|
||||
|
@ -81,3 +84,6 @@ protected:
|
|||
private:
|
||||
void *Alloc(size_t size) { return NULL; } // No access to FMemArena::Alloc for outsiders.
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -507,11 +507,7 @@ bool M_Responder (event_t *ev)
|
|||
// do we want mouse input?
|
||||
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)
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -98,19 +98,13 @@ void DReadThisMenu::Drawer()
|
|||
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);
|
||||
if (alpha < OPAQUE && prevpic != NULL)
|
||||
{
|
||||
screen->DrawTexture (prevpic, 0, 0,
|
||||
DTA_DestWidth, screen->GetWidth(),
|
||||
DTA_DestHeight, screen->GetHeight(),
|
||||
TAG_DONE);
|
||||
screen->DrawTexture (prevpic, 0, 0, DTA_Fullscreen, true, TAG_DONE);
|
||||
}
|
||||
screen->DrawTexture (tex, 0, 0,
|
||||
DTA_DestWidth, screen->GetWidth(),
|
||||
DTA_DestHeight, screen->GetHeight(),
|
||||
DTA_Alpha, alpha,
|
||||
TAG_DONE);
|
||||
screen->DrawTexture (tex, 0, 0, DTA_Fullscreen, true, DTA_Alpha, alpha, TAG_DONE);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -443,6 +443,7 @@ xx(smoothlighting)
|
|||
xx(blockprojectiles)
|
||||
xx(blockuse)
|
||||
xx(hidden)
|
||||
xx(blocksight)
|
||||
|
||||
xx(Renderstyle)
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
*above = false;
|
||||
if (P_GetMidTexturePosition(linedef, 0, &tt, &tb))
|
||||
{
|
||||
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
|
||||
{
|
||||
if(tt > openbottom) openbottom = tt;
|
||||
|
||||
if(tt > openbottom)
|
||||
{
|
||||
openbottom = tt;
|
||||
*above = true;
|
||||
}
|
||||
// returns true if it touches the midtexture
|
||||
return (abs(thing->z - tt) <= thing->MaxStepHeight);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
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_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);
|
||||
void P_StartLinkedSectorInterpolations(TArray<DInterpolation *> &list, sector_t *sector, bool ceiling);
|
||||
|
|
|
@ -1964,6 +1964,7 @@ DLevelScript::~DLevelScript ()
|
|||
{
|
||||
if (localvars != NULL)
|
||||
delete[] localvars;
|
||||
localvars = NULL;
|
||||
}
|
||||
|
||||
void DLevelScript::Unlink ()
|
||||
|
@ -2542,6 +2543,7 @@ enum
|
|||
APROP_ScaleX = 29,
|
||||
APROP_ScaleY = 30,
|
||||
APROP_Dormant = 31,
|
||||
APROP_Mass = 32,
|
||||
};
|
||||
|
||||
// These are needed for ACS's APROP_RenderStyle
|
||||
|
@ -2709,7 +2711,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value)
|
|||
actor->Score = value;
|
||||
|
||||
case APROP_NameTag:
|
||||
actor->Tag = FBehavior::StaticLookupString(value);
|
||||
actor->SetTag(FBehavior::StaticLookupString(value));
|
||||
break;
|
||||
|
||||
case APROP_DamageFactor:
|
||||
|
@ -2730,6 +2732,10 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value)
|
|||
actor->scaleY = value;
|
||||
break;
|
||||
|
||||
case APROP_Mass:
|
||||
actor->Mass = value;
|
||||
break;
|
||||
|
||||
default:
|
||||
// do nothing.
|
||||
break;
|
||||
|
@ -2795,6 +2801,7 @@ int DLevelScript::GetActorProperty (int tid, int property)
|
|||
case APROP_WaterLevel: return actor->waterlevel;
|
||||
case APROP_ScaleX: return actor->scaleX;
|
||||
case APROP_ScaleY: return actor->scaleY;
|
||||
case APROP_Mass: return actor->Mass;
|
||||
|
||||
default: return 0;
|
||||
}
|
||||
|
@ -2832,6 +2839,7 @@ int DLevelScript::CheckActorProperty (int tid, int property, int value)
|
|||
case APROP_WaterLevel:
|
||||
case APROP_ScaleX:
|
||||
case APROP_ScaleY:
|
||||
case APROP_Mass:
|
||||
return (GetActorProperty(tid, property) == value);
|
||||
|
||||
// Boolean values need to compare to a binary version of value
|
||||
|
@ -3052,6 +3060,7 @@ enum EACSFunctions
|
|||
ACSF_GetPolyobjX,
|
||||
ACSF_GetPolyobjY,
|
||||
ACSF_CheckSight,
|
||||
ACSF_SpawnForced,
|
||||
};
|
||||
|
||||
int DLevelScript::SideFromID(int id, int side)
|
||||
|
@ -3523,6 +3532,9 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
|
|||
return 0;
|
||||
}
|
||||
|
||||
case ACSF_SpawnForced:
|
||||
return DoSpawn(args[0], args[1], args[2], args[3], args[4], args[5], true);
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -6013,18 +6025,17 @@ int DLevelScript::RunScript ()
|
|||
sp--;
|
||||
break;
|
||||
|
||||
case PCD_CHECKWEAPON:
|
||||
if (activator == NULL || activator->player == NULL || // Non-players do not have weapons
|
||||
activator->player->ReadyWeapon == NULL)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = 0 == stricmp (FBehavior::StaticLookupString (STACK(1)),
|
||||
activator->player->ReadyWeapon->GetClass()->TypeName.GetChars());
|
||||
}
|
||||
break;
|
||||
case PCD_CHECKWEAPON:
|
||||
if (activator == NULL || activator->player == NULL || // Non-players do not have weapons
|
||||
activator->player->ReadyWeapon == NULL)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = activator->player->ReadyWeapon->GetClass()->TypeName == FName(FBehavior::StaticLookupString (STACK(1)), true);
|
||||
}
|
||||
break;
|
||||
|
||||
case PCD_SETWEAPON:
|
||||
if (activator == NULL || activator->player == NULL)
|
||||
|
@ -6725,9 +6736,18 @@ DLevelScript::DLevelScript (AActor *who, line_t *where, int num, const ScriptPtr
|
|||
script = num;
|
||||
numlocalvars = code->VarCount;
|
||||
localvars = new SDWORD[code->VarCount];
|
||||
localvars[0] = arg0;
|
||||
localvars[1] = arg1;
|
||||
localvars[2] = arg2;
|
||||
if (code->VarCount > 0)
|
||||
{
|
||||
localvars[0] = arg0;
|
||||
if (code->VarCount > 1)
|
||||
{
|
||||
localvars[1] = arg1;
|
||||
if (code->VarCount > 2)
|
||||
{
|
||||
localvars[2] = arg2;
|
||||
}
|
||||
}
|
||||
}
|
||||
memset (localvars+code->ArgCount, 0, (code->VarCount-code->ArgCount)*sizeof(SDWORD));
|
||||
pc = module->GetScriptAddress (code);
|
||||
activator = who;
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include "thingdef/thingdef.h"
|
||||
#include "d_dehacked.h"
|
||||
#include "g_level.h"
|
||||
#include "teaminfo.h"
|
||||
|
||||
#include "gi.h"
|
||||
|
||||
|
@ -308,7 +309,7 @@ bool P_CheckMissileRange (AActor *actor)
|
|||
{
|
||||
fixed_t dist;
|
||||
|
||||
if (!P_CheckSight (actor, actor->target, SF_SEEPASTBLOCKEVERYTHING|SF_SEEPASTSHOOTABLELINES))
|
||||
if (!P_CheckSight (actor, actor->target, SF_SEEPASTBLOCKEVERYTHING))
|
||||
return false;
|
||||
|
||||
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.
|
||||
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;
|
||||
if (link->flags & MF_FRIENDLY)
|
||||
{
|
||||
if (deathmatch &&
|
||||
lookee->FriendPlayer != 0 && link->FriendPlayer != 0 &&
|
||||
lookee->FriendPlayer != link->FriendPlayer)
|
||||
if (!lookee->IsFriend(link))
|
||||
{
|
||||
// This is somebody else's friend, so go after it
|
||||
other = link;
|
||||
|
@ -1581,7 +1580,7 @@ bool P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params)
|
|||
}
|
||||
#endif
|
||||
// [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;
|
||||
|
||||
|
||||
|
@ -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.
|
||||
if ( actor->flags & MF_FRIENDLY )
|
||||
{
|
||||
if ( actor->FriendPlayer == 0 )
|
||||
continue; // I have no friends, I will ignore players.
|
||||
if ( actor->FriendPlayer == player->mo->FriendPlayer )
|
||||
continue; // This is my master.
|
||||
if ( actor->IsFriend(player->mo) )
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((player->mo->flags & MF_SHADOW && !(i_compatflags & COMPATF_INVISIBILITY)) ||
|
||||
|
|
|
@ -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
|
||||
//
|
||||
|
@ -1115,17 +1130,6 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
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)
|
||||
{
|
||||
int newdam = damage;
|
||||
|
|
|
@ -2473,6 +2473,7 @@ FUNC(LS_Line_SetBlocking)
|
|||
ML_BLOCKEVERYTHING,
|
||||
ML_RAILING,
|
||||
ML_BLOCKUSE,
|
||||
ML_BLOCKSIGHT,
|
||||
-1
|
||||
};
|
||||
|
||||
|
|
|
@ -232,6 +232,7 @@ struct FLineOpening
|
|||
FTextureID ceilingpic;
|
||||
FTextureID floorpic;
|
||||
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);
|
||||
|
@ -348,6 +349,7 @@ struct FCheckPosition
|
|||
FTextureID ceilingpic;
|
||||
sector_t *ceilingsector;
|
||||
bool touchmidtex;
|
||||
bool abovemidtex;
|
||||
bool floatok;
|
||||
bool FromPMove;
|
||||
line_t *ceilingline;
|
||||
|
|
|
@ -148,10 +148,12 @@ static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPos
|
|||
tmf.floorz = open.bottom;
|
||||
tmf.floorsector = open.bottomsec;
|
||||
tmf.touchmidtex = open.touchmidtex;
|
||||
tmf.abovemidtex = open.abovemidtex;
|
||||
}
|
||||
else if (open.bottom == tmf.floorz)
|
||||
{
|
||||
tmf.touchmidtex |= open.touchmidtex;
|
||||
tmf.abovemidtex |= open.abovemidtex;
|
||||
}
|
||||
|
||||
if (open.lowfloor < tmf.dropoffz)
|
||||
|
@ -250,6 +252,7 @@ void P_FindFloorCeiling (AActor *actor, bool onlyspawnpos)
|
|||
FBoundingBox box(tmf.x, tmf.y, actor->radius);
|
||||
|
||||
tmf.touchmidtex = false;
|
||||
tmf.abovemidtex = false;
|
||||
validcount++;
|
||||
|
||||
FBlockLinesIterator it(box);
|
||||
|
@ -262,7 +265,7 @@ void P_FindFloorCeiling (AActor *actor, bool onlyspawnpos)
|
|||
|
||||
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->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.y = y;
|
||||
tmf.z = z;
|
||||
tmf.touchmidtex = false;
|
||||
tmf.abovemidtex = false;
|
||||
P_GetFloorCeilingZ(tmf, true);
|
||||
|
||||
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);
|
||||
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()))
|
||||
{
|
||||
PIT_FindFloorCeiling(ld, box, tmf);
|
||||
}
|
||||
thing->z = savedz;
|
||||
|
||||
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
|
||||
if (ld->frontsector->floorplane==ld->backsector->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;
|
||||
}
|
||||
|
@ -768,11 +778,13 @@ bool PIT_CheckLine (line_t *ld, const FBoundingBox &box, FCheckPosition &tm)
|
|||
tm.floorsector = open.bottomsec;
|
||||
tm.floorpic = open.floorpic;
|
||||
tm.touchmidtex = open.touchmidtex;
|
||||
tm.abovemidtex = open.abovemidtex;
|
||||
tm.thing->BlockingLine = ld;
|
||||
}
|
||||
else if (open.bottom == tm.floorz)
|
||||
{
|
||||
tm.touchmidtex |= open.touchmidtex;
|
||||
tm.abovemidtex |= open.abovemidtex;
|
||||
}
|
||||
|
||||
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.ceilingsector = newsec;
|
||||
tm.touchmidtex = false;
|
||||
tm.abovemidtex = false;
|
||||
|
||||
//Added by MC: Fill the tmsector.
|
||||
tm.sector = newsec;
|
||||
|
@ -2864,7 +2877,8 @@ bool aim_t::AimTraverse3DFloors(const divline_t &trace, intercept_t * in)
|
|||
nextsector=NULL;
|
||||
nexttopplane=nextbottomplane=NULL;
|
||||
|
||||
if(li->frontsector->e->XFloor.ffloors.Size() || li->backsector->e->XFloor.ffloors.Size())
|
||||
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())
|
||||
{
|
||||
int frontflag;
|
||||
F3DFloor* rover;
|
||||
|
|
|
@ -212,9 +212,9 @@ void P_LineOpening (FLineOpening &open, AActor *actor, const line_t *linedef,
|
|||
if (actor != NULL && linedef->frontsector != NULL && linedef->backsector != NULL &&
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -299,9 +299,12 @@ void AActor::Serialize (FArchive &arc)
|
|||
<< BlockingLine
|
||||
<< pushfactor
|
||||
<< Species
|
||||
<< Score
|
||||
<< Tag
|
||||
<< lastpush << lastbump
|
||||
<< Score;
|
||||
if (SaveVersion >= 3113)
|
||||
{
|
||||
arc << DesignatedTeam;
|
||||
}
|
||||
arc << lastpush << lastbump
|
||||
<< PainThreshold
|
||||
<< DamageFactor
|
||||
<< WeaveIndexXY << WeaveIndexZ
|
||||
|
@ -309,6 +312,17 @@ void AActor::Serialize (FArchive &arc)
|
|||
<< PoisonDamage << PoisonDuration << PoisonPeriod
|
||||
<< 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 ())
|
||||
{
|
||||
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));
|
||||
flags4 = (flags4 & ~MF4_NOHATEPLAYERS) | (other->flags4 & MF4_NOHATEPLAYERS);
|
||||
FriendPlayer = other->FriendPlayer;
|
||||
DesignatedTeam = other->DesignatedTeam;
|
||||
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
|
||||
|
@ -2735,6 +2750,11 @@ void AActor::Tick ()
|
|||
//Added by MC: Freeze mode.
|
||||
if (bglobal.freeze || level.flags2 & LEVEL2_FROZEN)
|
||||
{
|
||||
// Boss cubes shouldn't be accelerated by timefreeze
|
||||
if (flags6 & MF6_BOSSCUBE)
|
||||
{
|
||||
special2++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -2765,6 +2785,11 @@ void AActor::Tick ()
|
|||
|
||||
if (!(flags5 & MF5_NOTIMEFREEZE))
|
||||
{
|
||||
// Boss cubes shouldn't be accelerated by timefreeze
|
||||
if (flags6 & MF6_BOSSCUBE)
|
||||
{
|
||||
special2++;
|
||||
}
|
||||
//Added by MC: Freeze mode.
|
||||
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)
|
||||
{
|
||||
if (!player || !other || !other->player)
|
||||
if (!other)
|
||||
return false;
|
||||
if (!deathmatch)
|
||||
else if (!deathmatch && player && other->player)
|
||||
return true;
|
||||
if (teamplay && other->player->userinfo.team != TEAM_NONE &&
|
||||
player->userinfo.team == other->player->userinfo.team)
|
||||
int myTeam = DesignatedTeam;
|
||||
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;
|
||||
}
|
||||
|
@ -5343,6 +5374,11 @@ bool AActor::IsFriend (AActor *other)
|
|||
{
|
||||
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 ||
|
||||
FriendPlayer == other->FriendPlayer ||
|
||||
FriendPlayer == 0 ||
|
||||
|
@ -5368,6 +5404,11 @@ bool AActor::IsHostile (AActor *other)
|
|||
// Both monsters are friendly and belong to the same player if applicable.
|
||||
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 &&
|
||||
FriendPlayer != other->FriendPlayer &&
|
||||
FriendPlayer !=0 &&
|
||||
|
@ -5521,11 +5562,13 @@ bool AActor::IsSentient() const
|
|||
}
|
||||
|
||||
|
||||
FSharedStringArena AActor::mStringPropertyData;
|
||||
|
||||
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] == '$')
|
||||
{
|
||||
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()
|
||||
{
|
||||
|
|
|
@ -256,7 +256,7 @@ bool SightCheck::P_SightCheckLine (line_t *ld)
|
|||
}
|
||||
|
||||
// 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
|
||||
|
||||
// [RH] don't see past block everything lines
|
||||
|
|
|
@ -874,6 +874,10 @@ public:
|
|||
Flag(ld->flags, ML_BLOCKUSE, key);
|
||||
continue;
|
||||
|
||||
case NAME_blocksight:
|
||||
Flag(ld->flags, ML_BLOCKSIGHT, key);
|
||||
continue;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1115,6 +1115,7 @@ void R_InitSkins (void)
|
|||
for (k = 0; k < MAX_SPRITE_FRAMES; ++k)
|
||||
{
|
||||
sprtemp[k].Flip = 0;
|
||||
sprtemp[k].Voxel = NULL;
|
||||
}
|
||||
maxframe = -1;
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
static void I_CheckGUICapture ();
|
||||
static void I_CheckNativeMouse ();
|
||||
|
||||
static bool GUICapture;
|
||||
bool GUICapture;
|
||||
static bool NativeMouse = true;
|
||||
|
||||
extern int paused;
|
||||
|
@ -36,6 +36,9 @@ EXTERN_CVAR (Bool, fullscreen)
|
|||
extern int WaitingForKey, chatmodeon;
|
||||
extern constate_e ConsoleState;
|
||||
|
||||
extern SDL_Surface *cursorSurface;
|
||||
extern SDL_Rect cursorBlit;
|
||||
|
||||
static BYTE KeySymToDIK[SDLK_LAST], DownState[SDLK_LAST];
|
||||
|
||||
static WORD DIKToKeySym[256] =
|
||||
|
@ -114,6 +117,11 @@ static void I_CheckGUICapture ()
|
|||
GUICapture = wantCapt;
|
||||
if (wantCapt)
|
||||
{
|
||||
int x, y;
|
||||
SDL_GetMouseState (&x, &y);
|
||||
cursorBlit.x = x;
|
||||
cursorBlit.y = y;
|
||||
|
||||
FlushDIKState ();
|
||||
memset (DownState, 0, sizeof(DownState));
|
||||
repeat = !sdl_nokeyrepeat;
|
||||
|
@ -260,15 +268,14 @@ static void I_CheckNativeMouse ()
|
|||
if (wantNative != NativeMouse)
|
||||
{
|
||||
NativeMouse = wantNative;
|
||||
SDL_ShowCursor (wantNative ? cursorSurface == NULL : 0);
|
||||
if (wantNative)
|
||||
{
|
||||
SDL_ShowCursor (1);
|
||||
SDL_WM_GrabInput (SDL_GRAB_OFF);
|
||||
FlushDIKState (KEY_MOUSE1, KEY_MOUSE8);
|
||||
}
|
||||
else
|
||||
{
|
||||
SDL_ShowCursor (0);
|
||||
SDL_WM_GrabInput (SDL_GRAB_ON);
|
||||
CenterMouse ();
|
||||
}
|
||||
|
@ -299,54 +306,68 @@ void MessagePump (const SDL_Event &sev)
|
|||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
case SDL_MOUSEMOTION:
|
||||
if (!GUICapture || sev.button.button == 4 || sev.button.button == 5)
|
||||
{
|
||||
event.type = sev.type == SDL_MOUSEBUTTONDOWN ? EV_KeyDown : EV_KeyUp;
|
||||
/* These button mappings work with my Gentoo system using the
|
||||
* evdev driver and a Logitech MX510 mouse. Whether or not they
|
||||
* carry over to other Linux systems, I have no idea, but I sure
|
||||
* hope so. (Though buttons 11 and 12 are kind of useless, since
|
||||
* they also trigger buttons 4 and 5.)
|
||||
*/
|
||||
switch (sev.button.button)
|
||||
if(sev.type != SDL_MOUSEMOTION)
|
||||
{
|
||||
case 1: event.data1 = KEY_MOUSE1; break;
|
||||
case 2: event.data1 = KEY_MOUSE3; break;
|
||||
case 3: event.data1 = KEY_MOUSE2; break;
|
||||
case 4: event.data1 = KEY_MWHEELUP; break;
|
||||
case 5: event.data1 = KEY_MWHEELDOWN; break;
|
||||
case 6: event.data1 = KEY_MOUSE4; break; /* dunno; not generated by my mouse */
|
||||
case 7: event.data1 = KEY_MOUSE5; break; /* ditto */
|
||||
case 8: event.data1 = KEY_MOUSE4; break;
|
||||
case 9: event.data1 = KEY_MOUSE5; break;
|
||||
case 10: event.data1 = KEY_MOUSE6; break;
|
||||
case 11: event.data1 = KEY_MOUSE7; break;
|
||||
case 12: event.data1 = KEY_MOUSE8; break;
|
||||
default: printf("SDL mouse button %s %d\n",
|
||||
sev.type == SDL_MOUSEBUTTONDOWN ? "down" : "up", sev.button.button); break;
|
||||
}
|
||||
if (event.data1 != 0)
|
||||
{
|
||||
//DIKState[ActiveDIKState][event.data1] = (event.type == EV_KeyDown);
|
||||
if (event.data1 == KEY_MWHEELUP || event.data1 == KEY_MWHEELDOWN)
|
||||
event.type = sev.type == SDL_MOUSEBUTTONDOWN ? EV_KeyDown : EV_KeyUp;
|
||||
/* These button mappings work with my Gentoo system using the
|
||||
* evdev driver and a Logitech MX510 mouse. Whether or not they
|
||||
* carry over to other Linux systems, I have no idea, but I sure
|
||||
* hope so. (Though buttons 11 and 12 are kind of useless, since
|
||||
* they also trigger buttons 4 and 5.)
|
||||
*/
|
||||
switch (sev.button.button)
|
||||
{
|
||||
WheelMoved(&event);
|
||||
case 1: event.data1 = KEY_MOUSE1; break;
|
||||
case 2: event.data1 = KEY_MOUSE3; break;
|
||||
case 3: event.data1 = KEY_MOUSE2; break;
|
||||
case 4: event.data1 = KEY_MWHEELUP; break;
|
||||
case 5: event.data1 = KEY_MWHEELDOWN; break;
|
||||
case 6: event.data1 = KEY_MOUSE4; break; /* dunno; not generated by my mouse */
|
||||
case 7: event.data1 = KEY_MOUSE5; break; /* ditto */
|
||||
case 8: event.data1 = KEY_MOUSE4; break;
|
||||
case 9: event.data1 = KEY_MOUSE5; break;
|
||||
case 10: event.data1 = KEY_MOUSE6; break;
|
||||
case 11: event.data1 = KEY_MOUSE7; break;
|
||||
case 12: event.data1 = KEY_MOUSE8; break;
|
||||
default: printf("SDL mouse button %s %d\n",
|
||||
sev.type == SDL_MOUSEBUTTONDOWN ? "down" : "up", sev.button.button); break;
|
||||
}
|
||||
else
|
||||
if (event.data1 != 0)
|
||||
{
|
||||
D_PostEvent(&event);
|
||||
//DIKState[ActiveDIKState][event.data1] = (event.type == EV_KeyDown);
|
||||
if (event.data1 == KEY_MWHEELUP || event.data1 == KEY_MWHEELDOWN)
|
||||
{
|
||||
WheelMoved(&event);
|
||||
}
|
||||
else
|
||||
{
|
||||
D_PostEvent(&event);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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.subtype = sev.type == SDL_MOUSEBUTTONDOWN ? EV_GUI_LButtonDown : EV_GUI_LButtonUp;
|
||||
event.subtype += (sev.button.button - 1) * 3;
|
||||
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.button.button - 1) * 3;
|
||||
}
|
||||
D_PostEvent(&event);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case SDL_KEYDOWN:
|
||||
case SDL_KEYUP:
|
||||
if (sev.key.keysym.sym >= SDLK_LAST)
|
||||
|
|
|
@ -60,6 +60,9 @@
|
|||
#include "i_system.h"
|
||||
#include "c_dispatch.h"
|
||||
#include "templates.h"
|
||||
#include "v_palette.h"
|
||||
#include "textures.h"
|
||||
#include "bitmap.h"
|
||||
|
||||
#include "stats.h"
|
||||
#include "hardware.h"
|
||||
|
@ -830,7 +833,39 @@ unsigned int I_MakeRNGSeed()
|
|||
return seed;
|
||||
}
|
||||
|
||||
SDL_Surface *cursorSurface = NULL;
|
||||
SDL_Rect cursorBlit = {0, 0, 32, 32};
|
||||
bool I_SetCursor(FTexture *cursorpic)
|
||||
{
|
||||
return false;
|
||||
if (cursorpic != NULL && cursorpic->UseType != FTexture::TEX_Null)
|
||||
{
|
||||
// Must be no larger than 32x32.
|
||||
if (cursorpic->GetWidth() > 32 || cursorpic->GetHeight() > 32)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -76,6 +76,9 @@ void DoBlending (const PalEntry *from, PalEntry *to, int count, int r, int g, in
|
|||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||
|
||||
extern IVideo *Video;
|
||||
extern SDL_Surface *cursorSurface;
|
||||
extern SDL_Rect cursorBlit;
|
||||
extern bool GUICapture;
|
||||
|
||||
EXTERN_CVAR (Float, Gamma)
|
||||
|
||||
|
@ -404,7 +407,13 @@ void SDLFB::Update ()
|
|||
}
|
||||
|
||||
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();
|
||||
SDL_Flip (Screen);
|
||||
SDLFlipCycles.Unclock();
|
||||
|
|
|
@ -2037,6 +2037,21 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SetScale)
|
|||
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
|
||||
|
|
|
@ -61,6 +61,7 @@ DEFINE_MEMBER_VARIABLE(args, AActor)
|
|||
DEFINE_MEMBER_VARIABLE(ceilingz, AActor)
|
||||
DEFINE_MEMBER_VARIABLE(floorz, AActor)
|
||||
DEFINE_MEMBER_VARIABLE(health, AActor)
|
||||
DEFINE_MEMBER_VARIABLE(Mass, AActor)
|
||||
DEFINE_MEMBER_VARIABLE(pitch, AActor)
|
||||
DEFINE_MEMBER_VARIABLE(special, AActor)
|
||||
DEFINE_MEMBER_VARIABLE(special1, AActor)
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
#include "r_translate.h"
|
||||
#include "a_morph.h"
|
||||
#include "colormatcher.h"
|
||||
#include "teaminfo.h"
|
||||
|
||||
|
||||
//==========================================================================
|
||||
|
@ -299,7 +300,7 @@ DEFINE_PROPERTY(skip_super, 0, Actor)
|
|||
DEFINE_PROPERTY(tag, S, Actor)
|
||||
{
|
||||
PROP_STRING_PARM(str, 0);
|
||||
defaults->Tag = str;
|
||||
defaults->SetTag(str);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -1120,6 +1121,17 @@ DEFINE_PROPERTY(activation, N, Actor)
|
|||
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
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
// SAVESIG should match SAVEVER.
|
||||
|
||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||
#define MINSAVEVER 3085
|
||||
#define MINSAVEVER 3100
|
||||
|
||||
#if SVN_REVISION_NUMBER < MINSAVEVER
|
||||
// If we don't know the current revision write something very high to ensure that
|
||||
|
|
|
@ -2,7 +2,7 @@ cmake_minimum_required( VERSION 2.4 )
|
|||
|
||||
|
||||
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 )
|
||||
|
||||
add_custom_target( pk3 ALL
|
||||
|
|
|
@ -21,6 +21,7 @@ ACTOR Actor native //: Thinker
|
|||
PushFactor 0.25
|
||||
WeaveIndexXY 0
|
||||
WeaveIndexZ 16
|
||||
DesignatedTeam 255
|
||||
|
||||
// Variables for the expression evaluator
|
||||
// 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 floorz;
|
||||
native int health;
|
||||
native int mass;
|
||||
native angle_t pitch;
|
||||
native int special;
|
||||
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_FadeTo(float target, float amount = 0.1, bool remove = false);
|
||||
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_CheckSight(state label);
|
||||
action native A_ExtChase(bool usemelee, bool usemissile, bool playactive = true, bool nightmarefast = false);
|
||||
|
|
|
@ -122,6 +122,8 @@ ACTOR MinotaurFriend : Minotaur native
|
|||
MNTR A 15 A_SetTranslucent(0.66, 0)
|
||||
MNTR A 3 A_SetTranslucent(1, 0)
|
||||
Goto Super::Spawn
|
||||
Idle:
|
||||
Goto Super::Spawn
|
||||
Death:
|
||||
Goto FadeOut
|
||||
}
|
||||
|
|
|
@ -526,12 +526,9 @@ OptionMenu "MouseOptions"
|
|||
{
|
||||
Title "MOUSE OPTIONS"
|
||||
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 "Show back button", "m_show_backbutton", "Corners", "use_mouse"
|
||||
Option "Cursor", "vid_cursor", "Cursors"
|
||||
}
|
||||
Option "Enable mouse in menus", "m_use_mouse", "MenuMouse", "use_mouse"
|
||||
Option "Show back button", "m_show_backbutton", "Corners", "use_mouse"
|
||||
Option "Cursor", "vid_cursor", "Cursors"
|
||||
StaticText ""
|
||||
Slider "Overall sensitivity", "mouse_sensitivity", 0.5, 2.5, 0.1
|
||||
Option "Prescale mouse movement", "m_noprescale", "NoYes"
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
Description="Checking zdoom.pk3..."
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" "$(InputDir)generated"
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3""
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" 
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3""
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
|
@ -59,7 +59,7 @@
|
|||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
Description="Checking zdoom.pk3..."
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" "$(InputDir)generated"
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3""
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" 
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3""
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
|
@ -81,7 +81,7 @@
|
|||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
Description="Checking zdoom.pk3..."
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" "$(InputDir)generated"
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3"
"
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" 
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3"
"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
|
@ -103,7 +103,7 @@
|
|||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
Description="Checking zdoom.pk3..."
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" "$(InputDir)generated"
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3"
"
|
||||
CommandLine=""$(SolutionDir)tools\zipdir\zipdir.exe" -ud "$(InputDir)zdoom.pk3" "$(InputDir)static" 
copy "$(InputDir)zdoom.pk3" "$(SolutionDir)..\zdoom.pk3"
"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
|
|
Loading…
Reference in a new issue