diff --git a/Source/Menu/Defs.h b/Source/Menu/Defs.h index 97b6f085..a4bf4a60 100755 --- a/Source/Menu/Defs.h +++ b/Source/Menu/Defs.h @@ -40,13 +40,19 @@ var float fMouseClick; var int iMenuActive; var float fMenuScale; +var float fMenuAlpha; float frametime; float fLastTime; +int iMenu; string *sMapList; int iMapCount; +// Draw.c & Objects.c +float fFadeAlpha; +int iButtonSelected; + /* ================= gcd_r @@ -55,11 +61,10 @@ Returns the greatest common denominator ================= */ int gcd_r( float a, float b ) { - if ( a == 0 ) { - return b; - } - - return gcd_r( floor( b%a ), a ); + if ( a == 0 ) { + return b; + } + return gcd_r( floor( b%a ), a ); } /* @@ -83,9 +88,7 @@ Returns the menu size for the given ratio. */ vector Menu_Util_GetMenuSize( vector vAspect ) { float fScale = ( vAspect_x / vAspect_y ); - - return [ rint( 480 * fScale ), 480 ]; - + return [ rint( 480 * fScale ), 480 ]; } /* diff --git a/Source/Menu/Draw.c b/Source/Menu/Draw.c index 000414a3..f19fea0a 100755 --- a/Source/Menu/Draw.c +++ b/Source/Menu/Draw.c @@ -19,72 +19,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ int iMenuStage; -float fFadeAlpha; -int iButtonSelected; -void drawmenupic( vector vPosition, string sPic, vector vSize, vector vRGB, float fAlpha, float fDrawflag ) { - vSize = vSize * fMenuScale; - vPosition = vPosition * fMenuScale; - drawpic( vPosition + [ iMenuPadding, 0, 0 ], sPic, vSize, vRGB, fAlpha, fDrawflag ); -} - -void drawmenustring( vector vPosition, string sText, vector vSize, vector vRGB, float fAlpha, float fDrawflag ) { - vSize = vSize * fMenuScale; - vPosition = vPosition * fMenuScale; - drawstring( vPosition + [ iMenuPadding, 0, 0 ], sText, vSize, vRGB, fAlpha, fDrawflag ); -} - -void m_mainbutton( vector vPos, string sText, int iItem, void() vFunc) { - static float fSelectionAlpha; - - if ( Menu_InputCheckMouse( vPos, '182 14' ) == TRUE ) { - if ( iButtonSelected != iItem ) { - iButtonSelected = iItem; - fSelectionAlpha = 0.0f; - } - } - - if ( iButtonSelected == iItem ) { - if ( fMouseClick == TRUE ) { - drawmenustring( vPos, sText, '14 14', '1 0.5 0', fSelectionAlpha, 0 ); - vFunc(); - fMouseClick = FALSE; - } else { - drawmenustring( vPos, sText, '14 14', '1 1 1', 1 - fSelectionAlpha, 0 ); - drawmenustring( vPos, sText, '14 14', '0.3 0.3 1', fSelectionAlpha, 0 ); - } - } else { - drawmenustring( vPos, sText, '14 14', '1 1 1', fFadeAlpha, 0 ); - } - - if ( fSelectionAlpha < 1.0f ) { - fSelectionAlpha += frametime; - if ( fSelectionAlpha > 1.0f ) { - fSelectionAlpha = 1.0f; - } - } -} - -void m_button_findserver( void ) { - +enum { + MAIN_NONE, + MAIN_BROWSER, + MAIN_HOST, + MAIN_OPTIONS, + MAIN_REPLAY, + MAIN_QUIT, + MAIN_DISCONNECT }; -void m_button_createserver( void ) { - localcmd( "map cs_office\n" ); -}; - -void m_button_options( void ) { - -}; - -void m_button_replays( void ) { - -}; - -void m_button_quit( void ) { - localcmd( "quit\n" ); -}; +/* +================= +m_drawback +Responsible for the fancy menu background +================= +*/ void m_drawback( void ) { if ( clientstate() == 2 ) { drawfill( '0 0', vVideoSize, '0 0 0', 0.75f ); @@ -95,6 +47,13 @@ void m_drawback( void ) { } } +/* +================= +m_draw + +Run every frame, main loop for the menu +================= +*/ void m_draw( vector vScreenSize ) { if ( iMenuActive == FALSE ) { return; @@ -128,17 +87,19 @@ void m_draw( vector vScreenSize ) { if ( time < 5 ) { iMenuStage = 0; - drawmenustring( '45 45', "FreeCS (c) 2016, 2017", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 85', "Note that FreeCS is not affiliated", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 105', "with Steam or Valve.", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 125', "The source code for this is released", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 145', "under the GPL v2.", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 185', "FreeCS requires the content from:", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 205', "Counter-Strike 1.5", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 225', "Half-Life", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 265', "Please see visit:", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 285', "eukara.github.io/FreeCS", '16 16', '1 1 1', fFadeAlpha, 0 ); - drawmenustring( '45 325', "Developed by Marco Hladik", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenupic( '48 48 0', "gfx/logo", '64 64', '1 1 1', fFadeAlpha, 0 ); + drawmenupic( '144 48 0', "gfx/menu/freecs", '256 64', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 141', "FreeCS (c) 2016, 2017", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 181', "Note that FreeCS is not affiliated", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 201', "with Steam or Valve.", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 221', "The source code for this is released", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 241', "under the GPL v2.", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 281', "FreeCS requires the content from:", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 301', "Counter-Strike 1.5", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 321', "Half-Life", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 352', "Please see visit:", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 381', "eukara.github.io/FreeCS", '16 16', '1 1 1', fFadeAlpha, 0 ); + drawmenustring( '48 421', "Developed by Marco Hladik", '16 16', '1 1 1', fFadeAlpha, 0 ); } else if ( time < 8 ) { if ( iMenuStage == 0 ) { fFadeAlpha = 0.0f; @@ -157,13 +118,21 @@ void m_draw( vector vScreenSize ) { } m_drawback(); - drawmenupic( '25 145 0', "gfx/menu/freecs", '236 43', '1 1 1', fFadeAlpha, 0 ); - m_mainbutton( '430 300', " FIND SERVER", 1, m_button_findserver ); - m_mainbutton( '430 324', "CREATE SERVER", 2, m_button_createserver ); - m_mainbutton( '430 348', " OPTIONS", 3, m_button_options); - m_mainbutton( '430 372', " REPLAYS", 4, m_button_replays ); - m_mainbutton( '430 396', " QUIT", 5, m_button_quit ); + if ( !iMenu ) { + drawmenupic( '25 145 0', "gfx/menu/freecs", '236 43', '1 1 1', fFadeAlpha, 0 ); + } + + if ( clientstate() == 2 ) { + m_mainbutton( '430 276', " DISCONNECT", MAIN_DISCONNECT, m_button_disconnect ); + } + + m_mainbutton( '430 300', " FIND SERVER", MAIN_BROWSER, m_button_findserver ); + m_mainbutton( '430 324', "CREATE SERVER", MAIN_HOST, m_button_createserver ); + m_mainbutton( '430 348', " OPTIONS", MAIN_OPTIONS, m_button_options); + m_mainbutton( '430 372', " REPLAYS", MAIN_REPLAY, m_button_replays ); + m_mainbutton( '430 396', " QUIT", MAIN_QUIT, m_button_quit ); + } if ( fFadeAlpha < 1.0f ) { @@ -172,4 +141,11 @@ void m_draw( vector vScreenSize ) { fFadeAlpha = 1.0f; } } + + if ( fMenuAlpha < 1.0f ) { + fMenuAlpha += frametime * 0.5; + if ( fMenuAlpha > 1.0f ) { + fMenuAlpha = 1.0f; + } + } } diff --git a/Source/Menu/Init.c b/Source/Menu/Init.c index f85b1341..b8b547e7 100755 --- a/Source/Menu/Init.c +++ b/Source/Menu/Init.c @@ -18,6 +18,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* +================= +m_init + +Precaches and loading for the menu system +================= +*/ void m_init( void ) { precache_pic( "gfx/menu/freecs" ); precache_pic( "gfx/menu/back1" ); @@ -36,6 +43,13 @@ void m_init( void ) { search_end( shMaps ); } +/* +================= +m_shutdown + +I can see the curtain... the ending. +================= +*/ void m_shutdown( void ) { } diff --git a/Source/Menu/Input.c b/Source/Menu/Input.c index e9c2650c..51b197c9 100755 --- a/Source/Menu/Input.c +++ b/Source/Menu/Input.c @@ -18,6 +18,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* +================= +Menu_InputCheckMouse + +Checks a specified region and returns TRUE if the mouse is above it. +================= +*/ int Menu_InputCheckMouse( vector vPos, vector vReg ) { vector vSMins, vSMaxs; @@ -41,6 +48,13 @@ int Menu_InputCheckMouse( vector vPos, vector vReg ) { return FALSE; } +/* +================= +Menu_InputEvent + +New FTE routine for advanced mouse input in menuqc! +================= +*/ float Menu_InputEvent( float fEventType, float fKey, float fCharacter, float fDeviceID ) { if ( fEventType == IE_KEYDOWN ) { if ( fKey == K_MOUSE1 ) { @@ -72,6 +86,13 @@ float Menu_InputEvent( float fEventType, float fKey, float fCharacter, float fDe return TRUE; } +/* +================= +m_display, m_hide, m_toggle + +Essentially what happens when togglemenu is used, called by the engine as well. +================= +*/ void m_display( void ) { iMenuActive = TRUE; setkeydest( KEY_MENU ); diff --git a/Source/Menu/Menu_Create.c b/Source/Menu/Menu_Create.c new file mode 100755 index 00000000..b53c87b8 --- /dev/null +++ b/Source/Menu/Menu_Create.c @@ -0,0 +1,87 @@ +/* +FreeCS Project +Copyright (C) 2016, 2017 Marco "eukara" Hladik + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +var int iMapSelected = 0; + +/* +================= +m_mainbutton + +Buttons on the main menu screen +================= +*/ +void menu_mapbutton( vector vPos, int iItem ) { + + if ( Menu_InputCheckMouse( vPos, [ stringwidth( sMapList[ iItem ], TRUE, '16 16' ), 16 ] ) == TRUE ) { + if ( fMouseClick == TRUE ) { + iMapSelected = iItem; + fMouseClick = FALSE; + localsound( "misc/talk.wav" ); + } + } + + if ( iMapSelected == iItem ) { + drawmenustring( vPos, sMapList[ iItem ], '16 16', '1 0.5 0', 1.0f, 0 ); + } else { + drawmenustring( vPos, sMapList[ iItem ], '16 16', '1 1 1', fFadeAlpha, 0 ); + } +} + +void m_button_createserver_go( void ) { + localcmd( sprintf( "map %s\n", sMapList[ iMapSelected ] ) ); +} + +void m_button_createserver( void ) { + static int iMapOffset = 0; + + static void m_button_createserver_listless( void ) { + if ( iMapOffset - 15 > 0 ) { + iMapOffset -= 15; + } else { + iMapOffset = 0; + } + } + + static void m_button_createserver_listmore( void ) { + if ( iMapOffset + 15 < ( iMapCount - 15 ) ) { + iMapOffset += 15; + } else { + iMapOffset = iMapCount - 15; + } + } + + m_drawmenushadow(); + drawmenustring( '43 60 0', "CREATE SERVER", '16 16 0', '1 1 1', fMenuAlpha, FALSE ); + + vector vPos = '75 100'; + for ( float i = iMapOffset; i < ( 15 + iMapOffset ); i++ ) { + if ( iMapSelected == i ) { + drawmenustring( [ vPos_x - 32, vPos_y ], ">>", '16 16 0', '1 1 1', fMenuAlpha, FALSE ); + } + + menu_mapbutton( vPos, i ); + vPos_y += 20; + } + + menu_buttoncmd( '332 332', "<<", '16 16', m_button_createserver_listless ); + menu_buttoncmd( '332 364', ">>", '16 16', m_button_createserver_listmore ); + + menu_buttoncmd( '232 410', "CREATE >>", '16 16', m_button_createserver_go ); +}; diff --git a/Source/Menu/Menu_Options.c b/Source/Menu/Menu_Options.c new file mode 100755 index 00000000..dbf96dfd --- /dev/null +++ b/Source/Menu/Menu_Options.c @@ -0,0 +1,23 @@ +/* +FreeCS Project +Copyright (C) 2016, 2017 Marco "eukara" Hladik + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +void m_button_options( void ) { + +}; diff --git a/Source/Menu/Menu_Quit.c b/Source/Menu/Menu_Quit.c new file mode 100755 index 00000000..86733c62 --- /dev/null +++ b/Source/Menu/Menu_Quit.c @@ -0,0 +1,53 @@ +/* +FreeCS Project +Copyright (C) 2016, 2017 Marco "eukara" Hladik + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +void m_button_quit( void ) { + static void m_button_quit_yes( void ) { + localcmd( "quit\n" ); + } + static void m_button_quit_no( void ) { + iMenu = 0; + } + + m_drawmenushadow(); + + drawmenustring( '43 60 0', "QUIT GAME", '16 16 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( '88 211 0', "Are you sure you want to quit?", '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + menu_buttoncmd( '112 235 0', "Yes", '8 8', m_button_quit_yes ); + menu_buttoncmd( '283 235 0', "No", '8 8', m_button_quit_no ); +}; + + +void m_button_disconnect( void ) { + static void m_button_disconnect_yes( void ) { + iMenu = 0; + localcmd( "disconnect\n" ); + } + static void m_button_disconnect_no( void ) { + iMenu = 0; + } + + m_drawmenushadow(); + + drawmenustring( '43 60 0', "DISCONNECT", '16 16 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( '88 211 0', "Close connection to the server?", '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + menu_buttoncmd( '112 235 0', "Yes", '8 8', m_button_disconnect_yes ); + menu_buttoncmd( '283 235 0', "No", '8 8', m_button_disconnect_no ); +}; diff --git a/Source/Menu/Menu_Replays.c b/Source/Menu/Menu_Replays.c new file mode 100755 index 00000000..1f4ac75e --- /dev/null +++ b/Source/Menu/Menu_Replays.c @@ -0,0 +1,23 @@ +/* +FreeCS Project +Copyright (C) 2016, 2017 Marco "eukara" Hladik + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +void m_button_replays( void ) { + +}; diff --git a/Source/Menu/Menu_Servers.c b/Source/Menu/Menu_Servers.c new file mode 100755 index 00000000..35663c72 --- /dev/null +++ b/Source/Menu/Menu_Servers.c @@ -0,0 +1,149 @@ +/* +FreeCS Project +Copyright (C) 2016, 2017 Marco "eukara" Hladik + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +float fldName; +float fldAddress; +float fldPing; +float fldPlayers; +float fldMaxplayers; +float fldMap; +float fldTimelimit; +float fldFraglimit; +float fMaxServers; +float fServerClickTime; + +void Menu_Multiplayer_Connect( int iServerID ) { + if ( gethostcachenumber( fldMaxplayers, iServerID ) <= 0 ) { + return; + } + + if ( iServerID >= 0 ) { + localcmd( sprintf( "connect %s\n", gethostcachestring( fldAddress, iServerID ) ) ); + m_hide(); + } +} + +void Menu_Multiplayer_Find_Item( float fPos, int i, __inout int iSelected ) { + float fButtonAlpha = fMenuAlpha; + + if ( Menu_InputCheckMouse( [ 47, fPos ], [ 314, 8 ] ) == TRUE ) { + if ( fMouseClick == TRUE ) { + if ( iSelected != i ) { + iSelected = i; + fInputKeyCode = 0; + fMouseClick = FALSE; + fServerClickTime = time + 0.2; + } else { + if ( fServerClickTime > time ) { + Menu_Multiplayer_Connect( i ); + } + iSelected = -2; + fInputKeyCode = 0; + fMouseClick = FALSE; + } + } + } else { + fButtonAlpha *= 0.5; + } + + if ( iSelected == i ) { + drawmenufill( [ 40, fPos - 1 ], [ 323, 10 ], '1 1 1', fMenuAlpha * 0.5, 2 ); + drawmenustring( [48, fPos], sprintf( "%.16s", gethostcachestring( fldName, i ) ), '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( [184, fPos], sprintf( "%.10s", gethostcachestring( fldMap, i ) ), '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( [264, fPos], sprintf( "%d/%d", gethostcachenumber( fldPlayers, i ), gethostcachenumber( fldMaxplayers, i ) ), '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( [328, fPos], sprintf( "%.3s", ftos( gethostcachenumber( fldPing, i ) ) ), '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + } else { + drawmenustring( [48, fPos], sprintf( "^2%.16s", gethostcachestring( fldName, i ) ), '8 8 0', '1 1 1', fButtonAlpha, FALSE ); + drawmenustring( [184, fPos], sprintf( "%.10s", gethostcachestring( fldMap, i ) ), '8 8 0', '1 1 1', fButtonAlpha, FALSE ); + drawmenustring( [264, fPos], sprintf( "%d/%d", gethostcachenumber( fldPlayers, i ), gethostcachenumber( fldMaxplayers, i ) ), '8 8 0', '1 1 1', fButtonAlpha, FALSE ); + drawmenustring( [328, fPos], sprintf( "%.3s", ftos( gethostcachenumber( fldPing, i ) ) ), '8 8 0', '1 1 1', fButtonAlpha, FALSE ); + } +} + +void m_button_findserver( void ) { + static int iSelectedServer = -1; + static float fServerOffset; + + static void Menu_Multiplayer_Find_Refresh( void ) { + refreshhostcache(); + resorthostcache(); + } + static void Menu_Multiplayer_Find_ScrollDown( void ) { + fServerOffset++; + if ( fServerOffset > fMaxServers ) { + fServerOffset = fMaxServers; + } + } + static void Menu_Multiplayer_Find_ScrollUp( void ) { + fServerOffset--; + if ( fServerOffset < 0 ) { + fServerOffset = 0; + } + } + static void Menu_Multiplayer_Find_Connect( void ) { + Menu_Multiplayer_Connect( iSelectedServer ); + } + + m_drawmenushadow(); + drawmenustring( '43 60 0', "FIND SERVER", '16 16 0', '1 1 1', fMenuAlpha, FALSE ); + + if ( iSelectedServer == -1 ) { + localcmd( "com_protocolname FTE-Quake\n" ); + //clear the filter + resethostcachemasks(); + sethostcachemaskstring( 0, gethostcacheindexforkey("gamedir"), "freecs", SLIST_TEST_EQUAL ); + sethostcachesort( gethostcacheindexforkey( "ping" ), FALSE ); + refreshhostcache(); + resorthostcache(); + iSelectedServer = 0; + } + + fMaxServers = gethostcachevalue( SLIST_HOSTCACHEVIEWCOUNT ); + if ( fMaxServers >= 28 ) { + fMaxServers -= 28; + } + + fldName = gethostcacheindexforkey("name"); + fldAddress = gethostcacheindexforkey("cname"); + fldPing = gethostcacheindexforkey("ping"); + fldPlayers = gethostcacheindexforkey("numhumans"); + fldMaxplayers = gethostcacheindexforkey("maxplayers"); + fldMap = gethostcacheindexforkey("map"); + fldTimelimit = gethostcacheindexforkey("timelimit"); + fldFraglimit = gethostcacheindexforkey("fraglimit"); + + drawmenustring( '48 100 0', "Name", '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( '184 100 0', "Map", '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( '264 100 0', "Players", '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + drawmenustring( '328 100 0', "Ping", '8 8 0', '1 1 1', fMenuAlpha, FALSE ); + + float fPos = 120; + for ( float i = fServerOffset; i < ( 28 + fServerOffset ); i++ ) { + Menu_Multiplayer_Find_Item( fPos, i, iSelectedServer ); + fPos += 10; + } + + menu_buttoncmd( '128 410', "Refresh", '8 8', Menu_Multiplayer_Find_Refresh ); + menu_buttoncmd( '280 420', "Connect >>", '8 8', Menu_Multiplayer_Find_Connect ); + + // Scrollbars + menu_buttoncmd( '368 100', "<", '8 8', Menu_Multiplayer_Find_ScrollUp ); + menu_buttoncmd( '368 400', ">", '8 8', Menu_Multiplayer_Find_ScrollDown ); +} diff --git a/Source/Menu/Objects.c b/Source/Menu/Objects.c new file mode 100755 index 00000000..7fc0f0ab --- /dev/null +++ b/Source/Menu/Objects.c @@ -0,0 +1,131 @@ +/* +FreeCS Project +Copyright (C) 2016, 2017 Marco "eukara" Hladik + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* +================= +drawmenupic + +Wrapper for drawpic that cares about resolution and scales. +================= +*/ +void drawmenupic( vector vPosition, string sPic, vector vSize, vector vRGB, float fAlpha, float fDrawflag ) { + vSize = vSize * fMenuScale; + vPosition = vPosition * fMenuScale; + drawpic( vPosition + [ iMenuPadding, 0, 0 ], sPic, vSize, vRGB, fAlpha, fDrawflag ); +} + +/* +================= +drawmenufill + +Wrapper for drawpic that cares about resolution and scales. +================= +*/ +void drawmenufill( vector vPosition, vector vSize, vector vRGB, float fAlpha, float fDrawflag ) { + vSize = vSize * fMenuScale; + vPosition = vPosition * fMenuScale; + drawfill( vPosition + [ iMenuPadding, 0, 0 ], vSize, vRGB, fAlpha, fDrawflag ); +} + +/* +================= +drawmenustring + +Wrapper for drawstring that cares about resolution and scales. +================= +*/ +void drawmenustring( vector vPosition, string sText, vector vSize, vector vRGB, float fAlpha, float fDrawflag ) { + vSize = vSize * fMenuScale; + vPosition = vPosition * fMenuScale; + drawstring( vPosition + [ iMenuPadding, 0, 0 ], sText, vSize, vRGB, fAlpha, fDrawflag ); +} + +/* +================= +m_mainbutton + +Buttons on the main menu screen +================= +*/ +void m_mainbutton( vector vPos, string sText, int iItem, void() vFunc) { + static float fSelectionAlpha; + + if ( Menu_InputCheckMouse( vPos, '182 14' ) == TRUE ) { + if ( iButtonSelected != iItem ) { + iButtonSelected = iItem; + fSelectionAlpha = 0.0f; + } + + if ( fMouseClick == TRUE ) { + if ( iMenu == iItem ) { + iMenu = 0; + } else { + iMenu = iItem; + } + fMenuAlpha = 0.0f; + fMouseClick = FALSE; + localsound( "buttons/button9.wav" ); + } + } + + if ( iMenu == iItem ) { + drawmenustring( vPos, sText, '14 14', '1 0.5 0', 1.0f, 0 ); + vFunc(); + } else { + if ( iButtonSelected == iItem ) { + drawmenustring( vPos, sText, '14 14', '1 1 1', 1 - fSelectionAlpha, 0 ); + drawmenustring( vPos, sText, '14 14', '0.3 0.3 1', fSelectionAlpha, 0 ); + } else { + drawmenustring( vPos, sText, '14 14', '1 1 1', fFadeAlpha, 0 ); + } + } + + if ( fSelectionAlpha < 1.0f ) { + fSelectionAlpha += frametime; + if ( fSelectionAlpha > 1.0f ) { + fSelectionAlpha = 1.0f; + } + } +} + + +void menu_buttoncmd( vector vPosition, string sLabel, vector vFSize, void() vFunc ) { + float fButtonAlpha = fMenuAlpha; + if ( Menu_InputCheckMouse( vPosition, [ stringwidth( sLabel, TRUE, vFSize), vFSize_y ] ) == TRUE ) { + if ( fMouseClick == TRUE ) { + vFunc(); + fMouseClick = FALSE; + localsound( "buttons/button7.wav" ); + } + drawmenufill( vPosition + [ 0, vFSize_y + 2 ], [ stringwidth( sLabel, TRUE, vFSize ), 2 ], '1 1 1', fMenuAlpha * 0.5, 0 ); + } else { + fButtonAlpha *= 0.5; + } + drawmenustring( vPosition, sLabel, vFSize, '1 1 1', fButtonAlpha, FALSE ); +} + +#define OUTLINE_COLOR '0.8 0.8 1' +void m_drawmenushadow( void ) { + drawmenufill( '16 32', '380 430', '0 0 0', fMenuAlpha * 0.75, 2 ); // Backdrop + drawmenufill( '15 32', '1 430', OUTLINE_COLOR, fMenuAlpha * 0.5, 2 ); // Left + drawmenufill( '397 32', '1 430', OUTLINE_COLOR, fMenuAlpha * 0.5, 2 ); // Right + drawmenufill( '15 31', '383 1', OUTLINE_COLOR, fMenuAlpha * 0.5, 2 ); // Up + drawmenufill( '15 462', '383 1', OUTLINE_COLOR, fMenuAlpha * 0.5, 2 ); // Down +} diff --git a/Source/Menu/progs.src b/Source/Menu/progs.src index ec7fde49..ed4c7163 100755 --- a/Source/Menu/progs.src +++ b/Source/Menu/progs.src @@ -10,5 +10,11 @@ Defs.h Init.c Input.c +Objects.c +Menu_Create.c +Menu_Options.c +Menu_Quit.c +Menu_Replays.c +Menu_Servers.c Draw.c #endlist diff --git a/Source/Server/EntHostage.c b/Source/Server/EntHostage.c index d765abbd..9703dd9e 100755 --- a/Source/Server/EntHostage.c +++ b/Source/Server/EntHostage.c @@ -41,7 +41,7 @@ entity hostage_waypoint( void ) { setsize( ePoint, self.mins, self.maxs ); ePoint.classname = "remove_me"; ePoint.movetype = MOVETYPE_TOSS; - setmodel( ePoint, "models/chick.mdl" ); // Visual feedback... +// setmodel( ePoint, "models/chick.mdl" ); // Visual feedback... return ePoint; } diff --git a/Source/Server/Spawn.c b/Source/Server/Spawn.c index b5e72ba9..7e9ffbcc 100755 --- a/Source/Server/Spawn.c +++ b/Source/Server/Spawn.c @@ -91,7 +91,6 @@ void Spawn_ObserverCam( void ) { } } } else { - bprint( "Can't find fucking camera\n" ); // Can't find a camera? Just do this lazy thing, CS seems to do the same eCamera = find ( world, classname, "info_player_start" ); diff --git a/freecs/gfx/cursor.tga b/freecs/gfx/cursor.tga new file mode 100755 index 00000000..356b04ed Binary files /dev/null and b/freecs/gfx/cursor.tga differ diff --git a/freecs/gfx/logo.tga b/freecs/gfx/logo.tga new file mode 100755 index 00000000..d7abe1df Binary files /dev/null and b/freecs/gfx/logo.tga differ diff --git a/freecs/menu.dat b/freecs/menu.dat index 30f50083..8973d568 100755 Binary files a/freecs/menu.dat and b/freecs/menu.dat differ diff --git a/freecs/progs.dat b/freecs/progs.dat index 9e9cd1a1..4119c654 100644 Binary files a/freecs/progs.dat and b/freecs/progs.dat differ