Update to ZDoom r1643

- Added Hirogen2's unlimited pickup patch.
- Added railgun performance customization CVARs by Spleen.
- Added aspect ratio override submission by SoulPriestess.
- Added a 'resetinventory' MAPINFO option.
- Added MF6_NOFEAR flag.
- Added A_MonsterRefire(probability, jumptarget).
- Added A_JumpIfTargetInSight(state) action function.
- Changed: Puffs set their angle to face the originator of the attack.
- Strife's burning hands originally make the level view fullbright.
  changed in ZDoom to do partial brightening.
- Added support for horizontal mouse wheels, and set invprev/invnext as
  default bindings for it. This is Vista only. DirectInput mouse (in_mouse 2)
  does not support it, because the DirectInput mouse device does not expose
  this control.
- Added a label for the F16 key and mapped the kp= key on a Mac keyboard to
  the PC98 equivalent so it will be identified as kp=. (Interestingly, F13-
  F16 and kp= only generate events when using Raw Input, not when using
  DirectInput.
- Added MF6_FORCEPAIN flag that forces the target to go into the pain state
  regardless of pain chance.
- Changed screenblocks CVAR to be settable per game.
- Added SpawnSpotForced and SpawnSpotFacingForced ACS functions.
- Added pushfactor actor property.
- Added Gez's GetArmorType submission

git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@339 b0f79afe-0144-0410-b225-9a4edf0717df
This commit is contained in:
Christoph Oelckers 2009-06-06 15:24:18 +00:00
parent 0225657584
commit c2d1121663
35 changed files with 356 additions and 79 deletions

View file

@ -1,4 +1,69 @@
May 27, 2009 June 6, 2009 (Changes by Graf Zahl)
- Added Hirogen2's unlimited pickup patch.
- Added railgun performance customization CVARs by Spleen.
- Added aspect ratio override submission by SoulPriestess.
- Added a 'resetinventory' MAPINFO option.
- Added MF6_NOFEAR flag.
- Added A_MonsterRefire(probability, jumptarget).
- Added A_JumpIfTargetInSight(state) action function.
- Changed: Puffs set their angle to face the originator of the attack.
- Strife's burning hands originally make the level view fullbright.
changed in ZDoom to do partial brightening.
June 5, 2009
- Added support for horizontal mouse wheels, and set invprev/invnext as
default bindings for it. This is Vista only. DirectInput mouse (in_mouse 2)
does not support it, because the DirectInput mouse device does not expose
this control.
- Added a label for the F16 key and mapped the kp= key on a Mac keyboard to
the PC98 equivalent so it will be identified as kp=. (Interestingly, F13-
F16 and kp= only generate events when using Raw Input, not when using
DirectInput.
June 5, 2009 (Changes by Graf Zahl)
- Added MF6_FORCEPAIN flag that forces the target to go into the pain state
regardless of pain chance.
- Changed screenblocks CVAR to be settable per game.
- Added SpawnSpotForced and SpawnSpotFacingForced ACS functions.
- Added pushfactor actor property.
- Added Gez's GetArmorType submission
June 2, 2009
- Swapped snes_spc out for the full Game Music Emu library.
June 2, 2009 (Changes by Graf Zahl)
- Fixed: The Hexen status bar still uses MAX_MANA for some calculations instead
of MaxAmount.
June 1, 2009 (Changes by Graf Zahl)
- Added Blzut3's submission for displaying underwater stats in SBARINFO.
May 31, 2009 (Changes by Graf Zahl)
- Added Gez's AMMO_CHECKBOTH submission.
- Added Gez's THRUSPECIES submission.
- Added loading directories into the lump directory.
- fixed: The Dehacked parser could not parse flag values with the highest bit
set because it used atoi to convert the string into a number.
- fixed: bouncing sounds were limited to inventory items.
May 30, 2009 (Changes by Graf Zahl)
- Rewrote IWAD detection code to use the ResourceFile classes instead of
reading the WAD directory directly. As a side effect it should now be
possible to use Zip and 7z for IWADs, too.
- Added 'EndTitle' nextmap option which goes to the regular title loop after
the game has finished.
- Added NOBOSSRIP flag. Note: we are now at flags6!
- Added SetSkyScrollSpeed(int skyplane, fixed speed) ACS function.
- Added THRUACTORS flag that disables all actor<->actor collision detection.
- Added DONTSEEKINVISIBLE flag for missiles that can't home in on invisible
targets.
- Added SFX_TRANSFERPITCH flag to A_SpawnItemEx.
- Added Ultimate Freedoom IWAD detection.
- Added GetAirSupply and SetAirSupply functions to ACS.
- Fixed: The *surface sound was not played when drowning was switched off
by setting the level's air supply to 0.
May 27, 2009
- Fixed: The mouse wheel generated no events in GUI mode if you weren't - Fixed: The mouse wheel generated no events in GUI mode if you weren't
fullscreen. (e.g. You could no longer scroll the console with the mouse fullscreen. (e.g. You could no longer scroll the console with the mouse
buffer.) buffer.)

View file

@ -308,6 +308,8 @@ enum
MF6_NOBOSSRIP = 0x00000001, // For rippermissiles: Don't rip through bosses. MF6_NOBOSSRIP = 0x00000001, // For rippermissiles: Don't rip through bosses.
MF6_THRUSPECIES = 0x00000002, // Actors passes through other of the same species. MF6_THRUSPECIES = 0x00000002, // Actors passes through other of the same species.
MF6_MTHRUSPECIES = 0x00000004, // Missile passes through actors of its shooter's species. MF6_MTHRUSPECIES = 0x00000004, // Missile passes through actors of its shooter's species.
MF6_FORCEPAIN = 0x00000008, // forces target into painstate (unless it has the NOPAIN flag)
MF6_NOFEAR = 0x00000010, // Not scared of frightening players
// --- mobj.renderflags --- // --- mobj.renderflags ---
@ -737,6 +739,7 @@ public:
int bouncecount; // Strife's grenades only bounce twice before exploding int bouncecount; // Strife's grenades only bounce twice before exploding
fixed_t gravity; // [GRB] Gravity factor fixed_t gravity; // [GRB] Gravity factor
int FastChaseStrafeCount; int FastChaseStrafeCount;
fixed_t pushfactor;
AActor *BlockingMobj; // Actor that blocked the last move AActor *BlockingMobj; // Actor that blocked the last move
line_t *BlockingLine; // Line that blocked the last move line_t *BlockingLine; // Line that blocked the last move

View file

@ -70,6 +70,8 @@ static const FBinding DefBindings[] =
{ "0", "slot 0" }, { "0", "slot 0" },
{ "[", "invprev" }, { "[", "invprev" },
{ "]", "invnext" }, { "]", "invnext" },
{ "mwheelleft", "invprev" },
{ "mwheelright", "invnext" },
{ "enter", "invuse" }, { "enter", "invuse" },
{ "-", "sizedown" }, { "-", "sizedown" },
{ "=", "sizeup" }, { "=", "sizeup" },
@ -179,7 +181,7 @@ const char *KeyNames[NUM_KEYS] =
"kp8", "kp9", "kp-", "kp4", "kp5", "kp6", "kp+", "kp1", //48 "kp8", "kp9", "kp-", "kp4", "kp5", "kp6", "kp+", "kp1", //48
"kp2", "kp3", "kp0", "kp.", NULL, NULL, "oem102", "f11", //50 "kp2", "kp3", "kp0", "kp.", NULL, NULL, "oem102", "f11", //50
"f12", NULL, NULL, NULL, NULL, NULL, NULL, NULL, //58 "f12", NULL, NULL, NULL, NULL, NULL, NULL, NULL, //58
NULL, NULL, NULL, NULL, "f13", "f14", "f15", NULL, //60 NULL, NULL, NULL, NULL, "f13", "f14", "f15", "f16", //60
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, //68 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, //68
"kana", NULL, NULL, "abnt_c1", NULL, NULL, NULL, NULL, //70 "kana", NULL, NULL, "abnt_c1", NULL, NULL, NULL, NULL, //70
NULL, "convert", NULL, "noconvert",NULL, "yen", "abnt_c2", NULL, //78 NULL, "convert", NULL, "noconvert",NULL, "yen", "abnt_c2", NULL, //78
@ -243,6 +245,7 @@ const char *KeyNames[NUM_KEYS] =
"pov4up", "pov4right","pov4down", "pov4left", // Fourth POV hat "pov4up", "pov4right","pov4down", "pov4left", // Fourth POV hat
"mwheelup", "mwheeldown", // the mouse wheel "mwheelup", "mwheeldown", // the mouse wheel
"mwheelright", "mwheelleft",
}; };
static FString Bindings[NUM_KEYS]; static FString Bindings[NUM_KEYS];

View file

@ -1428,11 +1428,11 @@ static bool C_HandleKey (event_t *ev, BYTE *buffer, int len)
case EV_GUI_WheelDown: case EV_GUI_WheelDown:
if (!(ev->data3 & GKM_SHIFT)) if (!(ev->data3 & GKM_SHIFT))
{ {
data1 = GK_PGDN + ev->subtype - EV_GUI_WheelDown; data1 = GK_PGDN + EV_GUI_WheelDown - ev->subtype;
} }
else else
{ {
data1 = GK_DOWN + ev->subtype - EV_GUI_WheelDown; data1 = GK_DOWN + EV_GUI_WheelDown - ev->subtype;
} }
// Intentional fallthrough // Intentional fallthrough

View file

@ -53,8 +53,10 @@ enum EGUIEvent
EV_GUI_RButtonDown, EV_GUI_RButtonDown,
EV_GUI_RButtonUp, EV_GUI_RButtonUp,
EV_GUI_RButtonDblClick, EV_GUI_RButtonDblClick,
EV_GUI_WheelDown, // data3: shift/ctrl/alt EV_GUI_WheelUp, // data3: shift/ctrl/alt
EV_GUI_WheelUp // data3: shift/ctrl/alt EV_GUI_WheelDown, // "
EV_GUI_WheelRight, // "
EV_GUI_WheelLeft, // "
}; };
enum GUIKeyModifiers enum GUIKeyModifiers

View file

@ -1740,7 +1740,6 @@ void D_DoomMain (void)
if (Args->CheckParm ("-nomonsters")) flags |= DF_NO_MONSTERS; if (Args->CheckParm ("-nomonsters")) flags |= DF_NO_MONSTERS;
if (Args->CheckParm ("-respawn")) flags |= DF_MONSTERS_RESPAWN; if (Args->CheckParm ("-respawn")) flags |= DF_MONSTERS_RESPAWN;
if (Args->CheckParm ("-fast")) flags |= DF_FAST_MONSTERS; if (Args->CheckParm ("-fast")) flags |= DF_FAST_MONSTERS;
if (Args->CheckParm("-ulp")) sv_unlimited_pickup = true;
devparm = !!Args->CheckParm ("-devparm"); devparm = !!Args->CheckParm ("-devparm");

View file

@ -167,8 +167,10 @@ enum ESkillLevels
#define KEY_MWHEELUP 0x198 #define KEY_MWHEELUP 0x198
#define KEY_MWHEELDOWN 0x199 #define KEY_MWHEELDOWN 0x199
#define KEY_MWHEELRIGHT 0x19A
#define KEY_MWHEELLEFT 0x19B
#define NUM_KEYS 0x19A #define NUM_KEYS 0x19C
#define JOYAXIS_NONE 0 #define JOYAXIS_NONE 0
#define JOYAXIS_YAW 1 #define JOYAXIS_YAW 1

View file

@ -95,12 +95,18 @@ const BYTE *FManaBar::GetPixels ()
void FManaBar::SetVial (FTexture *pic, AActor *actor, const PClass *manaType) void FManaBar::SetVial (FTexture *pic, AActor *actor, const PClass *manaType)
{ {
int level; int level, max;
AInventory *ammo; AInventory *ammo;
ammo = actor->FindInventory (manaType); ammo = actor->FindInventory (manaType);
level = ammo != NULL ? ammo->Amount : 0; level = 0; max = 200;
level = MIN (22*level/ammo->MaxAmount, 22); if (ammo != NULL)
{
level = ammo->Amount;
max = ammo->MaxAmount;
if (!max) max = 1;
}
level = MIN (22*level/max, 22);
if (VialPic != pic || VialLevel != level) if (VialPic != pic || VialLevel != level)
{ {
VialPic = pic; VialPic = pic;

View file

@ -564,6 +564,8 @@ static bool g_nomonsters;
void G_ChangeLevel(const char *levelname, int position, bool keepFacing, int nextSkill, void G_ChangeLevel(const char *levelname, int position, bool keepFacing, int nextSkill,
bool nointermission, bool resetinv, bool nomonsters) bool nointermission, bool resetinv, bool nomonsters)
{ {
level_info_t *nextinfo = NULL;
if (unloading) if (unloading)
{ {
Printf (TEXTCOLOR_RED "Unloading scripts cannot exit the level again.\n"); Printf (TEXTCOLOR_RED "Unloading scripts cannot exit the level again.\n");
@ -574,7 +576,7 @@ void G_ChangeLevel(const char *levelname, int position, bool keepFacing, int nex
if (strncmp(levelname, "enDSeQ", 6)) if (strncmp(levelname, "enDSeQ", 6))
{ {
level_info_t *nextinfo = FindLevelInfo (nextlevel)->CheckLevelRedirect (); nextinfo = FindLevelInfo (nextlevel)->CheckLevelRedirect ();
if (nextinfo) if (nextinfo)
{ {
nextlevel = nextinfo->mapname; nextlevel = nextinfo->mapname;
@ -588,12 +590,20 @@ void G_ChangeLevel(const char *levelname, int position, bool keepFacing, int nex
if (nointermission) level.flags |= LEVEL_NOINTERMISSION; if (nointermission) level.flags |= LEVEL_NOINTERMISSION;
cluster_info_t *thiscluster = FindClusterInfo (level.cluster); cluster_info_t *thiscluster = FindClusterInfo (level.cluster);
cluster_info_t *nextcluster = FindClusterInfo (FindLevelInfo (nextlevel)->cluster); cluster_info_t *nextcluster = nextinfo? FindClusterInfo (nextinfo->cluster) : NULL;
startpos = position; startpos = position;
startkeepfacing = keepFacing; startkeepfacing = keepFacing;
gameaction = ga_completed; gameaction = ga_completed;
resetinventory = resetinv; resetinventory = resetinv;
if (nextinfo != NULL)
{
if (thiscluster != nextcluster || (thiscluster && !(thiscluster->flags & CLUSTER_HUB)))
{
resetinventory |= !!(nextinfo->flags2 & LEVEL2_RESETINVENTORY);
}
}
bglobal.End(); //Added by MC: bglobal.End(); //Added by MC:

View file

@ -198,6 +198,7 @@ enum ELevelFlags
LEVEL2_SMOOTHLIGHTING = 0x01000000, // Level uses the smooth lighting feature. LEVEL2_SMOOTHLIGHTING = 0x01000000, // Level uses the smooth lighting feature.
LEVEL2_POLYGRIND = 0x02000000, // Polyobjects grind corpses to gibs. LEVEL2_POLYGRIND = 0x02000000, // Polyobjects grind corpses to gibs.
LEVEL2_RESETINVENTORY = 0x04000000, // Resets player inventory when starting this level (unless in a hub)
}; };

View file

@ -1316,6 +1316,7 @@ MapFlagHandlers[] =
{ "nocheckswitchrange", MITYPE_CLRFLAG2, LEVEL2_CHECKSWITCHRANGE, 0 }, { "nocheckswitchrange", MITYPE_CLRFLAG2, LEVEL2_CHECKSWITCHRANGE, 0 },
{ "grinding_polyobj", MITYPE_SETFLAG2, LEVEL2_POLYGRIND, 0 }, { "grinding_polyobj", MITYPE_SETFLAG2, LEVEL2_POLYGRIND, 0 },
{ "no_grinding_polyobj", MITYPE_CLRFLAG2, LEVEL2_POLYGRIND, 0 }, { "no_grinding_polyobj", MITYPE_CLRFLAG2, LEVEL2_POLYGRIND, 0 },
{ "resetinventory", MITYPE_SETFLAG2, LEVEL2_RESETINVENTORY, 0 },
{ "unfreezesingleplayerconversations",MITYPE_SETFLAG2, LEVEL2_CONV_SINGLE_UNFREEZE, 0 }, { "unfreezesingleplayerconversations",MITYPE_SETFLAG2, LEVEL2_CONV_SINGLE_UNFREEZE, 0 },
{ "nobotnodes", MITYPE_IGNORE, 0, 0 }, // Skulltag option: nobotnodes { "nobotnodes", MITYPE_IGNORE, 0, 0 }, // Skulltag option: nobotnodes
{ "compat_shorttex", MITYPE_COMPATFLAG, COMPATF_SHORTTEX}, { "compat_shorttex", MITYPE_COMPATFLAG, COMPATF_SHORTTEX},

View file

@ -22,7 +22,7 @@ IMPLEMENT_CLASS (AHexenArmor)
void ABasicArmor::Serialize (FArchive &arc) void ABasicArmor::Serialize (FArchive &arc)
{ {
Super::Serialize (arc); Super::Serialize (arc);
arc << SavePercent << BonusCount << MaxAbsorb << MaxFullAbsorb << AbsorbCount; arc << SavePercent << BonusCount << MaxAbsorb << MaxFullAbsorb << AbsorbCount << ArmorType;
} }
//=========================================================================== //===========================================================================
@ -77,6 +77,7 @@ AInventory *ABasicArmor::CreateCopy (AActor *other)
copy->MaxAmount = MaxAmount; copy->MaxAmount = MaxAmount;
copy->Icon = Icon; copy->Icon = Icon;
copy->BonusCount = BonusCount; copy->BonusCount = BonusCount;
copy->ArmorType = ArmorType;
GoAwayAndDie (); GoAwayAndDie ();
return copy; return copy;
} }
@ -237,6 +238,7 @@ bool ABasicArmorPickup::Use (bool pickup)
armor->Icon = Icon; armor->Icon = Icon;
armor->MaxAbsorb = MaxAbsorb; armor->MaxAbsorb = MaxAbsorb;
armor->MaxFullAbsorb = MaxFullAbsorb; armor->MaxFullAbsorb = MaxFullAbsorb;
armor->ArmorType = this->GetClass()->TypeName;
return true; return true;
} }
@ -320,6 +322,7 @@ bool ABasicArmorBonus::Use (bool pickup)
armor->Icon = Icon; armor->Icon = Icon;
armor->SavePercent = SavePercent; armor->SavePercent = SavePercent;
armor->MaxAbsorb = MaxAbsorb; armor->MaxAbsorb = MaxAbsorb;
armor->ArmorType = this->GetClass()->TypeName;
armor->MaxFullAbsorb = MaxFullAbsorb; armor->MaxFullAbsorb = MaxFullAbsorb;
} }

View file

@ -328,37 +328,34 @@ DEFINE_ACTION_FUNCTION(AActor, A_RestoreSpecialPosition)
_y = self->SpawnPoint[1]; _y = self->SpawnPoint[1];
sec = P_PointInSector (_x, _y); sec = P_PointInSector (_x, _y);
fixed_t floorz = sec->floorplane.ZatPoint (_x, _y); self->SetOrigin (_x, _y, sec->floorplane.ZatPoint (_x, _y));
fixed_t ceilingz = sec->ceilingplane.ZatPoint (_x, _y); P_CheckPosition (self, _x, _y);
self->SetOrigin (_x, _y, floorz);
if (self->flags & MF_SPAWNCEILING) if (self->flags & MF_SPAWNCEILING)
{ {
self->z = ceilingz - self->height - self->SpawnPoint[2]; self->z = self->ceilingz - self->height - self->SpawnPoint[2];
} }
else if (self->flags2 & MF2_SPAWNFLOAT) else if (self->flags2 & MF2_SPAWNFLOAT)
{ {
fixed_t space = ceilingz - self->height - floorz; fixed_t space = self->ceilingz - self->height - self->floorz;
if (space > 48*FRACUNIT) if (space > 48*FRACUNIT)
{ {
space -= 40*FRACUNIT; space -= 40*FRACUNIT;
self->z = ((space * pr_restore())>>8) + floorz + 40*FRACUNIT; self->z = ((space * pr_restore())>>8) + self->floorz + 40*FRACUNIT;
} }
else else
{ {
self->z = floorz; self->z = self->floorz;
} }
} }
else else
{ {
self->z = self->SpawnPoint[2] + floorz; self->z = self->SpawnPoint[2] + self->floorz;
if (self->flags2 & MF2_FLOATBOB) if (self->flags2 & MF2_FLOATBOB)
{ {
self->z += FloatBobOffsets[(self->FloatBobPhase + level.maptime) & 63]; self->z += FloatBobOffsets[(self->FloatBobPhase + level.maptime) & 63];
} }
} }
P_CheckPosition (self, _x, _y);
} }
int AInventory::StaticLastMessageTic; int AInventory::StaticLastMessageTic;
@ -516,10 +513,10 @@ bool AInventory::HandlePickup (AInventory *item)
{ {
if (item->GetClass() == GetClass()) if (item->GetClass() == GetClass())
{ {
if (Amount < MaxAmount) if (Amount < MaxAmount || sv_unlimited_pickup)
{ {
Amount += item->Amount; Amount += item->Amount;
if (Amount > MaxAmount) if (Amount > MaxAmount && !sv_unlimited_pickup)
{ {
Amount = MaxAmount; Amount = MaxAmount;
} }

View file

@ -379,6 +379,7 @@ public:
int MaxAbsorb; int MaxAbsorb;
int MaxFullAbsorb; int MaxFullAbsorb;
int BonusCount; int BonusCount;
FNameNoInit ArmorType;
}; };
// BasicArmorPickup replaces the armor you have. // BasicArmorPickup replaces the armor you have.

View file

@ -674,6 +674,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_ItBurnsItBurns)
self->player->ReadyWeapon = NULL; self->player->ReadyWeapon = NULL;
self->player->PendingWeapon = WP_NOCHANGE; self->player->PendingWeapon = WP_NOCHANGE;
self->player->playerstate = PST_LIVE; self->player->playerstate = PST_LIVE;
self->player->extralight = 3;
} }
} }
@ -705,6 +706,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_HandLower)
{ {
P_SetPsprite (self->player, ps_weapon, NULL); P_SetPsprite (self->player, ps_weapon, NULL);
} }
if (self->player->extralight > 0) self->player->extralight--;
} }
} }

View file

@ -80,6 +80,8 @@
#include "cmdlib.h" #include "cmdlib.h"
#include "d_event.h" #include "d_event.h"
#include "sbar.h"
// Data. // Data.
#include "m_menu.h" #include "m_menu.h"
@ -117,6 +119,7 @@ EXTERN_CVAR (Int, crosshair)
EXTERN_CVAR (Bool, freelook) EXTERN_CVAR (Bool, freelook)
EXTERN_CVAR (Int, sv_smartaim) EXTERN_CVAR (Int, sv_smartaim)
EXTERN_CVAR (Int, am_colorset) EXTERN_CVAR (Int, am_colorset)
EXTERN_CVAR (Int, vid_aspect)
static void CalcIndent (menu_t *menu); static void CalcIndent (menu_t *menu);
@ -937,6 +940,14 @@ CUSTOM_CVAR (Int, menu_screenratios, 0, CVAR_ARCHIVE)
} }
} }
static value_t ForceRatios[] =
{
{ 0.0, "Off" },
{ 3.0, "4:3" },
{ 1.0, "16:9" },
{ 2.0, "16:10" },
{ 4.0, "5:4" }
};
static value_t Ratios[] = static value_t Ratios[] =
{ {
{ 0.0, "4:3" }, { 0.0, "4:3" },
@ -958,6 +969,7 @@ static char VMTestText[] = "T to test mode for 5 seconds";
static menuitem_t ModesItems[] = { static menuitem_t ModesItems[] = {
// { discrete, "Screen mode", {&DummyDepthCvar}, {0.0}, {0.0}, {0.0}, {Depths} }, // { discrete, "Screen mode", {&DummyDepthCvar}, {0.0}, {0.0}, {0.0}, {Depths} },
{ discrete, "Force aspect ratio", {&vid_aspect}, {5.0}, {0.0}, {0.0}, {ForceRatios} },
{ discrete, "Aspect ratio", {&menu_screenratios}, {4.0}, {0.0}, {0.0}, {Ratios} }, { discrete, "Aspect ratio", {&menu_screenratios}, {4.0}, {0.0}, {0.0}, {Ratios} },
{ discrete, "Renderer", {&vid_renderer}, {2.0}, {0.0}, {0.0}, {Renderers} }, // [ZDoomGL] { discrete, "Renderer", {&vid_renderer}, {2.0}, {0.0}, {0.0}, {Renderers} }, // [ZDoomGL]
{ discrete, "Fullscreen", {&fullscreen}, {2.0}, {0.0}, {0.0}, {YesNo} }, { discrete, "Fullscreen", {&fullscreen}, {2.0}, {0.0}, {0.0}, {YesNo} },
@ -981,9 +993,9 @@ static menuitem_t ModesItems[] = {
#define VM_DEPTHITEM 0 #define VM_DEPTHITEM 0
#define VM_ASPECTITEM 0 #define VM_ASPECTITEM 0
#define VM_RESSTART 5 #define VM_RESSTART 6
#define VM_ENTERLINE 15 #define VM_ENTERLINE 16
#define VM_TESTLINE 17 #define VM_TESTLINE 18
menu_t ModesMenu = menu_t ModesMenu =
{ {
@ -1010,6 +1022,11 @@ CUSTOM_CVAR (Bool, vid_tft, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
menu_screenratios = 0; menu_screenratios = 0;
} }
} }
setsizeneeded = true;
if (StatusBar != NULL)
{
StatusBar->ScreenSizeChanged();
}
} }
/*======================================= /*=======================================

View file

@ -101,6 +101,9 @@ xx(ArtiSuperHealth)
xx(MedicalKit) xx(MedicalKit)
xx(MedPatch) xx(MedPatch)
// Armor
xx(BasicArmor)
// The Wings of Wrath // The Wings of Wrath
xx(ArtiFly) xx(ArtiFly)

View file

@ -72,6 +72,8 @@
#include "m_png.h" #include "m_png.h"
#include "p_setup.h" #include "p_setup.h"
#include "g_shared/a_pickups.h"
extern FILE *Logfile; extern FILE *Logfile;
FRandom pr_acs ("ACS"); FRandom pr_acs ("ACS");
@ -2228,7 +2230,7 @@ void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, int flags)
} }
} }
int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, int angle) int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, int angle, bool force)
{ {
const PClass *info = PClass::FindClass (FBehavior::StaticLookupString (type)); const PClass *info = PClass::FindClass (FBehavior::StaticLookupString (type));
AActor *actor = NULL; AActor *actor = NULL;
@ -2241,7 +2243,7 @@ int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, i
{ {
DWORD oldFlags2 = actor->flags2; DWORD oldFlags2 = actor->flags2;
actor->flags2 |= MF2_PASSMOBJ; actor->flags2 |= MF2_PASSMOBJ;
if (P_TestMobjLocation (actor)) if (force || P_TestMobjLocation (actor))
{ {
actor->angle = angle << 24; actor->angle = angle << 24;
actor->tid = tid; actor->tid = tid;
@ -2272,7 +2274,7 @@ int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, i
return spawncount; return spawncount;
} }
int DLevelScript::DoSpawnSpot (int type, int spot, int tid, int angle) int DLevelScript::DoSpawnSpot (int type, int spot, int tid, int angle, bool force)
{ {
FActorIterator iterator (spot); FActorIterator iterator (spot);
AActor *aspot; AActor *aspot;
@ -2280,12 +2282,12 @@ int DLevelScript::DoSpawnSpot (int type, int spot, int tid, int angle)
while ( (aspot = iterator.Next ()) ) while ( (aspot = iterator.Next ()) )
{ {
spawned += DoSpawn (type, aspot->x, aspot->y, aspot->z, tid, angle); spawned += DoSpawn (type, aspot->x, aspot->y, aspot->z, tid, angle, force);
} }
return spawned; return spawned;
} }
int DLevelScript::DoSpawnSpotFacing (int type, int spot, int tid) int DLevelScript::DoSpawnSpotFacing (int type, int spot, int tid, bool force)
{ {
FActorIterator iterator (spot); FActorIterator iterator (spot);
AActor *aspot; AActor *aspot;
@ -2293,7 +2295,7 @@ int DLevelScript::DoSpawnSpotFacing (int type, int spot, int tid)
while ( (aspot = iterator.Next ()) ) while ( (aspot = iterator.Next ()) )
{ {
spawned += DoSpawn (type, aspot->x, aspot->y, aspot->z, tid, aspot->angle >> 24); spawned += DoSpawn (type, aspot->x, aspot->y, aspot->z, tid, aspot->angle >> 24, force);
} }
return spawned; return spawned;
} }
@ -2799,6 +2801,9 @@ enum EACSFunctions
ACSF_GetAirSupply, ACSF_GetAirSupply,
ACSF_SetAirSupply, ACSF_SetAirSupply,
ACSF_SetSkyScrollSpeed, ACSF_SetSkyScrollSpeed,
ACSF_GetArmorType,
ACSF_SpawnSpotForced,
ACSF_SpawnSpotFacingForced,
}; };
int DLevelScript::SideFromID(int id, int side) int DLevelScript::SideFromID(int id, int side)
@ -2942,6 +2947,27 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
return 1; return 1;
} }
case ACSF_GetArmorType:
{
if (args[1] < 0 || args[1] >= MAXPLAYERS || !playeringame[args[1]])
{
return 0;
}
else
{
FName p(FBehavior::StaticLookupString(args[0]));
ABasicArmor * armor = (ABasicArmor *) players[args[1]].mo->FindInventory(NAME_BasicArmor);
if (armor->ArmorType == p) return 1;
}
return 0;
}
case ACSF_SpawnSpotForced:
return DoSpawnSpot(args[0], args[1], args[2], args[3], true);
case ACSF_SpawnSpotFacingForced:
return DoSpawnSpotFacing(args[0], args[1], args[2], true);
default: default:
break; break;
} }
@ -4934,27 +4960,27 @@ int DLevelScript::RunScript ()
break; break;
case PCD_SPAWN: case PCD_SPAWN:
STACK(6) = DoSpawn (STACK(6), STACK(5), STACK(4), STACK(3), STACK(2), STACK(1)); STACK(6) = DoSpawn (STACK(6), STACK(5), STACK(4), STACK(3), STACK(2), STACK(1), false);
sp -= 5; sp -= 5;
break; break;
case PCD_SPAWNDIRECT: case PCD_SPAWNDIRECT:
PushToStack (DoSpawn (pc[0], pc[1], pc[2], pc[3], pc[4], pc[5])); PushToStack (DoSpawn (pc[0], pc[1], pc[2], pc[3], pc[4], pc[5], false));
pc += 6; pc += 6;
break; break;
case PCD_SPAWNSPOT: case PCD_SPAWNSPOT:
STACK(4) = DoSpawnSpot (STACK(4), STACK(3), STACK(2), STACK(1)); STACK(4) = DoSpawnSpot (STACK(4), STACK(3), STACK(2), STACK(1), false);
sp -= 3; sp -= 3;
break; break;
case PCD_SPAWNSPOTDIRECT: case PCD_SPAWNSPOTDIRECT:
PushToStack (DoSpawnSpot (pc[0], pc[1], pc[2], pc[3])); PushToStack (DoSpawnSpot (pc[0], pc[1], pc[2], pc[3], false));
pc += 4; pc += 4;
break; break;
case PCD_SPAWNSPOTFACING: case PCD_SPAWNSPOTFACING:
STACK(3) = DoSpawnSpotFacing (STACK(3), STACK(2), STACK(1)); STACK(3) = DoSpawnSpotFacing (STACK(3), STACK(2), STACK(1), false);
sp -= 2; sp -= 2;
break; break;

View file

@ -712,9 +712,9 @@ protected:
static int CountPlayers (); static int CountPlayers ();
static void SetLineTexture (int lineid, int side, int position, int name); static void SetLineTexture (int lineid, int side, int position, int name);
static void ReplaceTextures (int fromname, int toname, int flags); static void ReplaceTextures (int fromname, int toname, int flags);
static int DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, int angle); static int DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, int angle, bool force);
static int DoSpawnSpot (int type, int spot, int tid, int angle); static int DoSpawnSpot (int type, int spot, int tid, int angle, bool forced);
static int DoSpawnSpotFacing (int type, int spot, int tid); static int DoSpawnSpotFacing (int type, int spot, int tid, bool forced);
int DoClassifyActor (int tid); int DoClassifyActor (int tid);
int CallFunction(int argCount, int funcIndex, SDWORD *args); int CallFunction(int argCount, int funcIndex, SDWORD *args);

View file

@ -52,6 +52,9 @@
#include "colormatcher.h" #include "colormatcher.h"
CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE); CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE);
CVAR (Bool, r_rail_smartspiral, 0, CVAR_ARCHIVE);
CVAR (Int, r_rail_spiralsparsity, 1, CVAR_ARCHIVE);
CVAR (Int, r_rail_trailsparsity, 1, CVAR_ARCHIVE);
#define FADEFROMTTL(a) (255/(a)) #define FADEFROMTTL(a) (255/(a))
@ -512,12 +515,15 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
step = dir * 3; step = dir * 3;
// Create the outer spiral. // Create the outer spiral.
if (color1 != -1) if (color1 != -1 && (!r_rail_smartspiral || color2 == -1) && r_rail_spiralsparsity > 0)
{ {
FVector3 spiral_step = step * r_rail_spiralsparsity;
int spiral_steps = steps * r_rail_spiralsparsity;
color1 = color1 == 0 ? -1 : ColorMatcher.Pick(RPART(color1), GPART(color1), BPART(color1)); color1 = color1 == 0 ? -1 : ColorMatcher.Pick(RPART(color1), GPART(color1), BPART(color1));
pos = start; pos = start;
deg = FAngle(270); deg = FAngle(270);
for (i = steps; i; i--) for (i = spiral_steps; i; i--)
{ {
particle_t *p = NewParticle (); particle_t *p = NewParticle ();
FVector3 tempvec; FVector3 tempvec;
@ -538,8 +544,8 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
p->x = FLOAT2FIXED(tempvec.X); p->x = FLOAT2FIXED(tempvec.X);
p->y = FLOAT2FIXED(tempvec.Y); p->y = FLOAT2FIXED(tempvec.Y);
p->z = FLOAT2FIXED(tempvec.Z); p->z = FLOAT2FIXED(tempvec.Z);
pos += step; pos += spiral_step;
deg += FAngle(14); deg += FAngle(r_rail_spiralsparsity * 14);
if (color1 == -1) if (color1 == -1)
{ {
@ -562,13 +568,16 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
} }
// Create the inner trail. // Create the inner trail.
if (color2 != -1) if (color2 != -1 && r_rail_trailsparsity > 0)
{ {
FVector3 trail_step = step * r_rail_trailsparsity;
int trail_steps = steps * r_rail_trailsparsity;
color2 = color2 == 0 ? -1 : ColorMatcher.Pick(RPART(color2), GPART(color2), BPART(color2)); color2 = color2 == 0 ? -1 : ColorMatcher.Pick(RPART(color2), GPART(color2), BPART(color2));
FVector3 diff(0, 0, 0); FVector3 diff(0, 0, 0);
pos = start; pos = start;
for (i = steps; i; i--) for (i = trail_steps; i; i--)
{ {
particle_t *p = JitterParticle (33); particle_t *p = JitterParticle (33);
@ -594,7 +603,7 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
p->z = FLOAT2FIXED(postmp.Z); p->z = FLOAT2FIXED(postmp.Z);
if (color1 != -1) if (color1 != -1)
p->accz -= FRACUNIT/4096; p->accz -= FRACUNIT/4096;
pos += step; pos += trail_step;
if (color2 == -1) if (color2 == -1)
{ {

View file

@ -724,11 +724,14 @@ void P_NewChaseDir(AActor * actor)
deltax = actor->target->x - actor->x; deltax = actor->target->x - actor->x;
deltay = actor->target->y - actor->y; deltay = actor->target->y - actor->y;
if ((actor->target->player != NULL && (actor->target->player->cheats & CF_FRIGHTENING)) || if (!(actor->flags6 & MF6_NOFEAR))
(actor->flags4 & MF4_FRIGHTENED))
{ {
deltax = -deltax; if ((actor->target->player != NULL && (actor->target->player->cheats & CF_FRIGHTENING)) ||
deltay = -deltay; (actor->flags4 & MF4_FRIGHTENED))
{
deltax = -deltax;
deltay = -deltay;
}
} }
} }
else else

View file

@ -1123,6 +1123,8 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
damage = newdam; damage = newdam;
if (damage <= 0) if (damage <= 0)
{ {
// If MF&_FORCEPAIN is set make the player enter the pain state.
if (inflictor != NULL && (inflictor->flags6 & MF6_FORCEPAIN)) goto dopain;
return; return;
} }
} }
@ -1254,8 +1256,10 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
} }
} }
dopain:
if (!(target->flags5 & MF5_NOPAIN) && (inflictor == NULL || !(inflictor->flags5 & MF5_PAINLESS)) && if (!(target->flags5 & MF5_NOPAIN) && (inflictor == NULL || !(inflictor->flags5 & MF5_PAINLESS)) &&
(pr_damagemobj() < painchance) && !(target->flags & MF_SKULLFLY)) (pr_damagemobj() < painchance || (inflictor != NULL && (inflictor->flags6 & MF6_FORCEPAIN))) &&
!(target->flags & MF_SKULLFLY))
{ {
if (mod == NAME_Electric) if (mod == NAME_Electric)
{ {

View file

@ -1037,8 +1037,8 @@ bool PIT_CheckThing (AActor *thing, FCheckPosition &tm)
if (thing->flags2 & MF2_PUSHABLE && !(tm.thing->flags2 & MF2_CANNOTPUSH) && if (thing->flags2 & MF2_PUSHABLE && !(tm.thing->flags2 & MF2_CANNOTPUSH) &&
(tm.thing->player == NULL || !(tm.thing->player->cheats & CF_PREDICTING))) (tm.thing->player == NULL || !(tm.thing->player->cheats & CF_PREDICTING)))
{ // Push thing { // Push thing
thing->momx += tm.thing->momx >> 2; thing->momx += FixedMul(tm.thing->momx, thing->pushfactor);
thing->momy += tm.thing->momy >> 2; thing->momy += FixedMul(tm.thing->momy, thing->pushfactor);
} }
solid = (thing->flags & MF_SOLID) && solid = (thing->flags & MF_SOLID) &&
!(thing->flags & MF_NOCLIP) && !(thing->flags & MF_NOCLIP) &&

View file

@ -4288,6 +4288,7 @@ AActor *P_SpawnPuff (AActor *source, const PClass *pufftype, fixed_t x, fixed_t
puff = Spawn (pufftype, x, y, z, ALLOW_REPLACE); puff = Spawn (pufftype, x, y, z, ALLOW_REPLACE);
if (puff == NULL) return NULL; if (puff == NULL) return NULL;
if (source != NULL) puff->angle = R_PointToAngle2(x, y, source->x, source->y);
// If a puff has a crash state and an actor was not hit, // If a puff has a crash state and an actor was not hit,
// it will enter the crash state. This is used by the StrifeSpark // it will enter the crash state. This is used by the StrifeSpark

View file

@ -694,7 +694,7 @@ void R_ExecuteSetViewSize ()
// //
//========================================================================== //==========================================================================
CUSTOM_CVAR (Int, screenblocks, 10, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR (Int, screenblocks, 10, CVAR_ARCHIVE)
{ {
if (self > 12) if (self > 12)
self = 12; self = 12;

View file

@ -3,5 +3,5 @@
// This file was automatically generated by the // This file was automatically generated by the
// updaterevision tool. Do not edit by hand. // updaterevision tool. Do not edit by hand.
#define ZD_SVN_REVISION_STRING "1631" #define ZD_SVN_REVISION_STRING "1643"
#define ZD_SVN_REVISION_NUMBER 1631 #define ZD_SVN_REVISION_NUMBER 1643

View file

@ -80,6 +80,7 @@ static FRandom pr_crailgun ("CustomRailgun");
static FRandom pr_spawndebris ("SpawnDebris"); static FRandom pr_spawndebris ("SpawnDebris");
static FRandom pr_spawnitemex ("SpawnItemEx"); static FRandom pr_spawnitemex ("SpawnItemEx");
static FRandom pr_burst ("Burst"); static FRandom pr_burst ("Burst");
static FRandom pr_monsterrefire ("MonsterRefire");
//========================================================================== //==========================================================================
@ -524,6 +525,25 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfInTargetInventory)
DoJumpIfInventory(self->target, PUSH_PARAMINFO); DoJumpIfInventory(self->target, PUSH_PARAMINFO);
} }
//==========================================================================
//
// State jump function
//
//==========================================================================
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfArmorType)
{
ACTION_PARAM_START(3);
ACTION_PARAM_NAME(Type, 0);
ACTION_PARAM_STATE(JumpOffset, 1);
ACTION_SET_RESULT(false); // Jumps should never set the result for inventory state chains!
ABasicArmor * armor = (ABasicArmor *) self->FindInventory(NAME_BasicArmor);
if (armor && armor->ArmorType == Type)
ACTION_JUMP(JumpOffset);
}
//========================================================================== //==========================================================================
// //
// Parameterized version of A_Explode // Parameterized version of A_Explode
@ -1753,6 +1773,24 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CheckSight)
} }
//===========================================================================
//
// A_JumpIfTargetInSight
// jumps if monster can see its target
//
//===========================================================================
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfTargetInSight)
{
ACTION_PARAM_START(1);
ACTION_PARAM_STATE(jump, 0);
ACTION_SET_RESULT(false); // Jumps should never set the result for inventory state chains!
if (self->target == NULL || !P_CheckSight(self, self->target,4)) return;
ACTION_JUMP(jump);
}
//=========================================================================== //===========================================================================
// //
// Inventory drop // Inventory drop
@ -2436,4 +2474,31 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RemoveChildren)
P_RemoveThing(mo); P_RemoveThing(mo);
} }
} }
} }
//===========================================================================
//
// keep firing unless target got out of sight
//
//===========================================================================
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_MonsterRefire)
{
ACTION_PARAM_START(2);
ACTION_PARAM_INT(prob, 0);
ACTION_PARAM_STATE(jump, 1);
ACTION_SET_RESULT(false); // Jumps should never set the result for inventory state chains!
A_FaceTarget (self);
if (pr_monsterrefire() < prob)
return;
if (!self->target
|| P_HitFriend (self)
|| self->target->health <= 0
|| !P_CheckSight (self, self->target, 0) )
{
ACTION_JUMP(jump);
}
}

View file

@ -212,6 +212,8 @@ static FFlagDef ActorFlags[]=
DEFINE_FLAG(MF6, NOBOSSRIP, AActor, flags6), DEFINE_FLAG(MF6, NOBOSSRIP, AActor, flags6),
DEFINE_FLAG(MF6, THRUSPECIES, AActor, flags6), DEFINE_FLAG(MF6, THRUSPECIES, AActor, flags6),
DEFINE_FLAG(MF6, MTHRUSPECIES, AActor, flags6), DEFINE_FLAG(MF6, MTHRUSPECIES, AActor, flags6),
DEFINE_FLAG(MF6, FORCEPAIN, AActor, flags6),
DEFINE_FLAG(MF6, NOFEAR, AActor, flags6),
// Effect flags // Effect flags
DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects),

View file

@ -741,6 +741,15 @@ DEFINE_PROPERTY(missileheight, F, Actor)
info->Class->Meta.SetMetaFixed (ACMETA_MissileHeight, id); info->Class->Meta.SetMetaFixed (ACMETA_MissileHeight, id);
} }
//==========================================================================
//
//==========================================================================
DEFINE_PROPERTY(pushfactor, F, Actor)
{
PROP_FIXED_PARM(id, 0);
defaults->pushfactor = id;
}
//========================================================================== //==========================================================================
// //
//========================================================================== //==========================================================================
@ -1581,7 +1590,7 @@ DEFINE_CLASS_PROPERTY_PREFIX(powerup, duration, I, Inventory)
} }
else else
{ {
I_Error("\"powerup.color\" requires an actor of type \"Powerup\"\n"); I_Error("\"powerup.duration\" requires an actor of type \"Powerup\"\n");
return; return;
} }

View file

@ -1526,6 +1526,15 @@ CUSTOM_CVAR (Bool, vid_nowidescreen, false, CVAR_GLOBALCONFIG|CVAR_ARCHIVE)
} }
} }
CUSTOM_CVAR (Int, vid_aspect, 0, CVAR_GLOBALCONFIG|CVAR_ARCHIVE)
{
setsizeneeded = true;
if (StatusBar != NULL)
{
StatusBar->ScreenSizeChanged();
}
}
// Tries to guess the physical dimensions of the screen based on the // Tries to guess the physical dimensions of the screen based on the
// screen's pixel dimensions. Can return: // screen's pixel dimensions. Can return:
// 0: 4:3 // 0: 4:3
@ -1534,6 +1543,11 @@ CUSTOM_CVAR (Bool, vid_nowidescreen, false, CVAR_GLOBALCONFIG|CVAR_ARCHIVE)
// 4: 5:4 // 4: 5:4
int CheckRatio (int width, int height) int CheckRatio (int width, int height)
{ {
if ((vid_aspect >=1) && (vid_aspect <=4))
{
// [SP] User wants to force aspect ratio; let them.
return vid_aspect == 3? 0: int(vid_aspect);
}
if (vid_nowidescreen) if (vid_nowidescreen)
{ {
if (!vid_tft) if (!vid_tft)

View file

@ -77,7 +77,7 @@
// SAVESIG should match SAVEVER. // SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded. // MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 1619 #define MINSAVEVER 1643
#if ZD_SVN_REVISION_NUMBER < MINSAVEVER #if ZD_SVN_REVISION_NUMBER < MINSAVEVER
// Never write a savegame with a version lower than what we need // Never write a savegame with a version lower than what we need

View file

@ -76,11 +76,11 @@ public:
protected: protected:
void PostMouseMove(int x, int y); void PostMouseMove(int x, int y);
void WheelMoved(int wheelmove); void WheelMoved(int axis, int wheelmove);
void PostButtonEvent(int button, bool down); void PostButtonEvent(int button, bool down);
void ClearButtonState(); void ClearButtonState();
int WheelMove; int WheelMove[2];
int LastX, LastY; // for m_filter int LastX, LastY; // for m_filter
WORD ButtonState; // bit mask of current button states (1=down, 0=up) WORD ButtonState; // bit mask of current button states (1=down, 0=up)
}; };

View file

@ -228,6 +228,10 @@ void FKeyboard::PostKeyEvent(int key, INTBOOL down, bool foreground)
key = DIK_LSHIFT; key = DIK_LSHIFT;
} }
} }
if (key == 0x59)
{ // Turn kp= on a Mac keyboard into kp= on a PC98 keyboard.
key = DIK_NUMPADEQUALS;
}
// Generate the event, if appropriate. // Generate the event, if appropriate.
if (down) if (down)

View file

@ -32,6 +32,12 @@
#define GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam)) #define GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam))
#endif #endif
// Only present in Vista SDK, and it probably isn't available with w32api,
// either.
#ifndef WM_MOUSEHWHEEL
#define WM_MOUSEHWHEEL 0x20e
#endif
// TYPES ------------------------------------------------------------------- // TYPES -------------------------------------------------------------------
class FRawMouse : public FMouse class FRawMouse : public FMouse
@ -266,7 +272,8 @@ FMouse::FMouse()
{ {
LastX = LastY = 0; LastX = LastY = 0;
ButtonState = 0; ButtonState = 0;
WheelMove = 0; WheelMove[0] = 0;
WheelMove[1] = 0;
} }
//========================================================================== //==========================================================================
@ -308,18 +315,20 @@ void FMouse::PostMouseMove(int x, int y)
// Generates events for a wheel move. Events are generated for every // Generates events for a wheel move. Events are generated for every
// WHEEL_DELTA units that the wheel has moved. In normal mode, each move // WHEEL_DELTA units that the wheel has moved. In normal mode, each move
// generates both a key down and a key up event. In GUI mode, only one // generates both a key down and a key up event. In GUI mode, only one
// event is generated for each unit of movement. // event is generated for each unit of movement. Axis can be 0 for up/down
// or 1 for left/right.
// //
//========================================================================== //==========================================================================
void FMouse::WheelMoved(int wheelmove) void FMouse::WheelMoved(int axis, int wheelmove)
{ {
assert(axis == 0 || axis == 1);
event_t ev = { 0 }; event_t ev = { 0 };
int dir; int dir;
WheelMove += wheelmove; WheelMove[axis] += wheelmove;
if (WheelMove < 0) if (WheelMove[axis] < 0)
{ {
dir = WHEEL_DELTA; dir = WHEEL_DELTA;
ev.data1 = KEY_MWHEELDOWN; ev.data1 = KEY_MWHEELDOWN;
@ -329,30 +338,31 @@ void FMouse::WheelMoved(int wheelmove)
dir = -WHEEL_DELTA; dir = -WHEEL_DELTA;
ev.data1 = KEY_MWHEELUP; ev.data1 = KEY_MWHEELUP;
} }
ev.data1 += axis * 2;
if (!GUICapture) if (!GUICapture)
{ {
while (abs(WheelMove) >= WHEEL_DELTA) while (abs(WheelMove[axis]) >= WHEEL_DELTA)
{ {
ev.type = EV_KeyDown; ev.type = EV_KeyDown;
D_PostEvent(&ev); D_PostEvent(&ev);
ev.type = EV_KeyUp; ev.type = EV_KeyUp;
D_PostEvent(&ev); D_PostEvent(&ev);
WheelMove += dir; WheelMove[axis] += dir;
} }
} }
else else
{ {
ev.type = EV_GUI_Event; ev.type = EV_GUI_Event;
ev.subtype = (WheelMove < 0) ? EV_GUI_WheelDown : EV_GUI_WheelUp; ev.subtype = ev.data1 - KEY_MWHEELUP + EV_GUI_WheelUp;
if (GetKeyState(VK_SHIFT) & 0x8000) ev.data3 |= GKM_SHIFT; if (GetKeyState(VK_SHIFT) & 0x8000) ev.data3 |= GKM_SHIFT;
if (GetKeyState(VK_CONTROL) & 0x8000) ev.data3 |= GKM_CTRL; if (GetKeyState(VK_CONTROL) & 0x8000) ev.data3 |= GKM_CTRL;
if (GetKeyState(VK_MENU) & 0x8000) ev.data3 |= GKM_ALT; if (GetKeyState(VK_MENU) & 0x8000) ev.data3 |= GKM_ALT;
ev.data1 = 0; ev.data1 = 0;
while (abs(WheelMove) >= WHEEL_DELTA) while (abs(WheelMove[axis]) >= WHEEL_DELTA)
{ {
D_PostEvent(&ev); D_PostEvent(&ev);
WheelMove += dir; WheelMove[axis] += dir;
} }
} }
} }
@ -415,7 +425,8 @@ void FMouse::ClearButtonState()
ButtonState = 0; ButtonState = 0;
} }
// Reset mouse wheel accumulation to 0. // Reset mouse wheel accumulation to 0.
WheelMove = 0; WheelMove[0] = 0;
WheelMove[1] = 0;
} }
//========================================================================== //==========================================================================
@ -597,7 +608,11 @@ bool FRawMouse::WndProcHook(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
} }
if (raw->data.mouse.usButtonFlags & RI_MOUSE_WHEEL) if (raw->data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
{ {
WheelMoved((SHORT)raw->data.mouse.usButtonData); WheelMoved(0, (SHORT)raw->data.mouse.usButtonData);
}
else if (raw->data.mouse.usButtonFlags & 0x800) // horizontal mouse wheel
{
WheelMoved(1, (SHORT)raw->data.mouse.usButtonData);
} }
PostMouseMove(m_noprescale ? raw->data.mouse.lLastX : raw->data.mouse.lLastX<<2, PostMouseMove(m_noprescale ? raw->data.mouse.lLastX : raw->data.mouse.lLastX<<2,
-raw->data.mouse.lLastY); -raw->data.mouse.lLastY);
@ -794,7 +809,7 @@ void FDInputMouse::ProcessInput()
} }
else if (od.dwOfs == (DWORD)DIMOFS_Z) else if (od.dwOfs == (DWORD)DIMOFS_Z)
{ {
WheelMoved(od.dwData); WheelMoved(0, od.dwData);
} }
else if (od.dwOfs >= (DWORD)DIMOFS_BUTTON0 && od.dwOfs <= (DWORD)DIMOFS_BUTTON7) else if (od.dwOfs >= (DWORD)DIMOFS_BUTTON0 && od.dwOfs <= (DWORD)DIMOFS_BUTTON7)
{ {
@ -963,7 +978,12 @@ bool FWin32Mouse::WndProcHook(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
} }
else if (message == WM_MOUSEWHEEL) else if (message == WM_MOUSEWHEEL)
{ {
WheelMoved((SHORT)HIWORD(wParam)); WheelMoved(0, (SHORT)HIWORD(wParam));
return true;
}
else if (message == WM_MOUSEHWHEEL)
{
WheelMoved(1, (SHORT)HIWORD(wParam));
return true; return true;
} }
else if (message >= WM_LBUTTONDOWN && message <= WM_MBUTTONUP) else if (message >= WM_LBUTTONDOWN && message <= WM_MBUTTONUP)

View file

@ -17,6 +17,7 @@ ACTOR Actor native //: Thinker
BounceCount -1 BounceCount -1
FloatSpeed 4 FloatSpeed 4
Gravity 1 Gravity 1
PushFactor 0.25
// Variables for the expression evaluator // Variables for the expression evaluator
// NOTE: fixed_t and angle_t are only used here to ensure proper conversion // NOTE: fixed_t and angle_t are only used here to ensure proper conversion
@ -175,6 +176,7 @@ ACTOR Actor native //: Thinker
action native A_JumpIfHealthLower(int health, state label); action native A_JumpIfHealthLower(int health, state label);
action native A_JumpIfCloser(float distance, state label); action native A_JumpIfCloser(float distance, state label);
action native A_JumpIfInventory(class<Inventory> itemtype, int itemamount, state label); action native A_JumpIfInventory(class<Inventory> itemtype, int itemamount, state label);
action native A_JumpIfArmorType(string Type, state label);
action native A_GiveInventory(class<Inventory> itemtype, int amount = 0); action native A_GiveInventory(class<Inventory> itemtype, int amount = 0);
action native A_TakeInventory(class<Inventory> itemtype, int amount = 0); action native A_TakeInventory(class<Inventory> itemtype, int amount = 0);
action native A_SpawnItem(class<Actor> itemtype, float distance = 0, float zheight = 0, bool useammo = true, bool transfer_translation = false); action native A_SpawnItem(class<Actor> itemtype, float distance = 0, float zheight = 0, bool useammo = true, bool transfer_translation = false);
@ -234,6 +236,9 @@ ACTOR Actor native //: Thinker
action native A_RemoveForcefield(); action native A_RemoveForcefield();
action native A_DropWeaponPieces(class<Actor> p1, class<Actor> p2, class<Actor> p3); action native A_DropWeaponPieces(class<Actor> p1, class<Actor> p2, class<Actor> p3);
action native A_PigPain (); action native A_PigPain ();
action native A_JumpIfTargetInSight(state label);
action native A_MonsterRefire(int chance, state label);
States States
{ {