From 1c80e4bbcda6a6088701852ff4bb17adb2b71929 Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Fri, 25 Nov 2022 12:41:42 +0300 Subject: [PATCH 01/14] Add a cvar fixing pushable excessive acceleration (#343) --- dlls/func_break.cpp | 28 ++++++++++++++++++++++++---- dlls/game.cpp | 2 ++ dlls/game.h | 1 + 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/dlls/func_break.cpp b/dlls/func_break.cpp index 916913f2..0c5e0114 100644 --- a/dlls/func_break.cpp +++ b/dlls/func_break.cpp @@ -26,6 +26,7 @@ #include "func_break.h" #include "decals.h" #include "explode.h" +#include "game.h" extern DLL_GLOBAL Vector g_vecAttackDir; @@ -925,12 +926,24 @@ void CPushable::Move( CBaseEntity *pOther, int push ) return; } - // g-cont. fix pushable acceleration bug (reverted as it used in mods) if( pOther->IsPlayer() ) { - // Don't push unless the player is pushing forward and NOT use (pull) - if( push && !( pevToucher->button & ( IN_FORWARD | IN_USE ) ) ) - return; + // g-cont. fix pushable acceleration bug (now implemented as cvar) + if (pushablemode.value == 1) + { + // Allow player push when moving right, left and back too + if ( push && !(pevToucher->button & (IN_FORWARD|IN_MOVERIGHT|IN_MOVELEFT|IN_BACK)) ) + return; + // Require player walking back when applying '+use' on pushable + if ( !push && !(pevToucher->button & (IN_BACK)) ) + return; + } + else + { + // Don't push unless the player is pushing forward and NOT use (pull) + if( push && !( pevToucher->button & ( IN_FORWARD | IN_USE ) ) ) + return; + } playerTouch = 1; } @@ -951,6 +964,13 @@ void CPushable::Move( CBaseEntity *pOther, int push ) else factor = 0.25f; + // Spirit fix for pushable acceleration + if (pushablemode.value == 2) + { + if (!push) + factor *= 0.5f; + } + pev->velocity.x += pevToucher->velocity.x * factor; pev->velocity.y += pevToucher->velocity.y * factor; diff --git a/dlls/game.cpp b/dlls/game.cpp index 690256c2..c648c796 100644 --- a/dlls/game.cpp +++ b/dlls/game.cpp @@ -38,6 +38,7 @@ cvar_t satchelfix = { "satchelfix", "0", FCVAR_SERVER }; cvar_t explosionfix = { "explosionfix", "0", FCVAR_SERVER }; cvar_t monsteryawspeedfix = { "monsteryawspeedfix", "1", FCVAR_SERVER }; cvar_t corpsephysics = { "corpsephysics", "0", FCVAR_SERVER }; +cvar_t pushablemode = { "pushablemode", "0", FCVAR_SERVER }; cvar_t forcerespawn = { "mp_forcerespawn","1", FCVAR_SERVER }; cvar_t flashlight = { "mp_flashlight","0", FCVAR_SERVER }; cvar_t aimcrosshair = { "mp_autocrosshair","1", FCVAR_SERVER }; @@ -491,6 +492,7 @@ void GameDLLInit( void ) CVAR_REGISTER( &explosionfix ); CVAR_REGISTER( &monsteryawspeedfix ); CVAR_REGISTER( &corpsephysics ); + CVAR_REGISTER( &pushablemode ); CVAR_REGISTER( &forcerespawn ); CVAR_REGISTER( &flashlight ); CVAR_REGISTER( &aimcrosshair ); diff --git a/dlls/game.h b/dlls/game.h index 54e3281d..fee1a71b 100644 --- a/dlls/game.h +++ b/dlls/game.h @@ -33,6 +33,7 @@ extern cvar_t satchelfix; extern cvar_t explosionfix; extern cvar_t monsteryawspeedfix; extern cvar_t corpsephysics; +extern cvar_t pushablemode; extern cvar_t forcerespawn; extern cvar_t flashlight; extern cvar_t aimcrosshair; From 63e3769c46ba7f502b53abdfdd55597e4130c0dd Mon Sep 17 00:00:00 2001 From: Andrey Akhmichin <15944199+nekonomicon@users.noreply.github.com> Date: Sat, 26 Nov 2022 02:27:38 +0500 Subject: [PATCH 02/14] Fix animation code accessing invalid sequence descriptor. https://github.com/ValveSoftware/halflife/issues/3308 --- dlls/animation.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dlls/animation.cpp b/dlls/animation.cpp index c7d38e71..c66d49cd 100644 --- a/dlls/animation.cpp +++ b/dlls/animation.cpp @@ -238,7 +238,7 @@ void GetSequenceInfo( void *pmodel, entvars_t *pev, float *pflFrameRate, float * mstudioseqdesc_t *pseqdesc; - if( pev->sequence >= pstudiohdr->numseq ) + if( pev->sequence < 0 || pev->sequence >= pstudiohdr->numseq ) { *pflFrameRate = 0.0f; *pflGroundSpeed = 0.0f; @@ -265,7 +265,7 @@ int GetSequenceFlags( void *pmodel, entvars_t *pev ) studiohdr_t *pstudiohdr; pstudiohdr = (studiohdr_t *)pmodel; - if( !pstudiohdr || pev->sequence >= pstudiohdr->numseq ) + if( !pstudiohdr || pev->sequence < 0 || pev->sequence >= pstudiohdr->numseq ) return 0; mstudioseqdesc_t *pseqdesc; @@ -279,7 +279,7 @@ int GetAnimationEvent( void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEve studiohdr_t *pstudiohdr; pstudiohdr = (studiohdr_t *)pmodel; - if( !pstudiohdr || pev->sequence >= pstudiohdr->numseq || !pMonsterEvent ) + if( !pstudiohdr || pev->sequence < 0 || pev->sequence >= pstudiohdr->numseq || !pMonsterEvent ) return 0; mstudioseqdesc_t *pseqdesc; @@ -379,7 +379,7 @@ float SetBlending( void *pmodel, entvars_t *pev, int iBlender, float flValue ) studiohdr_t *pstudiohdr; pstudiohdr = (studiohdr_t *)pmodel; - if( !pstudiohdr ) + if( !pstudiohdr || pev->sequence < 0 || pev->sequence >= pstudiohdr->numseq ) return flValue; mstudioseqdesc_t *pseqdesc; From 06424ce6fa35fa32e58c8b68c874ec92fe6cb87e Mon Sep 17 00:00:00 2001 From: FreeSlave Date: Fri, 30 Dec 2022 10:57:07 +0300 Subject: [PATCH 03/14] Track m_rawinput changes when weapon prediction is disabled --- cl_dll/input_goldsource.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cl_dll/input_goldsource.cpp b/cl_dll/input_goldsource.cpp index bf029639..a11d26b1 100644 --- a/cl_dll/input_goldsource.cpp +++ b/cl_dll/input_goldsource.cpp @@ -158,7 +158,6 @@ bool isMouseRelative = false; #if _WIN32 #include "progdefs.h" -extern globalvars_t *gpGlobals; #endif int CL_IsDead( void ); @@ -781,9 +780,10 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY) #if _WIN32 // update m_bRawInput occasionally: - if ( gpGlobals && gpGlobals->time - s_flRawInputUpdateTime > 1.0f ) + const float currentTime = gEngfuncs.GetClientTime(); + if ( currentTime - s_flRawInputUpdateTime > 1.0f || s_flRawInputUpdateTime == 0.0f ) { - s_flRawInputUpdateTime = gpGlobals->time; + s_flRawInputUpdateTime = currentTime; bool lockEntered = MouseThread_ActiveLock_Enter(); From e0279920c7bf32b9a67c6c383cff90a32a99d573 Mon Sep 17 00:00:00 2001 From: FreeSlave Date: Fri, 30 Dec 2022 13:14:00 +0300 Subject: [PATCH 04/14] Access m_rawinput cvar via pointer instead of CVAR_GET_FLOAT --- cl_dll/input_goldsource.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cl_dll/input_goldsource.cpp b/cl_dll/input_goldsource.cpp index a11d26b1..615cb3d6 100644 --- a/cl_dll/input_goldsource.cpp +++ b/cl_dll/input_goldsource.cpp @@ -150,6 +150,7 @@ extern cvar_t *cl_pitchspeed; extern cvar_t *cl_movespeedkey; #if _WIN32 +static cvar_t* m_rawinput = NULL; static double s_flRawInputUpdateTime = 0.0f; static bool m_bRawInput = false; static bool m_bMouseThread = false; @@ -385,7 +386,7 @@ void IN_SetMouseMode(bool enable) if (mouseparmsvalid) restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0); - m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; + m_bRawInput = m_rawinput->value != 0; if(m_bRawInput) { #if USE_SDL2 @@ -787,7 +788,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY) bool lockEntered = MouseThread_ActiveLock_Enter(); - m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; + m_bRawInput = m_rawinput->value != 0; if(m_bRawInput && !isMouseRelative) { @@ -1571,7 +1572,8 @@ void GoldSourceInput::IN_Init (void) m_customaccel_exponent = gEngfuncs.pfnRegisterVariable ( "m_customaccel_exponent", "1", FCVAR_ARCHIVE ); #if _WIN32 - m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; + m_rawinput = gEngfuncs.pfnGetCvarPointer("m_rawinput"); + m_bRawInput = m_rawinput->value != 0; m_bMouseThread = gEngfuncs.CheckParm ("-mousethread", NULL ) != NULL; m_mousethread_sleep = gEngfuncs.pfnRegisterVariable ( "m_mousethread_sleep", "1", FCVAR_ARCHIVE ); // default to less than 1000 Hz From eceb28a304db24b7a5292d72755bfbac6f8b3959 Mon Sep 17 00:00:00 2001 From: Bohdan Shulyar Date: Mon, 9 Jan 2023 17:03:07 +0200 Subject: [PATCH 05/14] Remove useless macro from weapons.h (#352) --- dlls/weapons.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/dlls/weapons.h b/dlls/weapons.h index 889e0c5a..46e88edb 100644 --- a/dlls/weapons.h +++ b/dlls/weapons.h @@ -122,7 +122,6 @@ public: #define GLOCK_MAX_CLIP 17 #define PYTHON_MAX_CLIP 6 #define MP5_MAX_CLIP 50 -#define MP5_DEFAULT_AMMO 25 #define SHOTGUN_MAX_CLIP 8 #define CROSSBOW_MAX_CLIP 5 #define RPG_MAX_CLIP 1 @@ -138,7 +137,6 @@ public: #define GLOCK_DEFAULT_GIVE 17 #define PYTHON_DEFAULT_GIVE 6 #define MP5_DEFAULT_GIVE 25 -#define MP5_DEFAULT_AMMO 25 #define MP5_M203_DEFAULT_GIVE 0 #define SHOTGUN_DEFAULT_GIVE 12 #define CROSSBOW_DEFAULT_GIVE 5 From 94f3621a3f101f809c7ef3ea7a7ef70083256d97 Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Fri, 13 Jan 2023 13:46:59 +0300 Subject: [PATCH 06/14] Fix func_tank save-restore (#349) --- dlls/func_tank.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/func_tank.cpp b/dlls/func_tank.cpp index 3fd4678d..07fd7e30 100644 --- a/dlls/func_tank.cpp +++ b/dlls/func_tank.cpp @@ -276,6 +276,7 @@ TYPEDESCRIPTION CFuncTank::m_SaveData[] = DEFINE_FIELD( CFuncTank, m_iszFireMaster, FIELD_STRING ), //LRC DEFINE_FIELD( CFuncTank, m_iszLocusFire, FIELD_STRING ), //LRC DEFINE_FIELD( CFuncTank, m_pFireProxy, FIELD_CLASSPTR ), //LRC + DEFINE_FIELD( CFuncTank, m_iTankClass, FIELD_INTEGER ), }; IMPLEMENT_SAVERESTORE( CFuncTank, CBaseEntity ) From 92918eace7c2d1544319e9b22e26c0ce567a9de2 Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Fri, 13 Jan 2023 13:47:23 +0300 Subject: [PATCH 07/14] Fix CRenderFxFader save-restore (#350) --- dlls/triggers.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index 39310d45..71415b2f 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -1365,6 +1365,7 @@ public: int m_iszAmtFactor; }; +LINK_ENTITY_TO_CLASS( render_fader, CRenderFxFader ) TYPEDESCRIPTION CRenderFxFader::m_SaveData[] = { @@ -1385,6 +1386,7 @@ IMPLEMENT_SAVERESTORE(CRenderFxFader,CBaseEntity); void CRenderFxFader :: Spawn( void ) { SetThink(&CRenderFxFader :: FadeThink ); + pev->classname = MAKE_STRING("render_fader"); } void CRenderFxFader :: FadeThink( void ) From 882c9f6ec82dd0c8e17605191bd29b8491dbfe65 Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Fri, 13 Jan 2023 13:47:37 +0300 Subject: [PATCH 08/14] Fix motion_thread save-restore (#351) --- dlls/triggers.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index 71415b2f..07f6e035 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -4568,6 +4568,7 @@ void CTriggerMotion::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP class CMotionThread : public CPointEntity { public: + void Spawn(); void Think( void ); virtual int Save( CSave &save ); @@ -4581,7 +4582,7 @@ public: EHANDLE m_hLocus; EHANDLE m_hTarget; }; -LINK_ENTITY_TO_CLASS( motion_thread, CPointEntity ); +LINK_ENTITY_TO_CLASS( motion_thread, CMotionThread ); TYPEDESCRIPTION CMotionThread::m_SaveData[] = { @@ -4595,6 +4596,11 @@ TYPEDESCRIPTION CMotionThread::m_SaveData[] = IMPLEMENT_SAVERESTORE(CMotionThread,CPointEntity); +void CMotionThread::Spawn() //AJH +{ + pev->classname = MAKE_STRING("motion_thread"); //We need this for save/restore to work +} + void CMotionThread::Think( void ) { if( m_hLocus == 0 || m_hTarget == 0 ) @@ -4803,6 +4809,7 @@ void CMotionManager::Affect( CBaseEntity *pTarget, CBaseEntity *pActivator ) CMotionThread *pThread = GetClassPtr( (CMotionThread*)NULL ); if (pThread == NULL) return; //error? + pThread->Spawn(); pThread->m_hLocus = pActivator; pThread->m_hTarget = pTarget; pThread->m_iszPosition = m_iszPosition; From d32df8082288c5b7ae4d51c8f3adb2e9468e3b9a Mon Sep 17 00:00:00 2001 From: fgsfds Date: Sun, 5 Feb 2023 01:59:50 +0100 Subject: [PATCH 09/14] nswitch support --- cmake/LibraryNaming.cmake | 5 +- contrib/iZarif/premake5.lua | 2 +- contrib/iZarif/xash.lua | 2 +- public/build.h | 7 +- scripts/waifulib/library_naming.py | 5 +- scripts/waifulib/xcompile.py | 141 ++++++++++++++++++++++++++--- wscript | 11 ++- 7 files changed, 155 insertions(+), 18 deletions(-) diff --git a/cmake/LibraryNaming.cmake b/cmake/LibraryNaming.cmake index c97c92f7..feae5b70 100644 --- a/cmake/LibraryNaming.cmake +++ b/cmake/LibraryNaming.cmake @@ -42,6 +42,7 @@ check_symbol_exists(XASH_SERENITY "build.h" XASH_SERENITY) check_symbol_exists(XASH_WIN32 "build.h" XASH_WIN32) check_symbol_exists(XASH_WIN64 "build.h" XASH_WIN64) check_symbol_exists(XASH_X86 "build.h" XASH_X86) +check_symbol_exists(XASH_NSWITCH "build.h" XASH_NSWITCH) unset(CMAKE_REQUIRED_INCLUDES) # engine/common/build.c @@ -63,6 +64,8 @@ elseif(XASH_HAIKU) set(BUILDOS "haiku") elseif(XASH_SERENITY) set(BUILDOS "serenityos") +elseif(XASH_NSWITCH) + set(BUILDOS "nswitch") else() message(SEND_ERROR "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug") endif() @@ -76,7 +79,7 @@ elseif(XASH_X86) set(BUILDARCH "i386") endif() elseif(XASH_ARM AND XASH_64BIT) - set(BUILDARCH "arm64") + set(BUILDARCH "aarch64") elseif(XASH_ARM) set(BUILDARCH "armv") if(XASH_ARMv8) diff --git a/contrib/iZarif/premake5.lua b/contrib/iZarif/premake5.lua index 91817da5..55e438ea 100644 --- a/contrib/iZarif/premake5.lua +++ b/contrib/iZarif/premake5.lua @@ -55,7 +55,7 @@ newoption{trigger = "lto", description = "Enable Link Time Optimization", defaul newoption{trigger = "arch", description = "Destination arch", default = xash.get_arch(), allowed = { {"amd64", ""}, {"x86", ""}, - {"arm64", ""}, + {"aarch64", ""}, {"armv8_32l", ""}, {"armv7l", ""}, {"armv6l", ""}, diff --git a/contrib/iZarif/xash.lua b/contrib/iZarif/xash.lua index 0388602d..a94febb3 100644 --- a/contrib/iZarif/xash.lua +++ b/contrib/iZarif/xash.lua @@ -89,7 +89,7 @@ function m.get_arch() arch = "x86" elseif m.is_cxx_symbol_defined("XASH_ARM", {"build.h"}, {"public"}) then if m.is_cxx_symbol_defined("XASH_64BIT", {"build.h"}, {"public"}) then - arch = "arm64" + arch = "aarch64" else arch = "armv" diff --git a/public/build.h b/public/build.h index 5b6bcc36..521e4675 100644 --- a/public/build.h +++ b/public/build.h @@ -79,6 +79,7 @@ For more information, please refer to #undef XASH_WIN32 #undef XASH_WIN64 #undef XASH_X86 +#undef XASH_NSWITCH //================================================================ // @@ -96,6 +97,10 @@ For more information, please refer to #if defined(_WIN64) #define XASH_WIN64 1 #endif +#elif defined __SWITCH__ + #define XASH_NSWITCH 1 + #define XASH_LITTLE_ENDIAN 1 + #define XASH_POSIX 1 #elif defined(__linux__) #define XASH_LINUX 1 #if defined(__ANDROID__) @@ -134,7 +139,7 @@ For more information, please refer to #error "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug" #endif -#if defined XASH_ANDROID || defined XASH_IOS +#if defined XASH_ANDROID || defined XASH_IOS || defined XASH_NSWITCH #define XASH_MOBILE_PLATFORM 1 #endif diff --git a/scripts/waifulib/library_naming.py b/scripts/waifulib/library_naming.py index f3b9762a..de508625 100644 --- a/scripts/waifulib/library_naming.py +++ b/scripts/waifulib/library_naming.py @@ -61,6 +61,7 @@ DEFINES = [ 'XASH_WIN32', 'XASH_WIN64', 'XASH_X86', +'XASH_NSWITCH', ] def configure(conf): @@ -92,6 +93,8 @@ def configure(conf): buildos = "haiku" elif conf.env.XASH_SERENITY: buildos = "serenityos" + elif conf.env.XASH_NSWITCH: + buildos = "nswitch" else: conf.fatal("Place your operating system name in build.h and library_naming.py!\n" "If this is a mistake, try to fix conditions above and report a bug") @@ -104,7 +107,7 @@ def configure(conf): else: buildarch = "i386" elif conf.env.XASH_ARM and conf.env.XASH_64BIT: - buildarch = "arm64" + buildarch = "aarch64" elif conf.env.XASH_ARM: buildarch = "armv" if conf.env.XASH_ARMv8: diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index b9ce398f..c39a08eb 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -30,6 +30,8 @@ ANDROID_NDK_API_MIN = { 10: 3, 19: 16, 20: 16, 23: 16, 25: 19 } # minimal API le ANDROID_STPCPY_API_MIN = 21 # stpcpy() introduced in SDK 21 ANDROID_64BIT_API_MIN = 21 # minimal API level that supports 64-bit targets +NSWITCH_ENVVARS = ['DEVKITPRO'] + # This class does support ONLY r10e and r19c/r20 NDK class Android: ctx = None # waf context @@ -348,14 +350,99 @@ class Android: ldflags += ['-march=armv5te'] return ldflags +class NintendoSwitch: + ctx = None # waf context + arch = "aarch64" + dkp_dir = None + portlibs_dir = None + dka64_dir = None + libnx_dir = None + + def __init__(self, ctx): + self.ctx = ctx + + for i in NSWITCH_ENVVARS: + self.dkp_dir = os.getenv(i) + if self.dkp_dir != None: + break + else: + ctx.fatal('Set %s environment variable pointing to the DEVKITPRO home!' % + ' or '.join(NSWITCH_ENVVARS)) + + self.dkp_dir = os.path.abspath(self.dkp_dir) + + self.dka64_dir = os.path.join(self.dkp_dir, 'devkitA64') + if not os.path.exists(self.dka64_dir): + ctx.fatal('devkitA64 not found in `%s`. Install devkitA64!' % self.dka64_dir) + + self.libnx_dir = os.path.join(self.dkp_dir, 'libnx') + if not os.path.exists(self.libnx_dir): + ctx.fatal('libnx not found in `%s`. Install libnx!' % self.libnx_dir) + + self.portlibs_dir = os.path.join(self.dkp_dir, 'portlibs', 'switch') + if not os.path.exists(self.portlibs_dir): + ctx.fatal('No Switch libraries found in `%s`!' % self.portlibs_dir) + + def gen_toolchain_prefix(self): + return 'aarch64-none-elf-' + + def gen_gcc_toolchain_path(self): + return os.path.join(self.dka64_dir, 'bin', self.gen_toolchain_prefix()) + + def cc(self): + return self.gen_gcc_toolchain_path() + 'gcc' + + def cxx(self): + return self.gen_gcc_toolchain_path() + 'g++' + + def strip(self): + return self.gen_gcc_toolchain_path() + 'strip' + + def pkgconfig(self): + # counter-intuitively, this motherfucker is in portlibs/switch/bin + return os.path.join(self.portlibs_dir, 'bin', self.gen_toolchain_prefix() + 'pkg-config') + + def cflags(self, cxx = False): + cflags = [] + # arch flags + cflags += ['-D__SWITCH__', '-march=armv8-a+crc+crypto', '-mtune=cortex-a57', '-mtp=soft', '-ftls-model=local-exec', '-fPIE'] + # help the linker out + cflags += ['-ffunction-sections', '-fdata-sections'] + # base include dirs + cflags += ['-isystem %s/include' % self.libnx_dir, '-I%s/include' % self.portlibs_dir] + if cxx: + # while these are supported, they could fuck up the crappy dynamic linker + cflags += ['-fno-exceptions', '-fno-rtti'] + # the game wants GNU extensions + cflags += ['-std=gnu++17', '-D_GNU_SOURCE'] + else: + cflags += ['-std=gnu11', '-D_GNU_SOURCE'] + return cflags + + # they go before object list + def linkflags(self): + linkflags = ['-fPIE', '-specs=%s/switch.specs' % self.libnx_dir] + # libsolder only supports sysv hashes and we need to build everything with -rdynamic + linkflags += ['-Wl,--hash-style=sysv', '-rdynamic'] + # avoid pulling in and exposing mesa's internals, that crashes it for some god forsaken reason + linkflags += ['-Wl,--exclude-libs=libglapi.a', '-Wl,--exclude-libs=libdrm_nouveau.a'] + return linkflags + + def ldflags(self): + # system libraries implicitly require math and C++ standard library + ldflags = ['-lm', '-lstdc++'] + return ldflags + def options(opt): - android = opt.add_option_group('Android options') - android.add_option('--android', action='store', dest='ANDROID_OPTS', default=None, + xc = opt.add_option_group('Cross compile options') + xc.add_option('--android', action='store', dest='ANDROID_OPTS', default=None, help='enable building for android, format: --android=,,, example: --android=armeabi-v7a-hard,4.9,9') - - magx = opt.add_option_group('MotoMAGX options') - magx.add_option('--enable-magx', action = 'store_true', dest = 'MAGX', default = False, - help = 'enable targetting for MotoMAGX phones [default: %default]') + xc.add_option('--enable-magx', action='store_true', dest='MAGX', default=False, + help='enable building for Motorola MAGX [default: %default]') + xc.add_option('--enable-msvc-wine', action='store_true', dest='MSVC_WINE', default=False, + help='enable building with MSVC using Wine [default: %default]') + xc.add_option('--nswitch', action='store_true', dest='NSWITCH', default = False, + help ='enable building for Nintendo Switch [default: %default]') def configure(conf): if conf.options.ANDROID_OPTS: @@ -389,18 +476,42 @@ def configure(conf): conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK/')) conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK/')) conf.msg('... ld flags', ' '.join(android.ldflags()).replace(android.ndk_home, '$NDK/')) - - # conf.env.ANDROID_OPTS = android - conf.env.DEST_OS2 = 'android' elif conf.options.MAGX: # useless to change toolchain path, as toolchain meant to be placed in this path toolchain_path = '/opt/toolchains/motomagx/arm-eabi2/lib/' conf.env.INCLUDES_MAGX = [toolchain_path + i for i in ['ezx-z6/include', 'qt-2.3.8/include']] conf.env.LIBPATH_MAGX = [toolchain_path + i for i in ['ezx-z6/lib', 'qt-2.3.8/lib']] conf.env.LINKFLAGS_MAGX = ['-Wl,-rpath-link=' + i for i in conf.env.LIBPATH_MAGX] + elif conf.options.MSVC_WINE: + try: + toolchain_path = conf.environ['MSVC_WINE_PATH'] + except KeyError: + conf.fatal('Set MSVC_WINE_PATH environment variable to the MSVC toolchain root!') + + conf.environ['CC'] = conf.environ['CXX'] = os.path.join(toolchain_path, 'bin', conf.env.MSVC_TARGETS[0], 'cl') + conf.environ['LINK_CXX'] = os.path.join(toolchain_path, 'bin', conf.env.MSVC_TARGETS[0], 'link') + conf.environ['AR'] = os.path.join(toolchain_path, 'bin', conf.env.MSVC_TARGETS[0], 'lib') + conf.environ['WINRC'] = os.path.join(toolchain_path, 'bin', conf.env.MSVC_TARGETS[0], 'rc') + conf.env.DEST_OS = 'win32' + conf.env.DEST_CPU = conf.env.MSVC_TARGETS[0] + conf.env.COMPILER_CXX = conf.env.COMPILER_CC = 'msvc' + elif conf.options.NSWITCH: + conf.nswitch = nswitch = NintendoSwitch(conf) + conf.environ['CC'] = nswitch.cc() + conf.environ['CXX'] = nswitch.cxx() + conf.environ['STRIP'] = nswitch.strip() + conf.env.PKGCONFIG = nswitch.pkgconfig() + conf.env.CFLAGS += nswitch.cflags() + conf.env.CXXFLAGS += nswitch.cflags(True) + conf.env.LINKFLAGS += nswitch.linkflags() + conf.env.LDFLAGS += nswitch.ldflags() + conf.env.HAVE_M = True + conf.env.LIB_M = ['m'] + conf.env.DEST_OS = 'nswitch' conf.env.MAGX = conf.options.MAGX - MACRO_TO_DESTOS = OrderedDict({ '__ANDROID__' : 'android' }) + conf.env.MSVC_WINE = conf.options.MSVC_WINE + MACRO_TO_DESTOS = OrderedDict({ '__ANDROID__' : 'android', '__SWITCH__' : 'nswitch' }) for k in c_config.MACRO_TO_DESTOS: MACRO_TO_DESTOS[k] = c_config.MACRO_TO_DESTOS[k] # ordering is important c_config.MACRO_TO_DESTOS = MACRO_TO_DESTOS @@ -433,11 +544,17 @@ compiler_cxx_configure = getattr(compiler_cxx, 'configure') compiler_c_configure = getattr(compiler_c, 'configure') def patch_compiler_cxx_configure(conf): - compiler_cxx_configure(conf) + if not conf.env.MSVC_WINE: + compiler_cxx_configure(conf) + else: + conf.load('msvc', funs='no_autodetect') post_compiler_cxx_configure(conf) def patch_compiler_c_configure(conf): - compiler_c_configure(conf) + if not conf.env.MSVC_WINE: + compiler_c_configure(conf) + else: + conf.load('msvc', funs='no_autodetect') post_compiler_c_configure(conf) setattr(compiler_cxx, 'configure', patch_compiler_cxx_configure) diff --git a/wscript b/wscript index c4f85fae..28f80df5 100644 --- a/wscript +++ b/wscript @@ -74,8 +74,10 @@ def configure(conf): conf.load('msvs msdev strip_on_install') if conf.env.DEST_OS == 'android': - conf.options.GOLDSRC = False + conf.options.GOLDSRC = conf.env.GOLDSRC = False conf.env.SERVER_NAME = 'server' # can't be any other name, until specified + elif conf.env.DEST_OS == 'nswitch': + conf.options.GOLDSRC = conf.env.GOLDSRC = False if conf.env.MAGX: enforce_pic = False @@ -148,6 +150,13 @@ def configure(conf): cflags += conf.filter_cflags(compiler_optional_flags + c_compiler_optional_flags, cflags) cxxflags += conf.filter_cxxflags(compiler_optional_flags, cflags) + # on the Switch, allow undefined symbols by default, which is needed for libsolder to work + # additionally, shared libs are linked without libc + if conf.env.DEST_OS == 'nswitch': + linkflags.remove('-Wl,--no-undefined') + conf.env.append_unique('LINKFLAGS_cshlib', ['-nostdlib', '-nostartfiles']) + conf.env.append_unique('LINKFLAGS_cxxshlib', ['-nostdlib', '-nostartfiles']) + conf.env.append_unique('CFLAGS', cflags) conf.env.append_unique('CXXFLAGS', cxxflags) conf.env.append_unique('LINKFLAGS', linkflags) From c6da23892ff5cd297e1cbf75d68b0f172245a94b Mon Sep 17 00:00:00 2001 From: fgsfds Date: Wed, 8 Feb 2023 00:53:45 +0100 Subject: [PATCH 10/14] nswitch: do not link libstdc++ to game libraries --- scripts/waifulib/xcompile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index c39a08eb..e407c603 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -429,8 +429,9 @@ class NintendoSwitch: return linkflags def ldflags(self): - # system libraries implicitly require math and C++ standard library - ldflags = ['-lm', '-lstdc++'] + # NOTE: shared libraries should be built without standard libs, so that they could import their contents from the NRO, + # but executables, including the SDL2 sanity check, will generally require libstdc++ and libm, which we will add manually + ldflags = [] # ['-lm', '-lstdc++'] return ldflags def options(opt): From b01237f698ea3bb5b61365dd1c5e439c49d5f3bd Mon Sep 17 00:00:00 2001 From: fgsfds Date: Wed, 8 Feb 2023 01:01:26 +0100 Subject: [PATCH 11/14] scripts: revert the arm64->aarch64 change --- cmake/LibraryNaming.cmake | 2 +- contrib/iZarif/premake5.lua | 2 +- contrib/iZarif/xash.lua | 2 +- scripts/waifulib/library_naming.py | 2 +- scripts/waifulib/xcompile.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/LibraryNaming.cmake b/cmake/LibraryNaming.cmake index feae5b70..156ab672 100644 --- a/cmake/LibraryNaming.cmake +++ b/cmake/LibraryNaming.cmake @@ -79,7 +79,7 @@ elseif(XASH_X86) set(BUILDARCH "i386") endif() elseif(XASH_ARM AND XASH_64BIT) - set(BUILDARCH "aarch64") + set(BUILDARCH "arm64") elseif(XASH_ARM) set(BUILDARCH "armv") if(XASH_ARMv8) diff --git a/contrib/iZarif/premake5.lua b/contrib/iZarif/premake5.lua index 55e438ea..91817da5 100644 --- a/contrib/iZarif/premake5.lua +++ b/contrib/iZarif/premake5.lua @@ -55,7 +55,7 @@ newoption{trigger = "lto", description = "Enable Link Time Optimization", defaul newoption{trigger = "arch", description = "Destination arch", default = xash.get_arch(), allowed = { {"amd64", ""}, {"x86", ""}, - {"aarch64", ""}, + {"arm64", ""}, {"armv8_32l", ""}, {"armv7l", ""}, {"armv6l", ""}, diff --git a/contrib/iZarif/xash.lua b/contrib/iZarif/xash.lua index a94febb3..0388602d 100644 --- a/contrib/iZarif/xash.lua +++ b/contrib/iZarif/xash.lua @@ -89,7 +89,7 @@ function m.get_arch() arch = "x86" elseif m.is_cxx_symbol_defined("XASH_ARM", {"build.h"}, {"public"}) then if m.is_cxx_symbol_defined("XASH_64BIT", {"build.h"}, {"public"}) then - arch = "aarch64" + arch = "arm64" else arch = "armv" diff --git a/scripts/waifulib/library_naming.py b/scripts/waifulib/library_naming.py index de508625..3709bc76 100644 --- a/scripts/waifulib/library_naming.py +++ b/scripts/waifulib/library_naming.py @@ -107,7 +107,7 @@ def configure(conf): else: buildarch = "i386" elif conf.env.XASH_ARM and conf.env.XASH_64BIT: - buildarch = "aarch64" + buildarch = "arm64" elif conf.env.XASH_ARM: buildarch = "armv" if conf.env.XASH_ARMv8: diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index e407c603..51d8ec87 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -352,7 +352,7 @@ class Android: class NintendoSwitch: ctx = None # waf context - arch = "aarch64" + arch = "arm64" dkp_dir = None portlibs_dir = None dka64_dir = None From 0c1868f17e14dfd4cd7e7d40b8eaf1adba4f7c90 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Wed, 8 Feb 2023 19:39:29 +0100 Subject: [PATCH 12/14] readme: include nswitch build instructions --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index 3f7e36a6..6bd77f0e 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,39 @@ schroot --chroot jessie -- cmake --build build-in-chroot TODO +## Nintendo Switch + +### Prerequisites + +1. Set up [`dkp-pacman`](https://devkitpro.org/wiki/devkitPro_pacman). +2. Install dependency packages: +``` +sudo dkp-pacman -S switch-dev dkp-toolchain-vars switch-mesa switch-libdrm_nouveau switch-sdl2 +``` +3. Make sure the `DEVKITPRO` environment variable is set to the devkitPro SDK root: +``` +export DEVKITPRO=/opt/devkitpro +``` +4. Install libsolder: +``` +source $DEVKITPRO/switchvars.sh +git clone https://github.com/fgsfdsfgs/libsolder.git +make -C libsolder install +``` + +### Building using CMake +``` +mkdir build && cd build +aarch64-none-elf-cmake -G"Unix Makefiles" -DCMAKE_PROJECT_HLSDK-PORTABLE_INCLUDE="$DEVKITPRO/portlibs/switch/share/SolderShim.cmake" .. +make -j +``` + +### Building using waf +``` +./waf configure -T release --nswitch +./waf build +``` + ## Other platforms Building on other Unix-like platforms (e.g. FreeBSD) is supported. From d11f853464ee5d951e25ce9d0eea001780b92196 Mon Sep 17 00:00:00 2001 From: Andrey Akhmichin <15944199+nekonomicon@users.noreply.github.com> Date: Wed, 22 Feb 2023 00:42:23 +0500 Subject: [PATCH 13/14] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6bd77f0e..8797f054 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ git clone --recursive https://github.com/FWGS/hlsdk-portable # Build Instructions -## Windows +## Windows x86. ### Prerequisites @@ -131,7 +131,7 @@ cmake -G "Visual Studio 16 2019" -A Win32 -B build After the configuration step, `HLSDK-PORTABLE.sln` should appear in the `build` directory. You can open this solution in Visual Studio and continue developing there. -## Windows. Using Microsoft Visual Studio 6 +## Windows x86. Using Microsoft Visual Studio 6 Microsoft Visual Studio 6 is very old, but if you still have it installed, you can use it to build this hlsdk. There are no project files, but two `.bat` files, for server and client libraries. They require variable **MSVCDir** to be set to the installation path of Visual Studio: @@ -142,7 +142,7 @@ cd dlls && compile.bat && cd ../cl_dll && compile.bat `hl.dll` and `client.dll` will appear in `dlls/` and `cl_dll/` diretories. The libraries built with msvc6 should be compatible with Windows XP. -## Linux. Using Steam Runtime in chroot +## Linux x86. Portable steam-compatible build using Steam Runtime in chroot ### Prerequisites @@ -168,7 +168,7 @@ schroot --chroot steamrt_scout_i386 -- cmake -B build-in-steamrt -S . schroot --chroot steamrt_scout_i386 -- cmake --build build-in-steamrt ``` -## Linux. Build without Steam Runtime +## Linux x86. Portable steam-compatible build without Steam Runtime ### Prerequisites @@ -190,7 +190,7 @@ cmake .. -DCMAKE_C_FLAGS="-static-libstdc++ -static-libgcc" ``` To ensure portability it's still better to build using Steam Runtime or another chroot of some older distro. -## Linux. Build in your own chroot +## Linux x86. Portable steam-compatible build in your own chroot ### Prerequisites @@ -272,11 +272,11 @@ make -j ## Other platforms -Building on other Unix-like platforms (e.g. FreeBSD) is supported. +Building on other architectures (e.g x86_64 or arm) and POSIX-compliant OSes (e.g. FreeBSD) is supported. ### Prerequisites -Install C and C++ compilers (like gcc or clang), cmake and make (or gmake) +Install C and C++ compilers (like gcc or clang), cmake and make. ### Building From ad6fb5fe075667fcb5c2cb907898420e9a4827d6 Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Thu, 2 Mar 2023 17:09:09 +0300 Subject: [PATCH 14/14] Fix crash on older GoldSource versions that didn't have m_rawinput cvar (#357) --- cl_dll/input_goldsource.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cl_dll/input_goldsource.cpp b/cl_dll/input_goldsource.cpp index 615cb3d6..89408423 100644 --- a/cl_dll/input_goldsource.cpp +++ b/cl_dll/input_goldsource.cpp @@ -386,7 +386,7 @@ void IN_SetMouseMode(bool enable) if (mouseparmsvalid) restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0); - m_bRawInput = m_rawinput->value != 0; + m_bRawInput = m_rawinput && m_rawinput->value != 0; if(m_bRawInput) { #if USE_SDL2 @@ -788,7 +788,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY) bool lockEntered = MouseThread_ActiveLock_Enter(); - m_bRawInput = m_rawinput->value != 0; + m_bRawInput = m_rawinput && m_rawinput->value != 0; if(m_bRawInput && !isMouseRelative) { @@ -1573,7 +1573,7 @@ void GoldSourceInput::IN_Init (void) #if _WIN32 m_rawinput = gEngfuncs.pfnGetCvarPointer("m_rawinput"); - m_bRawInput = m_rawinput->value != 0; + m_bRawInput = m_rawinput && m_rawinput->value != 0; m_bMouseThread = gEngfuncs.CheckParm ("-mousethread", NULL ) != NULL; m_mousethread_sleep = gEngfuncs.pfnRegisterVariable ( "m_mousethread_sleep", "1", FCVAR_ARCHIVE ); // default to less than 1000 Hz