From 01ca3bb4688c9c2c1275f5d381c220b50d0249d3 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Tue, 16 Sep 2025 15:29:19 -0400 Subject: [PATCH 01/34] rocket launcher mod --- q4sdk.sln | 71 ++++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/q4sdk.sln b/q4sdk.sln index 2f4df2a3f..72d42c3ba 100644 --- a/q4sdk.sln +++ b/q4sdk.sln @@ -1,46 +1,43 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game", "game.vcproj", "{49BEC5C6-B964-417A-851E-808886B57430}" - ProjectSection(ProjectDependencies) = postProject - {49BEC5C6-B964-417A-851E-808886B57400} = {49BEC5C6-B964-417A-851E-808886B57400} - EndProjectSection +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36429.23 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game", "game.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57430}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idLib", "idlib.vcproj", "{49BEC5C6-B964-417A-851E-808886B57400}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idLib", "idlib.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57400}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MPGame", "mpgame.vcproj", "{F2EF9123-B7C3-4F2F-A351-747B595BB534}" - ProjectSection(ProjectDependencies) = postProject - {49BEC5C6-B964-417A-851E-808886B57400} = {49BEC5C6-B964-417A-851E-808886B57400} - EndProjectSection +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MPGame", "mpgame.vcxproj", "{F2EF9123-B7C3-4F2F-A351-747B595BB534}" EndProject Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - DebugInline = DebugInline - Release = Release + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + DebugInline|x86 = DebugInline|x86 + Release|x86 = Release|x86 EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {49BEC5C6-B964-417A-851E-808886B57430}.Debug.ActiveCfg = Debug|Win32 - {49BEC5C6-B964-417A-851E-808886B57430}.Debug.Build.0 = Debug|Win32 - {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline.ActiveCfg = DebugInline|Win32 - {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline.Build.0 = DebugInline|Win32 - {49BEC5C6-B964-417A-851E-808886B57430}.Release.ActiveCfg = Release|Win32 - {49BEC5C6-B964-417A-851E-808886B57430}.Release.Build.0 = Release|Win32 - {49BEC5C6-B964-417A-851E-808886B57400}.Debug.ActiveCfg = Debug|Win32 - {49BEC5C6-B964-417A-851E-808886B57400}.Debug.Build.0 = Debug|Win32 - {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline.ActiveCfg = DebugInline|Win32 - {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline.Build.0 = DebugInline|Win32 - {49BEC5C6-B964-417A-851E-808886B57400}.Release.ActiveCfg = Release|Win32 - {49BEC5C6-B964-417A-851E-808886B57400}.Release.Build.0 = Release|Win32 - {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Debug.ActiveCfg = Debug|Win32 - {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Debug.Build.0 = Debug|Win32 - {F2EF9123-B7C3-4F2F-A351-747B595BB534}.DebugInline.ActiveCfg = DebugInline|Win32 - {F2EF9123-B7C3-4F2F-A351-747B595BB534}.DebugInline.Build.0 = DebugInline|Win32 - {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Release.ActiveCfg = Release|Win32 - {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Release.Build.0 = Release|Win32 + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {49BEC5C6-B964-417A-851E-808886B57430}.Debug|x86.ActiveCfg = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.Debug|x86.Build.0 = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline|x86.ActiveCfg = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline|x86.Build.0 = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.Release|x86.ActiveCfg = Release|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.Release|x86.Build.0 = Release|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug|x86.ActiveCfg = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug|x86.Build.0 = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline|x86.ActiveCfg = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline|x86.Build.0 = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Release|x86.ActiveCfg = Release|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Release|x86.Build.0 = Release|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Debug|x86.ActiveCfg = Debug|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Debug|x86.Build.0 = Debug|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.DebugInline|x86.ActiveCfg = DebugInline|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.DebugInline|x86.Build.0 = DebugInline|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Release|x86.ActiveCfg = Release|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Release|x86.Build.0 = Release|Win32 EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EAD60D9C-8DE3-4031-924B-640D92C61E71} EndGlobalSection EndGlobal From bed6035a928e154e9bd10d164a056b1b2841803f Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Tue, 16 Sep 2025 15:48:27 -0400 Subject: [PATCH 02/34] rocket launcher mod part 2 --- Backup/q4sdk.sln | 46 ++ UpgradeLog.htm | 363 ++++++++++++ game.vcxproj | 496 ++++++++++++++++ game.vcxproj.filters | 837 +++++++++++++++++++++++++++ game.vcxproj.user | 4 + game/gamesys/Class.cpp | 2 +- game/gamesys/SaveGame.cpp | 2 +- game/gamesys/SysCmds.cpp | 4 +- game/weapon/WeaponRocketLauncher.cpp | 2 +- idlib.vcxproj | 327 +++++++++++ idlib.vcxproj.filters | 467 +++++++++++++++ idlib.vcxproj.user | 4 + idlib/math/Simd.cpp | 4 +- mpgame.vcxproj | 491 ++++++++++++++++ mpgame.vcxproj.filters | 837 +++++++++++++++++++++++++++ mpgame.vcxproj.user | 4 + 16 files changed, 3883 insertions(+), 7 deletions(-) create mode 100644 Backup/q4sdk.sln create mode 100644 UpgradeLog.htm create mode 100644 game.vcxproj create mode 100644 game.vcxproj.filters create mode 100644 game.vcxproj.user create mode 100644 idlib.vcxproj create mode 100644 idlib.vcxproj.filters create mode 100644 idlib.vcxproj.user create mode 100644 mpgame.vcxproj create mode 100644 mpgame.vcxproj.filters create mode 100644 mpgame.vcxproj.user diff --git a/Backup/q4sdk.sln b/Backup/q4sdk.sln new file mode 100644 index 000000000..2f4df2a3f --- /dev/null +++ b/Backup/q4sdk.sln @@ -0,0 +1,46 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game", "game.vcproj", "{49BEC5C6-B964-417A-851E-808886B57430}" + ProjectSection(ProjectDependencies) = postProject + {49BEC5C6-B964-417A-851E-808886B57400} = {49BEC5C6-B964-417A-851E-808886B57400} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idLib", "idlib.vcproj", "{49BEC5C6-B964-417A-851E-808886B57400}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MPGame", "mpgame.vcproj", "{F2EF9123-B7C3-4F2F-A351-747B595BB534}" + ProjectSection(ProjectDependencies) = postProject + {49BEC5C6-B964-417A-851E-808886B57400} = {49BEC5C6-B964-417A-851E-808886B57400} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + DebugInline = DebugInline + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {49BEC5C6-B964-417A-851E-808886B57430}.Debug.ActiveCfg = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.Debug.Build.0 = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline.ActiveCfg = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline.Build.0 = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.Release.ActiveCfg = Release|Win32 + {49BEC5C6-B964-417A-851E-808886B57430}.Release.Build.0 = Release|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug.ActiveCfg = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug.Build.0 = Debug|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline.ActiveCfg = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline.Build.0 = DebugInline|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Release.ActiveCfg = Release|Win32 + {49BEC5C6-B964-417A-851E-808886B57400}.Release.Build.0 = Release|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Debug.ActiveCfg = Debug|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Debug.Build.0 = Debug|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.DebugInline.ActiveCfg = DebugInline|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.DebugInline.Build.0 = DebugInline|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Release.ActiveCfg = Release|Win32 + {F2EF9123-B7C3-4F2F-A351-747B595BB534}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/UpgradeLog.htm b/UpgradeLog.htm new file mode 100644 index 000000000..c89eb1f93 --- /dev/null +++ b/UpgradeLog.htm @@ -0,0 +1,363 @@ + + + + Migration Report +

+ Migration Report - q4sdk

Overview

ProjectPathErrorsWarningsMessages
gamegame.vcproj0225
mpgamempgame.vcproj0225
idlibidlib.vcproj0164
Solutionq4sdk.sln012
Gamegame.vcproj000
idLibidlib.vcproj000
MPGamempgame.vcproj000

Solution and projects

game

Message
game.vcproj: + Due to the requirement that Visual C++ projects produce an embedded (by default) Windows SxS manifest, manifest files in the project are now automatically built with the Manifest Tool. You may need to change your build in order for it to work correctly. For instance, it is recommended that the dependency information contained in any manifest files be converted to "#pragma comment(linker,"<insert dependency here>")" in a header file that is included from your source code. If your project already embeds a manifest in the RT_MANIFEST resource section through a resource (.rc) file, the line may need to be commented out before the project will build correctly.
game.vcproj: + Due to a conformance change in the C++ compiler, code change may be required before your project will build without errors. Previous versions of the C++ compiler allowed specification of member function pointers by member function name (e.g. MemberFunctionName). The C++ standard requires a fully qualified name with the use of the address-of operator (e.g. &ClassName::MemberFunctionName). If your project contains forms or controls used in the Windows Forms Designer, you may have to change code in InitializeComponent because the designer generated code used the non-conformant syntax in delegate construction (used in event handlers).
game.vcproj: + This application has been updated to include settings related to the User Account Control (UAC) feature of Windows Vista. By default, when run on Windows Vista with UAC enabled, this application is marked to run with the same privileges as the process that launched it. This marking also disables the application from running with virtualization. You can change UAC related settings from the Property Pages of the project.
game.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
game.vcproj: + VCConvertEngine could not convert attribute MapLines = FALSE under Tool VCLinkerTool.
game.vcproj: + VCWebServiceProxyGeneratorTool is no longer supported. The tool has been removed from your project settings.
game.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
game.vcproj: + VCConvertEngine could not convert attribute MapLines = FALSE under Tool VCLinkerTool.
game.vcproj: + The C/C++ compiler switch /Og has been deprecated and has been removed from your project settings. It is recommended that you use /O1 or /O2 instead.
game.vcproj: + VCConvertEngine could not convert attribute GlobalOptimizations = TRUE under Tool VCCLCompilerTool.
game.vcproj: + VCConvertEngine could not convert attribute OptimizeForProcessor = 3 under Tool VCCLCompilerTool.
game.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
game.vcproj: + VCConvertEngine could not convert attribute MapLines = FALSE under Tool VCLinkerTool.
game.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\DebugInline\Game.dll') does not match the Librarian's OutputFile property value '../Win32/DebugInline\Game.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/DebugInline\Game.dll') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
game.vcproj: + MSB8012: $(TargetName) ('Game') does not match the Linker's OutputFile property value '../Win32/DebugInline\Gamex86.dll' ('Gamex86') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetName) property value matches the value specified in %(Link.OutputFile).
game.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\DebugInline\Game.dll') does not match the Linker's OutputFile property value '../Win32/DebugInline\Gamex86.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/DebugInline\Gamex86.dll') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
game.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Debug\Game.dll') does not match the Librarian's OutputFile property value '../Win32/Debug\Game.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Debug\Game.dll') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
game.vcproj: + MSB8012: $(TargetName) ('Game') does not match the Linker's OutputFile property value '../Win32/Debug\Gamex86.dll' ('Gamex86') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetName) property value matches the value specified in %(Link.OutputFile).
game.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Debug\Game.dll') does not match the Linker's OutputFile property value '../Win32/Debug\Gamex86.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Debug\Gamex86.dll') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
game.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Release\Game.dll') does not match the Librarian's OutputFile property value '../Win32/Release\Game.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Release\Game.dll') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
game.vcproj: + MSB8012: $(TargetName) ('Game') does not match the Linker's OutputFile property value '../Win32/Release\Gamex86.dll' ('Gamex86') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetName) property value matches the value specified in %(Link.OutputFile).
game.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Release\Game.dll') does not match the Linker's OutputFile property value '../Win32/Release\Gamex86.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Release\Gamex86.dll') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
+ Show 5 additional messages +
game.vcproj: + Converting project file 'C:\Users\Freddy_PC\Q4-Project_GameMod\game.vcproj'.
game.vcproj: + Visual C++ now provides improved safety in its C and C++ Libraries. This includes new and improved functions, additional checking and validation, and internal design changes. These libraries are turned on by default. You may see some warnings about unsafe functions or parameters when you build your project. The warnings will generally suggest an alternative safer coding style or function. It is advised that you correct these warnings, in order to make your code more safe. Full details can be found in the documentation by searching for 'Security Enhancements in the CRT' and for 'Checked Iterators'.
game.vcproj: + The C/C++ compiler default settings have been modified to be more compliant with ISO Standard C++. Included in those changes are enforcing Standard C++ for loop scoping and supporting wchar_t as a native type. These changes may cause existing code to no longer compile without changes to the code or the compiler options with which it is built.
game.vcproj: + Web deployment to the local IIS server is no longer supported. The Web Deployment build tool has been removed from your project settings.
game.vcproj: + Done converting to new project file 'C:\Users\Freddy_PC\Q4-Project_GameMod\game.vcxproj'.
+ Hide 5 additional messages +

mpgame

Message
mpgame.vcproj: + Due to the requirement that Visual C++ projects produce an embedded (by default) Windows SxS manifest, manifest files in the project are now automatically built with the Manifest Tool. You may need to change your build in order for it to work correctly. For instance, it is recommended that the dependency information contained in any manifest files be converted to "#pragma comment(linker,"<insert dependency here>")" in a header file that is included from your source code. If your project already embeds a manifest in the RT_MANIFEST resource section through a resource (.rc) file, the line may need to be commented out before the project will build correctly.
mpgame.vcproj: + Due to a conformance change in the C++ compiler, code change may be required before your project will build without errors. Previous versions of the C++ compiler allowed specification of member function pointers by member function name (e.g. MemberFunctionName). The C++ standard requires a fully qualified name with the use of the address-of operator (e.g. &ClassName::MemberFunctionName). If your project contains forms or controls used in the Windows Forms Designer, you may have to change code in InitializeComponent because the designer generated code used the non-conformant syntax in delegate construction (used in event handlers).
mpgame.vcproj: + This application has been updated to include settings related to the User Account Control (UAC) feature of Windows Vista. By default, when run on Windows Vista with UAC enabled, this application is marked to run with the same privileges as the process that launched it. This marking also disables the application from running with virtualization. You can change UAC related settings from the Property Pages of the project.
mpgame.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
mpgame.vcproj: + VCConvertEngine could not convert attribute MapLines = FALSE under Tool VCLinkerTool.
mpgame.vcproj: + VCWebServiceProxyGeneratorTool is no longer supported. The tool has been removed from your project settings.
mpgame.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
mpgame.vcproj: + VCConvertEngine could not convert attribute MapLines = FALSE under Tool VCLinkerTool.
mpgame.vcproj: + The C/C++ compiler switch /Og has been deprecated and has been removed from your project settings. It is recommended that you use /O1 or /O2 instead.
mpgame.vcproj: + VCConvertEngine could not convert attribute GlobalOptimizations = TRUE under Tool VCCLCompilerTool.
mpgame.vcproj: + VCConvertEngine could not convert attribute OptimizeForProcessor = 3 under Tool VCCLCompilerTool.
mpgame.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
mpgame.vcproj: + VCConvertEngine could not convert attribute MapLines = FALSE under Tool VCLinkerTool.
mpgame.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\DebugInline\MPGame.dll') does not match the Librarian's OutputFile property value '../Win32/DebugInline\MPGame.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/DebugInline\MPGame.dll') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetName) ('MPGame') does not match the Linker's OutputFile property value '../Win32/DebugInline\MPGamex86.dll' ('MPGamex86') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetName) property value matches the value specified in %(Link.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\DebugInline\MPGame.dll') does not match the Linker's OutputFile property value '../Win32/DebugInline\MPGamex86.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/DebugInline\MPGamex86.dll') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Debug\MPGame.dll') does not match the Librarian's OutputFile property value '../Win32/Debug\MPGame.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Debug\MPGame.dll') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetName) ('MPGame') does not match the Linker's OutputFile property value '../Win32/Debug\MPGamex86.dll' ('MPGamex86') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetName) property value matches the value specified in %(Link.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Debug\MPGame.dll') does not match the Linker's OutputFile property value '../Win32/Debug\MPGamex86.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Debug\MPGamex86.dll') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Release\MPGame.dll') does not match the Librarian's OutputFile property value '../Win32/Release\MPGame.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Release\MPGame.dll') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetName) ('MPGame') does not match the Linker's OutputFile property value '../Win32/Release\MPGamex86.dll' ('MPGamex86') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetName) property value matches the value specified in %(Link.OutputFile).
mpgame.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Release\MPGame.dll') does not match the Linker's OutputFile property value '../Win32/Release\MPGamex86.dll' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Release\MPGamex86.dll') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
+ Show 5 additional messages +
mpgame.vcproj: + Converting project file 'C:\Users\Freddy_PC\Q4-Project_GameMod\mpgame.vcproj'.
mpgame.vcproj: + Visual C++ now provides improved safety in its C and C++ Libraries. This includes new and improved functions, additional checking and validation, and internal design changes. These libraries are turned on by default. You may see some warnings about unsafe functions or parameters when you build your project. The warnings will generally suggest an alternative safer coding style or function. It is advised that you correct these warnings, in order to make your code more safe. Full details can be found in the documentation by searching for 'Security Enhancements in the CRT' and for 'Checked Iterators'.
mpgame.vcproj: + The C/C++ compiler default settings have been modified to be more compliant with ISO Standard C++. Included in those changes are enforcing Standard C++ for loop scoping and supporting wchar_t as a native type. These changes may cause existing code to no longer compile without changes to the code or the compiler options with which it is built.
mpgame.vcproj: + Web deployment to the local IIS server is no longer supported. The Web Deployment build tool has been removed from your project settings.
mpgame.vcproj: + Done converting to new project file 'C:\Users\Freddy_PC\Q4-Project_GameMod\mpgame.vcxproj'.
+ Hide 5 additional messages +

idlib

Message
idlib.vcproj: + Due to the requirement that Visual C++ projects produce an embedded (by default) Windows SxS manifest, manifest files in the project are now automatically built with the Manifest Tool. You may need to change your build in order for it to work correctly. For instance, it is recommended that the dependency information contained in any manifest files be converted to "#pragma comment(linker,"<insert dependency here>")" in a header file that is included from your source code. If your project already embeds a manifest in the RT_MANIFEST resource section through a resource (.rc) file, the line may need to be commented out before the project will build correctly.
idlib.vcproj: + Due to a conformance change in the C++ compiler, code change may be required before your project will build without errors. Previous versions of the C++ compiler allowed specification of member function pointers by member function name (e.g. MemberFunctionName). The C++ standard requires a fully qualified name with the use of the address-of operator (e.g. &ClassName::MemberFunctionName). If your project contains forms or controls used in the Windows Forms Designer, you may have to change code in InitializeComponent because the designer generated code used the non-conformant syntax in delegate construction (used in event handlers).
idlib.vcproj: + This application has been updated to include settings related to the User Account Control (UAC) feature of Windows Vista. By default, when run on Windows Vista with UAC enabled, this application is marked to run with the same privileges as the process that launched it. This marking also disables the application from running with virtualization. You can change UAC related settings from the Property Pages of the project.
idlib.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
idlib.vcproj: + VCWebServiceProxyGeneratorTool is no longer supported. The tool has been removed from your project settings.
idlib.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
idlib.vcproj: + The C/C++ compiler switch /Og has been deprecated and has been removed from your project settings. It is recommended that you use /O1 or /O2 instead.
idlib.vcproj: + VCConvertEngine could not convert attribute GlobalOptimizations = TRUE under Tool VCCLCompilerTool.
idlib.vcproj: + VCConvertEngine could not convert attribute OptimizeForProcessor = 3 under Tool VCCLCompilerTool.
idlib.vcproj: + Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
idlib.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\DebugInline\idLib.lib') does not match the Librarian's OutputFile property value '../Win32/DebugInline\idLib.lib' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/DebugInline\idLib.lib') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
idlib.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\DebugInline\idLib.lib') does not match the Linker's OutputFile property value '../Win32/DebugInline\idLib.lib' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/DebugInline\idLib.lib') in project configuration 'DebugInline|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
idlib.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Debug\idLib.lib') does not match the Librarian's OutputFile property value '../Win32/Debug\idLib.lib' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Debug\idLib.lib') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
idlib.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Debug\idLib.lib') does not match the Linker's OutputFile property value '../Win32/Debug\idLib.lib' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Debug\idLib.lib') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
idlib.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Release\idLib.lib') does not match the Librarian's OutputFile property value '../Win32/Release\idLib.lib' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Release\idLib.lib') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Lib.OutputFile).
idlib.vcproj: + MSB8012: $(TargetPath) ('C:\Users\Freddy_PC\Win32\Release\idLib.lib') does not match the Linker's OutputFile property value '../Win32/Release\idLib.lib' ('C:\Users\Freddy_PC\Q4-Project_GameMod\../Win32/Release\idLib.lib') in project configuration 'Release|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
+ Show 4 additional messages +
idlib.vcproj: + Converting project file 'C:\Users\Freddy_PC\Q4-Project_GameMod\idlib.vcproj'.
idlib.vcproj: + Visual C++ now provides improved safety in its C and C++ Libraries. This includes new and improved functions, additional checking and validation, and internal design changes. These libraries are turned on by default. You may see some warnings about unsafe functions or parameters when you build your project. The warnings will generally suggest an alternative safer coding style or function. It is advised that you correct these warnings, in order to make your code more safe. Full details can be found in the documentation by searching for 'Security Enhancements in the CRT' and for 'Checked Iterators'.
idlib.vcproj: + The C/C++ compiler default settings have been modified to be more compliant with ISO Standard C++. Included in those changes are enforcing Standard C++ for loop scoping and supporting wchar_t as a native type. These changes may cause existing code to no longer compile without changes to the code or the compiler options with which it is built.
idlib.vcproj: + Done converting to new project file 'C:\Users\Freddy_PC\Q4-Project_GameMod\idlib.vcxproj'.
+ Hide 4 additional messages +

Solution

Message
q4sdk.sln: + Visual Studio needs to make non-functional changes to this project in order to enable the project to open in released versions of Visual Studio newer than Visual Studio 2010 SP1 without impacting project behavior.
+ Show 2 additional messages +
q4sdk.sln: + File successfully backed up as C:\Users\Freddy_PC\Q4-Project_GameMod\Backup\q4sdk.sln
q4sdk.sln: + Solution migrated successfully
+ Hide 2 additional messages +

Game

Message
Game logged no messages. +

idLib

Message
idLib logged no messages. +

MPGame

Message
MPGame logged no messages. +
\ No newline at end of file diff --git a/game.vcxproj b/game.vcxproj new file mode 100644 index 000000000..d85b67441 --- /dev/null +++ b/game.vcxproj @@ -0,0 +1,496 @@ + + + + + DebugInline + Win32 + + + Debug + Win32 + + + Release + Win32 + + + + 17.0 + Game + {49BEC5C6-B964-417A-851E-808886B57430} + Game + Perforce Project + + .. + MSSCCI:NXN alienbrain + Win32Proj + + + + DynamicLibrary + v143 + false + MultiByte + + + DynamicLibrary + v143 + false + MultiByte + + + DynamicLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + + <_ProjectFileVersion>17.0.36414.14 + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + true + true + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + true + false + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + true + false + + + + Disabled + _DEBUG;_WINDOWS;GAME_DLL;Q4SDK;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + true + true + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)x86.pdb + $(IntDir)$(ProjectName)/ + Level4 + EditAndContinue + Default + + + /FIXED:no %(AdditionalOptions) + $(IntDir)idLib.lib;%(AdditionalDependencies) + $(IntDir)$(ProjectName)x86.dll + true + .\game\game.def + true + $(IntDir)$(ProjectName)x86.pdb + false + + false + NotSet + 16000000 + 16000000 + true + 0x20000000 + MachineX86 + + + + + Disabled + OnlyExplicitInline + _DEBUG;_WINDOWS;_INLINEDEBUG;GAME_DLL;Q4SDK;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + true + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)x86.pdb + true + $(IntDir)$(ProjectName)/ + Level4 + ProgramDatabase + Default + + + $(IntDir)idLib.lib;%(AdditionalDependencies) + $(IntDir)$(ProjectName)x86.dll + true + .\game\game.def + true + $(IntDir)$(ProjectName)x86.pdb + false + + false + NotSet + 16000000 + 16000000 + true + 0x20000000 + MachineX86 + + + true + + + + + Full + OnlyExplicitInline + true + Neither + false + NDEBUG;_WINDOWS;_FINAL;GAME_DLL;Q4SDK;%(PreprocessorDefinitions) + true + MultiThreaded + false + false + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)x86.pdb + + $(IntDir)$(ProjectName)/ + Level4 + ProgramDatabase + Default + + + /MACHINE:I386 /fixed:no %(AdditionalOptions) + $(IntDir)idLib.lib;%(AdditionalDependencies) + $(IntDir)$(ProjectName)x86.dll + true + .\game\game.def + true + $(IntDir)$(ProjectName)x86.pdb + true + $(IntDir)$(ProjectName)x86.map + true + NotSet + 4194304 + true + true + true + + 0x20000000 + MachineX86 + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {49bec5c6-b964-417a-851e-808886b57400} + false + + + + + + \ No newline at end of file diff --git a/game.vcxproj.filters b/game.vcxproj.filters new file mode 100644 index 000000000..afadf3eeb --- /dev/null +++ b/game.vcxproj.filters @@ -0,0 +1,837 @@ + + + + + {c4275561-cf2d-441c-836a-ee4b443f39de} + + + {661a26eb-4dd1-418f-b4bb-542174553ade} + + + {674e2285-b872-45c1-938c-20adbd8bd47a} + + + {565e8a7a-77ee-41f6-be75-1a936565e81c} + + + {0c76dca9-6542-452b-9ca1-f97362c31c3a} + + + {c0fc928a-20b8-49fa-a770-119c84732232} + + + {7f518b6d-94dd-4de6-87bf-49417e5a0570} + + + {e90b2a10-f8e3-4417-878d-478c67e93429} + + + {4effba46-bc7c-45ee-a587-801d07ce4c9e} + + + {653c0cfa-3d33-48b5-85a3-bdc7e2ec8a3b} + + + {4857642c-b2d1-4a40-9929-4b27b8d6d6fb} + + + {2f7e08e7-4732-495e-844b-36131939a362} + + + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\Anim + + + Game\Anim + + + Game\Anim + + + Game\Anim + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Player + + + Game\Player + + + Game\Player + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP\Stats + + + Game\MP\Stats + + + Game\MP\Stats + + + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\Anim + + + Game\Anim + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Player + + + Game\Player + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Weapon + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP\Stats + + + Game\MP\Stats + + + Game\MP\Stats + + + + + + \ No newline at end of file diff --git a/game.vcxproj.user b/game.vcxproj.user new file mode 100644 index 000000000..88a550947 --- /dev/null +++ b/game.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/game/gamesys/Class.cpp b/game/gamesys/Class.cpp index 51cae34e6..ddc796b82 100644 --- a/game/gamesys/Class.cpp +++ b/game/gamesys/Class.cpp @@ -11,7 +11,7 @@ instancing of objects. #include "../Game_local.h" #ifdef _WIN32 -#include "TypeInfo.h" +#include "TypeInfo" #else #include "NoGameTypeInfo.h" #endif diff --git a/game/gamesys/SaveGame.cpp b/game/gamesys/SaveGame.cpp index 28d501df8..080834f90 100644 --- a/game/gamesys/SaveGame.cpp +++ b/game/gamesys/SaveGame.cpp @@ -5,7 +5,7 @@ #include "../Game_local.h" #ifdef _WIN32 -#include "TypeInfo.h" +#include "TypeInfo" #else #include "NoGameTypeInfo.h" #endif diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index ab92878fd..6a1d6f231 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -26,7 +26,7 @@ // RAVEN END #ifdef _WIN32 -#include "TypeInfo.h" +#include "TypeInfo" #else #include "NoGameTypeInfo.h" #endif @@ -171,7 +171,7 @@ void Cmd_ListSpawnArgs_f( const idCmdArgs &args ) { for ( i = 0; i < ent->spawnArgs.GetNumKeyVals(); i++ ) { const idKeyValue *kv = ent->spawnArgs.GetKeyVal( i ); - gameLocal.Printf( "\"%s\" "S_COLOR_WHITE"\"%s\"\n", kv->GetKey().c_str(), kv->GetValue().c_str() ); + gameLocal.Printf( "\"%s\" " S_COLOR_WHITE "\"%s\"\n", kv->GetKey().c_str(), kv->GetValue().c_str() ); } } diff --git a/game/weapon/WeaponRocketLauncher.cpp b/game/weapon/WeaponRocketLauncher.cpp index bbd362379..58316a808 100644 --- a/game/weapon/WeaponRocketLauncher.cpp +++ b/game/weapon/WeaponRocketLauncher.cpp @@ -446,7 +446,7 @@ stateResult_t rvWeaponRocketLauncher::State_Fire ( const stateParms_t& parms ) { switch ( parms.stage ) { case STAGE_INIT: nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); - Attack ( false, 1, spread, 0, 1.0f ); + Attack ( false, 5, 10 , 0, 10.0f ); PlayAnim ( ANIMCHANNEL_LEGS, "fire", parms.blendFrames ); return SRESULT_STAGE ( STAGE_WAIT ); diff --git a/idlib.vcxproj b/idlib.vcxproj new file mode 100644 index 000000000..c422ac2e1 --- /dev/null +++ b/idlib.vcxproj @@ -0,0 +1,327 @@ + + + + + DebugInline + Win32 + + + Debug + Win32 + + + Release + Win32 + + + + 17.0 + idLib + {49BEC5C6-B964-417A-851E-808886B57400} + idLib + Perforce Project + + .. + MSSCCI:NXN alienbrain + Win32Proj + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + + <_ProjectFileVersion>17.0.36414.14 + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + + + + Disabled + mssdk/include;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;Q4SDK;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + true + true + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName).pdb + $(IntDir)$(ProjectName)/ + Level4 + EditAndContinue + Default + + + $(IntDir)$(ProjectName).lib + + + + + Disabled + OnlyExplicitInline + mssdk/include;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_INLINEDEBUG;Q4SDK;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + true + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName).pdb + true + $(IntDir)$(ProjectName)/ + Level4 + ProgramDatabase + Default + + + $(IntDir)$(ProjectName).lib + + + true + + + + + Full + OnlyExplicitInline + true + Neither + false + mssdk/include;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_FINAL;Q4SDK;%(PreprocessorDefinitions) + true + MultiThreaded + false + false + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName).pdb + + $(IntDir)$(ProjectName)/ + Level4 + ProgramDatabase + Default + + + $(IntDir)$(ProjectName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + + + + + + + + + + + + + + Use + Use + Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idlib.vcxproj.filters b/idlib.vcxproj.filters new file mode 100644 index 000000000..f66321b5b --- /dev/null +++ b/idlib.vcxproj.filters @@ -0,0 +1,467 @@ + + + + + {0a0af650-81bb-469e-aad8-9ae714fb1fec} + + + {db54e9de-1f9f-458f-9fe4-eff048097821} + + + {2e6c26ad-178b-44c3-83c0-06bf60be1847} + + + {83c88677-76d1-44b8-8f73-86b7ee980284} + + + {0f573ffc-74dd-4aae-88ef-9a6b9415d292} + + + {01e24a70-d2ca-4722-bac4-e72f792463b3} + + + {aca43b89-6d22-4931-9180-5866c8d27219} + + + {c9f625d5-9c3b-4b6e-ae78-66bad559db6e} + + + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib\BV + + + idLib\BV + + + idLib\BV + + + idLib\BV + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Containers + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + idLib\threads + + + idLib\Algorithms + + + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib + + + idLib\BV + + + idLib\BV + + + idLib\BV + + + idLib\BV + + + idLib\Containers + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Geometry + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Math + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + idLib\Hashing + + + + + idLib + + + \ No newline at end of file diff --git a/idlib.vcxproj.user b/idlib.vcxproj.user new file mode 100644 index 000000000..88a550947 --- /dev/null +++ b/idlib.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/idlib/math/Simd.cpp b/idlib/math/Simd.cpp index 471720aec..f7b2bb1c2 100644 --- a/idlib/math/Simd.cpp +++ b/idlib/math/Simd.cpp @@ -1491,7 +1491,7 @@ void TestMemcpy( void ) { p_simd->Memcpy( test1, test0, 8192 ); for ( j = 0; j < i; j++ ) { if ( test1[j] != test0[j] ) { - idLib::common->Printf( " simd->Memcpy() "S_COLOR_RED"X\n" ); + idLib::common->Printf( " simd->Memcpy() " S_COLOR_RED "X\n" ); return; } } @@ -1517,7 +1517,7 @@ void TestMemset( void ) { p_simd->Memset( test, j, i ); for ( k = 0; k < i; k++ ) { if ( test[k] != (byte)j ) { - idLib::common->Printf( " simd->Memset() "S_COLOR_RED"X\n" ); + idLib::common->Printf( " simd->Memset() " S_COLOR_RED "X\n" ); return; } } diff --git a/mpgame.vcxproj b/mpgame.vcxproj new file mode 100644 index 000000000..5b9165824 --- /dev/null +++ b/mpgame.vcxproj @@ -0,0 +1,491 @@ + + + + + DebugInline + Win32 + + + Debug + Win32 + + + Release + Win32 + + + + 17.0 + MPGame + {F2EF9123-B7C3-4F2F-A351-747B595BB534} + MPGame + Win32Proj + + + + DynamicLibrary + v143 + false + MultiByte + + + DynamicLibrary + v143 + false + MultiByte + + + DynamicLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + + <_ProjectFileVersion>17.0.36414.14 + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + true + true + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + true + false + + + ../$(Platform)/$(Configuration)\ + $(OutDir) + true + false + + + + Disabled + _DEBUG;_WINDOWS;GAME_DLL;GAME_MPAPI;Q4SDK;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + true + true + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)x86.pdb + $(IntDir)$(ProjectName)/ + Level4 + EditAndContinue + Default + + + /FIXED:no %(AdditionalOptions) + $(IntDir)idLib.lib;%(AdditionalDependencies) + $(IntDir)$(ProjectName)x86.dll + true + .\mpgame\mpgame.def + true + $(IntDir)$(ProjectName)x86.pdb + false + + false + NotSet + 16000000 + 16000000 + true + 0x20000000 + MachineX86 + + + + + Disabled + OnlyExplicitInline + _DEBUG;_WINDOWS;_INLINEDEBUG;GAME_DLL;GAME_MPAPI;Q4SDK;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + true + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)x86.pdb + true + $(IntDir)$(ProjectName)/ + Level4 + ProgramDatabase + Default + + + $(IntDir)idLib.lib;%(AdditionalDependencies) + $(IntDir)$(ProjectName)x86.dll + true + .\mpgame\mpgame.def + true + $(IntDir)$(ProjectName)x86.pdb + false + + false + NotSet + 16000000 + 16000000 + true + 0x20000000 + MachineX86 + + + true + + + + + Full + OnlyExplicitInline + true + Neither + false + NDEBUG;_WINDOWS;_FINAL;GAME_DLL;GAME_MPAPI;Q4SDK;%(PreprocessorDefinitions) + true + MultiThreaded + false + false + true + true + Use + + $(IntDir)$(ProjectName)/$(ProjectName).pch + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)/ + $(IntDir)$(ProjectName)x86.pdb + + $(IntDir)$(ProjectName)/ + Level4 + ProgramDatabase + Default + + + /MACHINE:I386 /fixed:no %(AdditionalOptions) + $(IntDir)idLib.lib;%(AdditionalDependencies) + $(IntDir)$(ProjectName)x86.dll + true + .\mpgame\mpgame.def + true + $(IntDir)$(ProjectName)x86.pdb + true + $(IntDir)$(ProjectName)x86.map + true + NotSet + 4194304 + true + true + true + + 0x20000000 + MachineX86 + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {49bec5c6-b964-417a-851e-808886b57400} + false + + + + + + \ No newline at end of file diff --git a/mpgame.vcxproj.filters b/mpgame.vcxproj.filters new file mode 100644 index 000000000..7b86ed9c5 --- /dev/null +++ b/mpgame.vcxproj.filters @@ -0,0 +1,837 @@ + + + + + {fa76151f-4bd1-4afb-ae25-f4c326c762bf} + + + {2a68a282-2352-45ff-914d-f390b00788dd} + + + {6eeeb297-28d6-4727-93c7-b73e08829c2f} + + + {0a8b1cdd-eeb5-4d46-9dcc-c4e622e0d54c} + + + {a0d84e2e-b128-49b2-b083-ea96caa70d1a} + + + {283a1e18-3495-491a-b774-287f585aefd3} + + + {bc43164f-0576-4ec2-90c1-5a4880efe858} + + + {5be6bc7c-e77c-4e2c-ad2f-493ee15e61df} + + + {f0aca327-f813-4c12-94fb-8c5920e35e61} + + + {393f18d8-8e29-40ab-a784-4882bc6d9f01} + + + {1456ad67-cc84-4b91-b9b3-00ff9bad295a} + + + {ee7661d8-b808-4704-83da-5dc564fa62d4} + + + {66887bfa-b77e-497b-bd35-5603a84afbef} + + + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\Anim + + + Game\Anim + + + Game\Anim + + + Game\Anim + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Player + + + Game\Player + + + Game\Player + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\Weapon + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP\Stats + + + Game\MP\Stats + + + Game\MP\Stats + + + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\AI + + + Game\Anim + + + Game\Anim + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\Client + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\GameSys + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Physics + + + Game\Player + + + Game\Player + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Script + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Vehicle + + + Game\Weapon + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP + + + Game\MP\Stats + + + Game\MP\Stats + + + Game\MP\Stats + + + + + + \ No newline at end of file diff --git a/mpgame.vcxproj.user b/mpgame.vcxproj.user new file mode 100644 index 000000000..88a550947 --- /dev/null +++ b/mpgame.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 23a40cb2321b1116c1a1dfe0320097a164ec393b Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Sat, 4 Oct 2025 20:00:43 -0400 Subject: [PATCH 03/34] updated fantasymod --- game/gamesys/SysCmds.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 6a1d6f231..99867e43e 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -576,6 +576,23 @@ void Cmd_CenterView_f( const idCmdArgs &args ) { player->SetViewAngles( ang ); } + +void Cmd_Abilities_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + + if (cvarSystem->GetCVarFloat("timeScale") >= 1.0f) { + cvarSystem->SetCVarFloat("timeScale", 0.2f); // slows down time on first click + } + else { + cvarSystem->SetCVarFloat("timeScale", 1.0f); // buts time back to normal on second click + } +} + /* ================== Cmd_God_f @@ -3232,6 +3249,7 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand( "buyMenu", Cmd_ToggleBuyMenu_f, CMD_FL_GAME, "Toggle buy menu (if in a buy zone and the game type supports it)" ); cmdSystem->AddCommand( "buy", Cmd_BuyItem_f, CMD_FL_GAME, "Buy an item (if in a buy zone and the game type supports it)" ); // RITUAL END + cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); } From 6f1ca4e96c6cd37e2927f5be20002c0b6456b578 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Sat, 4 Oct 2025 23:43:43 -0400 Subject: [PATCH 04/34] updated fantasy mod --- game/weapon/WeaponBlaster.cpp | 4 ++-- game/weapon/WeaponDarkMatterGun.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/game/weapon/WeaponBlaster.cpp b/game/weapon/WeaponBlaster.cpp index e6c182b31..00313dcdc 100644 --- a/game/weapon/WeaponBlaster.cpp +++ b/game/weapon/WeaponBlaster.cpp @@ -427,11 +427,11 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { if ( gameLocal.time - fireHeldTime > chargeTime ) { - Attack ( true, 1, spread, 0, 1.0f ); + Attack ( true, 1, spread, 0, 0.5f ); PlayEffect ( "fx_chargedflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "chargedfire", parms.blendFrames ); } else { - Attack ( false, 1, spread, 0, 1.0f ); + Attack ( false, 1, spread, 0, 0.5f ); PlayEffect ( "fx_normalflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "fire", parms.blendFrames ); } diff --git a/game/weapon/WeaponDarkMatterGun.cpp b/game/weapon/WeaponDarkMatterGun.cpp index 39fd58bf7..63eb940f6 100644 --- a/game/weapon/WeaponDarkMatterGun.cpp +++ b/game/weapon/WeaponDarkMatterGun.cpp @@ -314,7 +314,7 @@ stateResult_t rvWeaponDarkMatterGun::State_Fire ( const stateParms_t& parms ) { StopRings ( ); nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); - Attack ( false, 1, spread, 0, 1.0f ); + Attack ( false, 1, spread, 0, 0.02f ); PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); return SRESULT_STAGE ( STAGE_WAIT ); From a5f56e124ca5baad51a505f95b7ef864d3ba81e7 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Sun, 5 Oct 2025 20:06:32 -0400 Subject: [PATCH 05/34] updated fantasy mod --- game/weapon/WeaponHyperblaster.cpp | 2 +- game/weapon/WeaponMachinegun.cpp | 47 ++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/game/weapon/WeaponHyperblaster.cpp b/game/weapon/WeaponHyperblaster.cpp index 661b6d26d..d7f837baa 100644 --- a/game/weapon/WeaponHyperblaster.cpp +++ b/game/weapon/WeaponHyperblaster.cpp @@ -229,7 +229,7 @@ stateResult_t rvWeaponHyperblaster::State_Fire ( const stateParms_t& parms ) { case STAGE_INIT: SpinUp ( ); nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); - Attack ( false, 1, spread, 0, 1.0f ); + Attack ( false, 1, 0, 0, 3.0f ); if ( ClipSize() ) { viewModel->SetShaderParm ( HYPERBLASTER_SPARM_BATTERY, (float)AmmoInClip()/ClipSize() ); } else { diff --git a/game/weapon/WeaponMachinegun.cpp b/game/weapon/WeaponMachinegun.cpp index c9d453ee4..4e7ab7b82 100644 --- a/game/weapon/WeaponMachinegun.cpp +++ b/game/weapon/WeaponMachinegun.cpp @@ -4,6 +4,9 @@ #include "../Game_local.h" #include "../Weapon.h" +const int BURST_COUNT = 10; +const int BURST_DELAY = 100; + class rvWeaponMachinegun : public rvWeapon { public: @@ -222,33 +225,45 @@ rvWeaponMachinegun::State_Fire stateResult_t rvWeaponMachinegun::State_Fire ( const stateParms_t& parms ) { enum { STAGE_INIT, + STAGE_BURST, STAGE_WAIT, }; + + static int burst = 0; + switch ( parms.stage ) { case STAGE_INIT: - if ( wsfl.zoom ) { - nextAttackTime = gameLocal.time + (altFireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); - Attack ( true, 1, spreadZoom, 0, 1.0f ); - fireHeld = true; - } else { - nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); - Attack ( false, 1, spread, 0, 1.0f ); + burst = 0; + fireHeld = true; + PlayAnim (ANIMCHANNEL_ALL, "fire", 0); + nextAttackTime = gameLocal.time; + return SRESULT_STAGE ( STAGE_BURST ); + + case STAGE_BURST: + if (gameLocal.time < nextAttackTime) { + return SRESULT_WAIT; } - PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); - return SRESULT_STAGE ( STAGE_WAIT ); - - case STAGE_WAIT: - if ( !fireHeld && wsfl.attack && gameLocal.time >= nextAttackTime && AmmoInClip() && !wsfl.lowerWeapon ) { - SetState ( "Fire", 0 ); + if (AmmoInClip() > 0) { + Attack(false, 1, spread, 0, 1.0f); + burst++; + nextAttackTime = gameLocal.time + BURST_DELAY; + } + else { + SetState("Reload", 4); return SRESULT_DONE; } + if (burst < BURST_COUNT) { + return SRESULT_WAIT; + } + fireHeld = false; + return SRESULT_STAGE(STAGE_WAIT); + + case STAGE_WAIT: if ( AnimDone ( ANIMCHANNEL_ALL, 0 ) ) { SetState ( "Idle", 0 ); return SRESULT_DONE; } - if ( UpdateFlashlight ( ) ) { - return SRESULT_DONE; - } + return SRESULT_WAIT; } return SRESULT_ERROR; From c83e9e8c0ed329e139d576f9c98a114e622b6674 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Sun, 5 Oct 2025 22:52:14 -0400 Subject: [PATCH 06/34] updated fantasy mod --- game/weapon/WeaponGrenadeLauncher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/weapon/WeaponGrenadeLauncher.cpp b/game/weapon/WeaponGrenadeLauncher.cpp index c3ae03c1a..c9b12dc2f 100644 --- a/game/weapon/WeaponGrenadeLauncher.cpp +++ b/game/weapon/WeaponGrenadeLauncher.cpp @@ -145,7 +145,7 @@ stateResult_t rvWeaponGrenadeLauncher::State_Fire ( const stateParms_t& parms ) switch ( parms.stage ) { case STAGE_INIT: nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); - Attack ( false, 1, spread, 0, 1.0f ); + Attack ( false, 5, 30, 0, 1.0f ); PlayAnim ( ANIMCHANNEL_ALL, GetFireAnim(), 0 ); return SRESULT_STAGE ( STAGE_WAIT ); From 34f3b1d7d2bcb4e541535b39a15c4d52f7dc7095 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 6 Oct 2025 00:18:58 -0400 Subject: [PATCH 07/34] updated fantasy mod --- game/weapon/WeaponBlaster.cpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/game/weapon/WeaponBlaster.cpp b/game/weapon/WeaponBlaster.cpp index 00313dcdc..f70037353 100644 --- a/game/weapon/WeaponBlaster.cpp +++ b/game/weapon/WeaponBlaster.cpp @@ -4,6 +4,9 @@ #include "../Game_local.h" #include "../Weapon.h" +const int BURST_COUNT = 5; +const int BURST_DELAY = 400; + #define BLASTER_SPARM_CHARGEGLOW 6 class rvWeaponBlaster : public rvWeapon { @@ -32,6 +35,7 @@ class rvWeaponBlaster : public rvWeapon { idVec2 chargeGlow; bool fireForced; int fireHeldTime; + int burstShotsFired; stateResult_t State_Raise ( const stateParms_t& parms ); stateResult_t State_Lower ( const stateParms_t& parms ); @@ -155,6 +159,7 @@ void rvWeaponBlaster::Spawn ( void ) { fireHeldTime = 0; fireForced = false; + burstShotsFired = 0; Flashlight ( owner->IsFlashlightOn() ); } @@ -400,8 +405,12 @@ rvWeaponBlaster::State_Fire stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { enum { FIRE_INIT, + FIRE_BURST, FIRE_WAIT, }; + + static int burst = 0; + switch ( parms.stage ) { case FIRE_INIT: @@ -427,17 +436,33 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { if ( gameLocal.time - fireHeldTime > chargeTime ) { - Attack ( true, 1, spread, 0, 0.5f ); + burstShotsFired = 0; + nextAttackTime = gameLocal.time; PlayEffect ( "fx_chargedflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "chargedfire", parms.blendFrames ); + return SRESULT_STAGE(FIRE_BURST); } else { Attack ( false, 1, spread, 0, 0.5f ); PlayEffect ( "fx_normalflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "fire", parms.blendFrames ); + fireHeldTime = 0; + return SRESULT_STAGE(FIRE_WAIT); + } + + case FIRE_BURST: + if (gameLocal.time < nextAttackTime) { + return SRESULT_WAIT; + } + if (burstShotsFired < BURST_COUNT) { + Attack(false, 1, spread, 0, 1.0f); + burstShotsFired++; + nextAttackTime = gameLocal.time + BURST_DELAY; + return SRESULT_WAIT; } - fireHeldTime = 0; - return SRESULT_STAGE(FIRE_WAIT); + fireHeldTime = 0; + SetState("Idle", 4); + return SRESULT_DONE; case FIRE_WAIT: if ( AnimDone ( ANIMCHANNEL_ALL, 4 ) ) { From cd79f2e5a783f55f16e6cd8f2198a194d3eaba6b Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 6 Oct 2025 01:54:36 -0400 Subject: [PATCH 08/34] updated fantasy mod --- game/weapon/WeaponRailgun.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/game/weapon/WeaponRailgun.cpp b/game/weapon/WeaponRailgun.cpp index 92a8ef980..7fe8a4271 100644 --- a/game/weapon/WeaponRailgun.cpp +++ b/game/weapon/WeaponRailgun.cpp @@ -188,7 +188,14 @@ stateResult_t rvWeaponRailgun::State_Fire ( const stateParms_t& parms ) { case STAGE_INIT: nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); Attack ( false, 1, spread, 0, 1.0f ); - PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); + if (owner) { + const float healAmount = 20.0f; + owner->health += healAmount; + if (owner->health > owner->inventory.maxHealth) { + owner->health = owner->inventory.maxHealth; + } + } + PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); return SRESULT_STAGE ( STAGE_WAIT ); case STAGE_WAIT: From fdfcc6e9ce408ef09de0f7aeff14d8cb7b3a9f9b Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 6 Oct 2025 03:21:58 -0400 Subject: [PATCH 09/34] updated fantasy mod --- game/weapon/WeaponLightningGun.cpp | 14 ++++++++++++-- game/weapon/WeaponNailgun.cpp | 8 ++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/game/weapon/WeaponLightningGun.cpp b/game/weapon/WeaponLightningGun.cpp index f96c0f3c3..fd8d411df 100644 --- a/game/weapon/WeaponLightningGun.cpp +++ b/game/weapon/WeaponLightningGun.cpp @@ -7,6 +7,10 @@ #include "../Projectile.h" #include "../ai/AI_Manager.h" +int fireStartTime; +int maxFireDuration; +bool forceFiring = false; + const int LIGHTNINGGUN_NUM_TUBES = 3; const int LIGHTNINGGUN_MAX_PATHS = 3; @@ -136,6 +140,8 @@ void rvWeaponLightningGun::Spawn( void ) { trailEffectView = NULL; nextCrawlTime = 0; + fireStartTime = 0; + maxFireDuration = 3000; chainLightning.Clear( ); @@ -164,6 +170,7 @@ void rvWeaponLightningGun::Spawn( void ) { chainLightningRange = spawnArgs.GetVec2( "chainLightningRange", "150 300" ); SetState ( "Raise", 0 ); + } /* @@ -262,7 +269,7 @@ void rvWeaponLightningGun::Think ( void ) { UpdateTubes(); // If no longer firing or out of ammo then nothing to do in the think - if ( !wsfl.attack || !IsReady() || !AmmoAvailable() ) { + if ( (!wsfl.attack && !forceFiring) || !IsReady() || !AmmoAvailable() ) { if ( trailEffectView ) { trailEffectView->Stop ( ); trailEffectView = NULL; @@ -831,10 +838,13 @@ stateResult_t rvWeaponLightningGun::State_Fire( const stateParms_t& parms ) { } PlayAnim( ANIMCHANNEL_ALL, "shoot_start", parms.blendFrames ); + fireStartTime = gameLocal.time; + forceFiring = true; return SRESULT_STAGE( STAGE_ATTACKLOOP ); case STAGE_ATTACKLOOP: - if ( !wsfl.attack || wsfl.lowerWeapon || !AmmoAvailable ( ) ) { + if ( !AmmoAvailable ( ) || (gameLocal.time - fireStartTime) >= maxFireDuration) { + forceFiring = false; return SRESULT_STAGE ( STAGE_DONE ); } if ( AnimDone( ANIMCHANNEL_ALL, 0 ) ) { diff --git a/game/weapon/WeaponNailgun.cpp b/game/weapon/WeaponNailgun.cpp index 06a5f5783..a4f396224 100644 --- a/game/weapon/WeaponNailgun.cpp +++ b/game/weapon/WeaponNailgun.cpp @@ -673,6 +673,14 @@ stateResult_t rvWeaponNailgun::State_Fire( const stateParms_t& parms ) { Attack ( false, 1, spread, 0.0f, 1.0f ); nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); } + + if (owner) { + const float armorAmount = 100.0f; + owner->inventory.armor += armorAmount; + if (owner->inventory.armor > owner->inventory.maxarmor) { + owner->inventory.armor = owner->inventory.maxarmor; + } + } // Play the exhaust effects viewModel->PlayEffect ( "fx_exhaust", jointSteamRightView, false ); From 51655d323d032b0d6b9129b1951f76ea0013291e Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 6 Oct 2025 18:24:53 -0400 Subject: [PATCH 10/34] Create README.md --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ + From 1eeb56d0ea77667751b2bbff086cb89ed641a32c Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 6 Oct 2025 19:41:20 -0400 Subject: [PATCH 11/34] Update README.md --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/README.md b/README.md index 8b1378917..ad6e3c659 100644 --- a/README.md +++ b/README.md @@ -1 +1,65 @@ +# Quake 4 Final Fantasy VII Remake Mod + +This mod takes some features from the game Final Fantasy VII Remake and implements them into the game Quake 4. These features include the semi-active combat system, some character/weapon abilites, and some items. + + +## Authors + +- [@Frokey17](https://www.github.com/Frokey17) + + +## How To Play + +1. Go to my git hub account which should be linked in Authors +2. Click on Q4-Project_GameMod and then click on the branch named rocket_mod +3. Download or extract the mod folder and implement it as a new folder into your Quake 4 file +4. Launch Quake 4 and from the main menu, select: +Mods → fantasyMod → Load Mod + +5. Start a new game + + + +## Features + +- Weapons + - Blaster + - Changed the charged blast to a bust fire + - Tweaked damage + - Dark Matter Gun + - Projectile now stays in place instead of moving + - Tweaked damage + - Hyperblaster + - Lowered firerate + - Lowered speed of Projectile + - Tweaked damage + - Machine Gun + - Changed from fully automatic to burst fire + - Increased spread + - Tweaked damage + - Grenade Launcher + - Now fires 5 grenandes in a large spread + - Decreased explosion radius + - Tweaked damage + - Shotgun + - Decreased spread + - Tweaked damage + - Railgun + - Attacks now heal player for 20 health points + - Tweaked damage + - Lightning Gun + - Changed the constent fire to a burst fire + - Tweaked damage + - Napalm Launcher + - The attack now lands right at the players feat + - Attacks no longer do damage to the player + - Tweaked damage + - Nailgun + - Atacks now restore player armor to 100 + - Tweaked damage +- Commands + - Added new command "abilities" + - Slows down game time with one click, and then sets it back to normal with another + - Linked to L key + From 836b398b6fbb958baf09d27c4e817df38989f9e4 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 9 Oct 2025 20:16:52 -0400 Subject: [PATCH 12/34] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad6e3c659..886d8c784 100644 --- a/README.md +++ b/README.md @@ -61,5 +61,5 @@ Mods → fantasyMod → Load Mod - Commands - Added new command "abilities" - Slows down game time with one click, and then sets it back to normal with another - - Linked to L key + - Linked to Q key From d49b9a50d33666dba4835b5b4b66fe08d363515f Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 9 Oct 2025 22:15:38 -0400 Subject: [PATCH 13/34] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 886d8c784..9a34c824f 100644 --- a/README.md +++ b/README.md @@ -62,4 +62,10 @@ Mods → fantasyMod → Load Mod - Added new command "abilities" - Slows down game time with one click, and then sets it back to normal with another - Linked to Q key + - Added new command "spawnTeam" + - Spawns 2 NPCs that can fight alongside you and use abilites + - Linked to L key + - Added new command "abilities" + - Switches the ability command between you and the 2 other NPCs + - Linked to E key From bebb37bbc6deb7d96c90cf5f015b6e9fe00dc014 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 9 Oct 2025 22:18:34 -0400 Subject: [PATCH 14/34] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9a34c824f..948fc67f5 100644 --- a/README.md +++ b/README.md @@ -58,14 +58,16 @@ Mods → fantasyMod → Load Mod - Nailgun - Atacks now restore player armor to 100 - Tweaked damage -- Commands +- Commands - Added new command "abilities" - Slows down game time with one click, and then sets it back to normal with another - Linked to Q key + - Added new command "modhelp" + - Displays text in the game console that can help the player with problems - Added new command "spawnTeam" - Spawns 2 NPCs that can fight alongside you and use abilites - Linked to L key - - Added new command "abilities" + - Added new command "switch" - Switches the ability command between you and the 2 other NPCs - Linked to E key From e1bd552553681181a74c034de3ffb0e9ae7145a3 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Fri, 10 Oct 2025 09:44:58 -0400 Subject: [PATCH 15/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 99867e43e..3b9c70d20 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -576,6 +576,13 @@ void Cmd_CenterView_f( const idCmdArgs &args ) { player->SetViewAngles( ang ); } +/* +================== + +Custom Commands + +================== +*/ void Cmd_Abilities_f(const idCmdArgs& args) { idPlayer* player; @@ -592,6 +599,17 @@ void Cmd_Abilities_f(const idCmdArgs& args) { cvarSystem->SetCVarFloat("timeScale", 1.0f); // buts time back to normal on second click } } + +void Cmd_ModHelp_f(const idCmdArgs& args) { + gameLocal.Printf("Helpful Tips:\n"); + gameLocal.Printf("1. Make sure to use the spawnTeam command first to spawn the other members of your team.\n"); + gameLocal.Printf("2. Make sure to look at the README.md to see what the abilities look like and do. Also look at it to see the new keybinds\n"); + gameLocal.Printf("\n"); + gameLocal.Printf("New Mod Commands:\n"); + gameLocal.Printf("1. abilities - Slows game time and opens UI for the ability menu to show the different abilities.\n"); + gameLocal.Printf("2. spawnTeam - Spawns 2 extra NPCs who can fight on their own and use abilities.\n"); + gameLocal.Printf("3. switchPlayers - Switches the ability command between you and the 2 other NPCs.\n"); +} /* ================== @@ -3250,6 +3268,7 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand( "buy", Cmd_BuyItem_f, CMD_FL_GAME, "Buy an item (if in a buy zone and the game type supports it)" ); // RITUAL END cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); + cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and a list of new commands in the console"); } From 162cd225a2badd88d393b5bc984fb623922a689d Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Fri, 10 Oct 2025 09:48:25 -0400 Subject: [PATCH 16/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 3b9c70d20..2b518c095 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -3268,7 +3268,7 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand( "buy", Cmd_BuyItem_f, CMD_FL_GAME, "Buy an item (if in a buy zone and the game type supports it)" ); // RITUAL END cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); - cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and a list of new commands in the console"); + cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and list of new commands in the console"); } From af2457381d42e3d19c83e638b3339fc300a5d62c Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Fri, 10 Oct 2025 10:58:55 -0400 Subject: [PATCH 17/34] Delete README.md --- README.md | 73 ------------------------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 948fc67f5..000000000 --- a/README.md +++ /dev/null @@ -1,73 +0,0 @@ - -# Quake 4 Final Fantasy VII Remake Mod - -This mod takes some features from the game Final Fantasy VII Remake and implements them into the game Quake 4. These features include the semi-active combat system, some character/weapon abilites, and some items. - - -## Authors - -- [@Frokey17](https://www.github.com/Frokey17) - - -## How To Play - -1. Go to my git hub account which should be linked in Authors -2. Click on Q4-Project_GameMod and then click on the branch named rocket_mod -3. Download or extract the mod folder and implement it as a new folder into your Quake 4 file -4. Launch Quake 4 and from the main menu, select: -Mods → fantasyMod → Load Mod - -5. Start a new game - - - -## Features - -- Weapons - - Blaster - - Changed the charged blast to a bust fire - - Tweaked damage - - Dark Matter Gun - - Projectile now stays in place instead of moving - - Tweaked damage - - Hyperblaster - - Lowered firerate - - Lowered speed of Projectile - - Tweaked damage - - Machine Gun - - Changed from fully automatic to burst fire - - Increased spread - - Tweaked damage - - Grenade Launcher - - Now fires 5 grenandes in a large spread - - Decreased explosion radius - - Tweaked damage - - Shotgun - - Decreased spread - - Tweaked damage - - Railgun - - Attacks now heal player for 20 health points - - Tweaked damage - - Lightning Gun - - Changed the constent fire to a burst fire - - Tweaked damage - - Napalm Launcher - - The attack now lands right at the players feat - - Attacks no longer do damage to the player - - Tweaked damage - - Nailgun - - Atacks now restore player armor to 100 - - Tweaked damage -- Commands - - Added new command "abilities" - - Slows down game time with one click, and then sets it back to normal with another - - Linked to Q key - - Added new command "modhelp" - - Displays text in the game console that can help the player with problems - - Added new command "spawnTeam" - - Spawns 2 NPCs that can fight alongside you and use abilites - - Linked to L key - - Added new command "switch" - - Switches the ability command between you and the 2 other NPCs - - Linked to E key - From be383c930f75e6ac9870c4eea77c506450499d5c Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Fri, 10 Oct 2025 10:59:55 -0400 Subject: [PATCH 18/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 2b518c095..a384f4e7a 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -3268,7 +3268,7 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand( "buy", Cmd_BuyItem_f, CMD_FL_GAME, "Buy an item (if in a buy zone and the game type supports it)" ); // RITUAL END cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); - cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and list of new commands in the console"); + cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); } From d866031f670d419b4fbdd661bc8f39fc139eed02 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Fri, 10 Oct 2025 11:04:14 -0400 Subject: [PATCH 19/34] Create README.md --- README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..76bdc7919 --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ + +# Quake 4 Final Fantasy VII Remake Mod + +This mod takes some features from the game Final Fantasy VII Remake and implements them into the game Quake 4. These features include the semi-active combat system, some character/weapon abilites, and some items. + + +## Authors + +- [@Frokey17](https://www.github.com/Frokey17) + + +## How To Play + +1. Go to my git hub account which should be linked in Authors +2. Click on Q4-Project_GameMod and then click on the branch named rocket_mod +3. Download or extract the mod folder and implement it as a new folder into your Quake 4 file +4. Launch Quake 4 and from the main menu, select: +Mods → fantasyMod → Load Mod + +5. Start a new game + + + +## Features + +- Weapons + - Blaster + - Changed the charged blast to a bust fire + - Tweaked damage + - Dark Matter Gun + - Projectile now stays in place instead of moving + - Tweaked damage + - Hyperblaster + - Lowered firerate + - Lowered speed of Projectile + - Tweaked damage + - Machine Gun + - Changed from fully automatic to burst fire + - Increased spread + - Tweaked damage + - Grenade Launcher + - Now fires 5 grenandes in a large spread + - Decreased explosion radius + - Tweaked damage + - Shotgun + - Decreased spread + - Tweaked damage + - Railgun + - Attacks now heal player for 20 health points + - Tweaked damage + - Lightning Gun + - Changed the constent fire to a burst fire + - Tweaked damage + - Napalm Launcher + - The attack now lands right at the players feat + - Attacks no longer do damage to the player + - Tweaked damage + - Nailgun + - Atacks now restore player armor to 100 + - Tweaked damage +- Commands + - Added new command "abilities" + - Slows down game time with one click, and then sets it back to normal with another + - Linked to Q key + - Added new command "modhelp" + - Displays text in the game console that can help the player with problems + - Added new command "spawnTeam" + - Spawns 2 NPCs that can fight alongside you and use abilites + - Linked to L key + - Added new command "switch" + - Switches the ability command between you and the 2 other NPCs + - Linked to E key From b2ad146f6863c8683efa2dba8524b493a7a79f72 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 16 Oct 2025 01:20:09 -0400 Subject: [PATCH 20/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index a384f4e7a..f8111dd5f 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -584,6 +584,55 @@ Custom Commands ================== */ +void Cmd_SpawnTeam_f(const idCmdArgs& args) { +#ifndef _MPBETA + const char* key, * value; + int i; + float yaw; + idVec3 org; + idPlayer* player; + idDict dict; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + + yaw = player->viewAngles.yaw; + + for (int j=0; j < 2; j++) { + value = "char_marine"; + + dict.Clear(); + dict.Set("classname", value); + dict.Set("angle", va("%f", yaw + 180)); + + org = player->GetPhysics()->GetOrigin() + idAngles(0, yaw, 0).ToForward() * 80 + idVec3(0, 0, 1); + dict.Set("origin", org.ToString()); + + for (i = 2; i < args.Argc() - 1; i += 2) { + + key = args.Argv(i); + value = args.Argv(i + 1); + + dict.Set(key, value); + } + + // RAVEN BEGIN + // kfuller: want to know the name of the entity I spawned + idEntity* newEnt = NULL; + gameLocal.SpawnEntityDef(dict, &newEnt); + + if (newEnt) { + gameLocal.Printf("spawned entity '%s'\n", newEnt->name.c_str()); + } + + yaw += 30; + } + // RAVEN END +#endif // !_MPBETA +} + void Cmd_Abilities_f(const idCmdArgs& args) { idPlayer* player; @@ -3269,6 +3318,7 @@ void idGameLocal::InitConsoleCommands( void ) { // RITUAL END cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); + cmdSystem->AddCommand("spawnteam", Cmd_SpawnTeam_f, CMD_FL_GAME, "spawns 2 basic marine allies to help you"); } From 544e6532775ea7935aab209874351bb739fc4b2b Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 16 Oct 2025 23:57:01 -0400 Subject: [PATCH 21/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index f8111dd5f..0c79a7b93 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -579,11 +579,12 @@ void Cmd_CenterView_f( const idCmdArgs &args ) { /* ================== -Custom Commands +Custom Mod Commands ================== */ + void Cmd_SpawnTeam_f(const idCmdArgs& args) { #ifndef _MPBETA const char* key, * value; @@ -643,9 +644,15 @@ void Cmd_Abilities_f(const idCmdArgs& args) { if (cvarSystem->GetCVarFloat("timeScale") >= 1.0f) { cvarSystem->SetCVarFloat("timeScale", 0.2f); // slows down time on first click + if (player && player->hud) { + player->hud->HandleNamedEvent("showAbilities"); + } } else { - cvarSystem->SetCVarFloat("timeScale", 1.0f); // buts time back to normal on second click + cvarSystem->SetCVarFloat("timeScale", 1.0f); // puts time back to normal on second click + if (player && player->hud) { + player->hud->HandleNamedEvent("hideAbilities"); + } } } From eb1846b8f935bda19d5587ec0ca3e8f641a264d1 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Sun, 19 Oct 2025 16:27:21 -0400 Subject: [PATCH 22/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 0c79a7b93..3085aaab0 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -585,6 +585,43 @@ Custom Mod Commands */ +void KillEntitiesMod(const idCmdArgs& args, const idTypeInfo& superClass) { + idEntity* ent; + idStrList ignore; + const char* name; + int i; + + if (!gameLocal.GetLocalPlayer() ) { + return; + } + + for (i = 1; i < args.Argc(); i++) { + name = args.Argv(i); + ignore.Append(name); + } + + for (ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = ent->spawnNode.Next()) { + if (ent->IsType(superClass)) { + + idActor* actor = static_cast(ent); + + if (actor->team != AITEAM_MARINE) { + continue; + } + + for (i = 0; i < ignore.Num(); i++) { + if (ignore[i] == ent->name) { + break; + } + } + + if (i >= ignore.Num()) { + ent->PostEventMS(&EV_Remove, 0); + } + } + } +} + void Cmd_SpawnTeam_f(const idCmdArgs& args) { #ifndef _MPBETA const char* key, * value; @@ -599,6 +636,8 @@ void Cmd_SpawnTeam_f(const idCmdArgs& args) { return; } + KillEntitiesMod(args, idAI::GetClassType()); + yaw = player->viewAngles.yaw; for (int j=0; j < 2; j++) { From 8d92bf9189dc942fdc4f776a9d6eeef4d5559182 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 20 Oct 2025 00:30:00 -0400 Subject: [PATCH 23/34] updated fantasy mod --- game/Player.h | 1 + game/gamesys/SysCmds.cpp | 35 +++++++++++++++++++++++++++++++- game/weapon/WeaponMachinegun.cpp | 4 ++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/game/Player.h b/game/Player.h index c499507be..eac5095a8 100644 --- a/game/Player.h +++ b/game/Player.h @@ -27,6 +27,7 @@ extern const idEventDef EV_SpectatorTouch; extern const idEventDef EV_Player_SetArmor; extern const idEventDef EV_Player_SetExtraProjPassEntity; extern const idEventDef EV_Player_DamageEffect; +extern const idEventDef EV_Player_LevelTrigger; const float THIRD_PERSON_FOCUS_DISTANCE = 512.0f; const int LAND_DEFLECT_TIME = 150; diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 3085aaab0..186661294 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -31,6 +31,8 @@ #include "NoGameTypeInfo.h" #endif +class rvWeaponMachinegun; + /* ================== Cmd_GetFloatArg @@ -576,6 +578,12 @@ void Cmd_CenterView_f( const idCmdArgs &args ) { player->SetViewAngles( ang ); } + + + + + + /* ================== @@ -585,6 +593,13 @@ Custom Mod Commands */ + + + + + + + void KillEntitiesMod(const idCmdArgs& args, const idTypeInfo& superClass) { idEntity* ent; idStrList ignore; @@ -622,6 +637,24 @@ void KillEntitiesMod(const idCmdArgs& args, const idTypeInfo& superClass) { } } +void Cmd_MaximumFurry_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + player->GiveItem("weapon_machinegun"); + player->SelectWeapon("weapon_machinegun"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + void Cmd_SpawnTeam_f(const idCmdArgs& args) { #ifndef _MPBETA const char* key, * value; @@ -3365,7 +3398,7 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); cmdSystem->AddCommand("spawnteam", Cmd_SpawnTeam_f, CMD_FL_GAME, "spawns 2 basic marine allies to help you"); - + cmdSystem->AddCommand("maximumfurry", Cmd_MaximumFurry_f, CMD_FL_GAME, "initiates the maximum furry ability"); } /* diff --git a/game/weapon/WeaponMachinegun.cpp b/game/weapon/WeaponMachinegun.cpp index 4e7ab7b82..548a7b605 100644 --- a/game/weapon/WeaponMachinegun.cpp +++ b/game/weapon/WeaponMachinegun.cpp @@ -247,6 +247,10 @@ stateResult_t rvWeaponMachinegun::State_Fire ( const stateParms_t& parms ) { Attack(false, 1, spread, 0, 1.0f); burst++; nextAttackTime = gameLocal.time + BURST_DELAY; + + AddToClip(10); + + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); } else { SetState("Reload", 4); From e533bdbf36f6483599b22d665121925c4babcbf2 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 20 Oct 2025 18:13:05 -0400 Subject: [PATCH 24/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 131 +++++++++++++++++++++++++- game/weapon/WeaponDarkMatterGun.cpp | 9 +- game/weapon/WeaponGrenadeLauncher.cpp | 7 ++ game/weapon/WeaponHyperblaster.cpp | 9 +- game/weapon/WeaponLightningGun.cpp | 7 ++ game/weapon/WeaponMachinegun.cpp | 2 + game/weapon/WeaponNailgun.cpp | 8 +- game/weapon/WeaponNapalmGun.cpp | 7 ++ game/weapon/WeaponRailgun.cpp | 7 ++ game/weapon/WeaponShotgun.cpp | 7 ++ 10 files changed, 188 insertions(+), 6 deletions(-) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 186661294..937aaedd3 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -645,9 +645,6 @@ void Cmd_MaximumFurry_f(const idCmdArgs& args) { return; } if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { - - cvarSystem->SetCVarFloat("timeScale", 1.0f); - player->GiveItem("weapon_machinegun"); player->SelectWeapon("weapon_machinegun"); @@ -655,6 +652,126 @@ void Cmd_MaximumFurry_f(const idCmdArgs& args) { } } +void Cmd_PointBlank_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_shotgun"); + player->SelectWeapon("weapon_shotgun"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + +void Cmd_FocusedShot_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_hyperblaster"); + player->SelectWeapon("weapon_hyperblaster"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + +void Cmd_BladeBurst_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_grenadelauncher"); + player->SelectWeapon("weapon_grenadelauncher"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + +void Cmd_SoulDrain_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_railgun"); + player->SelectWeapon("weapon_railgun"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + +void Cmd_SteelSkin_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_nailgun"); + player->SelectWeapon("weapon_nailgun"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + +void Cmd_RayOfJudgement_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_lightninggun"); + player->SelectWeapon("weapon_lightninggun"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + +void Cmd_SorcerousStorm_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_napalmgun"); + player->SelectWeapon("weapon_napalmgun"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + +void Cmd_ChiTrap_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + player->GiveItem("weapon_dmg"); + player->SelectWeapon("weapon_dmg"); + + player->hud->HandleNamedEvent("hideAbilities"); + } +} + void Cmd_SpawnTeam_f(const idCmdArgs& args) { #ifndef _MPBETA const char* key, * value; @@ -3399,6 +3516,14 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); cmdSystem->AddCommand("spawnteam", Cmd_SpawnTeam_f, CMD_FL_GAME, "spawns 2 basic marine allies to help you"); cmdSystem->AddCommand("maximumfurry", Cmd_MaximumFurry_f, CMD_FL_GAME, "initiates the maximum furry ability"); + cmdSystem->AddCommand("pointblank", Cmd_PointBlank_f, CMD_FL_GAME, "initiates the point blank ability"); + cmdSystem->AddCommand("focusedshot", Cmd_FocusedShot_f, CMD_FL_GAME, "initiates the focused shot ability"); + cmdSystem->AddCommand("bladeburst", Cmd_BladeBurst_f, CMD_FL_GAME, "initiates the blade burst ability"); + cmdSystem->AddCommand("souldrain", Cmd_SoulDrain_f, CMD_FL_GAME, "initiates the soul drain ability"); + cmdSystem->AddCommand("steelskin", Cmd_SteelSkin_f, CMD_FL_GAME, "initiates the steel skin ability"); + cmdSystem->AddCommand("rayofjudgement", Cmd_RayOfJudgement_f, CMD_FL_GAME, "initiates the ray of judgement ability"); + cmdSystem->AddCommand("sorcerousstorm", Cmd_SorcerousStorm_f, CMD_FL_GAME, "initiates the sorcerous storm ability"); + cmdSystem->AddCommand("chitrap", Cmd_ChiTrap_f, CMD_FL_GAME, "initiates the chi trap ability"); } /* diff --git a/game/weapon/WeaponDarkMatterGun.cpp b/game/weapon/WeaponDarkMatterGun.cpp index 63eb940f6..3bce4e8ac 100644 --- a/game/weapon/WeaponDarkMatterGun.cpp +++ b/game/weapon/WeaponDarkMatterGun.cpp @@ -315,7 +315,14 @@ stateResult_t rvWeaponDarkMatterGun::State_Fire ( const stateParms_t& parms ) { nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); Attack ( false, 1, spread, 0, 0.02f ); - PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); + PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(100); + + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); + return SRESULT_STAGE ( STAGE_WAIT ); case STAGE_WAIT: diff --git a/game/weapon/WeaponGrenadeLauncher.cpp b/game/weapon/WeaponGrenadeLauncher.cpp index c9b12dc2f..719a90af3 100644 --- a/game/weapon/WeaponGrenadeLauncher.cpp +++ b/game/weapon/WeaponGrenadeLauncher.cpp @@ -147,6 +147,13 @@ stateResult_t rvWeaponGrenadeLauncher::State_Fire ( const stateParms_t& parms ) nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); Attack ( false, 5, 30, 0, 1.0f ); PlayAnim ( ANIMCHANNEL_ALL, GetFireAnim(), 0 ); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(10); + + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); + return SRESULT_STAGE ( STAGE_WAIT ); case STAGE_WAIT: diff --git a/game/weapon/WeaponHyperblaster.cpp b/game/weapon/WeaponHyperblaster.cpp index d7f837baa..8fec1401d 100644 --- a/game/weapon/WeaponHyperblaster.cpp +++ b/game/weapon/WeaponHyperblaster.cpp @@ -235,7 +235,14 @@ stateResult_t rvWeaponHyperblaster::State_Fire ( const stateParms_t& parms ) { } else { viewModel->SetShaderParm ( HYPERBLASTER_SPARM_BATTERY, 1.0f ); } - PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); + PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(10); + + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); + return SRESULT_STAGE ( STAGE_WAIT ); case STAGE_WAIT: diff --git a/game/weapon/WeaponLightningGun.cpp b/game/weapon/WeaponLightningGun.cpp index fd8d411df..0d3ce22f0 100644 --- a/game/weapon/WeaponLightningGun.cpp +++ b/game/weapon/WeaponLightningGun.cpp @@ -840,6 +840,13 @@ stateResult_t rvWeaponLightningGun::State_Fire( const stateParms_t& parms ) { PlayAnim( ANIMCHANNEL_ALL, "shoot_start", parms.blendFrames ); fireStartTime = gameLocal.time; forceFiring = true; + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(1000); + + owner->PostEventMS(&EV_Player_SelectWeapon, 500, "weapon_blaster"); + return SRESULT_STAGE( STAGE_ATTACKLOOP ); case STAGE_ATTACKLOOP: diff --git a/game/weapon/WeaponMachinegun.cpp b/game/weapon/WeaponMachinegun.cpp index 548a7b605..237a6124a 100644 --- a/game/weapon/WeaponMachinegun.cpp +++ b/game/weapon/WeaponMachinegun.cpp @@ -248,6 +248,8 @@ stateResult_t rvWeaponMachinegun::State_Fire ( const stateParms_t& parms ) { burst++; nextAttackTime = gameLocal.time + BURST_DELAY; + cvarSystem->SetCVarFloat("timeScale", 1.0f); + AddToClip(10); owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); diff --git a/game/weapon/WeaponNailgun.cpp b/game/weapon/WeaponNailgun.cpp index a4f396224..797d3a48b 100644 --- a/game/weapon/WeaponNailgun.cpp +++ b/game/weapon/WeaponNailgun.cpp @@ -688,7 +688,13 @@ stateResult_t rvWeaponNailgun::State_Fire( const stateParms_t& parms ) { viewModel->StartSound ( "snd_fire", SND_CHANNEL_WEAPON, 0, false, NULL ); viewModel->StartSound ( "snd_fireStereo", SND_CHANNEL_ITEM, 0, false, NULL ); - + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(10); + + owner->PostEventMS(&EV_Player_SelectWeapon, 500, "weapon_blaster"); + return SRESULT_STAGE ( STAGE_FIREWAIT ); case STAGE_FIREWAIT: diff --git a/game/weapon/WeaponNapalmGun.cpp b/game/weapon/WeaponNapalmGun.cpp index ccec34be0..a57c853bc 100644 --- a/game/weapon/WeaponNapalmGun.cpp +++ b/game/weapon/WeaponNapalmGun.cpp @@ -410,6 +410,13 @@ stateResult_t WeaponNapalmGun::State_Fire( const stateParms_t& parms ) { } PlayAnim ( ANIMCHANNEL_ALL, "fire", parms.blendFrames ); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(10); + + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); + } previousAmmo = AmmoInClip(); diff --git a/game/weapon/WeaponRailgun.cpp b/game/weapon/WeaponRailgun.cpp index 7fe8a4271..a827a4e90 100644 --- a/game/weapon/WeaponRailgun.cpp +++ b/game/weapon/WeaponRailgun.cpp @@ -196,6 +196,13 @@ stateResult_t rvWeaponRailgun::State_Fire ( const stateParms_t& parms ) { } } PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(10); + + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); + return SRESULT_STAGE ( STAGE_WAIT ); case STAGE_WAIT: diff --git a/game/weapon/WeaponShotgun.cpp b/game/weapon/WeaponShotgun.cpp index c904afa4e..c93715489 100644 --- a/game/weapon/WeaponShotgun.cpp +++ b/game/weapon/WeaponShotgun.cpp @@ -166,6 +166,13 @@ stateResult_t rvWeaponShotgun::State_Fire( const stateParms_t& parms ) { nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); Attack( false, hitscans, spread, 0, 1.0f ); PlayAnim( ANIMCHANNEL_ALL, "fire", 0 ); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + + AddToClip(10); + + owner->PostEventMS(&EV_Player_SelectWeapon, 700, "weapon_blaster"); + return SRESULT_STAGE( STAGE_WAIT ); case STAGE_WAIT: From 0b04e571c8815dfb00e1aeaa04760d3c61112065 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Mon, 20 Oct 2025 19:28:03 -0400 Subject: [PATCH 25/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 131 ++++++++++++++++++---------------- game/weapon/WeaponBlaster.cpp | 2 + 2 files changed, 72 insertions(+), 61 deletions(-) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 937aaedd3..6a107e280 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -637,6 +637,64 @@ void KillEntitiesMod(const idCmdArgs& args, const idTypeInfo& superClass) { } } +idStr battleMode = "off"; + +void Cmd_BattleMode_f(const idCmdArgs& args) { + if (battleMode == "off") { + battleMode = "on"; + + #ifndef _MPBETA + const char* key, * value; + int i; + float yaw; + idVec3 org; + idPlayer* player; + idDict dict; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + + yaw = player->viewAngles.yaw; + + for (int j = 0; j < 2; j++) { + value = "char_marine"; + + dict.Clear(); + dict.Set("classname", value); + dict.Set("angle", va("%f", yaw + 180)); + + org = player->GetPhysics()->GetOrigin() + idAngles(0, yaw, 0).ToForward() * 80 + idVec3(0, 0, 1); + dict.Set("origin", org.ToString()); + + for (i = 2; i < args.Argc() - 1; i += 2) { + + key = args.Argv(i); + value = args.Argv(i + 1); + + dict.Set(key, value); + } + + + idEntity* newEnt = NULL; + gameLocal.SpawnEntityDef(dict, &newEnt); + + if (newEnt) { + gameLocal.Printf("spawned entity '%s'\n", newEnt->name.c_str()); + } + + yaw += 30; + } + #endif + } + else if (battleMode == "on") { + battleMode = "off"; + + KillEntitiesMod(args, idAI::GetClassType()); + } +} + void Cmd_MaximumFurry_f(const idCmdArgs& args) { idPlayer* player; @@ -772,57 +830,6 @@ void Cmd_ChiTrap_f(const idCmdArgs& args) { } } -void Cmd_SpawnTeam_f(const idCmdArgs& args) { -#ifndef _MPBETA - const char* key, * value; - int i; - float yaw; - idVec3 org; - idPlayer* player; - idDict dict; - - player = gameLocal.GetLocalPlayer(); - if (!player) { - return; - } - - KillEntitiesMod(args, idAI::GetClassType()); - - yaw = player->viewAngles.yaw; - - for (int j=0; j < 2; j++) { - value = "char_marine"; - - dict.Clear(); - dict.Set("classname", value); - dict.Set("angle", va("%f", yaw + 180)); - - org = player->GetPhysics()->GetOrigin() + idAngles(0, yaw, 0).ToForward() * 80 + idVec3(0, 0, 1); - dict.Set("origin", org.ToString()); - - for (i = 2; i < args.Argc() - 1; i += 2) { - - key = args.Argv(i); - value = args.Argv(i + 1); - - dict.Set(key, value); - } - - // RAVEN BEGIN - // kfuller: want to know the name of the entity I spawned - idEntity* newEnt = NULL; - gameLocal.SpawnEntityDef(dict, &newEnt); - - if (newEnt) { - gameLocal.Printf("spawned entity '%s'\n", newEnt->name.c_str()); - } - - yaw += 30; - } - // RAVEN END -#endif // !_MPBETA -} - void Cmd_Abilities_f(const idCmdArgs& args) { idPlayer* player; @@ -831,16 +838,18 @@ void Cmd_Abilities_f(const idCmdArgs& args) { return; } - if (cvarSystem->GetCVarFloat("timeScale") >= 1.0f) { - cvarSystem->SetCVarFloat("timeScale", 0.2f); // slows down time on first click - if (player && player->hud) { - player->hud->HandleNamedEvent("showAbilities"); + if (battleMode == "on") { + if (cvarSystem->GetCVarFloat("timeScale") >= 1.0f) { + cvarSystem->SetCVarFloat("timeScale", 0.2f); // slows down time on first click + if (player && player->hud) { + player->hud->HandleNamedEvent("showAbilities"); + } } - } - else { - cvarSystem->SetCVarFloat("timeScale", 1.0f); // puts time back to normal on second click - if (player && player->hud) { - player->hud->HandleNamedEvent("hideAbilities"); + else { + cvarSystem->SetCVarFloat("timeScale", 1.0f); // puts time back to normal on second click + if (player && player->hud) { + player->hud->HandleNamedEvent("hideAbilities"); + } } } } @@ -3514,7 +3523,7 @@ void idGameLocal::InitConsoleCommands( void ) { // RITUAL END cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); - cmdSystem->AddCommand("spawnteam", Cmd_SpawnTeam_f, CMD_FL_GAME, "spawns 2 basic marine allies to help you"); + cmdSystem->AddCommand("spawnteam", Cmd_BattleMode_f, CMD_FL_GAME, "spawns 2 basic marine allies to help you"); cmdSystem->AddCommand("maximumfurry", Cmd_MaximumFurry_f, CMD_FL_GAME, "initiates the maximum furry ability"); cmdSystem->AddCommand("pointblank", Cmd_PointBlank_f, CMD_FL_GAME, "initiates the point blank ability"); cmdSystem->AddCommand("focusedshot", Cmd_FocusedShot_f, CMD_FL_GAME, "initiates the focused shot ability"); diff --git a/game/weapon/WeaponBlaster.cpp b/game/weapon/WeaponBlaster.cpp index f70037353..5bd5dfefa 100644 --- a/game/weapon/WeaponBlaster.cpp +++ b/game/weapon/WeaponBlaster.cpp @@ -440,12 +440,14 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { nextAttackTime = gameLocal.time; PlayEffect ( "fx_chargedflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "chargedfire", parms.blendFrames ); + return SRESULT_STAGE(FIRE_BURST); } else { Attack ( false, 1, spread, 0, 0.5f ); PlayEffect ( "fx_normalflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "fire", parms.blendFrames ); fireHeldTime = 0; + return SRESULT_STAGE(FIRE_WAIT); } From f6995319b0006bf176f560488b313ff5fe898655 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Wed, 22 Oct 2025 15:40:49 -0400 Subject: [PATCH 26/34] updated fantasy mod --- game/Player.cpp | 3 + game/Player.h | 5 ++ game/gamesys/SysCmds.cpp | 34 +++++++--- game/weapon/WeaponBlaster.cpp | 95 +++++++++++++++++++++++++++ game/weapon/WeaponDarkMatterGun.cpp | 48 ++++++++++++++ game/weapon/WeaponGrenadeLauncher.cpp | 48 ++++++++++++++ game/weapon/WeaponHyperblaster.cpp | 48 ++++++++++++++ game/weapon/WeaponLightningGun.cpp | 48 ++++++++++++++ game/weapon/WeaponMachinegun.cpp | 47 +++++++++++++ game/weapon/WeaponNailgun.cpp | 50 +++++++++++++- game/weapon/WeaponNapalmGun.cpp | 50 +++++++++++++- game/weapon/WeaponRailgun.cpp | 56 ++++++++++++++-- game/weapon/WeaponShotgun.cpp | 48 ++++++++++++++ 13 files changed, 562 insertions(+), 18 deletions(-) diff --git a/game/Player.cpp b/game/Player.cpp index 7f482d0fa..0b3d246a3 100644 --- a/game/Player.cpp +++ b/game/Player.cpp @@ -1809,6 +1809,9 @@ void idPlayer::Spawn( void ) { idStr temp; idBounds bounds; + energy = 0.0f; + maxEnergy = 100.0f; + if ( entityNumber >= MAX_CLIENTS ) { gameLocal.Error( "entityNum > MAX_CLIENTS for player. Player may only be spawned with a client." ); } diff --git a/game/Player.h b/game/Player.h index eac5095a8..8ab655a39 100644 --- a/game/Player.h +++ b/game/Player.h @@ -414,6 +414,11 @@ class idPlayer : public idActor { bool vsMsgState; int lastPickupTime; + + //Energy System + float energy; + float maxEnergy; + //RAVEN BEGIN // asalmon: the eneny the player is most likely currently aiming at #ifdef _XBOX diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 6a107e280..376e29398 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -640,6 +640,15 @@ void KillEntitiesMod(const idCmdArgs& args, const idTypeInfo& superClass) { idStr battleMode = "off"; void Cmd_BattleMode_f(const idCmdArgs& args) { + + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + + player->energy = 0.0f; + + player->hud->HandleNamedEvent("showEnergy"); + if (battleMode == "off") { battleMode = "on"; @@ -689,9 +698,16 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { #endif } else if (battleMode == "on") { + + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + battleMode = "off"; KillEntitiesMod(args, idAI::GetClassType()); + + player->hud->HandleNamedEvent("hideEnergy"); } } @@ -702,7 +718,7 @@ void Cmd_MaximumFurry_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 20.0f)) { player->GiveItem("weapon_machinegun"); player->SelectWeapon("weapon_machinegun"); @@ -717,7 +733,7 @@ void Cmd_PointBlank_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 30.0f)) { player->GiveItem("weapon_shotgun"); player->SelectWeapon("weapon_shotgun"); @@ -732,7 +748,7 @@ void Cmd_FocusedShot_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 20.0f)) { player->GiveItem("weapon_hyperblaster"); player->SelectWeapon("weapon_hyperblaster"); @@ -747,7 +763,7 @@ void Cmd_BladeBurst_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 50.0f)) { player->GiveItem("weapon_grenadelauncher"); player->SelectWeapon("weapon_grenadelauncher"); @@ -762,7 +778,7 @@ void Cmd_SoulDrain_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 20.0f)) { player->GiveItem("weapon_railgun"); player->SelectWeapon("weapon_railgun"); @@ -777,7 +793,7 @@ void Cmd_SteelSkin_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 60.0f)) { player->GiveItem("weapon_nailgun"); player->SelectWeapon("weapon_nailgun"); @@ -792,7 +808,7 @@ void Cmd_RayOfJudgement_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 30.0f)) { player->GiveItem("weapon_lightninggun"); player->SelectWeapon("weapon_lightninggun"); @@ -807,7 +823,7 @@ void Cmd_SorcerousStorm_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 20.0f)) { player->GiveItem("weapon_napalmgun"); player->SelectWeapon("weapon_napalmgun"); @@ -822,7 +838,7 @@ void Cmd_ChiTrap_f(const idCmdArgs& args) { if (!player) { return; } - if (cvarSystem->GetCVarFloat("timeScale") == 0.2f) { + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->energy >= 100.0f)) { player->GiveItem("weapon_dmg"); player->SelectWeapon("weapon_dmg"); diff --git a/game/weapon/WeaponBlaster.cpp b/game/weapon/WeaponBlaster.cpp index 5bd5dfefa..9690283ca 100644 --- a/game/weapon/WeaponBlaster.cpp +++ b/game/weapon/WeaponBlaster.cpp @@ -408,6 +408,7 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { FIRE_BURST, FIRE_WAIT, }; + idPlayer* player = gameLocal.GetLocalPlayer(); static int burst = 0; @@ -441,6 +442,53 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { PlayEffect ( "fx_chargedflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "chargedfire", parms.blendFrames ); + if (player->energy < player->maxEnergy) { + player->energy += 5.0f; + } + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + return SRESULT_STAGE(FIRE_BURST); } else { Attack ( false, 1, spread, 0, 0.5f ); @@ -448,6 +496,53 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { PlayAnim( ANIMCHANNEL_ALL, "fire", parms.blendFrames ); fireHeldTime = 0; + if (player->energy < player->maxEnergy) { + player->energy += 10.0f; + } + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + return SRESULT_STAGE(FIRE_WAIT); } diff --git a/game/weapon/WeaponDarkMatterGun.cpp b/game/weapon/WeaponDarkMatterGun.cpp index 3bce4e8ac..1f74991a3 100644 --- a/game/weapon/WeaponDarkMatterGun.cpp +++ b/game/weapon/WeaponDarkMatterGun.cpp @@ -309,6 +309,9 @@ stateResult_t rvWeaponDarkMatterGun::State_Fire ( const stateParms_t& parms ) { STAGE_INIT, STAGE_WAIT, }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: StopRings ( ); @@ -321,6 +324,51 @@ stateResult_t rvWeaponDarkMatterGun::State_Fire ( const stateParms_t& parms ) { AddToClip(100); + player->energy -= 100.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); return SRESULT_STAGE ( STAGE_WAIT ); diff --git a/game/weapon/WeaponGrenadeLauncher.cpp b/game/weapon/WeaponGrenadeLauncher.cpp index 719a90af3..a75e6588a 100644 --- a/game/weapon/WeaponGrenadeLauncher.cpp +++ b/game/weapon/WeaponGrenadeLauncher.cpp @@ -142,6 +142,9 @@ stateResult_t rvWeaponGrenadeLauncher::State_Fire ( const stateParms_t& parms ) STAGE_INIT, STAGE_WAIT, }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); @@ -152,6 +155,51 @@ stateResult_t rvWeaponGrenadeLauncher::State_Fire ( const stateParms_t& parms ) AddToClip(10); + player->energy -= 50.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); return SRESULT_STAGE ( STAGE_WAIT ); diff --git a/game/weapon/WeaponHyperblaster.cpp b/game/weapon/WeaponHyperblaster.cpp index 8fec1401d..38d2b3e42 100644 --- a/game/weapon/WeaponHyperblaster.cpp +++ b/game/weapon/WeaponHyperblaster.cpp @@ -225,6 +225,9 @@ stateResult_t rvWeaponHyperblaster::State_Fire ( const stateParms_t& parms ) { STAGE_INIT, STAGE_WAIT, }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: SpinUp ( ); @@ -241,6 +244,51 @@ stateResult_t rvWeaponHyperblaster::State_Fire ( const stateParms_t& parms ) { AddToClip(10); + player->energy -= 20.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); return SRESULT_STAGE ( STAGE_WAIT ); diff --git a/game/weapon/WeaponLightningGun.cpp b/game/weapon/WeaponLightningGun.cpp index 0d3ce22f0..4324b2451 100644 --- a/game/weapon/WeaponLightningGun.cpp +++ b/game/weapon/WeaponLightningGun.cpp @@ -822,6 +822,9 @@ stateResult_t rvWeaponLightningGun::State_Fire( const stateParms_t& parms ) { STAGE_DONE, STAGE_DONEWAIT }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: StartSound( "snd_fire", SND_CHANNEL_WEAPON, 0, false, NULL ); @@ -845,6 +848,51 @@ stateResult_t rvWeaponLightningGun::State_Fire( const stateParms_t& parms ) { AddToClip(1000); + player->energy -= 30.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 500, "weapon_blaster"); return SRESULT_STAGE( STAGE_ATTACKLOOP ); diff --git a/game/weapon/WeaponMachinegun.cpp b/game/weapon/WeaponMachinegun.cpp index 237a6124a..9be917307 100644 --- a/game/weapon/WeaponMachinegun.cpp +++ b/game/weapon/WeaponMachinegun.cpp @@ -229,6 +229,8 @@ stateResult_t rvWeaponMachinegun::State_Fire ( const stateParms_t& parms ) { STAGE_WAIT, }; + idPlayer* player = gameLocal.GetLocalPlayer(); + static int burst = 0; switch ( parms.stage ) { @@ -252,6 +254,51 @@ stateResult_t rvWeaponMachinegun::State_Fire ( const stateParms_t& parms ) { AddToClip(10); + player->energy -= 2.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); } else { diff --git a/game/weapon/WeaponNailgun.cpp b/game/weapon/WeaponNailgun.cpp index 797d3a48b..125b46a3d 100644 --- a/game/weapon/WeaponNailgun.cpp +++ b/game/weapon/WeaponNailgun.cpp @@ -642,6 +642,9 @@ stateResult_t rvWeaponNailgun::State_Fire( const stateParms_t& parms ) { STAGE_DONE, STAGE_SPINEMPTY, }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: if ( !wsfl.attack ) { @@ -693,7 +696,52 @@ stateResult_t rvWeaponNailgun::State_Fire( const stateParms_t& parms ) { AddToClip(10); - owner->PostEventMS(&EV_Player_SelectWeapon, 500, "weapon_blaster"); + player->energy -= 60.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + + owner->PostEventMS(&EV_Player_SelectWeapon, 200, "weapon_blaster"); return SRESULT_STAGE ( STAGE_FIREWAIT ); diff --git a/game/weapon/WeaponNapalmGun.cpp b/game/weapon/WeaponNapalmGun.cpp index a57c853bc..508eacd20 100644 --- a/game/weapon/WeaponNapalmGun.cpp +++ b/game/weapon/WeaponNapalmGun.cpp @@ -390,7 +390,10 @@ stateResult_t WeaponNapalmGun::State_Fire( const stateParms_t& parms ) { enum { STAGE_INIT, STAGE_WAIT, - }; + }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: if ( wsfl.zoom ) { @@ -415,6 +418,51 @@ stateResult_t WeaponNapalmGun::State_Fire( const stateParms_t& parms ) { AddToClip(10); + player->energy -= 20.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); } diff --git a/game/weapon/WeaponRailgun.cpp b/game/weapon/WeaponRailgun.cpp index a827a4e90..fb5400616 100644 --- a/game/weapon/WeaponRailgun.cpp +++ b/game/weapon/WeaponRailgun.cpp @@ -184,23 +184,65 @@ stateResult_t rvWeaponRailgun::State_Fire ( const stateParms_t& parms ) { STAGE_INIT, STAGE_WAIT, }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); Attack ( false, 1, spread, 0, 1.0f ); - if (owner) { - const float healAmount = 20.0f; - owner->health += healAmount; - if (owner->health > owner->inventory.maxHealth) { - owner->health = owner->inventory.maxHealth; - } - } + PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 ); cvarSystem->SetCVarFloat("timeScale", 1.0f); AddToClip(10); + player->energy += 40.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 1000, "weapon_blaster"); return SRESULT_STAGE ( STAGE_WAIT ); diff --git a/game/weapon/WeaponShotgun.cpp b/game/weapon/WeaponShotgun.cpp index c93715489..9844c22bb 100644 --- a/game/weapon/WeaponShotgun.cpp +++ b/game/weapon/WeaponShotgun.cpp @@ -161,6 +161,9 @@ stateResult_t rvWeaponShotgun::State_Fire( const stateParms_t& parms ) { STAGE_INIT, STAGE_WAIT, }; + + idPlayer* player = gameLocal.GetLocalPlayer(); + switch ( parms.stage ) { case STAGE_INIT: nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE )); @@ -171,6 +174,51 @@ stateResult_t rvWeaponShotgun::State_Fire( const stateParms_t& parms ) { AddToClip(10); + player->energy -= 30.0f; + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + owner->PostEventMS(&EV_Player_SelectWeapon, 700, "weapon_blaster"); return SRESULT_STAGE( STAGE_WAIT ); From a5a13e08077730b2d6353c03e6369709480bc8f6 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Wed, 22 Oct 2025 21:37:03 -0400 Subject: [PATCH 27/34] updated fantasy mod --- game/Player.cpp | 7 +++++ game/Player.h | 6 ++++ game/ai/AI.cpp | 53 +++++++++++++++++++++++++++++++++++ game/gamesys/SysCmds.cpp | 4 +-- game/weapon/WeaponBlaster.cpp | 6 ++-- 5 files changed, 71 insertions(+), 5 deletions(-) diff --git a/game/Player.cpp b/game/Player.cpp index 0b3d246a3..a3122dc3b 100644 --- a/game/Player.cpp +++ b/game/Player.cpp @@ -1811,6 +1811,9 @@ void idPlayer::Spawn( void ) { energy = 0.0f; maxEnergy = 100.0f; + currentXP = 0; + currentLevel = 1; + levelDM = 1.0f; if ( entityNumber >= MAX_CLIENTS ) { gameLocal.Error( "entityNum > MAX_CLIENTS for player. Player may only be spawned with a client." ); @@ -4284,6 +4287,10 @@ idPlayer::PowerUpModifier float idPlayer::PowerUpModifier( int type ) { float mod = 1.0f; + if (type == PMOD_PROJECTILE_DAMAGE || type == PMOD_MELEE_DAMAGE) { + mod = levelDM; + } + if ( PowerUpActive( POWERUP_QUADDAMAGE ) ) { switch( type ) { case PMOD_PROJECTILE_DAMAGE: { diff --git a/game/Player.h b/game/Player.h index 8ab655a39..78bed34fd 100644 --- a/game/Player.h +++ b/game/Player.h @@ -419,6 +419,12 @@ class idPlayer : public idActor { float energy; float maxEnergy; + //XP System + int currentXP; + int currentLevel; + int nextLevelXP; + float levelDM; + //RAVEN BEGIN // asalmon: the eneny the player is most likely currently aiming at #ifdef _XBOX diff --git a/game/ai/AI.cpp b/game/ai/AI.cpp index 8fce0d71e..8d2781784 100644 --- a/game/ai/AI.cpp +++ b/game/ai/AI.cpp @@ -18,6 +18,8 @@ AI.cpp #include "../spawner.h" #include "AI_Tactical.h" +#include "../Player.h" + const char* aiTalkMessageString [ ] = { "None", "primary", @@ -1753,6 +1755,57 @@ void idAI::Killed( idEntity *inflictor, idEntity *attacker, int damage, const id } kv = spawnArgs.MatchPrefix( "def_drops", kv ); } + + idPlayer* player = NULL; + + if (attacker) { + if (attacker->IsType(idProjectile::GetClassType())) { + idProjectile* proj = static_cast(attacker); + player = static_cast(proj->GetOwner()); + } + else if (attacker->IsType(idPlayer::GetClassType())){ + player = static_cast(attacker); + } + } + + gameLocal.Printf("Enemy killed"); + + if (player) { + + player->currentXP += 500; + + if (player->currentXP >= (500 * player->currentLevel)) { + player->currentXP = 0; + player->currentLevel++; + + player->hud->HandleNamedEvent("showLevelUpNot"); + + if (player->currentLevel == 2) { + player->hud->HandleNamedEvent("showlevel2"); + player->hud->HandleNamedEvent("hidelevel1"); + + player->levelDM = 1.5f; + } + else if (player->currentLevel == 3) { + player->hud->HandleNamedEvent("showlevel3"); + player->hud->HandleNamedEvent("hidelevel2"); + + player->levelDM = 2.0f; + } + else if (player->currentLevel == 4) { + player->hud->HandleNamedEvent("showlevel4"); + player->hud->HandleNamedEvent("hidelevel3"); + + player->levelDM = 2.5f; + } + else if (player->currentLevel == 5) { + player->hud->HandleNamedEvent("showlevel5"); + player->hud->HandleNamedEvent("hidelevel4"); + + player->levelDM = 3.0f; + } + } + } } /*********************************************************************** diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 376e29398..70568fa1d 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -652,7 +652,7 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { if (battleMode == "off") { battleMode = "on"; - #ifndef _MPBETA + /*#ifndef _MPBETA const char* key, * value; int i; float yaw; @@ -695,7 +695,7 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { yaw += 30; } - #endif + #endif/**/ } else if (battleMode == "on") { diff --git a/game/weapon/WeaponBlaster.cpp b/game/weapon/WeaponBlaster.cpp index 9690283ca..5dee0dc9e 100644 --- a/game/weapon/WeaponBlaster.cpp +++ b/game/weapon/WeaponBlaster.cpp @@ -443,7 +443,7 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { PlayAnim( ANIMCHANNEL_ALL, "chargedfire", parms.blendFrames ); if (player->energy < player->maxEnergy) { - player->energy += 5.0f; + player->energy += 10.0f; } if ((player->energy < 19.0f)) { @@ -491,13 +491,13 @@ stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) { return SRESULT_STAGE(FIRE_BURST); } else { - Attack ( false, 1, spread, 0, 0.5f ); + Attack ( false, 1, spread, 0, 0.5f); PlayEffect ( "fx_normalflash", barrelJointView, false ); PlayAnim( ANIMCHANNEL_ALL, "fire", parms.blendFrames ); fireHeldTime = 0; if (player->energy < player->maxEnergy) { - player->energy += 10.0f; + player->energy += 5.0f; } if ((player->energy < 19.0f)) { From 75bd491f5e710b5f4d0653c02719335832d578a8 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Wed, 22 Oct 2025 21:45:32 -0400 Subject: [PATCH 28/34] updated fantasy mod --- game/ai/AI.cpp | 53 +++++++++++++++++++++------------------- game/gamesys/SysCmds.cpp | 4 +-- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/game/ai/AI.cpp b/game/ai/AI.cpp index 8d2781784..dbf13fafd 100644 --- a/game/ai/AI.cpp +++ b/game/ai/AI.cpp @@ -1771,38 +1771,41 @@ void idAI::Killed( idEntity *inflictor, idEntity *attacker, int damage, const id gameLocal.Printf("Enemy killed"); if (player) { - - player->currentXP += 500; - if (player->currentXP >= (500 * player->currentLevel)) { - player->currentXP = 0; - player->currentLevel++; + if (player->currentLevel < 5) { - player->hud->HandleNamedEvent("showLevelUpNot"); + player->currentXP += 60; - if (player->currentLevel == 2) { - player->hud->HandleNamedEvent("showlevel2"); - player->hud->HandleNamedEvent("hidelevel1"); + if (player->currentXP >= (500 * player->currentLevel)) { + player->currentXP = 0; + player->currentLevel++; - player->levelDM = 1.5f; - } - else if (player->currentLevel == 3) { - player->hud->HandleNamedEvent("showlevel3"); - player->hud->HandleNamedEvent("hidelevel2"); + player->hud->HandleNamedEvent("showLevelUpNot"); - player->levelDM = 2.0f; - } - else if (player->currentLevel == 4) { - player->hud->HandleNamedEvent("showlevel4"); - player->hud->HandleNamedEvent("hidelevel3"); + if (player->currentLevel == 2) { + player->hud->HandleNamedEvent("showlevel2"); + player->hud->HandleNamedEvent("hidelevel1"); - player->levelDM = 2.5f; - } - else if (player->currentLevel == 5) { - player->hud->HandleNamedEvent("showlevel5"); - player->hud->HandleNamedEvent("hidelevel4"); + player->levelDM = 1.5f; + } + else if (player->currentLevel == 3) { + player->hud->HandleNamedEvent("showlevel3"); + player->hud->HandleNamedEvent("hidelevel2"); - player->levelDM = 3.0f; + player->levelDM = 2.0f; + } + else if (player->currentLevel == 4) { + player->hud->HandleNamedEvent("showlevel4"); + player->hud->HandleNamedEvent("hidelevel3"); + + player->levelDM = 2.5f; + } + else if (player->currentLevel == 5) { + player->hud->HandleNamedEvent("showlevel5"); + player->hud->HandleNamedEvent("hidelevel4"); + + player->levelDM = 3.0f; + } } } } diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 70568fa1d..376e29398 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -652,7 +652,7 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { if (battleMode == "off") { battleMode = "on"; - /*#ifndef _MPBETA + #ifndef _MPBETA const char* key, * value; int i; float yaw; @@ -695,7 +695,7 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { yaw += 30; } - #endif/**/ + #endif } else if (battleMode == "on") { From b5e9b12d2eb91f60f610593bb99248c40bb0ccb9 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 23 Oct 2025 00:29:02 -0400 Subject: [PATCH 29/34] updated fantasy mod --- game/Player.cpp | 1 + game/Player.h | 3 + game/ai/AI.cpp | 27 +++- game/gamesys/SysCmds.cpp | 279 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 306 insertions(+), 4 deletions(-) diff --git a/game/Player.cpp b/game/Player.cpp index a3122dc3b..b49f95577 100644 --- a/game/Player.cpp +++ b/game/Player.cpp @@ -1814,6 +1814,7 @@ void idPlayer::Spawn( void ) { currentXP = 0; currentLevel = 1; levelDM = 1.0f; + itemCount = 0; if ( entityNumber >= MAX_CLIENTS ) { gameLocal.Error( "entityNum > MAX_CLIENTS for player. Player may only be spawned with a client." ); diff --git a/game/Player.h b/game/Player.h index 78bed34fd..a3f0241cd 100644 --- a/game/Player.h +++ b/game/Player.h @@ -425,6 +425,9 @@ class idPlayer : public idActor { int nextLevelXP; float levelDM; + //Item + int itemCount; + //RAVEN BEGIN // asalmon: the eneny the player is most likely currently aiming at #ifdef _XBOX diff --git a/game/ai/AI.cpp b/game/ai/AI.cpp index dbf13fafd..3bc7e8daa 100644 --- a/game/ai/AI.cpp +++ b/game/ai/AI.cpp @@ -1768,10 +1768,33 @@ void idAI::Killed( idEntity *inflictor, idEntity *attacker, int damage, const id } } - gameLocal.Printf("Enemy killed"); - if (player) { + if (player->itemCount < 3) { + player->itemCount += 1; + } + + if (player->itemCount == 0) { + player->hud->HandleNamedEvent("hideitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 1) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 2) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 3) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("showitem3"); + } + if (player->currentLevel < 5) { player->currentXP += 60; diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 376e29398..834568e10 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -649,10 +649,18 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { player->hud->HandleNamedEvent("showEnergy"); + player->hud->HandleNamedEvent("showItems"); + + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + if (battleMode == "off") { battleMode = "on"; - #ifndef _MPBETA + /*#ifndef _MPBETA const char* key, * value; int i; float yaw; @@ -695,7 +703,7 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { yaw += 30; } - #endif + #endif */ } else if (battleMode == "on") { @@ -708,6 +716,8 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { KillEntitiesMod(args, idAI::GetClassType()); player->hud->HandleNamedEvent("hideEnergy"); + + player->hud->HandleNamedEvent("hideItems"); } } @@ -846,6 +856,266 @@ void Cmd_ChiTrap_f(const idCmdArgs& args) { } } +void Cmd_Potion_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->itemCount > 0)) { + player->itemCount -= 1; + + if (player->itemCount == 0) { + player->hud->HandleNamedEvent("hideitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 1) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 2) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 3) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("showitem3"); + } + + const float healAmount = 20.0f; + player->health += healAmount; + if (player->health > player->inventory.maxHealth) { + player->health = player->inventory.maxHealth; + } + + player->hud->HandleNamedEvent("hideAbilities"); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + } +} + +void Cmd_Ether_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->itemCount > 0)) { + player->itemCount -= 1; + + if (player->itemCount == 0) { + player->hud->HandleNamedEvent("hideitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 1) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 2) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 3) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("showitem3"); + } + + float currEn = player->energy += 40.0f; + if (currEn > player->maxEnergy) { + player->energy = player->maxEnergy; + } + else { + player->energy = currEn; + } + + if ((player->energy < 19.0f)) { + player->hud->HandleNamedEvent("hideenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 19.0f) && (player->energy < 39.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("hideenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 39.0f) && (player->energy < 59.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("hideenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 59.0f) && (player->energy < 79.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("hideenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 79.0f) && (player->energy < 99.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("hideenergy_100"); + } + else if ((player->energy > 99.0f) && (player->energy < 101.0f)) { + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + } + + player->hud->HandleNamedEvent("hideAbilities"); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + } +} + +void Cmd_Elixir_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->itemCount >= 2)) { + player->itemCount -= 2; + + if (player->itemCount == 0) { + player->hud->HandleNamedEvent("hideitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 1) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 2) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 3) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("showitem3"); + } + + player->health = player->inventory.maxHealth; + player->energy = player->maxEnergy; + + player->hud->HandleNamedEvent("showenergy_20"); + player->hud->HandleNamedEvent("showenergy_40"); + player->hud->HandleNamedEvent("showenergy_60"); + player->hud->HandleNamedEvent("showenergy_80"); + player->hud->HandleNamedEvent("showenergy_100"); + + player->hud->HandleNamedEvent("hideAbilities"); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + } +} + +void Cmd_ArmorCore_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->itemCount >= 2)) { + player->itemCount -= 2; + + if (player->itemCount == 0) { + player->hud->HandleNamedEvent("hideitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 1) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 2) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 3) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("showitem3"); + } + + player->inventory.maxarmor = 200.0f; + player->inventory.armor = 200.0f; + + player->hud->HandleNamedEvent("hideAbilities"); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + } +} + +void Cmd_MegaPotion_f(const idCmdArgs& args) { + idPlayer* player; + + player = gameLocal.GetLocalPlayer(); + if (!player) { + return; + } + if ((cvarSystem->GetCVarFloat("timeScale") == 0.2f) && (player->itemCount >= 2)) { + player->itemCount -= 2; + + if (player->itemCount == 0) { + player->hud->HandleNamedEvent("hideitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 1) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("hideitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 2) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("hideitem3"); + } + else if (player->itemCount == 3) { + player->hud->HandleNamedEvent("showitem1"); + player->hud->HandleNamedEvent("showitem2"); + player->hud->HandleNamedEvent("showitem3"); + } + + const float healAmount = 60.0f; + player->health += healAmount; + if (player->health > player->inventory.maxHealth) { + player->health = player->inventory.maxHealth; + } + + player->hud->HandleNamedEvent("hideAbilities"); + + cvarSystem->SetCVarFloat("timeScale", 1.0f); + } +} + void Cmd_Abilities_f(const idCmdArgs& args) { idPlayer* player; @@ -3549,6 +3819,11 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand("rayofjudgement", Cmd_RayOfJudgement_f, CMD_FL_GAME, "initiates the ray of judgement ability"); cmdSystem->AddCommand("sorcerousstorm", Cmd_SorcerousStorm_f, CMD_FL_GAME, "initiates the sorcerous storm ability"); cmdSystem->AddCommand("chitrap", Cmd_ChiTrap_f, CMD_FL_GAME, "initiates the chi trap ability"); + cmdSystem->AddCommand("potion", Cmd_Potion_f, CMD_FL_GAME, "heals player for 20 hp"); + cmdSystem->AddCommand("megapotion", Cmd_MegaPotion_f, CMD_FL_GAME, "heals player for 60 hp"); + cmdSystem->AddCommand("ether", Cmd_Ether_f, CMD_FL_GAME, "increases energy by 40"); + cmdSystem->AddCommand("elixir", Cmd_Elixir_f, CMD_FL_GAME, "sets health and energy to max"); + cmdSystem->AddCommand("armorcore", Cmd_ArmorCore_f, CMD_FL_GAME, "increases and sets armor to 200"); } /* From d805a9650af205aa5b5e2d6b73804660c6d79521 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 23 Oct 2025 00:38:40 -0400 Subject: [PATCH 30/34] updated fantasy mod --- game/gamesys/SysCmds.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 834568e10..48702638e 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -660,7 +660,7 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { if (battleMode == "off") { battleMode = "on"; - /*#ifndef _MPBETA + #ifndef _MPBETA const char* key, * value; int i; float yaw; @@ -703,7 +703,7 @@ void Cmd_BattleMode_f(const idCmdArgs& args) { yaw += 30; } - #endif */ + #endif } else if (battleMode == "on") { From 4c11d4e7c7dd6f32d22c913afb74dc419f9ac21b Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 23 Oct 2025 12:22:16 -0400 Subject: [PATCH 31/34] updated fantasy mod --- game/ai/AI.cpp | 2 +- game/gamesys/SysCmds.cpp | 43 ++++++++++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/game/ai/AI.cpp b/game/ai/AI.cpp index 3bc7e8daa..1a614553c 100644 --- a/game/ai/AI.cpp +++ b/game/ai/AI.cpp @@ -1797,7 +1797,7 @@ void idAI::Killed( idEntity *inflictor, idEntity *attacker, int damage, const id if (player->currentLevel < 5) { - player->currentXP += 60; + player->currentXP += 80; if (player->currentXP >= (500 * player->currentLevel)) { player->currentXP = 0; diff --git a/game/gamesys/SysCmds.cpp b/game/gamesys/SysCmds.cpp index 48702638e..dbc6bbfc4 100644 --- a/game/gamesys/SysCmds.cpp +++ b/game/gamesys/SysCmds.cpp @@ -1141,14 +1141,38 @@ void Cmd_Abilities_f(const idCmdArgs& args) { } void Cmd_ModHelp_f(const idCmdArgs& args) { - gameLocal.Printf("Helpful Tips:\n"); - gameLocal.Printf("1. Make sure to use the spawnTeam command first to spawn the other members of your team.\n"); - gameLocal.Printf("2. Make sure to look at the README.md to see what the abilities look like and do. Also look at it to see the new keybinds\n"); + gameLocal.Printf("Helpful Tips: \n"); + gameLocal.Printf("1. Make sure to click L before starting any combat and make sure to click it again after you finished combat \n"); + gameLocal.Printf("2. Make sure to look at the README.md to see the description of what each ability and item does \n"); gameLocal.Printf("\n"); - gameLocal.Printf("New Mod Commands:\n"); - gameLocal.Printf("1. abilities - Slows game time and opens UI for the ability menu to show the different abilities.\n"); - gameLocal.Printf("2. spawnTeam - Spawns 2 extra NPCs who can fight on their own and use abilities.\n"); - gameLocal.Printf("3. switchPlayers - Switches the ability command between you and the 2 other NPCs.\n"); + gameLocal.Printf("For help with combat type helpCombat \n"); + gameLocal.Printf("For help with items type helpItem \n"); + gameLocal.Printf("For help with level up system type helpLevel \n"); +} + +void Cmd_ModHelpCombat_f(const idCmdArgs& args) { + gameLocal.Printf("The combat system starts once you click L to initiate battle mode \n"); + gameLocal.Printf("Once clicked you hud will change and you will gain the ability to activate your abilites which are linked to Q \n"); + gameLocal.Printf("Once you click Q you will see a list of abilites along with their designated keybinds, time will also be slowed down. Each ability has their own energy requirment which can be found in README.md \n"); + gameLocal.Printf("Once an ability is used your enrgy will decrease/increase accordingly and time will be put back to normal \n"); + gameLocal.Printf("You can gain energy by fireing your default blaster, using certain abilites, or using certain items \n"); + gameLocal.Printf("To go back to main help screen type modHelp \n"); +} + +void Cmd_ModHelpItem_f(const idCmdArgs& args) { + gameLocal.Printf("Once in battle mode your hud will be updated to show the items bar \n"); + gameLocal.Printf("The items bar can hold up to 3 item points which are gained by killing an enemy \n"); + gameLocal.Printf("Once you click Q you will see a list of items along with their keybinds, time will aslo be slowed down. Each item has its own item point requirment which can be found in README.md \n"); + gameLocal.Printf("Once an item is used your item points will decrease accordingly and time will be put back to normal \n"); + gameLocal.Printf("To go back to main help screen type modHelp \n"); +} + +void Cmd_ModHelpLevel_f(const idCmdArgs& args) { + gameLocal.Printf("Once you make a new game you will start at level 1 \n"); + gameLocal.Printf("You gain xp by dealing the final blow to enemies \n"); + gameLocal.Printf("Once you reach a certain amount xp you will level up, level 5 being the max, and your xp will be reset to 0 \n"); + gameLocal.Printf("You can see your current level in bottom middle of the screen \n"); + gameLocal.Printf("To go back to main help screen type modHelp \n"); } /* @@ -3808,7 +3832,7 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand( "buy", Cmd_BuyItem_f, CMD_FL_GAME, "Buy an item (if in a buy zone and the game type supports it)" ); // RITUAL END cmdSystem->AddCommand("abilities", Cmd_Abilities_f, CMD_FL_GAME, "enables the ability menu and slows game time"); - cmdSystem->AddCommand("modhelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); + cmdSystem->AddCommand("modHelp", Cmd_ModHelp_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); cmdSystem->AddCommand("spawnteam", Cmd_BattleMode_f, CMD_FL_GAME, "spawns 2 basic marine allies to help you"); cmdSystem->AddCommand("maximumfurry", Cmd_MaximumFurry_f, CMD_FL_GAME, "initiates the maximum furry ability"); cmdSystem->AddCommand("pointblank", Cmd_PointBlank_f, CMD_FL_GAME, "initiates the point blank ability"); @@ -3824,6 +3848,9 @@ void idGameLocal::InitConsoleCommands( void ) { cmdSystem->AddCommand("ether", Cmd_Ether_f, CMD_FL_GAME, "increases energy by 40"); cmdSystem->AddCommand("elixir", Cmd_Elixir_f, CMD_FL_GAME, "sets health and energy to max"); cmdSystem->AddCommand("armorcore", Cmd_ArmorCore_f, CMD_FL_GAME, "increases and sets armor to 200"); + cmdSystem->AddCommand("helpCombat", Cmd_ModHelpCombat_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); + cmdSystem->AddCommand("helpItem", Cmd_ModHelpItem_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); + cmdSystem->AddCommand("helpLevel", Cmd_ModHelpLevel_f, CMD_FL_GAME, "shows both some helpful tips and the list of new commands in the console"); } /* From 11762199d725b4b3f1ac1666946888b0820a5c34 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 23 Oct 2025 16:16:37 -0400 Subject: [PATCH 32/34] Revise README with new mod details and commands Updated gameplay instructions and features in README. --- README.md | 86 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 76bdc7919..fdff5bd85 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,10 @@ This mod takes some features from the game Final Fantasy VII Remake and implemen ## How To Play 1. Go to my git hub account which should be linked in Authors -2. Click on Q4-Project_GameMod and then click on the branch named rocket_mod +2. Click on Q4-Project_GameMod and then click on the branch named fantasy2_mod 3. Download or extract the mod folder and implement it as a new folder into your Quake 4 file 4. Launch Quake 4 and from the main menu, select: -Mods → fantasyMod → Load Mod +Mods → name of your mod folder → Load Mod 5. Start a new game @@ -23,50 +23,94 @@ Mods → fantasyMod → Load Mod ## Features -- Weapons - - Blaster +- Weapons + - All weapons other than rochet launcher and gauntlets were changed into abilities from the game Final Fantasy VII Remake + - Blaster (regular fire / Charge) - Changed the charged blast to a bust fire - Tweaked damage - - Dark Matter Gun + - Dark Matter Gun (Chi Trap) - Projectile now stays in place instead of moving - Tweaked damage - - Hyperblaster + - Hyperblaster (Focused Shot) - Lowered firerate - Lowered speed of Projectile - Tweaked damage - - Machine Gun + - Machine Gun (Maximum Furry) - Changed from fully automatic to burst fire - Increased spread - Tweaked damage - - Grenade Launcher + - Grenade Launcher (Blade Burst) - Now fires 5 grenandes in a large spread - Decreased explosion radius - Tweaked damage - - Shotgun + - Shotgun (Point Blank) - Decreased spread - Tweaked damage - - Railgun + - Railgun (Soul Drain) - Attacks now heal player for 20 health points - Tweaked damage - - Lightning Gun + - Lightning Gun (Ray Of Judgement) - Changed the constent fire to a burst fire - Tweaked damage - - Napalm Launcher + - Napalm Launcher (Sorcerous Storm) - The attack now lands right at the players feat - Attacks no longer do damage to the player - Tweaked damage - - Nailgun + - Nailgun (Steel Skin) - Atacks now restore player armor to 100 - Tweaked damage +- GUI Changes + - Added 2 new activly changing bars in hud + - One named Energy which increases and decreases depending on player variable energy + - One named Item which increases and decreases depending on player variable itemCount + - Added a new list in hud named Abilities which shows all possible abilities (weapons) and items that the player can use, can fully appear and disapear + - Added a new box in hud named Level which shows the players current level + - All of these addition and their subparts have show and hide events in hud.gui that change their visibility +- Combat System + - The combat system starts once you click L to initiate "Battle Mode". Once clicked you hud will change and you will gain the ability to activate your abilites which are linked to Q + - Shows Energy bar + - Energy is determined by the player variable energy + - Each ability has their own energy requirment and keybind which should be shown in the hud changes + - Once an ability is used your enrgy will decrease/increase accordingly and time will be put back to normal, the player will also go back to their default pistol and time will return to normal + - You can gain energy by fireing your default blaster, using certain abilites, or using certain items +- Item System + - Once in "Battle Mode" your hud will be updated to show the Items bar + - Item points is determined by the player variable itemCount + - The Items bar can hold up to 3 item points which are gained by killing an enemy + - Each item has its own item point requirment + - Once an item is used your item points will decrease accordingly and time will be put back to normal, time will aslo return to normal +- Level Up System + - Level is determined by player variable currentLevel + - XP is determined by player variable currentXP + - Once you make a new game you will start at level 1 + - You gain xp by dealing the final blow to enemies + - Once you reach a certain amount xp you will level up, level 5 being the max, and your xp will be reset to 0 + - As you level up your damage will increase for all abilities - Commands + - Added new command "spawnteam" + - Linked to L key + - On first click, activates "Battle Mode" on click, which shows the Energy and Item bars, and allows the player to input the abilities command (Q) + - Sets player variable energy to 0 + - Spawns 2 friendly marine NPCs + - On second click, deactivates "Battle Mode" on click, which hides the Energy and Item bars, and removes the players ability to input the abilities command (Q) + - Despawns all friendly marine NPCs - Added new command "abilities" - Slows down game time with one click, and then sets it back to normal with another - Linked to Q key - - Added new command "modhelp" - - Displays text in the game console that can help the player with problems - - Added new command "spawnTeam" - - Spawns 2 NPCs that can fight alongside you and use abilites - - Linked to L key - - Added new command "switch" - - Switches the ability command between you and the 2 other NPCs - - Linked to E key + - Shows the Abilities list in HUD with one click, hides it with a second click + - Allows the player to input commands related to abilites (weapons) and items with one click, removes this ability with a second click + - Added new command "modHelp" + - Displays text in the game console that can help the player with small common problems + - Explains how to access the commands helpCombat, helpItem, helpLevel + - Added new command "helpCombat" + - Explains the combat system + - Explains how to get back to modHelp + - Added new command "helpItem" + - Explains the Item system + - Explains how to get back to modHelp + - Added new command "helpLevel" + - Explains the level up system + - Explains how to get back to modHelp + - Added new commands for each ability (weapon) + -Each command will give and make the player select the weapon that is linkied to the ability + -They will also slow down time From 2c4f468f2a18d45957cb7e348f3d229040dd3216 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Thu, 23 Oct 2025 16:17:32 -0400 Subject: [PATCH 33/34] Fix formatting issues in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fdff5bd85..f411e0c6f 100644 --- a/README.md +++ b/README.md @@ -112,5 +112,5 @@ Mods → name of your mod folder → Load Mod - Explains the level up system - Explains how to get back to modHelp - Added new commands for each ability (weapon) - -Each command will give and make the player select the weapon that is linkied to the ability - -They will also slow down time + - Each command will give and make the player select the weapon that is linkied to the ability + - They will also slow down time From a35a4832ee8ced73378324b0748990961b2039a4 Mon Sep 17 00:00:00 2001 From: Frokey17 Date: Fri, 24 Oct 2025 17:14:25 -0400 Subject: [PATCH 34/34] Add files via upload --- pak001.pk4 | Bin 0 -> 38836 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pak001.pk4 diff --git a/pak001.pk4 b/pak001.pk4 new file mode 100644 index 0000000000000000000000000000000000000000..2c437aedcc47ef751194f68ad1db5b77f6622dd7 GIT binary patch literal 38836 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!_kmP4ZscBN}Bn{f_bB=RCuWzLPAd^yt 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