Night Owl 6 years ago
parent
commit
4b636e1ce3
  1. 1
      .travis.yml
  2. 45
      CMakeLists.txt
  3. 14
      README.md
  4. 28
      appveyor.yml
  5. 2
      cl_dll/Android.mk
  6. 27
      cl_dll/CMakeLists.txt
  7. 2
      cl_dll/GameStudioModelRenderer.cpp
  8. 2
      cl_dll/GameStudioModelRenderer.h
  9. 2
      cl_dll/GameStudioModelRenderer_Sample.cpp
  10. 2
      cl_dll/GameStudioModelRenderer_Sample.h
  11. 2
      cl_dll/StudioModelRenderer.cpp
  12. 2
      cl_dll/StudioModelRenderer.h
  13. 2
      cl_dll/camera.h
  14. 17
      cl_dll/cdll_int.cpp
  15. 3
      cl_dll/cl_util.h
  16. 2
      cl_dll/demo.h
  17. 2
      cl_dll/entity.cpp
  18. 2
      cl_dll/ev_hldm.h
  19. 2
      cl_dll/events.cpp
  20. 2
      cl_dll/eventscripts.h
  21. 3
      cl_dll/flashlight.cpp
  22. 2
      cl_dll/health.cpp
  23. 16
      cl_dll/hud.cpp
  24. 2
      cl_dll/hud.h
  25. 2
      cl_dll/hud_iface.h
  26. 11
      cl_dll/hud_msg.cpp
  27. 2
      cl_dll/hud_redraw.cpp
  28. 2
      cl_dll/hud_servers.cpp
  29. 2
      cl_dll/hud_servers.h
  30. 2
      cl_dll/hud_servers_priv.h
  31. 2
      cl_dll/hud_spectator.cpp
  32. 2
      cl_dll/hud_spectator.h
  33. 2
      cl_dll/in_camera.cpp
  34. 2
      cl_dll/in_defs.h
  35. 2
      cl_dll/input.cpp
  36. 4
      cl_dll/input_goldsource.cpp
  37. 2
      cl_dll/input_mouse.cpp
  38. 2
      cl_dll/kbutton.h
  39. 2
      cl_dll/overview.cpp
  40. 2
      cl_dll/overview.h
  41. 67
      cl_dll/scoreboard.cpp
  42. 2
      cl_dll/studio_util.cpp
  43. 2
      cl_dll/studio_util.h
  44. 8
      cl_dll/text_message.cpp
  45. 2
      cl_dll/tri.cpp
  46. 2
      cl_dll/view.cpp
  47. 2
      cl_dll/view.h
  48. 29
      cmake/VSForceXPToolchain.cmake
  49. 18
      dlls/CMakeLists.txt
  50. 2
      dlls/cbase.h
  51. 4
      dlls/client.cpp
  52. 8
      dlls/lights.cpp
  53. 3
      dlls/monsters.cpp
  54. 8
      dlls/multiplay_gamerules.cpp
  55. 29
      dlls/player.cpp
  56. 2
      dlls/playermonster.cpp
  57. 84
      dlls/sound.cpp
  58. 2
      dlls/squad.h
  59. 2
      dlls/stats.cpp
  60. 2
      dlls/util.cpp
  61. 2
      dlls/util.h
  62. 3
      dlls/world.cpp
  63. 16
      engine/mobility_int.h
  64. 2
      pm_shared/pm_movevars.h
  65. 17
      pm_shared/pm_shared.c
  66. 1
      utils/false_vgui/include/VGUI_Panel.h
  67. 845
      utils/makefont/makefont.cpp
  68. 138
      utils/makefont/makefont.dsp
  69. 3
      utils/makefont/winebuild.sh

1
.travis.yml

@ -22,3 +22,4 @@ script: @@ -22,3 +22,4 @@ script:
- cp dlls/hl.* $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC/dlls
- tar -J -cf $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC.txz $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC
- curl --upload-file $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC.txz https://transfer.sh/$TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC.txz

45
CMakeLists.txt

@ -21,17 +21,25 @@ @@ -21,17 +21,25 @@
#
cmake_minimum_required(VERSION 2.6.0)
# Install custom module path
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
include(VSForceXPToolchain) # Force XP toolchain for Visual Studio
project (HLSDK-XASH3D)
#--------------
# USER DEFINES \
################\
option(64BIT "Allow 64 Bit builds" OFF)
option(USE_VGUI "Enable VGUI1. UNDONE" OFF)
option(USE_VGUI2 "Enable VGUI2. UNDONE" OFF)
option(USE_VOICEMGR "Enable VOICE MANAGER." OFF)
option(BUILD_CLIENT "Build client dll" ON)
option(BUILD_SERVER "Build server dll" ON)
option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" OFF)
option(64BIT "Disable auto -m32 appending to compiler flags" OFF)
set(GAMEDIR "valve" CACHE STRING "Gamedir path")
set(SERVER_INSTALL_DIR "dlls" CACHE STRING "Where put server dll")
set(CLIENT_INSTALL_DIR "cl_dlls" CACHE STRING "Where put client dll")
@ -43,15 +51,40 @@ set(SERVER_LIBRARY_NAME "hl" CACHE STRING "Library name for Linux/MacOS/Windows" @@ -43,15 +51,40 @@ set(SERVER_LIBRARY_NAME "hl" CACHE STRING "Library name for Linux/MacOS/Windows"
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
# Build 32-bit Xash on 64-bit, because Xash3D not support this
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT 64BIT)
if(MSVC)
error("UNDONE: set 32 build flags")
error("UNDONE: set 32 build flags")
else()
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
endif()
set(CMAKE_SIZEOF_VOID_P 4)
endif()
if(64BIT AND CMAKE_SIZEOF_VOID_P EQUAL 4)
message(FATAL_ERROR "You enabled XASH_64BIT, but compiler can't create 64 bit code!")
endif()
if(64BIT)
message(STATUS "Building for 64 Bit")
else()
message(STATUS "Building for 32 Bit")
endif()
if (MINGW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--add-stdcall-alias")
endif()
# add_compile_options for older cmake versions
if(${CMAKE_VERSION} VERSION_LESS "3.0.2")
macro(add_compile_options)
set(list_var "${ARGV}")
foreach(arg IN LISTS list_var)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${arg}")
endforeach()
endmacro()
endif()
if(BUILD_CLIENT)

14
README.md

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
# Half-Life SDK for Xash3D [![Build Status](https://travis-ci.org/FWGS/hlsdk-xash3d.svg)](https://travis-ci.org/FWGS/hlsdk-xash3d)
# Half-Life SDK for Xash3D [![Build Status](https://travis-ci.org/FWGS/hlsdk-xash3d.svg)](https://travis-ci.org/FWGS/hlsdk-xash3d) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/FWGS/hlsdk-xash3d?svg=true)](https://ci.appveyor.com/project/a1batross/hlsdk-xash3d)
Half-Life SDK for Xash3D & GoldSource with some fixes.
@ -10,6 +10,12 @@ Half-Life SDK for Xash3D & GoldSource with some fixes. @@ -10,6 +10,12 @@ Half-Life SDK for Xash3D & GoldSource with some fixes.
cmake ../
make
Crosscompiling using mingw:
mkdir build-mingw && cd build-mingw
TOOLCHAIN_PREFIX=i686-w64-mingw32 # check up the actual mingw prefix of your mingw installation
cmake ../ -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER="$TOOLCHAIN_PREFIX-gcc" -DCMAKE_CXX_COMPILER="$TOOLCHAIN_PREFIX-g++"
You may enable or disable some build options by -Dkey=value. All available build options are defined in CMakeLists.txt at root directory.
See below if you want to build the GoldSource compatible libraries.
@ -31,7 +37,7 @@ These scripts also can be ran via wine: @@ -31,7 +37,7 @@ These scripts also can be ran via wine:
The libraries built this way are always GoldSource compatible.
There're dsp projects for MVS 6 in `cl_dll` and `dlls` directories, but we don't keep them up-to-date. You're free to adapt them for yourself and try to import into the newer MVS versions.
There're dsp projects for Visual Studio 6 in `cl_dll` and `dlls` directories, but we don't keep them up-to-date. You're free to adapt them for yourself and try to import into the newer Visual Studio versions.
#### Using mingw
@ -44,7 +50,7 @@ TODO @@ -44,7 +50,7 @@ TODO
### OS X
TODO
Nothing here.
### FreeBSD
@ -68,6 +74,8 @@ or when using make without cmake: @@ -68,6 +74,8 @@ or when using make without cmake:
Unlike original client by Valve the resulting client library will not depend on vgui or SDL2 just like the one that's used in FWGS Xash3d.
Note for **Windows**: it's not possible to create GoldSource compatible libraries using mingw, only msvc builds will work.
Note for **Linux**: GoldSource requires libraries (both client and server) to be compiled with libstdc++ bundled with g++ of major version 4 (versions from 4.6 to 4.9 should work).
If your Linux distribution does not provide compatible g++ version you have several options.

28
appveyor.yml

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
version: 1.0.{build}
branches:
only:
- master
environment:
matrix:
- os: Visual Studio 2013
GENERATOR_NAME: "Visual Studio 12 2013"
- os: Visual Studio 2015
GENERATOR_NAME: "Visual Studio 14 2015"
# TODO: Uncomment when AppVeyor will provide XP toolchain for VS2017
# - os: Visual Studio 2017
# GENERATOR_NAME: "Visual Studio 15 2017"
clone_folder: c:\projects\xash\hlsdk-xash3d
build:
project: INSTALL.vcxproj
verbosity: normal
configuration:
- Debug
before_build:
- git submodule update --init --recursive
- cmake -G "%GENERATOR_NAME%"

2
cl_dll/Android.mk

@ -78,7 +78,7 @@ SRCS+=./input_xash3d.cpp @@ -78,7 +78,7 @@ SRCS+=./input_xash3d.cpp
SRCS+=./scoreboard.cpp
SRCS+=./MOTD.cpp
INCLUDES = -I../common -I. -I../game_shared -I../pm_shared -I../engine -I../dlls -I../utils/false_vgui/include
DEFINES = -Wno-write-strings -DLINUX -D_LINUX -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -DCLIENT_DLL -w
DEFINES = -Wno-write-strings -DLINUX -D_LINUX -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -DCLIENT_DLL -w -D_snprintf=snprintf
LOCAL_C_INCLUDES := $(LOCAL_PATH)/. \
$(LOCAL_PATH)/../common \

27
cl_dll/CMakeLists.txt

@ -25,11 +25,25 @@ project (CLDLL) @@ -25,11 +25,25 @@ project (CLDLL)
set (CLDLL_LIBRARY client)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-write-strings -DLINUX -D_LINUX -Dstricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -DCLIENT_DLL -w")
add_definitions(-DCLIENT_DLL)
if(NOT MSVC)
add_compile_options(-fno-exceptions) # GCC/Clang flag
add_compile_options(-Wno-write-strings) # GCC/Clang flag
add_compile_options(-fvisibility=hidden) # GCC/Clang flag
add_definitions(-D_LINUX -DLINUX) # It seems enough for all non-Win32 systems
add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp)
if(NOT MINGW)
add_definitions(-D_snprintf=snprintf -D_vsnprintf=vsnprintf)
endif()
else()
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
endif()
if (GOLDSOURCE_SUPPORT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGOLDSOURCE_SUPPORT")
add_definitions(-DGOLDSOURCE_SUPPORT)
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
set (CLDLL_SOURCES
ev_hldm.cpp
@ -100,8 +114,13 @@ set_target_properties (${CLDLL_LIBRARY} PROPERTIES @@ -100,8 +114,13 @@ set_target_properties (${CLDLL_LIBRARY} PROPERTIES
POSITION_INDEPENDENT_CODE 1)
if(APPLE OR WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
set(CLDLL_NAME "client")
if(64BIT)
set(CLDLL_NAME "client64")
endif()
set_target_properties(${CLDLL_LIBRARY} PROPERTIES
OUTPUT_NAME "client"
OUTPUT_NAME ${CLDLL_NAME}
PREFIX "")
endif()

2
cl_dll/GameStudioModelRenderer.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/GameStudioModelRenderer.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/GameStudioModelRenderer_Sample.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/GameStudioModelRenderer_Sample.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/StudioModelRenderer.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/StudioModelRenderer.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/camera.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

17
cl_dll/cdll_int.cpp

@ -376,7 +376,22 @@ void DLLEXPORT HUD_MobilityInterface( mobile_engfuncs_t *gpMobileEngfuncs ) @@ -376,7 +376,22 @@ void DLLEXPORT HUD_MobilityInterface( mobile_engfuncs_t *gpMobileEngfuncs )
gMobileEngfuncs = gpMobileEngfuncs;
}
bool isXashFWGS()
bool HUD_MessageBox( const char *msg )
{
gEngfuncs.Con_Printf( msg ); // just in case
if( IsXashFWGS() )
{
gMobileEngfuncs->pfnSys_Warn( msg );
return true;
}
// TODO: Load SDL2 and call ShowSimpleMessageBox
return false;
}
bool IsXashFWGS()
{
return gMobileEngfuncs != NULL;
}

3
cl_dll/cl_util.h

@ -181,5 +181,6 @@ inline void UnpackRGB( int &r, int &g, int &b, unsigned long ulRGB )\ @@ -181,5 +181,6 @@ inline void UnpackRGB( int &r, int &g, int &b, unsigned long ulRGB )\
HSPRITE LoadSprite( const char *pszName );
bool isXashFWGS();
bool HUD_MessageBox( const char *msg );
bool IsXashFWGS();
#endif

2
cl_dll/demo.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/entity.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/ev_hldm.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/events.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/eventscripts.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

3
cl_dll/flashlight.cpp

@ -108,6 +108,9 @@ int CHudFlashlight::Draw( float flTime ) @@ -108,6 +108,9 @@ int CHudFlashlight::Draw( float flTime )
int r, g, b, x, y, a;
wrect_t rc;
if( gEngfuncs.IsSpectateOnly() )
return 1;
if( !( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_SUIT ) ) ) )
return 1;

2
cl_dll/health.cpp

@ -231,6 +231,8 @@ int CHudHealth::Draw( float flTime ) @@ -231,6 +231,8 @@ int CHudHealth::Draw( float flTime )
int iHeight = gHUD.m_iFontHeight;
int iWidth = HealthWidth / 10;
UnpackRGB( r, g, b, RGB_YELLOWISH );
FillRGBA( x, y, iWidth, iHeight, r, g, b, a );
}

16
cl_dll/hud.cpp

@ -381,6 +381,18 @@ void CHud::VidInit( void ) @@ -381,6 +381,18 @@ void CHud::VidInit( void )
// assumption: number_1, number_2, etc, are all listed and loaded sequentially
m_HUD_number_0 = GetSpriteIndex( "number_0" );
if( m_HUD_number_0 == -1 )
{
const char *msg = "There is something wrong with your game data! Please, reinstall\n";
if( HUD_MessageBox( msg ) )
{
gEngfuncs.pfnClientCmd( "quit\n" );
}
return;
}
m_iFontHeight = m_rgrcRects[m_HUD_number_0].bottom - m_rgrcRects[m_HUD_number_0].top;
m_Ammo.VidInit();
@ -513,10 +525,6 @@ int CHud::MsgFunc_SetFOV( const char *pszName, int iSize, void *pbuf ) @@ -513,10 +525,6 @@ int CHud::MsgFunc_SetFOV( const char *pszName, int iSize, void *pbuf )
int newfov = READ_BYTE();
int def_fov = CVAR_GET_FLOAT( "default_fov" );
//Weapon prediction already takes care of changing the fog. ( g_lastFOV ).
//if( cl_lw && cl_lw->value )
// return 1;
g_lastFOV = newfov;
if( newfov == 0 )

2
cl_dll/hud.h

@ -230,7 +230,7 @@ public: @@ -230,7 +230,7 @@ public:
void InitHUDData( void );
int VidInit( void );
int Draw( float flTime );
int DrawPlayers( int xoffset, float listslot, int nameoffset = 0, char *team = NULL ); // returns the ypos where it finishes drawing
int DrawPlayers( int xoffset, float listslot, int nameoffset = 0, const char *team = NULL ); // returns the ypos where it finishes drawing
void UserCmd_ShowScores( void );
void UserCmd_HideScores( void );
int MsgFunc_ScoreInfo( const char *pszName, int iSize, void *pbuf );

2
cl_dll/hud_iface.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

11
cl_dll/hud_msg.cpp

@ -23,6 +23,7 @@ @@ -23,6 +23,7 @@
#define MAX_CLIENTS 32
extern float g_lastFOV; // Vit_amiN
/// USER-DEFINED SERVER MESSAGE HANDLERS
@ -46,6 +47,10 @@ int CHud::MsgFunc_ResetHUD( const char *pszName, int iSize, void *pbuf ) @@ -46,6 +47,10 @@ int CHud::MsgFunc_ResetHUD( const char *pszName, int iSize, void *pbuf )
// reset concussion effect
m_iConcussionEffect = 0;
// Vit_amiN: reset the FOV
m_iFOV = 0; // default_fov
g_lastFOV = 0.0f;
return 1;
}
@ -102,10 +107,14 @@ int CHud::MsgFunc_Damage( const char *pszName, int iSize, void *pbuf ) @@ -102,10 +107,14 @@ int CHud::MsgFunc_Damage( const char *pszName, int iSize, void *pbuf )
int CHud::MsgFunc_Concuss( const char *pszName, int iSize, void *pbuf )
{
int r, g, b;
BEGIN_READ( pbuf, iSize );
m_iConcussionEffect = READ_BYTE();
if( m_iConcussionEffect )
this->m_StatusIcons.EnableIcon( "dmg_concuss", 255, 160, 0 );
{
UnpackRGB( r, g, b, RGB_YELLOWISH ); // Vit_amiN: fixed
this->m_StatusIcons.EnableIcon( "dmg_concuss", r, g, b );
}
else
this->m_StatusIcons.DisableIcon( "dmg_concuss" );
return 1;

2
cl_dll/hud_redraw.cpp

@ -235,7 +235,7 @@ int CHud::DrawHudString( int xpos, int ypos, int iMaxX, const char *szIt, int r, @@ -235,7 +235,7 @@ int CHud::DrawHudString( int xpos, int ypos, int iMaxX, const char *szIt, int r,
int DrawUtfString( int xpos, int ypos, int iMaxX, const char *szIt, int r, int g, int b )
{
if (isXashFWGS())
if (IsXashFWGS())
{
// xash3d: reset unicode state
gEngfuncs.pfnVGUI2DrawCharacterAdditive( 0, 0, 0, 0, 0, 0, 0 );

2
cl_dll/hud_servers.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/hud_servers.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/hud_servers_priv.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/hud_spectator.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/hud_spectator.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/in_camera.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/in_defs.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/input.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

4
cl_dll/input_goldsource.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//
@ -1368,7 +1368,7 @@ void IN_JoyMove ( float frametime, usercmd_t *cmd ) @@ -1368,7 +1368,7 @@ void IN_JoyMove ( float frametime, usercmd_t *cmd )
// y=ax^b; where a = 300 and b = 1.3
// also x values are in increments of 800 (so this is factored out)
// then bounds check result to level out excessively high spin rates
fTemp = 300.0 * pow(abs(fAxisValue) / 800.0, 1.3);
fTemp = 300.0 * pow(fabs(fAxisValue) / 800.0, 1.3);
if (fTemp > 14000.0)
fTemp = 14000.0;
// restore direction information

2
cl_dll/input_mouse.cpp

@ -69,7 +69,7 @@ void IN_Shutdown( void ) @@ -69,7 +69,7 @@ void IN_Shutdown( void )
void IN_Init( void )
{
#ifdef SUPPORT_GOLDSOURCE_INPUT
if (isXashFWGS()) {
if (IsXashFWGS()) {
gEngfuncs.Con_Printf( "FWGS Xash3D input is in use\n" );
currentInput = &fwgsInput;
} else {

2
cl_dll/kbutton.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/overview.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/overview.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

67
cl_dll/scoreboard.cpp

@ -92,17 +92,18 @@ We have a minimum width of 1-320 - we could have the field widths scale with it? @@ -92,17 +92,18 @@ We have a minimum width of 1-320 - we could have the field widths scale with it?
// X positions
// relative to the side of the scoreboard
#define NAME_RANGE_MIN -65
#define NAME_RANGE_MAX 180
#define KILLS_RANGE_MIN 165
#define KILLS_RANGE_MAX 205
#define DIVIDER_POS 215
#define DEATHS_RANGE_MIN 220
#define DEATHS_RANGE_MAX 245
#define PING_RANGE_MIN 280
#define PING_RANGE_MAX 330
#define PL_RANGE_MIN 350
#define PL_RANGE_MAX 410
#define NAME_RANGE_MIN 20
#define NAME_RANGE_MAX 145
#define NAME_RANGE_MODIFIER 120
#define KILLS_RANGE_MIN 130
#define KILLS_RANGE_MAX 170
#define DIVIDER_POS 180
#define DEATHS_RANGE_MIN 185
#define DEATHS_RANGE_MAX 210
#define PING_RANGE_MIN 245
#define PING_RANGE_MAX 295
#define PL_RANGE_MIN 315
#define PL_RANGE_MAX 375
int SCOREBOARD_WIDTH = 320;
@ -128,11 +129,11 @@ int CHudScoreboard::Draw( float fTime ) @@ -128,11 +129,11 @@ int CHudScoreboard::Draw( float fTime )
if( cl_showpacketloss && cl_showpacketloss->value && ( ScreenWidth >= 400 ) )
{
can_show_packetloss = 1;
SCOREBOARD_WIDTH = 400;
SCOREBOARD_WIDTH = ( ScreenWidth >= 520 ) ? ( 400 - NAME_RANGE_MODIFIER ) : 400;
}
else
{
SCOREBOARD_WIDTH = 320;
SCOREBOARD_WIDTH = ( ScreenWidth >= 440 ) ? ( 320 - NAME_RANGE_MODIFIER ) : 320;
}
// just sort the list on the fly
@ -145,7 +146,14 @@ int CHudScoreboard::Draw( float fTime ) @@ -145,7 +146,14 @@ int CHudScoreboard::Draw( float fTime )
int xpos = NAME_RANGE_MIN + xpos_rel;
FAR_RIGHT = can_show_packetloss ? PL_RANGE_MAX : PING_RANGE_MAX;
FAR_RIGHT += 125;
FAR_RIGHT += 5;
if( ( ScreenWidth >= 440 && !can_show_packetloss ) || ( ScreenWidth >= 520 && can_show_packetloss ) )
{
xpos -= NAME_RANGE_MODIFIER;
FAR_RIGHT += NAME_RANGE_MODIFIER;
}
if( cl_scoreboard_bg && cl_scoreboard_bg->value )
gHUD.DrawDarkRectangle( xpos - 5, ypos - 5, FAR_RIGHT, ROW_RANGE_MAX );
if( !gHUD.m_Teamplay )
@ -165,7 +173,7 @@ int CHudScoreboard::Draw( float fTime ) @@ -165,7 +173,7 @@ int CHudScoreboard::Draw( float fTime )
list_slot += 1.2;
ypos = ROW_RANGE_MIN + ( list_slot * ROW_GAP );
xpos = NAME_RANGE_MIN + xpos_rel;
// xpos = NAME_RANGE_MIN + xpos_rel;
FillRGBA( xpos - 4, ypos, FAR_RIGHT -2, 1, 255, 140, 0, 255 ); // draw the seperator line
list_slot += 0.8;
@ -266,12 +274,18 @@ int CHudScoreboard::Draw( float fTime ) @@ -266,12 +274,18 @@ int CHudScoreboard::Draw( float fTime )
break;
xpos = NAME_RANGE_MIN + xpos_rel;
if( ( ScreenWidth >= 440 && !can_show_packetloss ) || ( ScreenWidth >= 520 && can_show_packetloss ) )
{
xpos -= NAME_RANGE_MODIFIER;
}
int r = 255, g = 225, b = 55; // draw the stuff kinda yellowish
if( team_info->ownteam ) // if it is their team, draw the background different color
{
// overlay the background in blue, then draw the score text over it
FillRGBA( NAME_RANGE_MIN + xpos_rel - 5, ypos, FAR_RIGHT, ROW_GAP, 0, 0, 255, 70 );
FillRGBA( xpos - 5, ypos, FAR_RIGHT, ROW_GAP, 0, 0, 255, 70 );
}
// draw their name (left to right)
@ -323,7 +337,7 @@ int CHudScoreboard::Draw( float fTime ) @@ -323,7 +337,7 @@ int CHudScoreboard::Draw( float fTime )
extern float *GetClientColor( int client );
// returns the ypos where it finishes drawing
int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset, char *team )
int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset, const char *team )
{
int can_show_packetloss = 0;
int FAR_RIGHT;
@ -340,7 +354,12 @@ int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset, @@ -340,7 +354,12 @@ int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset,
}
FAR_RIGHT = can_show_packetloss ? PL_RANGE_MAX : PING_RANGE_MAX;
FAR_RIGHT += 125;
FAR_RIGHT += 5;
if( ( ScreenWidth >= 440 && !can_show_packetloss ) || ( ScreenWidth >= 520 && can_show_packetloss ) )
{
FAR_RIGHT += NAME_RANGE_MODIFIER;
}
// draw the players, in order, and restricted to team if set
while( 1 )
@ -380,6 +399,12 @@ int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset, @@ -380,6 +399,12 @@ int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset,
break;
int xpos = NAME_RANGE_MIN + xpos_rel;
if( ( ScreenWidth >= 440 && !can_show_packetloss ) || ( ScreenWidth >= 520 && can_show_packetloss ) )
{
xpos -= NAME_RANGE_MODIFIER;
}
int r = 255, g = 255, b = 255;
float *colors = GetClientColor( best_player );
r *= colors[0], g *= colors[1], b *= colors[2];
@ -388,18 +413,18 @@ int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset, @@ -388,18 +413,18 @@ int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset,
if( pl_info->thisplayer )
{
// green is the suicide color? i wish this could do grey...
FillRGBA( NAME_RANGE_MIN + xpos_rel - 5, ypos, FAR_RIGHT, ROW_GAP, 80, 155, 0, 70 );
FillRGBA( xpos - 5, ypos, FAR_RIGHT, ROW_GAP, 80, 155, 0, 70 );
}
else
{
// Highlight the killers name - overlay the background in red, then draw the score text over it
FillRGBA( NAME_RANGE_MIN + xpos_rel - 5, ypos, FAR_RIGHT, ROW_GAP, 255, 0, 0, ( (float)15 * (float)( m_fLastKillTime - gHUD.m_flTime ) ) );
FillRGBA( xpos - 5, ypos, FAR_RIGHT, ROW_GAP, 255, 0, 0, ( (float)15 * (float)( m_fLastKillTime - gHUD.m_flTime ) ) );
}
}
else if( pl_info->thisplayer ) // if it is their name, draw it a different color
{
// overlay the background in blue, then draw the score text over it
FillRGBA( NAME_RANGE_MIN + xpos_rel - 5, ypos, FAR_RIGHT, ROW_GAP, 0, 0, 255, 70 );
FillRGBA( xpos - 5, ypos, FAR_RIGHT, ROW_GAP, 0, 0, 255, 70 );
}
// draw their name (left to right)

2
cl_dll/studio_util.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/studio_util.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

8
cl_dll/text_message.cpp

@ -181,20 +181,20 @@ int CHudTextMessage::MsgFunc_TextMsg( const char *pszName, int iSize, void *pbuf @@ -181,20 +181,20 @@ int CHudTextMessage::MsgFunc_TextMsg( const char *pszName, int iSize, void *pbuf
switch( msg_dest )
{
case HUD_PRINTCENTER:
snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
_snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
CenterPrint( ConvertCRtoNL( psz ) );
break;
case HUD_PRINTNOTIFY:
psz[0] = 1; // mark this message to go into the notify buffer
snprintf( psz + 1, MSG_BUF_SIZE - 1, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
_snprintf( psz + 1, MSG_BUF_SIZE - 1, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
ConsolePrint( ConvertCRtoNL( psz ) );
break;
case HUD_PRINTTALK:
snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
_snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
gHUD.m_SayText.SayTextPrint( ConvertCRtoNL( psz ), MSG_BUF_SIZE );
break;
case HUD_PRINTCONSOLE:
snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
_snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
ConsolePrint( ConvertCRtoNL( psz ) );
break;
}

2
cl_dll/tri.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/view.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

2
cl_dll/view.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

29
cmake/VSForceXPToolchain.cmake

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
if(WIN32)
# Windows XP compatible platform toolset. Must be set before project(),
# otherwise change of CMAKE_*_TOOLSET will take no effect.
# We get VS version from the generator name because neither MSVC* nor other
# variables that describe the compiler aren't available before project().
if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio ([0-9]+)")
if(${CMAKE_MATCH_1} LESS 11)
# Nothing. Older VS does support XP by default.
elseif(${CMAKE_MATCH_1} EQUAL 11)
# Visual Studio 11 2012
set(CMAKE_GENERATOR_TOOLSET "v110_xp" CACHE STRING "CMAKE_GENERATOR_TOOLSET" FORCE)
set(CMAK_VS_PLATFORM_TOOLSET "v110_xp" CACHE STRING "CMAKE_VS_PLATFORM_TOOLSET" FORCE)
elseif (${CMAKE_MATCH_1} EQUAL 12)
# Visual Studio 12 2013
set(CMAKE_GENERATOR_TOOLSET "v120_xp" CACHE STRING "CMAKE_GENERATOR_TOOLSET" FORCE)
set(CMAKE_VS_PLATFORM_TOOLSET "v120_xp" CACHE STRING "CMAKE_VS_PLATFORM_TOOLSET" FORCE)
elseif (${CMAKE_MATCH_1} EQUAL 14)
# Visual Studio 14 2015
set(CMAKE_GENERATOR_TOOLSET "v140_xp" CACHE STRING "CMAKE_GENERATOR_TOOLSET" FORCE)
set(CMAKE_VS_PLATFORM_TOOLSET "v140_xp" CACHE STRING "CMAKE_VS_PLATFORM_TOOLSET" FORCE)
elseif (${CMAKE_MATCH_1} EQUAL 15)
# Visual Studio 15 2017
set(CMAKE_GENERATOR_TOOLSET "v141_xp" CACHE STRING "CMAKE_GENERATOR_TOOLSET" FORCE)
set(CMAKE_VS_PLATFORM_TOOLSET "v141_xp" CACHE STRING "CMAKE_VS_PLATFORM_TOOLSET" FORCE)
else()
message(WARNING "WARNING: You maybe building without Windows XP compability. See which toolchain version Visual Studio provides, and say cmake to use it: cmake -G \"Visual Studio XX\" -T \"vXXX_xp\"")
endif()
endif()
endif()

18
dlls/CMakeLists.txt

@ -25,8 +25,15 @@ project (SVDLL) @@ -25,8 +25,15 @@ project (SVDLL)
set (SVDLL_LIBRARY server)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LINUX -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -fno-exceptions -w")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
if(NOT MSVC)
add_compile_options(-fno-exceptions) # GCC/Clang flag
add_compile_options(-Wno-invalid-offsetof) # GCC/Clang flag
add_compile_options(-fvisibility=hidden) # GCC/Clang flag
add_definitions(-D_LINUX) # It seems enough for all non-Win32 systems
add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf )
else()
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
endif()
set (SVDLL_SOURCES
agrunt.cpp
@ -167,8 +174,13 @@ set_target_properties (${SVDLL_LIBRARY} PROPERTIES @@ -167,8 +174,13 @@ set_target_properties (${SVDLL_LIBRARY} PROPERTIES
POSITION_INDEPENDENT_CODE 1)
if(APPLE OR WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
set(SVDLL_NAME "${SERVER_LIBRARY_NAME}")
if(64BIT)
set(SVDLL_NAME "${SERVER_LIBRARY_NAME}64")
endif()
set_target_properties(${SVDLL_LIBRARY} PROPERTIES
OUTPUT_NAME ${SERVER_LIBRARY_NAME}
OUTPUT_NAME ${SVDLL_NAME}
PREFIX "")
endif()

2
dlls/cbase.h

@ -283,7 +283,7 @@ public: @@ -283,7 +283,7 @@ public:
#ifdef _DEBUG
void FunctionCheck( void *pFunction, char *name )
{
if( pFunction && !NAME_FOR_FUNCTION( (size_t)( pFunction ) ) )
if( pFunction && !NAME_FOR_FUNCTION( pFunction ) )
ALERT( at_error, "No EXPORT: %s:%s (%08lx)\n", STRING( pev->classname ), name, (size_t)pFunction );
}

4
dlls/client.cpp

@ -108,7 +108,7 @@ void ClientDisconnect( edict_t *pEntity ) @@ -108,7 +108,7 @@ void ClientDisconnect( edict_t *pEntity )
char text[256] = "";
if( pEntity->v.netname )
snprintf( text, sizeof(text), "- %s has left the game\n", STRING( pEntity->v.netname ) );
_snprintf( text, sizeof(text), "- %s has left the game\n", STRING( pEntity->v.netname ) );
MESSAGE_BEGIN( MSG_ALL, gmsgSayText, NULL );
WRITE_BYTE( ENTINDEX( pEntity ) );
WRITE_STRING( text );
@ -660,7 +660,7 @@ void ClientUserInfoChanged( edict_t *pEntity, char *infobuffer ) @@ -660,7 +660,7 @@ void ClientUserInfoChanged( edict_t *pEntity, char *infobuffer )
if( gpGlobals->maxClients > 1 )
{
char text[256];
snprintf( text, 256, "* %s changed name to %s\n", STRING( pEntity->v.netname ), g_engfuncs.pfnInfoKeyValue( infobuffer, "name" ) );
_snprintf( text, 256, "* %s changed name to %s\n", STRING( pEntity->v.netname ), g_engfuncs.pfnInfoKeyValue( infobuffer, "name" ) );
MESSAGE_BEGIN( MSG_ALL, gmsgSayText, NULL );
WRITE_BYTE( ENTINDEX( pEntity ) );
WRITE_STRING( text );

8
dlls/lights.cpp

@ -155,10 +155,10 @@ void CEnvLight::KeyValue( KeyValueData* pkvd ) @@ -155,10 +155,10 @@ void CEnvLight::KeyValue( KeyValueData* pkvd )
}
else if( j == 4 )
{
v /= 255;
r *= v;
g *= v;
b *= v;
float vf = v / 255.0f;
r *= vf;
g *= vf;
b *= vf;
}
// simulate qrad direct, ambient,and gamma adjustments, as well as engine scaling

3
dlls/monsters.cpp

@ -2118,7 +2118,8 @@ void CBaseMonster::StartMonster( void ) @@ -2118,7 +2118,8 @@ void CBaseMonster::StartMonster( void )
SetThink( &CBaseMonster::CallMonsterThink );
pev->nextthink += RANDOM_FLOAT( 0.1, 0.4 ); // spread think times.
if( !FStringNull( pev->targetname ) )// wait until triggered
// Vit_amiN: fixed -- now it doesn't touch any scripted_sequence target
if( !FStringNull( pev->targetname ) && !m_pCine )// wait until triggered
{
SetState( MONSTERSTATE_IDLE );
// UNDONE: Some scripted sequence monsters don't have an idle?

8
dlls/multiplay_gamerules.cpp

@ -1662,8 +1662,8 @@ void CHalfLifeMultiplay::SendMOTDToClient( edict_t *client ) @@ -1662,8 +1662,8 @@ void CHalfLifeMultiplay::SendMOTDToClient( edict_t *client )
{
// read from the MOTD.txt file
int length, char_count = 0;
const char *pFileList;
const char *aFileList = pFileList = (const char*)LOAD_FILE_FOR_ME( CVAR_GET_STRING( "motdfile" ), &length );
char *pFileList;
char *aFileList = pFileList = (char*)LOAD_FILE_FOR_ME( CVAR_GET_STRING( "motdfile" ), &length );
// send the server name
MESSAGE_BEGIN( MSG_ONE, gmsgServerName, NULL, client );
@ -1691,10 +1691,10 @@ void CHalfLifeMultiplay::SendMOTDToClient( edict_t *client ) @@ -1691,10 +1691,10 @@ void CHalfLifeMultiplay::SendMOTDToClient( edict_t *client )
if( char_count < MAX_MOTD_LENGTH )
pFileList = aFileList + char_count;
else
pFileList = 0;
*pFileList = 0;
MESSAGE_BEGIN( MSG_ONE, gmsgMOTD, NULL, client );
WRITE_BYTE( pFileList ? FALSE : TRUE ); // FALSE means there is still more message to come
WRITE_BYTE( *pFileList ? FALSE : TRUE ); // FALSE means there is still more message to come
WRITE_STRING( chunk );
MESSAGE_END();
}

29
dlls/player.cpp

@ -787,6 +787,9 @@ void CBasePlayer::PackDeadPlayerItems( void ) @@ -787,6 +787,9 @@ void CBasePlayer::PackDeadPlayerItems( void )
void CBasePlayer::RemoveAllItems( BOOL removeSuit )
{
int i;
CBasePlayerItem *pPendingItem;
if( m_pActiveItem )
{
ResetAutoaim();
@ -800,8 +803,8 @@ void CBasePlayer::RemoveAllItems( BOOL removeSuit ) @@ -800,8 +803,8 @@ void CBasePlayer::RemoveAllItems( BOOL removeSuit )
if( m_pTank != 0 )
m_pTank->Use( this, this, USE_OFF, 0 );
int i;
CBasePlayerItem *pPendingItem;
m_iTrain = TRAIN_NEW; // turn off train
for( i = 0; i < MAX_ITEM_TYPES; i++ )
{
m_pActiveItem = m_rgpPlayerItems[i];
@ -1403,7 +1406,7 @@ void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle ) @@ -1403,7 +1406,7 @@ void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
MESSAGE_END();
// Setup flags
m_iHideHUD = ( HIDEHUD_HEALTH | HIDEHUD_WEAPONS );
m_iHideHUD = ( HIDEHUD_HEALTH | HIDEHUD_FLASHLIGHT | HIDEHUD_WEAPONS );
m_afPhysicsFlags |= PFLAG_OBSERVER;
pev->effects = EF_NODRAW;
pev->view_ofs = g_vecZero;
@ -1842,6 +1845,7 @@ void CBasePlayer::PreThink( void ) @@ -1842,6 +1845,7 @@ void CBasePlayer::PreThink( void )
{
CBaseEntity *pTrain = CBaseEntity::Instance( pev->groundentity );
float vel;
int iGearId; // Vit_amiN: keeps the train control HUD in sync
if( !pTrain )
{
@ -1882,10 +1886,12 @@ void CBasePlayer::PreThink( void ) @@ -1882,10 +1886,12 @@ void CBasePlayer::PreThink( void )
pTrain->Use( this, this, USE_SET, (float)vel );
}
if( vel )
iGearId = TrainSpeed( pTrain->pev->speed, pTrain->pev->impulse );
if( iGearId != ( m_iTrain & 0x0F ) ) // Vit_amiN: speed changed
{
m_iTrain = TrainSpeed( (int)pTrain->pev->speed, pTrain->pev->impulse );
m_iTrain |= TRAIN_ACTIVE|TRAIN_NEW;
m_iTrain = iGearId;
m_iTrain |= TRAIN_ACTIVE | TRAIN_NEW;
}
}
else if( m_iTrain & TRAIN_ACTIVE )
@ -2903,6 +2909,8 @@ void CBasePlayer::Precache( void ) @@ -2903,6 +2909,8 @@ void CBasePlayer::Precache( void )
if( gInitHUD )
m_fInitHUD = TRUE;
pev->fov = m_iFOV; // Vit_amiN: restore the FOV on level change or map/saved game load
}
int CBasePlayer::Save( CSave &save )
@ -3315,6 +3323,8 @@ void CBasePlayer::ForceClientDllUpdate( void ) @@ -3315,6 +3323,8 @@ void CBasePlayer::ForceClientDllUpdate( void )
{
m_iClientHealth = -1;
m_iClientBattery = -1;
m_iClientHideHUD = -1; // Vit_amiN: forcing to update
m_iClientFOV = -1; // Vit_amiN: force client weapons to be sent
m_iTrain |= TRAIN_NEW; // Force new train message.
m_fWeapon = FALSE; // Force weapon send
m_fKnownItem = FALSE; // Force weaponinit messages.
@ -3905,6 +3915,11 @@ void CBasePlayer::UpdateClientData( void ) @@ -3905,6 +3915,11 @@ void CBasePlayer::UpdateClientData( void )
WRITE_BYTE( m_iFlashBattery );
MESSAGE_END();
// Vit_amiN: the geiger state could run out of sync, too
MESSAGE_BEGIN( MSG_ONE, gmsgGeigerRange, NULL, pev );
WRITE_BYTE( 0 );
MESSAGE_END();
InitStatusBar();
}
@ -3950,7 +3965,7 @@ void CBasePlayer::UpdateClientData( void ) @@ -3950,7 +3965,7 @@ void CBasePlayer::UpdateClientData( void )
m_iClientHealth = (int)pev->health;
}
if( pev->armorvalue != m_iClientBattery )
if( (int)pev->armorvalue != m_iClientBattery )
{
m_iClientBattery = (int)pev->armorvalue;

2
dlls/playermonster.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose: New version of the slider bar
//

84
dlls/sound.cpp

@ -1458,14 +1458,6 @@ void EMIT_GROUPNAME_SUIT( edict_t *entity, const char *groupname ) @@ -1458,14 +1458,6 @@ void EMIT_GROUPNAME_SUIT( edict_t *entity, const char *groupname )
// texture name to a material type. Play footstep sound based
// on material type.
int fTextureTypeInit = FALSE;
#define CTEXTURESMAX 512 // max number of textures loaded
int gcTextures = 0;
char grgszTextureName[CTEXTURESMAX][CBTEXTURENAMEMAX]; // texture names
char grgchTextureType[CTEXTURESMAX]; // parallel array of texture types
// open materials.txt, get size, alloc space,
// save in array. Only works first time called,
// ignored on subsequent calls.
@ -1517,87 +1509,17 @@ static char *memfgets( byte *pMemFile, int fileSize, int &filePos, char *pBuffer @@ -1517,87 +1509,17 @@ static char *memfgets( byte *pMemFile, int fileSize, int &filePos, char *pBuffer
return NULL;
}
void TEXTURETYPE_Init()
{
char buffer[512];
int i, j;
byte *pMemFile;
int fileSize, filePos = 0;
if( fTextureTypeInit )
return;
memset( &( grgszTextureName[0][0] ), 0, CTEXTURESMAX * CBTEXTURENAMEMAX );
memset( grgchTextureType, 0, CTEXTURESMAX );
gcTextures = 0;
pMemFile = g_engfuncs.pfnLoadFileForMe( "sound/materials.txt", &fileSize );
if( !pMemFile )
return;
memset( buffer, 0, 512 );
// for each line in the file...
while( memfgets( pMemFile, fileSize, filePos, buffer, 511 ) != NULL && ( gcTextures < CTEXTURESMAX) )
{
// skip whitespace
i = 0;
while( buffer[i] && isspace( buffer[i] ) )
i++;
if( !buffer[i] )
continue;
// skip comment lines
if( buffer[i] == '/' || !isalpha( buffer[i] ) )
continue;
// get texture type
grgchTextureType[gcTextures] = toupper( buffer[i++] );
// skip whitespace
while( buffer[i] && isspace( buffer[i] ) )
i++;
if( !buffer[i] )
continue;
// get sentence name
j = i;
while( buffer[j] && !isspace( buffer[j] ) )
j++;
if( !buffer[j] )
continue;
// null-terminate name and save in sentences array
j = Q_min( j, CBTEXTURENAMEMAX - 1 + i );
buffer[j] = 0;
strcpy( &( grgszTextureName[gcTextures++][0] ), &( buffer[i] ) );
}
g_engfuncs.pfnFreeFile( pMemFile );
fTextureTypeInit = TRUE;
}
// given texture name, find texture type
// if not found, return type 'concrete'
// NOTE: this routine should ONLY be called if the
// current texture under the player changes!
extern "C" char PM_FindTextureType( char *name );
char TEXTURETYPE_Find( char *name )
{
// CONSIDER: pre-sort texture names and perform faster binary search here
for( int i = 0; i < gcTextures; i++ )
{
if( !strnicmp( name, &( grgszTextureName[i][0] ), CBTEXTURENAMEMAX - 1 ) )
return grgchTextureType[i];
}
return CHAR_TEX_CONCRETE;
return PM_FindTextureType(name);
}
// play a strike sound based on the texture that was hit by the attack traceline. VecSrc/VecEnd are the

2
dlls/squad.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose: New version of the slider bar
//

2
dlls/stats.cpp

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose: New version of the slider bar
//

2
dlls/util.cpp

@ -1192,7 +1192,7 @@ float UTIL_Approach( float target, float value, float speed ) @@ -1192,7 +1192,7 @@ float UTIL_Approach( float target, float value, float speed )
float UTIL_ApproachAngle( float target, float value, float speed )
{
target = UTIL_AngleMod( target );
value = UTIL_AngleMod( target );
value = UTIL_AngleMod( value );
float delta = target - value;

2
dlls/util.h

@ -40,7 +40,7 @@ extern globalvars_t *gpGlobals; @@ -40,7 +40,7 @@ extern globalvars_t *gpGlobals;
#define STRING(offset) (const char *)(gpGlobals->pStringBase + (int)offset)
#if !defined XASH_64BIT || defined(CLIENT_DLL)
#define MAKE_STRING(str) ((int)str - (int)STRING(0))
#define MAKE_STRING(str) ((int)(long int)str - (int)(long int)STRING(0))
#else
static inline int MAKE_STRING(const char *szValue)
{

3
dlls/world.cpp

@ -500,9 +500,6 @@ void CWorld::Precache( void ) @@ -500,9 +500,6 @@ void CWorld::Precache( void )
// ok to call this multiple times, calls after first are ignored.
SENTENCEG_Init();
// init texture type array from materials.txt
TEXTURETYPE_Init();
// the area based ambient sounds MUST be the first precache_sounds
// player precaches
W_Precache(); // get weapon precaches

16
engine/mobility_int.h

@ -34,7 +34,7 @@ extern "C" { @@ -34,7 +34,7 @@ extern "C" {
#define TOUCH_FL_DEF_HIDE (1U << 6)
#define TOUCH_FL_DRAW_ADDITIVE (1U << 7)
#define TOUCH_FL_STROKE (1U << 8)
#define TOUCH_FL_PRECISION (1U << 9)
#define TOUCH_FL_PRECISION (1U << 9)
typedef struct mobile_engfuncs_s
{
@ -65,13 +65,21 @@ typedef struct mobile_engfuncs_s @@ -65,13 +65,21 @@ typedef struct mobile_engfuncs_s
void (*pfnTouchSetClientOnly)( unsigned char state );
// Clean defaults list
void (*pfnTouchResetDefaultButtons)();
void (*pfnTouchResetDefaultButtons)( void );
// Draw scaled font for client
int (*pfnDrawScaledCharacter)( int x, int y, int number, int r, int g, int b, float scale );
void (*pfnSys_Warn)( const char *format, ... );
// Get native object for current platform.
// Pass NULL to arguments to receive an array of available objects or NULL if nothing
void *(*pfnGetNativeObject)( const char *obj );
void (*pfnSetCustomClientID)( const char *id );
// To be continued...
} mobile_engfuncs_t;
extern mobile_engfuncs_t *gMobileEngfuncs;
// function exported from client
// returns 0 on no error otherwise error
typedef int (*pfnMobilityInterface)( mobile_engfuncs_t *gMobileEngfuncs );

2
pm_shared/pm_movevars.h

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//

17
pm_shared/pm_shared.c

@ -168,24 +168,23 @@ void PM_InitTextureTypes() @@ -168,24 +168,23 @@ void PM_InitTextureTypes()
char buffer[512];
int i, j;
byte *pMemFile;
int fileSize, filePos;
int fileSize, filePos = 0;
static qboolean bTextureTypeInit = false;
if( bTextureTypeInit )
return;
memset(&( grgszTextureName[0][0] ), 0, CTEXTURESMAX * CBTEXTURENAMEMAX );
memset( grgchTextureType, 0, CTEXTURESMAX );
memset(&( grgszTextureName[0][0] ), 0, sizeof( grgszTextureName ) );
memset( grgchTextureType, 0, sizeof( grgchTextureType ) );
gcTextures = 0;
fileSize = pmove->COM_FileSize( "sound/materials.txt" );
pMemFile = pmove->COM_LoadFile( "sound/materials.txt", 5, NULL );
pMemFile = pmove->COM_LoadFile( "sound/materials.txt", 5, &fileSize );
if( !pMemFile )
return;
memset( buffer, 0, 512 );
filePos = 0;
memset( buffer, 0, sizeof( buffer ) );
// for each line in the file...
while( pmove->memfgets( pMemFile, fileSize, &filePos, buffer, 511 ) != NULL && (gcTextures < CTEXTURESMAX ) )
{
@ -3312,8 +3311,8 @@ void PM_Move( struct playermove_s *ppmove, int server ) @@ -3312,8 +3311,8 @@ void PM_Move( struct playermove_s *ppmove, int server )
pmove->flags &= ~FL_ONGROUND;
}
// In single player, reset friction after each movement to FrictionModifier Triggers work still.
if( !pmove->multiplayer && ( pmove->movetype == MOVETYPE_WALK ) )
// Reset friction after each movement to FrictionModifier Triggers work still.
if( pmove->movetype == MOVETYPE_WALK )
{
pmove->friction = 1.0f;
}

1
utils/false_vgui/include/VGUI_Panel.h

@ -219,7 +219,6 @@ private: @@ -219,7 +219,6 @@ private:
bool _paintBorderEnabled;
bool _paintBackgroundEnabled;
bool _paintEnabled;
friend class Panel;
friend class App;
friend class SurfaceBase;
friend class Image;

845
utils/makefont/makefont.cpp

@ -0,0 +1,845 @@ @@ -0,0 +1,845 @@
/***
*
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
*
* This product contains software technology licensed from Id
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
* All Rights Reserved.
*
* Use, distribution, and modification of this source code and/or resulting
* object code is restricted to non-commercial enhancements to products from
* Valve LLC. All other use, distribution, or modification is prohibited
* without written permission from Valve LLC.
*
****/
#define _NOENUMQBOOL
#include <windows.h>
extern "C"
{
#include "cmdlib.h"
#include "wadlib.h"
}
#include "qfont.h"
#define DEFAULT_FONT "Arial"
#define FONT_TAG 6 // Font's are the 6th tag after the TYP_LUMPY base ( 64 )...i.e., type == 70
BOOL bItalic = FALSE;
BOOL bBold = FALSE;
BOOL bUnderline = FALSE;
char fontname[ 256 ];
int pointsize[3] = { 9, 11, 15 };
/*
=================
zeromalloc
Allocates and zeroes memory
=================
*/
void *zeromalloc( size_t size )
{
unsigned char *pbuffer;
pbuffer = ( unsigned char * )malloc( size );
if ( !pbuffer )
{
printf( "Failed on allocation of %i bytes", size );
exit( -1 );
}
memset( pbuffer, 0, size );
return ( void * )pbuffer;
}
/*
=================
Draw_SetupConsolePalette
Set's the palette to full brightness ( 192 ) and
set's up palette entry 0 -- black
=================
*/
void Draw_SetupConsolePalette( unsigned char *pal )
{
unsigned char *pPalette;
int i;
pPalette = pal;
*(short *)pPalette = 3 * 256;
pPalette += sizeof( short );
for ( i = 0; i < 256; i++ )
{
pPalette[3 * i + 0 ] = i;
pPalette[3 * i + 1 ] = i;
pPalette[3 * i + 2 ] = i;
}
// Set palette zero correctly
pPalette[ 0 ] = 0;
pPalette[ 1 ] = 0;
pPalette[ 2 ] = 0;
}
//DJXX added for debugging
BOOL WriteDIB(LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
if (!hDIB)
return FALSE;
FILE *file;
file = SafeOpenWrite(szFile);
lpbi = (LPBITMAPINFOHEADER)hDIB;
int nColors = 1 << lpbi->biBitCount;
// Fill in the fields of the file header
hdr.bfType = ((WORD)('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = GlobalSize(hDIB) + sizeof(hdr);
printf("WriteDIB. Error code = %i\n",GetLastError());
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD)(sizeof(hdr)+lpbi->biSize +
nColors * sizeof(RGBQUAD));
// Write the file header
SafeWrite(file, &hdr, sizeof(hdr));
// Write the DIB header and the bits
SafeWrite(file, lpbi, GlobalSize(hDIB));
fclose(file);
return TRUE;
}
/*
=================
CreateProportionalConsoleFont
Renders TT font into memory dc and creates appropriate qfont_t structure
=================
*/
//DJXX: New version, draws chararacters closely to each other without spaces
// YWB: Sigh, VC 6.0's global optimizer causes weird stack fixups in release builds. Disable the globabl optimizer for this function.
#pragma optimize( "g", off )
qfont_t *CreateProportionalConsoleFont(char *pszFont, int nPointSize, BOOL bItalic, BOOL bUnderline, BOOL bBold, int *outsize)
{
HDC hdc;
HDC hmemDC;
HBITMAP hbm, oldbm;
RECT rc;
HFONT fnt, oldfnt;
TEXTMETRIC tm;
int startchar = 32;
int c;
int i, j;
int x, y;
int nScans;
unsigned char *bits;
BITMAPINFO tempbmi;
BITMAPINFO *pbmi;
BITMAPINFOHEADER *pbmheader;
unsigned char *pqdata;
unsigned char *pCur;
int x1, y1;
unsigned char *pPalette;
qfont_t *pqf = NULL;
int fullsize;
int w = 16;
//int h = (128 - 32) / 16;
int h = (256 - 32) / 16;
int charheight = nPointSize + 5;
int charwidth = 16;//now used only for calculating width of wad texture
int fontcharwidth;
int edge = 1;
RECT rcChar;
boolean lShadow = true;//draw shadow instead of outline
// Create the font
fnt = CreateFont(-nPointSize, 0, 0, 0, bBold ? FW_HEAVY : FW_MEDIUM, bItalic, bUnderline, 0, /*ANSI_CHARSET*/DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH | FF_DONTCARE, pszFont);
bits = NULL;
fullsize = sizeof(qfont_t)-4 + (/*128*/256 * w * charwidth) + sizeof(short)+768 + 64;
// Store off final size
*outsize = fullsize;
pqf = (qfont_t *)zeromalloc(fullsize);
pqdata = (unsigned char *)pqf + sizeof(qfont_t)-4;
pPalette = pqdata + (/*128*/256 * w * charwidth);
// Configure palette
Draw_SetupConsolePalette(pPalette);
hdc = GetDC(NULL);
hmemDC = CreateCompatibleDC(hdc);
oldfnt = (HFONT)SelectObject(hmemDC, fnt);
if (GetTextMetrics(hmemDC, &tm))
{
fontcharwidth = tm.tmMaxCharWidth;
if (fontcharwidth % 2)//hack: on odd values of fontcharwidth, bitmaps pixel check gives false triggering
fontcharwidth++;
}
else {
fontcharwidth = charwidth;
}
if (lShadow)
charheight += edge;//adding 1 pixel to bottom for shadowing
rc.top = 0;
rc.left = 0;
rc.right = fontcharwidth * w;
rc.bottom = charheight * h;
hbm = CreateBitmap(fontcharwidth * w, charheight * h, 1, 1, NULL);
oldbm = (HBITMAP)SelectObject(hmemDC, hbm);
SetTextColor(hmemDC, 0x00ffffff);
SetBkMode(hmemDC, TRANSPARENT);
// Paint black background
FillRect(hmemDC, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
// Draw character set into memory DC
for (j = 0; j < h; j++)
{
for (i = 0; i < w; i++)
{
x = i * fontcharwidth;
y = j * charheight;
c = (unsigned char)(startchar + j * w + i);
// Only draw printable characters, of course
//if ( isprint( c ) && c <= 127 )
{
// Draw it.
rcChar.left = x + 1;
rcChar.top = y + 1;
rcChar.right = x + fontcharwidth - 1;
rcChar.bottom = y + charheight - 1;
DrawText(hmemDC, (char *)&c, 1, &rcChar, DT_NOPREFIX | DT_LEFT);
}
}
}
// Now turn the qfont into raw format
memset(&tempbmi, 0, sizeof(BITMAPINFO));
pbmheader = (BITMAPINFOHEADER *)&tempbmi;
pbmheader->biSize = sizeof(BITMAPINFOHEADER);
pbmheader->biWidth = w * fontcharwidth;
pbmheader->biHeight = -h * charheight;
pbmheader->biPlanes = 1;
pbmheader->biBitCount = 1;
pbmheader->biCompression = BI_RGB;
// Find out how big the bitmap is
nScans = GetDIBits(hmemDC, hbm, 0, h * charheight, NULL, &tempbmi, DIB_RGB_COLORS);
// Allocate space for all bits
pbmi = (BITMAPINFO *)zeromalloc(sizeof (BITMAPINFOHEADER)+2 * sizeof(RGBQUAD)+pbmheader->biSizeImage);
memcpy(pbmi, &tempbmi, sizeof(BITMAPINFO));
bits = (unsigned char *)pbmi + sizeof(BITMAPINFOHEADER)+2 * sizeof(RGBQUAD);
// Now read in bits
nScans = GetDIBits(hmemDC, hbm, 0, h * charheight, bits, pbmi, DIB_RGB_COLORS);
if (nScans > 0)
{
#if 0 //for debugging
char sz[128];//DJXX write dib to file
sprintf(sz, "font_%s_%i.bmp", pszFont, nPointSize);
WriteDIB(sz, pbmi);
#endif
// Now convert to proper raw format
//
// Now get results from dib
pqf->height = /*128*/256; // Always set to 128
pqf->width = charwidth;
pqf->rowheight = charheight;
pqf->rowcount = h;
pCur = pqdata;
// Set everything to index 255 ( 0xff ) == transparent
memset(pCur, 0xFF, w * charwidth * pqf->height);
int k = 0, dest_x = 0, dest_y = 0;
for (j = 0; j < h; j++)
for (i = 0; i < w; i++)
{
int rightmost, leftmost, realcharwidth;
x = i * fontcharwidth;
y = j * charheight;
//c = (char)( startchar + j * w + i ); here was memory bug
c = (unsigned char)(startchar + j * w + i);
rightmost = 0;
leftmost = fontcharwidth;
//Calculate real width of the character
for (y1 = 0; y1 < charheight; y1++)
for (x1 = 0; x1 < fontcharwidth; x1++)
{
int src_offset;
src_offset = (y + y1) * w * fontcharwidth + x + x1;
if (bits[src_offset >> 3] & (1 << (7 - src_offset & 7)))//on odd values of fontcharwidth this check gives false triggering
{
if (x1 > rightmost)
rightmost = x1;
if (x1 < leftmost)
leftmost = x1;
}
}
if (leftmost > rightmost)//empty characters
{
leftmost = 0;
rightmost = 7;
} else {
rightmost += edge;
if (!lShadow)
leftmost -= edge;
}
realcharwidth = rightmost - leftmost + 1;
pqf->fontinfo[c].charwidth = realcharwidth;
if (dest_x + realcharwidth >= w * charwidth)//if it not fits on current line then carry it to the next line
{
dest_x = 0;
k++;
}
dest_y = k * charheight;
pqf->fontinfo[c].startoffset = dest_y * w * charwidth + dest_x;
if (lShadow)
{
int shift = edge;
//Draw shadow by shifting character to 1 pixel right and down
for (y1 = 0; y1 < charheight; y1++)
for (x1 = 0; x1 < realcharwidth; x1++)
{
int src_offset, dest_offset;
src_offset = (y + y1) * w * fontcharwidth + x + x1 + leftmost;
dest_offset = (dest_y + shift + y1) * w * charwidth + (dest_x + shift + x1);
// Dest
pCur = pqdata + dest_offset;
if (bits[src_offset >> 3] & (1 << (7 - src_offset & 7)))
{
// Near Black
//pCur[0] = 32;
pCur[0] = 0;//full black so shadow remains black even it's coloured text
}
}
}
else
{
// Put black pixels below and to the right of each pixel(outline)
for (y1 = edge; y1 < charheight - edge; y1++)
for (x1 = 0; x1 < realcharwidth; x1++)
{
int src_offset, dest_offset;
int xx0, yy0;
dest_offset = (dest_y + y1) * w * charwidth + (dest_x + x1);
// Dest
pCur = pqdata + dest_offset;
for (xx0 = -edge; xx0 <= edge; xx0++)
for (yy0 = -edge; yy0 <= edge; yy0++)
{
src_offset = (y + y1 + yy0) * w * fontcharwidth + x + x1 + xx0 + leftmost;//adding shift
if (bits[src_offset >> 3] & (1 << (7 - src_offset & 7)))
{
// Near Black
pCur[0] = 32;
}
}
}
}
// Now copy in the actual font pixels
for (y1 = 0; y1 < charheight; y1++)
for (x1 = 0; x1 < realcharwidth; x1++)
{
int src_offset, dest_offset;
src_offset = (y + y1) * w * fontcharwidth + x + x1 + leftmost;
dest_offset = (dest_y + y1) * w * charwidth + (dest_x + x1);
// Dest
pCur = pqdata + dest_offset;
if (bits[src_offset >> 3] & (1 << (7 - src_offset & 7)))
{
pCur[0] = 192;
}
}
dest_x += realcharwidth;
}
}
// Free memory bits
free(pbmi);
SelectObject(hmemDC, oldfnt);
DeleteObject(fnt);
SelectObject(hmemDC, oldbm);
DeleteObject(hbm);
DeleteDC(hmemDC);
ReleaseDC(NULL, hdc);
return pqf;
}
#pragma optimize( "g", on )
/*
=================
CreateConsoleFont
Renders TT font into memory dc and creates appropriate qfont_t structure
=================
*/
//DJXX: original version, just added drawing of locale characters and fixed memory bug.
// YWB: Sigh, VC 6.0's global optimizer causes weird stack fixups in release builds. Disable the globabl optimizer for this function.
#pragma optimize( "g", off )
qfont_t *CreateConsoleFont( char *pszFont, int nPointSize, BOOL bItalic, BOOL bUnderline, BOOL bBold, int *outsize )
{
HDC hdc;
HDC hmemDC;
HBITMAP hbm, oldbm;
RECT rc;
HFONT fnt, oldfnt;
int startchar = 32;
int c;
int i, j;
int x, y;
int nScans;
unsigned char *bits;
BITMAPINFO tempbmi;
BITMAPINFO *pbmi;
BITMAPINFOHEADER *pbmheader;
unsigned char *pqdata;
unsigned char *pCur;
int x1, y1;
unsigned char *pPalette;
qfont_t *pqf = NULL;
int fullsize;
int w = 16;
//int h = (128-32)/16;
int h = (256 - 32) / 16;
int charheight = nPointSize + 5;
int charwidth = 16;
RECT rcChar;
// Create the font
fnt = CreateFont( -nPointSize, 0, 0, 0, bBold ? FW_HEAVY : FW_MEDIUM, bItalic, bUnderline, 0, /*ANSI_CHARSET*/DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH | FF_DONTCARE, pszFont );
bits = NULL;
fullsize = sizeof( qfont_t ) - 4 + ( /*128*/256 * w * charwidth ) + sizeof(short) + 768 + 64;
// Store off final size
*outsize = fullsize;
pqf = ( qfont_t * )zeromalloc( fullsize );
pqdata = (unsigned char *)pqf + sizeof( qfont_t ) - 4;
pPalette = pqdata + ( /*128*/256 * w * charwidth);
// Configure palette
Draw_SetupConsolePalette( pPalette );
hdc = GetDC( NULL );
hmemDC = CreateCompatibleDC( hdc );
rc.top = 0;
rc.left = 0;
rc.right = charwidth * w;
rc.bottom = charheight * h;
hbm = CreateBitmap( charwidth * w, charheight * h, 1, 1, NULL );
oldbm = (HBITMAP)SelectObject( hmemDC, hbm );
oldfnt = (HFONT)SelectObject( hmemDC, fnt );
SetTextColor( hmemDC, 0x00ffffff );
SetBkMode( hmemDC, TRANSPARENT );
// Paint black background
FillRect( hmemDC, &rc, (HBRUSH)GetStockObject( BLACK_BRUSH ) );
// Draw character set into memory DC
for ( j = 0; j < h; j++ )
{
for ( i = 0; i < w; i++ )
{
x = i * charwidth;
y = j * charheight;
c = (unsigned char)( startchar + j * w + i );
// Only draw printable characters, of course
//if ( isprint( c ) && c <= 127 )
{
// Draw it.
rcChar.left = x + 1;
rcChar.top = y + 1;
rcChar.right = x + charwidth - 1;
rcChar.bottom = y + charheight - 1;
DrawText( hmemDC, (char *)&c, 1, &rcChar, DT_NOPREFIX | DT_LEFT );
}
}
}
// Now turn the qfont into raw format
memset( &tempbmi, 0, sizeof( BITMAPINFO ) );
pbmheader = ( BITMAPINFOHEADER * )&tempbmi;
pbmheader->biSize = sizeof( BITMAPINFOHEADER );
pbmheader->biWidth = w * charwidth;
pbmheader->biHeight = -h * charheight;
pbmheader->biPlanes = 1;
pbmheader->biBitCount = 1;
pbmheader->biCompression = BI_RGB;
// Find out how big the bitmap is
nScans = GetDIBits( hmemDC, hbm, 0, h * charheight, NULL, &tempbmi, DIB_RGB_COLORS );
// Allocate space for all bits
pbmi = ( BITMAPINFO * )zeromalloc( sizeof ( BITMAPINFOHEADER ) + 2 * sizeof( RGBQUAD ) + pbmheader->biSizeImage );
memcpy( pbmi, &tempbmi, sizeof( BITMAPINFO ) );
bits = ( unsigned char * )pbmi + sizeof( BITMAPINFOHEADER ) + 2 * sizeof( RGBQUAD );
// Now read in bits
nScans = GetDIBits( hmemDC, hbm, 0, h * charheight, bits, pbmi, DIB_RGB_COLORS );
if ( nScans > 0 )
{
#if 0 //for debugging
char sz[128];//DJXX write dib to file
sprintf(sz, "font_%s_%i.bmp", pszFont, nPointSize);
WriteDIB(sz, pbmi);
#endif
// Now convert to proper raw format
//
// Now get results from dib
pqf->height = /*128*/256; // Always set to 128
pqf->width = charwidth;
pqf->rowheight = charheight;
pqf->rowcount = h;
pCur = pqdata;
// Set everything to index 255 ( 0xff ) == transparent
memset( pCur, 0xFF, w * charwidth * pqf->height );
for ( j = 0; j < h; j++ )
{
for ( i = 0; i < w; i++ )
{
int edge = 1;
int bestwidth;
x = i * charwidth;
y = j * charheight;
//c = (char)( startchar + j * w + i ); here was memory bug
c = (unsigned char)(startchar + j * w + i);
pqf->fontinfo[ c ].charwidth = charwidth;
pqf->fontinfo[ c ].startoffset = y * w * charwidth + x;
bestwidth = 0;
// In this first pass, place the black drop shadow so characters draw ok in the engine against
// most backgrounds.
// YWB: FIXME, apply a box filter and enable blending?
#if 0//DJXX: we already did that for a whole image by memset
// Make it all transparent for starters
for ( y1 = 0; y1 < charheight; y1++ )
{
for ( x1 = 0; x1 < charwidth; x1++ )
{
int offset;
offset = ( y + y1 ) * w * charwidth + x + x1 ;
// Dest
pCur = pqdata + offset;
// Assume transparent
pCur[0] = 255;
}
}
#endif
// Put black pixels below and to the right of each pixel
for ( y1 = edge; y1 < charheight - edge; y1++ )
{
for ( x1 = 0; x1 < charwidth; x1++ )
{
int offset;
int srcoffset;
int xx0, yy0;
offset = ( y + y1 ) * w * charwidth + x + x1 ;
// Dest
pCur = pqdata + offset;
for ( xx0 = -edge; xx0 <= edge; xx0++ )
{
for ( yy0 = -edge; yy0 <= edge; yy0++ )
{
srcoffset = ( y + y1 + yy0 ) * w * charwidth + x + x1 + xx0;
if ( bits[ srcoffset >> 3 ] & ( 1 << ( 7 - srcoffset & 7 ) ) )
{
// Near Black
pCur[0] = 32;
}
}
}
}
}
// Now copy in the actual font pixels
for ( y1 = 0; y1 < charheight; y1++ )
{
for ( x1 = 0; x1 < charwidth; x1++ )
{
int offset;
offset = ( y + y1 ) * w * charwidth + x + x1;
// Dest
pCur = pqdata + offset;
if ( bits[ offset >> 3 ] & ( 1 << ( 7 - offset & 7 ) ) )
{
if ( x1 > bestwidth )
{
bestwidth = x1;
}
// Full color
// FIXME: Enable true palette support in engine?
pCur[0] = 192;
}
}
}
// bestwidth += 1;
/*
// Now blend it
for ( y1 = 0; y1 < charheight; y1++ )
{
for ( x1 = 0; x1 < charwidth; x1++ )
{
int offset;
offset = ( y + y1 ) * w * charwidth + x + x1;
// Dest
pCur = pqdata + offset;
if ( bits[ offset >> 3 ] & ( 1 << ( 7 - offset & 7 ) ) )
{
if ( x1 > bestwidth )
{
bestwidth = x1;
}
// Full color
// FIXME: Enable true palette support in engine?
pCur[0] = 192;
}
}
}
*/
// Space character width
if ( c == 32 )
{
bestwidth = 8;
}
else
{
// Small characters needs can be padded a bit so they don't run into each other
if ( bestwidth <= 14 )
{
bestwidth += 2;
}
}
// Store off width
pqf->fontinfo[ c ].charwidth = bestwidth;
}
}
}
// Free memory bits
free ( pbmi );
SelectObject( hmemDC, oldfnt );
DeleteObject( fnt );
SelectObject( hmemDC, oldbm );
DeleteObject( hbm );
DeleteDC( hmemDC );
ReleaseDC( NULL, hdc );
return pqf;
}
#pragma optimize( "g", on )
/*
=================
main
=================
*/
int main(int argc, char* argv[])
{
int i;
DWORD start, end;
char destfile[1024];
char sz[ 32 ];
int outsize[ 3 ];
qfont_t *fonts[ 3 ];
strcpy( fontname, DEFAULT_FONT );
printf("makefont.exe Version 2.0 by valve and DJXX (%s)\n", __DATE__ );
printf ("----- Creating Console Font ----\n");
for (i=1 ; i<argc ; i++)
{
if (!strcmp(argv[i],"-font"))
{
strcpy( fontname, argv[i+1] );
i++;
}
else if (!strcmp(argv[i],"-pointsizes"))
{
if ( i + 3 >= argc )
{
Error( "Makefont: Insufficient point sizes specified\n" );
}
pointsize[0] = atoi( argv[i+1] );
pointsize[1] = atoi( argv[i+2] );
pointsize[2] = atoi( argv[i+3] );
i += 3;
}
else if (!strcmp(argv[i],"-italic"))
{
bItalic = TRUE;
printf ( "italic set\n");
}
else if (!strcmp(argv[i],"-bold"))
{
bBold = TRUE;
printf ( "bold set\n");
}
else if (!strcmp(argv[i],"-underline"))
{
bUnderline = TRUE;
printf ( "underline set\n");
}
else if ( argv[i][0] == '-' )
{
Error ("Unknown option \"%s\"", argv[i]);
}
else
break;
}
if ( i != argc - 1 )
{
Error ("usage: makefont [-font \"fontname\"] [-italic] [-underline] [-bold] [-pointsizes sm med lg] outfile");
}
printf( "Creating %i, %i, and %i point %s fonts\n", pointsize[0], pointsize[1], pointsize[2], fontname );
start = timeGetTime();
// Create the fonts
for ( i = 0 ; i < 3; i++ )
{
fonts[ i ] = CreateProportionalConsoleFont( fontname, pointsize[i], bItalic, bUnderline, bBold, &outsize[ i ] );
//fonts[i] = CreateConsoleFont(fontname, pointsize[i], bItalic, bUnderline, bBold, &outsize[i]);
}
// Create wad file
strcpy (destfile, argv[argc - 1]);
StripExtension (destfile);
DefaultExtension (destfile, ".wad");
NewWad( destfile, false );
// Add fonts as lumps
for ( i = 0; i < 3; i++ )
{
sprintf( sz, "font%i", i );
AddLump( sz, fonts[ i ], outsize[ i ], TYP_LUMPY + FONT_TAG, false );
}
// Store results as a WAD3
// NOTE: ( should be named fonts.wad in the valve\ subdirectory )
WriteWad( 3 );
// Clean up memory
for ( i = 0 ; i < 3; i++ )
{
free( fonts[ i ] );
}
end = timeGetTime ();
printf ( "%5.5f seconds elapsed\n", (float)( end - start )/1000.0 );
// Display for a second since it might not be running from command prompt
Sleep( 1000 );
return 0;
}

138
utils/makefont/makefont.dsp

@ -0,0 +1,138 @@ @@ -0,0 +1,138 @@
# Microsoft Developer Studio Project File - Name="makefont" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=makefont - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "makefont.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "makefont.mak" CFG="makefont - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "makefont - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "makefont - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "makefont - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /W3 /GX /Zi /O2 /I "../../common" /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX"qfont.h" /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386
# Begin Special Build Tool
TargetPath=.\Release\makefont.exe
SOURCE="$(InputPath)"
PostBuild_Desc=Copyint to valve\
PostBuild_Cmds=xcopy $(TargetPath) ..\..\..\valve /r /i
# End Special Build Tool
!ELSEIF "$(CFG)" == "makefont - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../common" /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX"qfont.h" /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# Begin Special Build Tool
TargetPath=.\Debug\makefont.exe
SOURCE="$(InputPath)"
PostBuild_Desc=Copyint to valve\
PostBuild_Cmds=xcopy $(TargetPath) ..\..\..\valve /r /i
# End Special Build Tool
!ENDIF
# Begin Target
# Name "makefont - Win32 Release"
# Name "makefont - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=..\common\cmdlib.c
# End Source File
# Begin Source File
SOURCE=.\makefont.cpp
# End Source File
# Begin Source File
SOURCE=..\common\wadlib.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=..\common\cmdlib.h
# End Source File
# Begin Source File
SOURCE=.\StdAfx.h
# End Source File
# Begin Source File
SOURCE=..\common\wadlib.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# Begin Source File
SOURCE=.\ReadMe.txt
# End Source File
# End Target
# End Project

3
utils/makefont/winebuild.sh

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
#!/bin/sh
winegcc -g -m32 makefont.cpp ../common/wadlib.c ../common/cmdlib.c -I../common/ -I../../common/ -mwindows -mno-cygwin -lwinmm -fno-stack-protector
Loading…
Cancel
Save