mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 13:01:47 +00:00
SVN r114 (trunk)
This commit is contained in:
parent
b97c417101
commit
caed57baa5
38 changed files with 372 additions and 393 deletions
|
@ -1,3 +1,14 @@
|
||||||
|
May 14, 2006 (Changes by Graf Zahl)
|
||||||
|
- Added an AltFlash state for weapons.
|
||||||
|
- Turned FloatSpeed into an actor property and changed the value to 5
|
||||||
|
for all floating Strife actors, as a comment in the source indicated.
|
||||||
|
- Added GZDoom's code for Vavoom slope things because I wanted to test
|
||||||
|
something with a map from Silent Steel.
|
||||||
|
- Added nocrouch and allowcrouch MAPINFO commands and a DF_NO_CROUCH
|
||||||
|
dmflag.
|
||||||
|
- Added GZDoom's crouching code after cleaning it up so that adding
|
||||||
|
crouching sprites will be easier.
|
||||||
|
|
||||||
May 13, 2006 (Changes by Graf Zahl)
|
May 13, 2006 (Changes by Graf Zahl)
|
||||||
- Fixed: P_StartScript was missing a NULL pointer check for the error
|
- Fixed: P_StartScript was missing a NULL pointer check for the error
|
||||||
message. When trying to puke a script outside a map it crashed.
|
message. When trying to puke a script outside a map it crashed.
|
||||||
|
|
|
@ -681,6 +681,7 @@ public:
|
||||||
WORD UseSound; // [RH] Sound to play when an actor is used.
|
WORD UseSound; // [RH] Sound to play when an actor is used.
|
||||||
|
|
||||||
fixed_t Speed;
|
fixed_t Speed;
|
||||||
|
fixed_t FloatSpeed;
|
||||||
fixed_t MaxDropOffHeight, MaxStepHeight;
|
fixed_t MaxDropOffHeight, MaxStepHeight;
|
||||||
SDWORD Mass;
|
SDWORD Mass;
|
||||||
SWORD PainChance;
|
SWORD PainChance;
|
||||||
|
|
|
@ -115,7 +115,7 @@ FButtonStatus Button_Mlook, Button_Klook, Button_Use, Button_AltAttack,
|
||||||
Button_Attack, Button_Speed, Button_MoveRight, Button_MoveLeft,
|
Button_Attack, Button_Speed, Button_MoveRight, Button_MoveLeft,
|
||||||
Button_Strafe, Button_LookDown, Button_LookUp, Button_Back,
|
Button_Strafe, Button_LookDown, Button_LookUp, Button_Back,
|
||||||
Button_Forward, Button_Right, Button_Left, Button_MoveDown,
|
Button_Forward, Button_Right, Button_Left, Button_MoveDown,
|
||||||
Button_MoveUp, Button_Jump, Button_ShowScores;
|
Button_MoveUp, Button_Jump, Button_ShowScores, Button_Crouch;
|
||||||
|
|
||||||
// To add new actions, go to the console and type "key <action name>".
|
// To add new actions, go to the console and type "key <action name>".
|
||||||
// This will give you the key value to use in the first column. Then
|
// This will give you the key value to use in the first column. Then
|
||||||
|
@ -132,6 +132,7 @@ FActionMap ActionMaps[] =
|
||||||
{ 0x47c02d3b, &Button_Attack, "attack" },
|
{ 0x47c02d3b, &Button_Attack, "attack" },
|
||||||
{ 0x6dcec137, &Button_Back, "back" },
|
{ 0x6dcec137, &Button_Back, "back" },
|
||||||
{ 0x7a67e768, &Button_Left, "left" },
|
{ 0x7a67e768, &Button_Left, "left" },
|
||||||
|
{ 0x8076f318, &Button_Crouch, "crouch" },
|
||||||
{ 0x84b8789a, &Button_MoveLeft, "moveleft" },
|
{ 0x84b8789a, &Button_MoveLeft, "moveleft" },
|
||||||
{ 0x8fd9bf1e, &Button_ShowScores, "showscores" },
|
{ 0x8fd9bf1e, &Button_ShowScores, "showscores" },
|
||||||
{ 0x94b1cc4b, &Button_Use, "use" },
|
{ 0x94b1cc4b, &Button_Use, "use" },
|
||||||
|
@ -1280,3 +1281,4 @@ CCMD (pullin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,7 @@ extern FButtonStatus Button_Mlook, Button_Klook, Button_Use, Button_AltAttack,
|
||||||
Button_Attack, Button_Speed, Button_MoveRight, Button_MoveLeft,
|
Button_Attack, Button_Speed, Button_MoveRight, Button_MoveLeft,
|
||||||
Button_Strafe, Button_LookDown, Button_LookUp, Button_Back,
|
Button_Strafe, Button_LookDown, Button_LookUp, Button_Back,
|
||||||
Button_Forward, Button_Right, Button_Left, Button_MoveDown,
|
Button_Forward, Button_Right, Button_Left, Button_MoveDown,
|
||||||
Button_MoveUp, Button_Jump, Button_ShowScores;
|
Button_MoveUp, Button_Jump, Button_ShowScores, Button_Crouch;
|
||||||
extern bool ParsingKeyConf;
|
extern bool ParsingKeyConf;
|
||||||
|
|
||||||
void ResetButtonTriggers (); // Call ResetTriggers for all buttons
|
void ResetButtonTriggers (); // Call ResetTriggers for all buttons
|
||||||
|
|
|
@ -337,3 +337,41 @@ char *myasctime ()
|
||||||
return "Pre Jan 01 00:00:00 1970\n";
|
return "Pre Jan 01 00:00:00 1970\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* CreatePath: creates a directory including all levels necessary */
|
||||||
|
/* */
|
||||||
|
/************************************************************************/
|
||||||
|
void DoCreatePath(const char * fn)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
char drive[_MAX_DRIVE];
|
||||||
|
#endif
|
||||||
|
char path[PATH_MAX];
|
||||||
|
char p[PATH_MAX];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
_splitpath(fn,drive,path,NULL,NULL);
|
||||||
|
_makepath(p,drive,path,NULL,NULL);
|
||||||
|
i=(int)strlen(p);
|
||||||
|
if (p[i-1]=='/' || p[i-1]=='\\') p[i-1]=0;
|
||||||
|
if (*path) DoCreatePath(p);
|
||||||
|
CreateDirectory(p,NULL);
|
||||||
|
#else
|
||||||
|
// FIXME: write me
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatePath(const char * fn)
|
||||||
|
{
|
||||||
|
char name[PATH_MAX];
|
||||||
|
char c = fn[strlen(fn)-1];
|
||||||
|
|
||||||
|
if (c!='\\' && c!='/')
|
||||||
|
{
|
||||||
|
sprintf(name, "%s/", fn);
|
||||||
|
DoCreatePath(name);
|
||||||
|
}
|
||||||
|
else DoCreatePath(fn);
|
||||||
|
}
|
||||||
|
|
|
@ -51,4 +51,6 @@ void FormatGUID (char *text, const GUID &guid);
|
||||||
|
|
||||||
char *myasctime ();
|
char *myasctime ();
|
||||||
|
|
||||||
|
void CreatePath(const char * fn);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -84,7 +84,7 @@
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
#include "decallib.h"
|
#include "decallib.h"
|
||||||
#include "r_polymost.h"
|
#include "r_polymost.h"
|
||||||
|
#include "version.h"
|
||||||
#include "v_text.h"
|
#include "v_text.h"
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
@ -349,6 +349,7 @@ CVAR (Flag, sv_nofreelook, dmflags, DF_NO_FREELOOK);
|
||||||
CVAR (Flag, sv_respawnsuper, dmflags, DF_RESPAWN_SUPER);
|
CVAR (Flag, sv_respawnsuper, dmflags, DF_RESPAWN_SUPER);
|
||||||
CVAR (Flag, sv_nofov, dmflags, DF_NO_FOV);
|
CVAR (Flag, sv_nofov, dmflags, DF_NO_FOV);
|
||||||
CVAR (Flag, sv_noweaponspawn, dmflags, DF_NO_COOP_WEAPON_SPAWN);
|
CVAR (Flag, sv_noweaponspawn, dmflags, DF_NO_COOP_WEAPON_SPAWN);
|
||||||
|
CVAR (Flag, sv_nocrouch, dmflags, DF_NO_CROUCH);
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
|
|
@ -2254,6 +2254,14 @@ void Net_DoCommand (int type, byte **stream, int player)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DEM_CROUCH:
|
||||||
|
if (gamestate == GS_LEVEL && players[player].mo != NULL)
|
||||||
|
{
|
||||||
|
players[player].crouching = players[player].crouchdir<0? 1 : -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
I_Error ("Unknown net command: %d", type);
|
I_Error ("Unknown net command: %d", type);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -53,6 +53,7 @@ class APlayerPawn : public AActor
|
||||||
public:
|
public:
|
||||||
virtual void Serialize (FArchive &arc);
|
virtual void Serialize (FArchive &arc);
|
||||||
|
|
||||||
|
virtual void Tick();
|
||||||
virtual void AddInventory (AInventory *item);
|
virtual void AddInventory (AInventory *item);
|
||||||
virtual void RemoveInventory (AInventory *item);
|
virtual void RemoveInventory (AInventory *item);
|
||||||
virtual bool UseInventory (AInventory *item);
|
virtual bool UseInventory (AInventory *item);
|
||||||
|
@ -278,10 +279,24 @@ public:
|
||||||
|
|
||||||
FString LogText; // [RH] Log for Strife
|
FString LogText; // [RH] Log for Strife
|
||||||
|
|
||||||
|
signed char crouching;
|
||||||
|
signed char crouchdir;
|
||||||
|
fixed_t crouchfactor;
|
||||||
|
fixed_t crouchoffset;
|
||||||
|
fixed_t crouchviewdelta;
|
||||||
|
|
||||||
fixed_t GetDeltaViewHeight() const
|
fixed_t GetDeltaViewHeight() const
|
||||||
{
|
{
|
||||||
return (defaultviewheight - viewheight) >> 3;
|
return (defaultviewheight + crouchviewdelta - viewheight) >> 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Uncrouch()
|
||||||
|
{
|
||||||
|
crouchfactor = FRACUNIT;
|
||||||
|
crouchoffset = 0;
|
||||||
|
crouchdir = 0;
|
||||||
|
crouching = 0;
|
||||||
|
crouchviewdelta = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -295,6 +310,7 @@ inline FArchive &operator<< (FArchive &arc, player_s *&p)
|
||||||
return arc.SerializePointer (players, (BYTE **)&p, sizeof(*players));
|
return arc.SerializePointer (players, (BYTE **)&p, sizeof(*players));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CROUCHSPEED (FRACUNIT/12)
|
||||||
#define MAX_DN_ANGLE 56 // Max looking down angle
|
#define MAX_DN_ANGLE 56 // Max looking down angle
|
||||||
#define MAX_UP_ANGLE 32 // Max looking up angle
|
#define MAX_UP_ANGLE 32 // Max looking up angle
|
||||||
|
|
||||||
|
|
|
@ -137,6 +137,7 @@ enum EDemoCommand
|
||||||
DEM_CENTERVIEW, // 36
|
DEM_CENTERVIEW, // 36
|
||||||
DEM_SUMMONFRIEND, // 37 String: Thing to fabricate
|
DEM_SUMMONFRIEND, // 37 String: Thing to fabricate
|
||||||
DEM_SPRAY, // 38 String: The decal to spray
|
DEM_SPRAY, // 38 String: The decal to spray
|
||||||
|
DEM_CROUCH, // 39
|
||||||
};
|
};
|
||||||
|
|
||||||
// The following are implemented by cht_DoCheat in m_cheat.cpp
|
// The following are implemented by cht_DoCheat in m_cheat.cpp
|
||||||
|
|
|
@ -220,6 +220,7 @@ enum
|
||||||
DF_RESPAWN_SUPER = 1 << 18, // Respawn invulnerability and invisibility
|
DF_RESPAWN_SUPER = 1 << 18, // Respawn invulnerability and invisibility
|
||||||
DF_NO_FOV = 1 << 19, // Only let the arbitrator set FOV (for all players)
|
DF_NO_FOV = 1 << 19, // Only let the arbitrator set FOV (for all players)
|
||||||
DF_NO_COOP_WEAPON_SPAWN = 1 << 20, // Don't spawn multiplayer weapons in coop games
|
DF_NO_COOP_WEAPON_SPAWN = 1 << 20, // Don't spawn multiplayer weapons in coop games
|
||||||
|
DF_NO_CROUCH = 1 << 21, // Don't allow crouching
|
||||||
};
|
};
|
||||||
|
|
||||||
// [BC] More dmflags. w00p!
|
// [BC] More dmflags. w00p!
|
||||||
|
|
|
@ -274,6 +274,11 @@ CCMD (centerview)
|
||||||
Net_WriteByte (DEM_CENTERVIEW);
|
Net_WriteByte (DEM_CENTERVIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CCMD(crouch)
|
||||||
|
{
|
||||||
|
Net_WriteByte(DEM_CROUCH);
|
||||||
|
}
|
||||||
|
|
||||||
CCMD (land)
|
CCMD (land)
|
||||||
{
|
{
|
||||||
SendLand = true;
|
SendLand = true;
|
||||||
|
@ -534,6 +539,9 @@ void G_BuildTiccmd (ticcmd_t *cmd)
|
||||||
if (Button_Jump.bDown)
|
if (Button_Jump.bDown)
|
||||||
cmd->ucmd.buttons |= BT_JUMP;
|
cmd->ucmd.buttons |= BT_JUMP;
|
||||||
|
|
||||||
|
if (Button_Crouch.bDown)
|
||||||
|
cmd->ucmd.buttons |= BT_DUCK;
|
||||||
|
|
||||||
// [RH] Scale joystick moves to full range of allowed speeds
|
// [RH] Scale joystick moves to full range of allowed speeds
|
||||||
if (JoyAxes[JOYAXIS_PITCH] != 0)
|
if (JoyAxes[JOYAXIS_PITCH] != 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -243,7 +243,7 @@ bool AArtiPoisonBag3::Use (bool pickup)
|
||||||
AActor *mo;
|
AActor *mo;
|
||||||
|
|
||||||
mo = Spawn<AThrowingBomb> (Owner->x, Owner->y,
|
mo = Spawn<AThrowingBomb> (Owner->x, Owner->y,
|
||||||
Owner->z-Owner->floorclip+35*FRACUNIT);
|
Owner->z-Owner->floorclip+35*FRACUNIT + (Owner->player? Owner->player->crouchoffset : 0));
|
||||||
if (mo)
|
if (mo)
|
||||||
{
|
{
|
||||||
angle_t pitch = (angle_t)Owner->pitch >> ANGLETOFINESHIFT;
|
angle_t pitch = (angle_t)Owner->pitch >> ANGLETOFINESHIFT;
|
||||||
|
|
|
@ -243,6 +243,8 @@ static const char *MapInfoMapLevel[] =
|
||||||
"soundinfo",
|
"soundinfo",
|
||||||
"clipmidtextures",
|
"clipmidtextures",
|
||||||
"wrapmidtextures",
|
"wrapmidtextures",
|
||||||
|
"allowcrouch",
|
||||||
|
"nocrouch",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -356,6 +358,8 @@ MapHandlers[] =
|
||||||
{ MITYPE_LUMPNAME, lioffset(soundinfo), 0 },
|
{ MITYPE_LUMPNAME, lioffset(soundinfo), 0 },
|
||||||
{ MITYPE_SETFLAG, LEVEL_CLIPMIDTEX, 0 },
|
{ MITYPE_SETFLAG, LEVEL_CLIPMIDTEX, 0 },
|
||||||
{ MITYPE_SETFLAG, LEVEL_WRAPMIDTEX, 0 },
|
{ MITYPE_SETFLAG, LEVEL_WRAPMIDTEX, 0 },
|
||||||
|
{ MITYPE_SCFLAGS, LEVEL_CROUCH_YES, ~LEVEL_CROUCH_NO },
|
||||||
|
{ MITYPE_SCFLAGS, LEVEL_CROUCH_NO, ~LEVEL_CROUCH_YES },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *MapInfoClusterLevel[] =
|
static const char *MapInfoClusterLevel[] =
|
||||||
|
@ -1510,6 +1514,12 @@ static void goOn (int position, bool keepFacing, bool secret)
|
||||||
NoWipe = 4;
|
NoWipe = 4;
|
||||||
D_DrawIcon = "TELEICON";
|
D_DrawIcon = "TELEICON";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// un-crouch all players here
|
||||||
|
for(int i=0;i<MAXPLAYERS;i++)
|
||||||
|
{
|
||||||
|
players[i].Uncrouch();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void G_ExitLevel (int position, bool keepFacing)
|
void G_ExitLevel (int position, bool keepFacing)
|
||||||
|
@ -2124,6 +2134,10 @@ void G_InitLevelLocals ()
|
||||||
clear = DF_NO_JUMP;
|
clear = DF_NO_JUMP;
|
||||||
if (level.flags & LEVEL_JUMP_NO)
|
if (level.flags & LEVEL_JUMP_NO)
|
||||||
set = DF_NO_JUMP;
|
set = DF_NO_JUMP;
|
||||||
|
if (level.flags & LEVEL_CROUCH_YES)
|
||||||
|
clear = DF_NO_CROUCH;
|
||||||
|
if (level.flags & LEVEL_CROUCH_NO)
|
||||||
|
set = DF_NO_CROUCH;
|
||||||
if (level.flags & LEVEL_FREELOOK_YES)
|
if (level.flags & LEVEL_FREELOOK_YES)
|
||||||
clear |= DF_NO_FREELOOK;
|
clear |= DF_NO_FREELOOK;
|
||||||
if (level.flags & LEVEL_FREELOOK_NO)
|
if (level.flags & LEVEL_FREELOOK_NO)
|
||||||
|
|
|
@ -103,6 +103,9 @@
|
||||||
#define LEVEL_CLIPMIDTEX UCONST64(0x20000000000)
|
#define LEVEL_CLIPMIDTEX UCONST64(0x20000000000)
|
||||||
#define LEVEL_WRAPMIDTEX UCONST64(0x40000000000)
|
#define LEVEL_WRAPMIDTEX UCONST64(0x40000000000)
|
||||||
|
|
||||||
|
#define LEVEL_CROUCH_NO UCONST64(0x80000000000)
|
||||||
|
#define LEVEL_CROUCH_YES UCONST64(0x100000000000)
|
||||||
|
|
||||||
struct acsdefered_s;
|
struct acsdefered_s;
|
||||||
class FBehavior;
|
class FBehavior;
|
||||||
|
|
||||||
|
|
|
@ -208,7 +208,7 @@ public:
|
||||||
FState *ReadyState;
|
FState *ReadyState;
|
||||||
FState *AtkState, *HoldAtkState;
|
FState *AtkState, *HoldAtkState;
|
||||||
FState *AltAtkState, *AltHoldAtkState;
|
FState *AltAtkState, *AltHoldAtkState;
|
||||||
FState *FlashState;
|
FState *FlashState, *AltFlashState;
|
||||||
|
|
||||||
// In-inventory instance variables
|
// In-inventory instance variables
|
||||||
AAmmo *Ammo1, *Ammo2;
|
AAmmo *Ammo1, *Ammo2;
|
||||||
|
|
|
@ -1,361 +0,0 @@
|
||||||
#ifndef __A_PICKUPS_H__
|
|
||||||
#define __A_PICKUPS_H__
|
|
||||||
|
|
||||||
#include "dobject.h"
|
|
||||||
#include "actor.h"
|
|
||||||
#include "info.h"
|
|
||||||
|
|
||||||
#define STREAM_ENUM(e) \
|
|
||||||
inline FArchive &operator<< (FArchive &arc, e &i) \
|
|
||||||
{ \
|
|
||||||
BYTE val = (BYTE)i; \
|
|
||||||
arc << val; \
|
|
||||||
i = (e)val; \
|
|
||||||
return arc; \
|
|
||||||
} \
|
|
||||||
|
|
||||||
// Ammunition types defined.
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
// Doom ammo
|
|
||||||
am_clip, // Pistol / chaingun ammo.
|
|
||||||
am_shell, // Shotgun / double barreled shotgun.
|
|
||||||
am_cell, // Plasma rifle, BFG.
|
|
||||||
am_misl, // Missile launcher.
|
|
||||||
|
|
||||||
// Heretic ammo
|
|
||||||
am_goldwand,
|
|
||||||
am_crossbow,
|
|
||||||
am_blaster,
|
|
||||||
am_skullrod,
|
|
||||||
am_phoenixrod,
|
|
||||||
am_mace,
|
|
||||||
|
|
||||||
// Hexen ammo
|
|
||||||
MANA_1,
|
|
||||||
MANA_2,
|
|
||||||
|
|
||||||
// Strife ammo
|
|
||||||
// am_clip
|
|
||||||
am_electricbolt,
|
|
||||||
am_poisonbolt,
|
|
||||||
// am_cell
|
|
||||||
// am_misl
|
|
||||||
am_hegrenade,
|
|
||||||
am_phgrenade,
|
|
||||||
|
|
||||||
NUMAMMO,
|
|
||||||
|
|
||||||
MANA_BOTH,
|
|
||||||
am_noammo, // Unlimited for chainsaw / fist.
|
|
||||||
MANA_NONE = am_noammo,
|
|
||||||
|
|
||||||
SAVEVER217_NUMAMMO = MANA_2+1
|
|
||||||
|
|
||||||
} ammotype_t;
|
|
||||||
|
|
||||||
STREAM_ENUM (ammotype_t)
|
|
||||||
|
|
||||||
#define MAX_MANA 200
|
|
||||||
|
|
||||||
extern const char *AmmoPics[MANA_BOTH+1];
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
ARMOR_ARMOR = 0,
|
|
||||||
ARMOR_SHIELD,
|
|
||||||
ARMOR_HELMET,
|
|
||||||
ARMOR_AMULET,
|
|
||||||
NUMARMOR
|
|
||||||
} armortype_t;
|
|
||||||
|
|
||||||
extern const char *ArmorPics[NUMARMOR];
|
|
||||||
|
|
||||||
STREAM_ENUM (armortype_t)
|
|
||||||
|
|
||||||
// LUT of ammunition limits for each kind.
|
|
||||||
// This doubles with BackPack powerup item.
|
|
||||||
extern int maxammo[NUMAMMO];
|
|
||||||
|
|
||||||
// The defined weapons,
|
|
||||||
// including a marker indicating
|
|
||||||
// user has not changed weapon.
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
// Doom weapons
|
|
||||||
wp_fist,
|
|
||||||
wp_pistol,
|
|
||||||
wp_shotgun,
|
|
||||||
wp_chaingun,
|
|
||||||
wp_missile,
|
|
||||||
wp_plasma,
|
|
||||||
wp_bfg,
|
|
||||||
wp_chainsaw,
|
|
||||||
wp_supershotgun,
|
|
||||||
|
|
||||||
// Heretic weapons
|
|
||||||
wp_staff,
|
|
||||||
wp_goldwand,
|
|
||||||
wp_crossbow,
|
|
||||||
wp_blaster,
|
|
||||||
wp_skullrod,
|
|
||||||
wp_phoenixrod,
|
|
||||||
wp_mace,
|
|
||||||
wp_gauntlets,
|
|
||||||
wp_beak,
|
|
||||||
|
|
||||||
// Hexen weapons
|
|
||||||
wp_snout,
|
|
||||||
wp_ffist,
|
|
||||||
wp_cmace,
|
|
||||||
wp_mwand,
|
|
||||||
wp_faxe,
|
|
||||||
wp_cstaff,
|
|
||||||
wp_mfrost,
|
|
||||||
wp_fhammer,
|
|
||||||
wp_cfire,
|
|
||||||
wp_mlightning,
|
|
||||||
wp_fsword,
|
|
||||||
wp_choly,
|
|
||||||
wp_mstaff,
|
|
||||||
|
|
||||||
// Strife weapons
|
|
||||||
wp_dagger,
|
|
||||||
wp_electricxbow,
|
|
||||||
wp_assaultgun,
|
|
||||||
wp_minimissile,
|
|
||||||
wp_hegrenadelauncher,
|
|
||||||
wp_flamethrower,
|
|
||||||
wp_maulerscatter,
|
|
||||||
wp_sigil,
|
|
||||||
wp_poisonxbow,
|
|
||||||
wp_phgrenadelauncher,
|
|
||||||
wp_maulertorpedo,
|
|
||||||
|
|
||||||
NUMWEAPONS,
|
|
||||||
|
|
||||||
wp_nochange, // No pending weapon change.
|
|
||||||
|
|
||||||
SAVEVER217_NUMWEAPONS = wp_mstaff+1
|
|
||||||
|
|
||||||
} weapontype_t;
|
|
||||||
|
|
||||||
STREAM_ENUM (weapontype_t)
|
|
||||||
|
|
||||||
// Weapon info: sprite frames, ammunition use.
|
|
||||||
struct FWeaponInfo
|
|
||||||
{
|
|
||||||
DWORD flags;
|
|
||||||
ammotype_t ammo;
|
|
||||||
ammotype_t givingammo;
|
|
||||||
int ammouse;
|
|
||||||
int ammogive;
|
|
||||||
FState *upstate;
|
|
||||||
FState *downstate;
|
|
||||||
FState *readystate;
|
|
||||||
FState *atkstate;
|
|
||||||
FState *holdatkstate;
|
|
||||||
FState *flashstate;
|
|
||||||
const TypeInfo *droptype;
|
|
||||||
int kickback;
|
|
||||||
fixed_t yadjust;
|
|
||||||
const char *upsound;
|
|
||||||
const char *readysound;
|
|
||||||
TypeInfo *type; // type of actor that represents this weapon
|
|
||||||
int minammo; // minimum ammo needed to switch to this weapon
|
|
||||||
|
|
||||||
int GetMinAmmo () const
|
|
||||||
{
|
|
||||||
return (minammo < 0) ? ammouse : minammo;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
WIF_NOAUTOFIRE = 0x00000001, // weapon does not autofire
|
|
||||||
WIF_READYSNDHALF = 0x00000002, // ready sound is played ~1/2 the time
|
|
||||||
WIF_DONTBOB = 0x00000004, // don't bob the weapon
|
|
||||||
WIF_AXEBLOOD = 0x00000008, // weapon makes axe blood on impact (Hexen only)
|
|
||||||
WIF_FIREDAMAGE = 0x00000010, // weapon does fire damage on impact
|
|
||||||
WIF_NOALERT = 0x00000020, // weapon does not alert monsters
|
|
||||||
WIF_AMMO_OPTIONAL = 0x00000040, // weapon can use ammo but does not require it
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAX_WEAPONS_PER_SLOT 8
|
|
||||||
#define NUM_WEAPON_SLOTS 10
|
|
||||||
|
|
||||||
class player_s;
|
|
||||||
class FConfigFile;
|
|
||||||
|
|
||||||
class FWeaponSlot
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FWeaponSlot ();
|
|
||||||
void Clear ();
|
|
||||||
bool AddWeapon (const char *type);
|
|
||||||
bool AddWeapon (const TypeInfo *type);
|
|
||||||
bool AddWeapon (weapontype_t weap);
|
|
||||||
weapontype_t PickWeapon (player_s *player);
|
|
||||||
int CountWeapons ();
|
|
||||||
void StreamOut ();
|
|
||||||
void StreamIn (byte **stream);
|
|
||||||
|
|
||||||
inline weapontype_t GetWeapon (int index) const
|
|
||||||
{
|
|
||||||
return (weapontype_t)Weapons[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
friend weapontype_t PickNextWeapon (player_s *player);
|
|
||||||
friend weapontype_t PickPrevWeapon (player_s *player);
|
|
||||||
|
|
||||||
friend struct FWeaponSlots;
|
|
||||||
|
|
||||||
private:
|
|
||||||
byte Weapons[MAX_WEAPONS_PER_SLOT];
|
|
||||||
};
|
|
||||||
|
|
||||||
// FWeaponSlots::AddDefaultWeapon return codes
|
|
||||||
enum ESlotDef
|
|
||||||
{
|
|
||||||
SLOTDEF_Exists, // Weapon was already assigned a slot
|
|
||||||
SLOTDEF_Added, // Weapon was successfully added
|
|
||||||
SLOTDEF_Full // The specifed slot was full
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FWeaponSlots
|
|
||||||
{
|
|
||||||
FWeaponSlot Slots[NUM_WEAPON_SLOTS];
|
|
||||||
|
|
||||||
void Clear ();
|
|
||||||
bool LocateWeapon (weapontype_t weap, int *const slot, int *const index);
|
|
||||||
ESlotDef AddDefaultWeapon (int slot, const char *weapName, weapontype_t weap);
|
|
||||||
void RestoreSlots (FConfigFile &config);
|
|
||||||
void SaveSlots (FConfigFile &config);
|
|
||||||
void StreamOutSlots ();
|
|
||||||
void StreamInSlots (byte **stream);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern FWeaponSlots LocalWeapons;
|
|
||||||
extern FWeaponInfo *wpnlev1info[NUMWEAPONS], *wpnlev2info[NUMWEAPONS];
|
|
||||||
|
|
||||||
//
|
|
||||||
// Keys
|
|
||||||
//
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
// Heretic keys
|
|
||||||
key_blue = 0,
|
|
||||||
key_yellow,
|
|
||||||
key_green,
|
|
||||||
|
|
||||||
// Doom keys
|
|
||||||
it_bluecard = 0,
|
|
||||||
it_yellowcard,
|
|
||||||
it_redcard,
|
|
||||||
it_blueskull,
|
|
||||||
it_yellowskull,
|
|
||||||
it_redskull,
|
|
||||||
|
|
||||||
// Hexen keys
|
|
||||||
KEY_STEEL = 0,
|
|
||||||
KEY_CAVE,
|
|
||||||
KEY_AXE,
|
|
||||||
KEY_FIRE,
|
|
||||||
KEY_EMERALD,
|
|
||||||
KEY_DUNGEON,
|
|
||||||
KEY_SILVER,
|
|
||||||
KEY_RUSTED,
|
|
||||||
KEY_HORN,
|
|
||||||
KEY_SWAMP,
|
|
||||||
KEY_CASTLE,
|
|
||||||
|
|
||||||
NUMKEYS
|
|
||||||
|
|
||||||
} keytype_t;
|
|
||||||
|
|
||||||
STREAM_ENUM (keytype_t)
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* Class definitions */
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
// A pickup is anything the player can pickup (i.e. weapons, ammo,
|
|
||||||
// powerups, etc)
|
|
||||||
class AInventory : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AInventory, AActor)
|
|
||||||
public:
|
|
||||||
virtual void Touch (AActor *toucher);
|
|
||||||
|
|
||||||
virtual void BeginPlay ();
|
|
||||||
virtual bool ShouldRespawn ();
|
|
||||||
virtual bool ShouldStay ();
|
|
||||||
virtual void Hide ();
|
|
||||||
virtual bool DoRespawn ();
|
|
||||||
virtual bool TryPickup (AActor *toucher);
|
|
||||||
virtual void DoPickupSpecial (AActor *toucher);
|
|
||||||
|
|
||||||
virtual const char *PickupMessage ();
|
|
||||||
virtual void PlayPickupSound (AActor *toucher);
|
|
||||||
private:
|
|
||||||
static int StaticLastMessageTic;
|
|
||||||
static const char *StaticLastMessage;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A weapon is just that.
|
|
||||||
class AWeapon : public AInventory
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AWeapon, AInventory)
|
|
||||||
public:
|
|
||||||
virtual bool TryPickup (AActor *toucher);
|
|
||||||
virtual weapontype_t OldStyleID() const;
|
|
||||||
protected:
|
|
||||||
virtual void PlayPickupSound (AActor *toucher);
|
|
||||||
virtual bool ShouldStay ();
|
|
||||||
};
|
|
||||||
#define S_LIGHTDONE 0
|
|
||||||
|
|
||||||
// Health is some item that gives the player health when picked up.
|
|
||||||
class AHealth : public AInventory
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (AHealth, AInventory)
|
|
||||||
protected:
|
|
||||||
AHealth () {}
|
|
||||||
virtual void PlayPickupSound (AActor *toucher);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Armor gives the player armor when picked up.
|
|
||||||
class AArmor : public AInventory
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (AArmor, AInventory)
|
|
||||||
protected:
|
|
||||||
AArmor () {}
|
|
||||||
virtual void PlayPickupSound (AActor *toucher);
|
|
||||||
};
|
|
||||||
|
|
||||||
class AAmmo : public AInventory
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (AAmmo, AInventory)
|
|
||||||
public:
|
|
||||||
virtual ammotype_t GetAmmoType () const;
|
|
||||||
protected:
|
|
||||||
AAmmo () {}
|
|
||||||
virtual void PlayPickupSound (AActor *toucher);
|
|
||||||
};
|
|
||||||
|
|
||||||
// A key is something the player can use to unlock something
|
|
||||||
class AKey : public AInventory
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (AKey, AInventory)
|
|
||||||
public:
|
|
||||||
virtual bool TryPickup (AActor *toucher);
|
|
||||||
protected:
|
|
||||||
virtual bool ShouldStay ();
|
|
||||||
virtual void PlayPickupSound (AActor *toucher);
|
|
||||||
virtual keytype_t GetKeyType ();
|
|
||||||
AKey () {}
|
|
||||||
};
|
|
||||||
|
|
||||||
#undef STREAM_ENUM
|
|
||||||
|
|
||||||
#endif //__A_PICKUPS_H__
|
|
|
@ -55,7 +55,7 @@ void AWeapon::Serialize (FArchive &arc)
|
||||||
<< UpState << DownState << ReadyState
|
<< UpState << DownState << ReadyState
|
||||||
<< AtkState << HoldAtkState
|
<< AtkState << HoldAtkState
|
||||||
<< AltAtkState << AltHoldAtkState
|
<< AltAtkState << AltHoldAtkState
|
||||||
<< FlashState
|
<< FlashState << AltFlashState
|
||||||
<< Ammo1 << Ammo2 << SisterWeapon
|
<< Ammo1 << Ammo2 << SisterWeapon
|
||||||
<< bAltFire;
|
<< bAltFire;
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,6 +111,7 @@ IMPLEMENT_ACTOR (AAlienSpectre1, Strife, 129, 0)
|
||||||
PROP_SpeedFixed (12)
|
PROP_SpeedFixed (12)
|
||||||
PROP_RadiusFixed (64)
|
PROP_RadiusFixed (64)
|
||||||
PROP_HeightFixed (64)
|
PROP_HeightFixed (64)
|
||||||
|
PROP_FloatSpeed (5)
|
||||||
PROP_Mass (1000)
|
PROP_Mass (1000)
|
||||||
PROP_Flags (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|
|
PROP_Flags (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|
|
||||||
MF_FLOAT|MF_SHADOW|MF_COUNTKILL|MF_NOTDMATCH|MF_STRIFEx8000000)
|
MF_FLOAT|MF_SHADOW|MF_COUNTKILL|MF_NOTDMATCH|MF_STRIFEx8000000)
|
||||||
|
|
|
@ -149,6 +149,7 @@ IMPLEMENT_ACTOR (AEntityBoss, Strife, 128, 0)
|
||||||
PROP_SpeedFixed (13)
|
PROP_SpeedFixed (13)
|
||||||
PROP_RadiusFixed (130)
|
PROP_RadiusFixed (130)
|
||||||
PROP_HeightFixed (200)
|
PROP_HeightFixed (200)
|
||||||
|
PROP_FloatSpeed (5)
|
||||||
PROP_Mass (1000)
|
PROP_Mass (1000)
|
||||||
PROP_Flags (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|
|
PROP_Flags (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|
|
||||||
MF_FLOAT|MF_SHADOW|MF_COUNTKILL|MF_NOTDMATCH|
|
MF_FLOAT|MF_SHADOW|MF_COUNTKILL|MF_NOTDMATCH|
|
||||||
|
@ -252,6 +253,7 @@ IMPLEMENT_ACTOR (AEntitySecond, Strife, -1, 0)
|
||||||
PROP_SpeedFixed (14)
|
PROP_SpeedFixed (14)
|
||||||
PROP_RadiusFixed (130)
|
PROP_RadiusFixed (130)
|
||||||
PROP_HeightFixed (200)
|
PROP_HeightFixed (200)
|
||||||
|
PROP_FloatSpeed (5)
|
||||||
PROP_Mass (1000)
|
PROP_Mass (1000)
|
||||||
PROP_Flags (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|
|
PROP_Flags (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|
|
||||||
MF_FLOAT|MF_SHADOW|MF_COUNTKILL|MF_NOTDMATCH|
|
MF_FLOAT|MF_SHADOW|MF_COUNTKILL|MF_NOTDMATCH|
|
||||||
|
|
|
@ -87,6 +87,7 @@ IMPLEMENT_ACTOR (ALoremaster, Strife, 12, 0)
|
||||||
PROP_SpeedFixed (10)
|
PROP_SpeedFixed (10)
|
||||||
PROP_RadiusFixed (15)
|
PROP_RadiusFixed (15)
|
||||||
PROP_HeightFixed (56)
|
PROP_HeightFixed (56)
|
||||||
|
PROP_FloatSpeed (5)
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_FLOAT|
|
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_FLOAT|
|
||||||
MF_NOBLOOD|MF_COUNTKILL|MF_NOTDMATCH)
|
MF_NOBLOOD|MF_COUNTKILL|MF_NOTDMATCH)
|
||||||
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
|
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
|
||||||
|
|
|
@ -87,6 +87,7 @@ IMPLEMENT_ACTOR (AProgrammer, Strife, 71, 0)
|
||||||
PROP_MissileState (S_PROG_MISSILE)
|
PROP_MissileState (S_PROG_MISSILE)
|
||||||
PROP_DeathState (S_PROG_DIE)
|
PROP_DeathState (S_PROG_DIE)
|
||||||
PROP_SpeedFixed (26)
|
PROP_SpeedFixed (26)
|
||||||
|
PROP_FloatSpeed (5)
|
||||||
PROP_RadiusFixed (45)
|
PROP_RadiusFixed (45)
|
||||||
PROP_HeightFixed (60)
|
PROP_HeightFixed (60)
|
||||||
PROP_Mass (800)
|
PROP_Mass (800)
|
||||||
|
|
|
@ -102,7 +102,7 @@ FGameConfigFile::FGameConfigFile ()
|
||||||
SetValueForKey ("Path", "$HOME", true);
|
SetValueForKey ("Path", "$HOME", true);
|
||||||
SetValueForKey ("Path", "$PROGDIR", true);
|
SetValueForKey ("Path", "$PROGDIR", true);
|
||||||
#else
|
#else
|
||||||
SetValueForKey ("Path", "~/.zdoom", true);
|
SetValueForKey ("Path", HOME_DIR, true);
|
||||||
SetValueForKey ("Path", SHARE_DIR, true);
|
SetValueForKey ("Path", SHARE_DIR, true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,6 +281,7 @@ enum
|
||||||
ADEF_MaxStepHeight,
|
ADEF_MaxStepHeight,
|
||||||
ADEF_BounceFactor,
|
ADEF_BounceFactor,
|
||||||
ADEF_BounceCount,
|
ADEF_BounceCount,
|
||||||
|
ADEF_FloatSpeed,
|
||||||
|
|
||||||
ADEF_SpawnState,
|
ADEF_SpawnState,
|
||||||
ADEF_SeeState,
|
ADEF_SeeState,
|
||||||
|
|
|
@ -185,6 +185,7 @@ static void ApplyActorDefault (int defnum, const char *datastr, int dataint)
|
||||||
case ADEF_ReactionTime: actor->reactiontime = dataint; break;
|
case ADEF_ReactionTime: actor->reactiontime = dataint; break;
|
||||||
case ADEF_PainChance: actor->PainChance = dataint; break;
|
case ADEF_PainChance: actor->PainChance = dataint; break;
|
||||||
case ADEF_Speed: actor->Speed = dataint; break;
|
case ADEF_Speed: actor->Speed = dataint; break;
|
||||||
|
case ADEF_FloatSpeed: actor->FloatSpeed = dataint; break;
|
||||||
case ADEF_Radius: actor->radius = dataint; break;
|
case ADEF_Radius: actor->radius = dataint; break;
|
||||||
case ADEF_Height: actor->height = dataint; break;
|
case ADEF_Height: actor->height = dataint; break;
|
||||||
case ADEF_Mass: actor->Mass = dataint; break;
|
case ADEF_Mass: actor->Mass = dataint; break;
|
||||||
|
|
|
@ -217,6 +217,7 @@ public:
|
||||||
#define PROP_MaxPainChance ADD_WORD_PROP(ADEF_PainChance,256)
|
#define PROP_MaxPainChance ADD_WORD_PROP(ADEF_PainChance,256)
|
||||||
#define PROP_SpeedFixed(x) ADD_FIXD_PROP(ADEF_Speed,x)
|
#define PROP_SpeedFixed(x) ADD_FIXD_PROP(ADEF_Speed,x)
|
||||||
#define PROP_SpeedLong(x) ADD_LONG_PROP(ADEF_Speed,x)
|
#define PROP_SpeedLong(x) ADD_LONG_PROP(ADEF_Speed,x)
|
||||||
|
#define PROP_FloatSpeed(x) ADD_FIXD_PROP(ADEF_FloatSpeed,x)
|
||||||
#define PROP_Radius(x) ADD_LONG_PROP(ADEF_Radius,x)
|
#define PROP_Radius(x) ADD_LONG_PROP(ADEF_Radius,x)
|
||||||
#define PROP_RadiusFixed(x) ADD_FIXD_PROP(ADEF_Radius,x)
|
#define PROP_RadiusFixed(x) ADD_FIXD_PROP(ADEF_Radius,x)
|
||||||
#define PROP_Height(x) ADD_LONG_PROP(ADEF_Height,x)
|
#define PROP_Height(x) ADD_LONG_PROP(ADEF_Height,x)
|
||||||
|
|
|
@ -576,6 +576,7 @@ void M_ScreenShot (char *filename)
|
||||||
autoname = filename;
|
autoname = filename;
|
||||||
DefaultExtension (autoname, writepcx ? ".pcx" : ".png");
|
DefaultExtension (autoname, writepcx ? ".pcx" : ".png");
|
||||||
}
|
}
|
||||||
|
CreatePath(screenshot_dir);
|
||||||
|
|
||||||
// save the screenshot
|
// save the screenshot
|
||||||
screen->Lock (true);
|
screen->Lock (true);
|
||||||
|
|
|
@ -376,6 +376,8 @@ static menuitem_t ControlsItems[] =
|
||||||
{ control, "Turn left", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+left"} },
|
{ control, "Turn left", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+left"} },
|
||||||
{ control, "Turn right", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+right"} },
|
{ control, "Turn right", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+right"} },
|
||||||
{ control, "Jump", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+jump"} },
|
{ control, "Jump", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+jump"} },
|
||||||
|
{ control, "Crouch", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+crouch"} },
|
||||||
|
{ control, "Crouch Toggle", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"crouch"} },
|
||||||
{ control, "Fly / Swim up", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+moveup"} },
|
{ control, "Fly / Swim up", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+moveup"} },
|
||||||
{ control, "Fly / Swim down", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+movedown"} },
|
{ control, "Fly / Swim down", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"+movedown"} },
|
||||||
{ control, "Stop flying", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"land"} },
|
{ control, "Stop flying", {NULL}, {0.0}, {0.0}, {0.0}, {(value_t *)"land"} },
|
||||||
|
@ -476,7 +478,7 @@ static value_t ColumnMethods[] = {
|
||||||
|
|
||||||
static value_t BloodTypes[] = {
|
static value_t BloodTypes[] = {
|
||||||
{ 0.0, "Sprites" },
|
{ 0.0, "Sprites" },
|
||||||
{ 1.0, "Sprites and Particles" },
|
{ 1.0, "Sprites & Particles" },
|
||||||
{ 2.0, "Particles" }
|
{ 2.0, "Particles" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -934,6 +936,7 @@ static menuitem_t DMFlagsItems[] = {
|
||||||
{ bitflag, "Mega powerups respawn",{&dmflags}, {0}, {0}, {0}, {(value_t *)DF_RESPAWN_SUPER} },
|
{ bitflag, "Mega powerups respawn",{&dmflags}, {0}, {0}, {0}, {(value_t *)DF_RESPAWN_SUPER} },
|
||||||
{ bitflag, "Fast monsters", {&dmflags}, {0}, {0}, {0}, {(value_t *)DF_FAST_MONSTERS} },
|
{ bitflag, "Fast monsters", {&dmflags}, {0}, {0}, {0}, {(value_t *)DF_FAST_MONSTERS} },
|
||||||
{ bitflag, "Allow jump", {&dmflags}, {1}, {0}, {0}, {(value_t *)DF_NO_JUMP} },
|
{ bitflag, "Allow jump", {&dmflags}, {1}, {0}, {0}, {(value_t *)DF_NO_JUMP} },
|
||||||
|
{ bitflag, "Allow crouch", {&dmflags}, {1}, {0}, {0}, {(value_t *)DF_NO_CROUCH} },
|
||||||
{ bitflag, "Allow freelook", {&dmflags}, {1}, {0}, {0}, {(value_t *)DF_NO_FREELOOK} },
|
{ bitflag, "Allow freelook", {&dmflags}, {1}, {0}, {0}, {(value_t *)DF_NO_FREELOOK} },
|
||||||
{ bitflag, "Allow FOV", {&dmflags}, {1}, {0}, {0}, {(value_t *)DF_NO_FOV} },
|
{ bitflag, "Allow FOV", {&dmflags}, {1}, {0}, {0}, {(value_t *)DF_NO_FOV} },
|
||||||
{ bitflag, "Allow BFG aiming", {&dmflags2}, {1}, {0}, {0}, {(value_t *)DF2_NO_FREEAIMBFG} },
|
{ bitflag, "Allow BFG aiming", {&dmflags2}, {1}, {0}, {0}, {(value_t *)DF2_NO_FREEAIMBFG} },
|
||||||
|
|
|
@ -479,9 +479,9 @@ BOOL P_Move (AActor *actor)
|
||||||
fixed_t savedz = actor->z;
|
fixed_t savedz = actor->z;
|
||||||
|
|
||||||
if (actor->z < tmfloorz)
|
if (actor->z < tmfloorz)
|
||||||
actor->z += FLOATSPEED;
|
actor->z += actor->FloatSpeed;
|
||||||
else
|
else
|
||||||
actor->z -= FLOATSPEED;
|
actor->z -= actor->FloatSpeed;
|
||||||
|
|
||||||
// [RH] Check to make sure there's nothing in the way of the float
|
// [RH] Check to make sure there's nothing in the way of the float
|
||||||
if (P_TestMobjZ (actor))
|
if (P_TestMobjZ (actor))
|
||||||
|
|
|
@ -29,8 +29,6 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define FLOATSPEED (FRACUNIT*4)
|
|
||||||
|
|
||||||
#define STEEPSLOPE 46341 // [RH] Minimum floorplane.c value for walking
|
#define STEEPSLOPE 46341 // [RH] Minimum floorplane.c value for walking
|
||||||
|
|
||||||
#define MAXMORPHHEALTH 30
|
#define MAXMORPHHEALTH 30
|
||||||
|
|
|
@ -1496,9 +1496,9 @@ void P_FakeZMovement (AActor *mo)
|
||||||
fixed_t dist = P_AproxDistance (mo->x - mo->target->x, mo->y - mo->target->y);
|
fixed_t dist = P_AproxDistance (mo->x - mo->target->x, mo->y - mo->target->y);
|
||||||
fixed_t delta = (mo->target->z + (mo->height>>1)) - mo->z;
|
fixed_t delta = (mo->target->z + (mo->height>>1)) - mo->z;
|
||||||
if (delta < 0 && dist < -(delta*3))
|
if (delta < 0 && dist < -(delta*3))
|
||||||
mo->z -= FLOATSPEED;
|
mo->z -= mo->FloatSpeed;
|
||||||
else if (delta > 0 && dist < (delta*3))
|
else if (delta > 0 && dist < (delta*3))
|
||||||
mo->z += FLOATSPEED;
|
mo->z += mo->FloatSpeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mo->player && mo->flags&MF_NOGRAVITY && (mo->z > mo->floorz))
|
if (mo->player && mo->flags&MF_NOGRAVITY && (mo->z > mo->floorz))
|
||||||
|
|
|
@ -296,6 +296,7 @@ void AActor::Serialize (FArchive &arc)
|
||||||
<< AR_SOUNDW(ActiveSound)
|
<< AR_SOUNDW(ActiveSound)
|
||||||
<< AR_SOUNDW(UseSound)
|
<< AR_SOUNDW(UseSound)
|
||||||
<< Speed
|
<< Speed
|
||||||
|
<< FloatSpeed
|
||||||
<< Mass
|
<< Mass
|
||||||
<< PainChance
|
<< PainChance
|
||||||
<< SpawnState
|
<< SpawnState
|
||||||
|
@ -1285,7 +1286,8 @@ void P_XYMovement (AActor *mo, fixed_t scrollx, fixed_t scrolly)
|
||||||
int steps, step, totalsteps;
|
int steps, step, totalsteps;
|
||||||
fixed_t startx, starty;
|
fixed_t startx, starty;
|
||||||
|
|
||||||
fixed_t maxmove = (mo->waterlevel < 2) || (mo->flags & MF_MISSILE) ? MAXMOVE : MAXMOVE/4;
|
fixed_t maxmove = (mo->waterlevel < 1) || (mo->flags & MF_MISSILE) ||
|
||||||
|
(mo->player && mo->player->crouchoffset<-10*FRACUNIT) ? MAXMOVE : MAXMOVE/4;
|
||||||
|
|
||||||
if (mo->flags2 & MF2_WINDTHRUST && mo->waterlevel < 2 && !(mo->flags & MF_NOCLIP))
|
if (mo->flags2 & MF2_WINDTHRUST && mo->waterlevel < 2 && !(mo->flags & MF_NOCLIP))
|
||||||
{
|
{
|
||||||
|
@ -1311,9 +1313,10 @@ void P_XYMovement (AActor *mo, fixed_t scrollx, fixed_t scrolly)
|
||||||
// that large thrusts can't propel an actor through a wall, because wall
|
// that large thrusts can't propel an actor through a wall, because wall
|
||||||
// running depends on the player's original movement continuing even after
|
// running depends on the player's original movement continuing even after
|
||||||
// it gets blocked.
|
// it gets blocked.
|
||||||
if (mo->player != NULL && (compatflags & COMPATF_WALLRUN) || (mo->waterlevel >= 2))
|
if (mo->player != NULL && (compatflags & COMPATF_WALLRUN) || (mo->waterlevel >= 1) ||
|
||||||
|
(mo->player != NULL && mo->player->crouchfactor < FRACUNIT*3/4))
|
||||||
{
|
{
|
||||||
// try to preserve the direction instead of clamping x and y independently.
|
// preserve the direction instead of clamping x and y independently.
|
||||||
xmove = clamp (mo->momx, -maxmove, maxmove);
|
xmove = clamp (mo->momx, -maxmove, maxmove);
|
||||||
ymove = clamp (mo->momy, -maxmove, maxmove);
|
ymove = clamp (mo->momy, -maxmove, maxmove);
|
||||||
|
|
||||||
|
@ -1825,9 +1828,9 @@ void P_ZMovement (AActor *mo)
|
||||||
dist = P_AproxDistance (mo->x - mo->target->x, mo->y - mo->target->y);
|
dist = P_AproxDistance (mo->x - mo->target->x, mo->y - mo->target->y);
|
||||||
delta = (mo->target->z + (mo->height>>1)) - mo->z;
|
delta = (mo->target->z + (mo->height>>1)) - mo->z;
|
||||||
if (delta < 0 && dist < -(delta*3))
|
if (delta < 0 && dist < -(delta*3))
|
||||||
mo->z -= FLOATSPEED, mo->momz = 0;
|
mo->z -= mo->FloatSpeed, mo->momz = 0;
|
||||||
else if (delta > 0 && dist < (delta*3))
|
else if (delta > 0 && dist < (delta*3))
|
||||||
mo->z += FLOATSPEED, mo->momz = 0;
|
mo->z += mo->FloatSpeed, mo->momz = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mo->player && (mo->flags & MF_NOGRAVITY) && (mo->z > mo->floorz))
|
if (mo->player && (mo->flags & MF_NOGRAVITY) && (mo->z > mo->floorz))
|
||||||
|
@ -2983,6 +2986,7 @@ BEGIN_DEFAULTS (AActor, Any, -1, 0)
|
||||||
PROP_MaxStepHeight(24)
|
PROP_MaxStepHeight(24)
|
||||||
PROP_BounceFactor(FRACUNIT*7/10)
|
PROP_BounceFactor(FRACUNIT*7/10)
|
||||||
PROP_BounceCount(-1)
|
PROP_BounceCount(-1)
|
||||||
|
PROP_FloatSpeed(4)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -3410,6 +3414,7 @@ void P_SpawnPlayer (mapthing2_t *mthing)
|
||||||
p->lastkilltime = 0;
|
p->lastkilltime = 0;
|
||||||
p->BlendR = p->BlendG = p->BlendB = p->BlendA = 0.f;
|
p->BlendR = p->BlendG = p->BlendB = p->BlendA = 0.f;
|
||||||
p->air_finished = level.time + level.airsupply;
|
p->air_finished = level.time + level.airsupply;
|
||||||
|
p->Uncrouch();
|
||||||
|
|
||||||
p->momx = p->momy = 0; // killough 10/98: initialize bobbing to 0.
|
p->momx = p->momy = 0; // killough 10/98: initialize bobbing to 0.
|
||||||
|
|
||||||
|
@ -4455,7 +4460,7 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
|
||||||
}
|
}
|
||||||
if (z != ONFLOORZ && z != ONCEILINGZ)
|
if (z != ONFLOORZ && z != ONCEILINGZ)
|
||||||
{
|
{
|
||||||
z += 4*8*FRACUNIT - source->floorclip;
|
z += 4*8*FRACUNIT - source->floorclip + (source->player? source->player->crouchoffset : 0);
|
||||||
}
|
}
|
||||||
MissileActor = Spawn (type, x, y, z);
|
MissileActor = Spawn (type, x, y, z);
|
||||||
|
|
||||||
|
|
|
@ -663,7 +663,8 @@ void A_GunFlash (AActor *actor)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player->mo->PlayAttacking2 ();
|
player->mo->PlayAttacking2 ();
|
||||||
P_SetPsprite (player, ps_flash, player->ReadyWeapon->FlashState);
|
P_SetPsprite (player, ps_flash, (player->ReadyWeapon->bAltFire && player->ReadyWeapon->AltFlashState != NULL) ?
|
||||||
|
player->ReadyWeapon->AltFlashState : player->ReadyWeapon->FlashState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1148,6 +1148,61 @@ void P_SetSlope (secplane_t *plane, BOOL setCeil, int xyangi, int zangi,
|
||||||
plane->c, z);
|
plane->c, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void P_VavoomSlope(sector_t * sec, int id, fixed_t x, fixed_t y, fixed_t z, int which)
|
||||||
|
{
|
||||||
|
for (int i=0;i<sec->linecount;i++)
|
||||||
|
{
|
||||||
|
line_t * l=sec->lines[i];
|
||||||
|
|
||||||
|
if (l->args[0]==id)
|
||||||
|
{
|
||||||
|
vec3_t v1, v2, cross;
|
||||||
|
secplane_t *srcplane = (which == 0) ? &sec->floorplane : &sec->ceilingplane;
|
||||||
|
fixed_t srcheight = (which == 0) ? sec->floortexz : sec->ceilingtexz;
|
||||||
|
|
||||||
|
v1[0] = FIXED2FLOAT (x - l->v2->x);
|
||||||
|
v1[1] = FIXED2FLOAT (y - l->v2->y);
|
||||||
|
v1[2] = FIXED2FLOAT (z - srcheight);
|
||||||
|
|
||||||
|
v2[0] = FIXED2FLOAT (x - l->v1->x);
|
||||||
|
v2[1] = FIXED2FLOAT (y - l->v1->y);
|
||||||
|
v2[2] = FIXED2FLOAT (z - srcheight);
|
||||||
|
|
||||||
|
CrossProduct (v1, v2, cross);
|
||||||
|
VectorNormalize (cross);
|
||||||
|
|
||||||
|
// Fix backward normals
|
||||||
|
if ((cross[2] < 0 && which == 0) || (cross[2] > 0 && which == 1))
|
||||||
|
{
|
||||||
|
cross[0] = -cross[0];
|
||||||
|
cross[1] = -cross[1];
|
||||||
|
cross[2] = -cross[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
srcplane->a = FLOAT2FIXED (cross[0]);
|
||||||
|
srcplane->b = FLOAT2FIXED (cross[1]);
|
||||||
|
srcplane->c = FLOAT2FIXED (cross[2]);
|
||||||
|
//plane->ic = FLOAT2FIXED (1.f/cross[2]);
|
||||||
|
srcplane->ic = DivScale32 (1, srcplane->c);
|
||||||
|
srcplane->d = -TMulScale16 (srcplane->a, x,
|
||||||
|
srcplane->b, y,
|
||||||
|
srcplane->c, z);
|
||||||
|
|
||||||
|
int v=srcplane->ZatPoint(x,y);
|
||||||
|
int w=srcplane->ZatPoint(l->v1->x,l->v1->y);
|
||||||
|
int x=srcplane->ZatPoint(l->v2->x,l->v2->y);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
THING_SlopeFloorPointLine = 9500,
|
THING_SlopeFloorPointLine = 9500,
|
||||||
|
@ -1156,16 +1211,23 @@ enum
|
||||||
THING_SetCeilingSlope = 9503,
|
THING_SetCeilingSlope = 9503,
|
||||||
THING_CopyFloorPlane = 9510,
|
THING_CopyFloorPlane = 9510,
|
||||||
THING_CopyCeilingPlane = 9511,
|
THING_CopyCeilingPlane = 9511,
|
||||||
|
THING_VavoomFloor=1500,
|
||||||
|
THING_VavoomCeiling=1501,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
static void P_SpawnSlopeMakers (mapthing2_t *firstmt, mapthing2_t *lastmt)
|
static void P_SpawnSlopeMakers (mapthing2_t *firstmt, mapthing2_t *lastmt)
|
||||||
{
|
{
|
||||||
mapthing2_t *mt;
|
mapthing2_t *mt;
|
||||||
|
|
||||||
for (mt = firstmt; mt < lastmt; ++mt)
|
for (mt = firstmt; mt < lastmt; ++mt)
|
||||||
{
|
{
|
||||||
if (mt->type >= THING_SlopeFloorPointLine &&
|
if ((mt->type >= THING_SlopeFloorPointLine &&
|
||||||
mt->type <= THING_SetCeilingSlope)
|
mt->type <= THING_SetCeilingSlope) ||
|
||||||
|
mt->type==THING_VavoomFloor || mt->type==THING_VavoomCeiling)
|
||||||
{
|
{
|
||||||
fixed_t x, y, z;
|
fixed_t x, y, z;
|
||||||
secplane_t *refplane;
|
secplane_t *refplane;
|
||||||
|
@ -1183,7 +1245,11 @@ static void P_SpawnSlopeMakers (mapthing2_t *firstmt, mapthing2_t *lastmt)
|
||||||
refplane = &sec->floorplane;
|
refplane = &sec->floorplane;
|
||||||
}
|
}
|
||||||
z = refplane->ZatPoint (x, y) + (mt->z << FRACBITS);
|
z = refplane->ZatPoint (x, y) + (mt->z << FRACBITS);
|
||||||
if (mt->type <= THING_SlopeCeilingPointLine)
|
if (mt->type==THING_VavoomFloor || mt->type==THING_VavoomCeiling)
|
||||||
|
{
|
||||||
|
P_VavoomSlope(sec, mt->thingid, x, y, mt->z<<FRACBITS, mt->type & 1);
|
||||||
|
}
|
||||||
|
else if (mt->type <= THING_SlopeCeilingPointLine)
|
||||||
{
|
{
|
||||||
P_SlopeLineToPoint (mt->args[0], x, y, z, mt->type & 1);
|
P_SlopeLineToPoint (mt->args[0], x, y, z, mt->type & 1);
|
||||||
}
|
}
|
||||||
|
|
139
src/p_user.cpp
139
src/p_user.cpp
|
@ -127,6 +127,12 @@ void player_s::SetLogText (const char *text)
|
||||||
LogText = text;
|
LogText = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// APlayerPawn
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
IMPLEMENT_ABSTRACT_ACTOR (APlayerPawn)
|
IMPLEMENT_ABSTRACT_ACTOR (APlayerPawn)
|
||||||
IMPLEMENT_ABSTRACT_ACTOR (APlayerChunk)
|
IMPLEMENT_ABSTRACT_ACTOR (APlayerChunk)
|
||||||
|
|
||||||
|
@ -143,6 +149,37 @@ void APlayerPawn::BeginPlay ()
|
||||||
ChangeStatNum (STAT_PLAYER);
|
ChangeStatNum (STAT_PLAYER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// APlayerPawn :: Tick
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void APlayerPawn::Tick()
|
||||||
|
{
|
||||||
|
if (player != NULL && player->mo == this && player->morphTics == 0 && player->playerstate != PST_DEAD)
|
||||||
|
{
|
||||||
|
yscale = FixedMul(GetDefault()->yscale, player->crouchfactor);
|
||||||
|
height = FixedMul(GetDefault()->height, player->crouchfactor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ensure that PlayerPawns not connected to a player or morphed players are always un-crouched.
|
||||||
|
yscale = GetDefault()->yscale;
|
||||||
|
if (health > 0) height = GetDefault()->height;
|
||||||
|
}
|
||||||
|
Super::Tick();
|
||||||
|
|
||||||
|
// Here's the place where crouching sprites should be handled
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// APlayerPawn :: AddInventory
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
void APlayerPawn::AddInventory (AInventory *item)
|
void APlayerPawn::AddInventory (AInventory *item)
|
||||||
{
|
{
|
||||||
// Don't add to the inventory of dead players.
|
// Don't add to the inventory of dead players.
|
||||||
|
@ -163,6 +200,12 @@ void APlayerPawn::AddInventory (AInventory *item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// APlayerPawn :: RemoveInventory
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
void APlayerPawn::RemoveInventory (AInventory *item)
|
void APlayerPawn::RemoveInventory (AInventory *item)
|
||||||
{
|
{
|
||||||
bool pickWeap = false;
|
bool pickWeap = false;
|
||||||
|
@ -208,6 +251,12 @@ void APlayerPawn::RemoveInventory (AInventory *item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// APlayerPawn :: UseInventory
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
bool APlayerPawn::UseInventory (AInventory *item)
|
bool APlayerPawn::UseInventory (AInventory *item)
|
||||||
{
|
{
|
||||||
const PClass *itemtype = item->GetClass();
|
const PClass *itemtype = item->GetClass();
|
||||||
|
@ -556,7 +605,7 @@ void P_CalcHeight (player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fixed_t defaultviewheight = player->defaultviewheight;
|
fixed_t defaultviewheight = player->defaultviewheight + player->crouchviewdelta;
|
||||||
|
|
||||||
if (player->cheats & CF_NOMOMENTUM)
|
if (player->cheats & CF_NOMOMENTUM)
|
||||||
{
|
{
|
||||||
|
@ -695,6 +744,14 @@ void P_MovePlayer (player_t *player)
|
||||||
fm = FixedMul (fm, player->mo->Speed);
|
fm = FixedMul (fm, player->mo->Speed);
|
||||||
sm = FixedMul (sm, player->mo->Speed);
|
sm = FixedMul (sm, player->mo->Speed);
|
||||||
|
|
||||||
|
// When crouching speed and bobbing have to be reduced
|
||||||
|
if (player->morphTics==0 && player->crouchfactor != FRACUNIT)
|
||||||
|
{
|
||||||
|
fm = FixedMul(fm, player->crouchfactor);
|
||||||
|
sm = FixedMul(sm, player->crouchfactor);
|
||||||
|
bobfactor = FixedMul(bobfactor, player->crouchfactor);
|
||||||
|
}
|
||||||
|
|
||||||
forwardmove = Scale (fm, movefactor * 35, TICRATE << 8);
|
forwardmove = Scale (fm, movefactor * 35, TICRATE << 8);
|
||||||
sidemove = Scale (sm, movefactor * 35, TICRATE << 8);
|
sidemove = Scale (sm, movefactor * 35, TICRATE << 8);
|
||||||
|
|
||||||
|
@ -937,6 +994,40 @@ void P_DeathThink (player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC P_CrouchMove
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void P_CrouchMove(player_t * player, int direction)
|
||||||
|
{
|
||||||
|
fixed_t defaultheight = player->mo->GetDefault()->height;
|
||||||
|
fixed_t savedheight = player->mo->height;
|
||||||
|
fixed_t crouchspeed = direction * CROUCHSPEED;
|
||||||
|
|
||||||
|
player->crouchdir = (signed char) direction;
|
||||||
|
player->crouchfactor += crouchspeed;
|
||||||
|
|
||||||
|
// check whether the move is ok
|
||||||
|
player->mo->height = FixedMul(defaultheight, player->crouchfactor);
|
||||||
|
if (!P_TryMove(player->mo, player->mo->x, player->mo->y, false, false))
|
||||||
|
{
|
||||||
|
player->mo->height = savedheight;
|
||||||
|
if (direction > 0)
|
||||||
|
{
|
||||||
|
// doesn't fit
|
||||||
|
player->crouchfactor -= crouchspeed;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
player->mo->height = savedheight;
|
||||||
|
|
||||||
|
player->crouchfactor = clamp<fixed_t>(player->crouchfactor, FRACUNIT/2, FRACUNIT);
|
||||||
|
player->viewheight = FixedMul(player->defaultviewheight, player->crouchfactor);
|
||||||
|
player->crouchviewdelta = player->viewheight - player->defaultviewheight;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC P_PlayerThink
|
// PROC P_PlayerThink
|
||||||
|
@ -1031,8 +1122,43 @@ void P_PlayerThink (player_t *player)
|
||||||
cmd->ucmd.upmove = 0;
|
cmd->ucmd.upmove = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle crouching
|
||||||
|
if (player->morphTics == 0)
|
||||||
|
{
|
||||||
|
if (!(player->cheats & CF_TOTALLYFROZEN))
|
||||||
|
{
|
||||||
|
int crouchdir = player->crouching;
|
||||||
|
|
||||||
|
if (crouchdir==0)
|
||||||
|
{
|
||||||
|
crouchdir = (player->cmd.ucmd.buttons & BT_DUCK)? -1 : 1;
|
||||||
|
}
|
||||||
|
else if (player->cmd.ucmd.buttons & BT_DUCK)
|
||||||
|
{
|
||||||
|
player->crouching=0;
|
||||||
|
}
|
||||||
|
if (crouchdir == 1 && player->crouchfactor < FRACUNIT &&
|
||||||
|
player->mo->z + player->mo->height < player->mo->ceilingz)
|
||||||
|
{
|
||||||
|
P_CrouchMove(player, 1);
|
||||||
|
}
|
||||||
|
else if (crouchdir == -1 && player->crouchfactor > FRACUNIT/2)
|
||||||
|
{
|
||||||
|
P_CrouchMove(player, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->Uncrouch();
|
||||||
|
}
|
||||||
|
|
||||||
|
player->crouchoffset = -FixedMul(player->defaultviewheight, (FRACUNIT - player->crouchfactor));
|
||||||
|
|
||||||
|
|
||||||
if (player->playerstate == PST_DEAD)
|
if (player->playerstate == PST_DEAD)
|
||||||
{
|
{
|
||||||
|
player->Uncrouch();
|
||||||
P_DeathThink (player);
|
P_DeathThink (player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1099,6 +1225,12 @@ void P_PlayerThink (player_t *player)
|
||||||
// [RH] check for jump
|
// [RH] check for jump
|
||||||
if (cmd->ucmd.buttons & BT_JUMP)
|
if (cmd->ucmd.buttons & BT_JUMP)
|
||||||
{
|
{
|
||||||
|
if (player->crouchoffset!=0)
|
||||||
|
{
|
||||||
|
// Jumping while crouching will force an un-crouch but not jump
|
||||||
|
player->crouching = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
if (player->mo->waterlevel >= 2)
|
if (player->mo->waterlevel >= 2)
|
||||||
{
|
{
|
||||||
player->mo->momz = 4*FRACUNIT;
|
player->mo->momz = 4*FRACUNIT;
|
||||||
|
@ -1419,6 +1551,11 @@ void player_s::Serialize (FArchive &arc)
|
||||||
|
|
||||||
arc << CurrentPlayerClass;
|
arc << CurrentPlayerClass;
|
||||||
|
|
||||||
|
arc << crouchfactor
|
||||||
|
<< crouching
|
||||||
|
<< crouchdir
|
||||||
|
<< crouchviewdelta;
|
||||||
|
|
||||||
if (isbot)
|
if (isbot)
|
||||||
{
|
{
|
||||||
arc << angle
|
arc << angle
|
||||||
|
|
|
@ -1128,7 +1128,7 @@ static const char * actor_statenames[]={"SPAWN","SEE","PAIN","MELEE","MISSILE","
|
||||||
"CRUSH", "YES", "NO", "GREETINGS", NULL};
|
"CRUSH", "YES", "NO", "GREETINGS", NULL};
|
||||||
|
|
||||||
static const char * weapon_statenames[]={"SELECT", "DESELECT", "READY", "FIRE", "HOLD",
|
static const char * weapon_statenames[]={"SELECT", "DESELECT", "READY", "FIRE", "HOLD",
|
||||||
"ALTFIRE", "ALTHOLD", "FLASH", NULL };
|
"ALTFIRE", "ALTHOLD", "FLASH", "ALTFLASH", NULL };
|
||||||
|
|
||||||
static const char * inventory_statenames[]={"USE", "PICKUP", "DROP", NULL };
|
static const char * inventory_statenames[]={"USE", "PICKUP", "DROP", NULL };
|
||||||
|
|
||||||
|
@ -1429,7 +1429,7 @@ static void RetargetStates (intptr_t count, const char *target, const PClass *cl
|
||||||
if (cls->IsDescendantOf (RUNTIME_CLASS(AWeapon)))
|
if (cls->IsDescendantOf (RUNTIME_CLASS(AWeapon)))
|
||||||
{
|
{
|
||||||
AWeapon *weapon = (AWeapon *)defaults;
|
AWeapon *weapon = (AWeapon *)defaults;
|
||||||
RetargetStatePointers (count, target, &weapon->UpState, &weapon->FlashState);
|
RetargetStatePointers (count, target, &weapon->UpState, &weapon->AltFlashState);
|
||||||
}
|
}
|
||||||
if (cls->IsDescendantOf (RUNTIME_CLASS(ACustomInventory)))
|
if (cls->IsDescendantOf (RUNTIME_CLASS(ACustomInventory)))
|
||||||
{
|
{
|
||||||
|
@ -1947,7 +1947,7 @@ static int FinishStates (FActorInfo *actor, AActor *defaults, Baggage &bag)
|
||||||
{
|
{
|
||||||
AWeapon *weapon = (AWeapon*)defaults;
|
AWeapon *weapon = (AWeapon*)defaults;
|
||||||
|
|
||||||
FixStatePointers (actor, &weapon->UpState, &weapon->FlashState);
|
FixStatePointers (actor, &weapon->UpState, &weapon->AltFlashState);
|
||||||
}
|
}
|
||||||
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(ACustomInventory)))
|
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(ACustomInventory)))
|
||||||
{
|
{
|
||||||
|
@ -1993,7 +1993,7 @@ static int FinishStates (FActorInfo *actor, AActor *defaults, Baggage &bag)
|
||||||
{
|
{
|
||||||
AWeapon *weapon = (AWeapon*)defaults;
|
AWeapon *weapon = (AWeapon*)defaults;
|
||||||
|
|
||||||
FixStatePointersAgain (actor, defaults, &weapon->UpState, &weapon->FlashState);
|
FixStatePointersAgain (actor, defaults, &weapon->UpState, &weapon->AltFlashState);
|
||||||
}
|
}
|
||||||
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(ACustomInventory)))
|
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(ACustomInventory)))
|
||||||
{
|
{
|
||||||
|
@ -2377,6 +2377,15 @@ static void ActorSpeed (AActor *defaults, Baggage &bag)
|
||||||
defaults->Speed=fixed_t(sc_Float*FRACUNIT);
|
defaults->Speed=fixed_t(sc_Float*FRACUNIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
static void ActorFloatSpeed (AActor *defaults, Baggage &bag)
|
||||||
|
{
|
||||||
|
SC_MustGetFloat();
|
||||||
|
defaults->FloatSpeed=fixed_t(sc_Float*FRACUNIT);
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -3506,6 +3515,7 @@ static const ActorProps props[] =
|
||||||
{ "explosiondamage", ActorExplosionDamage, RUNTIME_CLASS(AActor) },
|
{ "explosiondamage", ActorExplosionDamage, RUNTIME_CLASS(AActor) },
|
||||||
{ "explosionradius", ActorExplosionRadius, RUNTIME_CLASS(AActor) },
|
{ "explosionradius", ActorExplosionRadius, RUNTIME_CLASS(AActor) },
|
||||||
{ "fastspeed", ActorFastSpeed, RUNTIME_CLASS(AActor) },
|
{ "fastspeed", ActorFastSpeed, RUNTIME_CLASS(AActor) },
|
||||||
|
{ "floatspeed", ActorFloatSpeed, RUNTIME_CLASS(AActor) },
|
||||||
{ "game", ActorGame, RUNTIME_CLASS(AActor) },
|
{ "game", ActorGame, RUNTIME_CLASS(AActor) },
|
||||||
{ "gibhealth", ActorGibHealth, RUNTIME_CLASS(AActor) },
|
{ "gibhealth", ActorGibHealth, RUNTIME_CLASS(AActor) },
|
||||||
{ "heal", ActorHealState, RUNTIME_CLASS(AActor) },
|
{ "heal", ActorHealState, RUNTIME_CLASS(AActor) },
|
||||||
|
|
|
@ -532,7 +532,7 @@ void A_CustomMissile(AActor * self)
|
||||||
angle_t ang = (self->angle - ANGLE_90) >> ANGLETOFINESHIFT;
|
angle_t ang = (self->angle - ANGLE_90) >> ANGLETOFINESHIFT;
|
||||||
fixed_t x = Spawnofs_XY * finecosine[ang];
|
fixed_t x = Spawnofs_XY * finecosine[ang];
|
||||||
fixed_t y = Spawnofs_XY * finesine[ang];
|
fixed_t y = Spawnofs_XY * finesine[ang];
|
||||||
fixed_t z = SpawnHeight-32*FRACUNIT;
|
fixed_t z = SpawnHeight - 32*FRACUNIT + (self->player? self->player->crouchoffset : 0);
|
||||||
|
|
||||||
switch (aimmode&3)
|
switch (aimmode&3)
|
||||||
{
|
{
|
||||||
|
@ -1197,7 +1197,8 @@ void A_ThrowGrenade(AActor * self)
|
||||||
|
|
||||||
AActor * bo;
|
AActor * bo;
|
||||||
|
|
||||||
bo = Spawn(missile, self->x, self->y, self->z - self->floorclip + zheight + 35*FRACUNIT);
|
bo = Spawn(missile, self->x, self->y,
|
||||||
|
self->z - self->floorclip + zheight + 35*FRACUNIT + (self->player? self->player->crouchoffset : 0));
|
||||||
if (bo)
|
if (bo)
|
||||||
{
|
{
|
||||||
int pitch = self->pitch;
|
int pitch = self->pitch;
|
||||||
|
|
|
@ -68,6 +68,10 @@
|
||||||
#define GAMESIG "ZDOOM"
|
#define GAMESIG "ZDOOM"
|
||||||
#define BASEWAD "zdoom.pk3"
|
#define BASEWAD "zdoom.pk3"
|
||||||
|
|
||||||
|
#ifdef unix
|
||||||
|
#define HOME_DIR "~/.zdoom"
|
||||||
|
#endif
|
||||||
|
|
||||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||||
#define MINSAVEVER 232 // Used by 2.0.99
|
#define MINSAVEVER 232 // Used by 2.0.99
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue