diff --git a/Source/Client/Entities.c b/Source/Client/Entities.c index ad15f17f..30f720bc 100755 --- a/Source/Client/Entities.c +++ b/Source/Client/Entities.c @@ -18,6 +18,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +void CSQC_ambient_generic( string sSample, float fVolume, float fAttenuation ) { + //print( sprintf( "SOUND: %s, %f, %d\n%d %d %d", sSample, fVolume, fAttenuation, self.origin_x, self.origin_y, self.origin_z ) ); + sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, SOUNDFLAG_FORCELOOP ); +} /* ================= @@ -57,6 +61,14 @@ void CSQC_Ent_Update( float flIsNew ) { } setorigin( self, self.origin ); + } else if ( fEntType == ENT_AMBIENTSOUND ) { + self.origin_x = readcoord(); + self.origin_y = readcoord(); + self.origin_z = readcoord(); + + setorigin( self, self.origin ); + + CSQC_ambient_generic( readstring(), readfloat(), readbyte() ); } else if ( fEntType == ENT_SPRITE ) { self.origin_x = readcoord(); self.origin_y = readcoord(); diff --git a/Source/Client/Event.c b/Source/Client/Event.c index 647a8af6..48137e88 100755 --- a/Source/Client/Event.c +++ b/Source/Client/Event.c @@ -279,31 +279,31 @@ float CSQC_ConsoleCommand( string sCMD ) { return TRUE; break; case "vest": - sendevent( "PlayerBuyEquipment", "f", EQUIPMENT_KEVLAR ); + sendevent( "PlayerBuyEquipment", "f", 0 ); return TRUE; break; case "vesthelm": - sendevent( "PlayerBuyEquipment", "f", EQUIPMENT_HELMET ); + sendevent( "PlayerBuyEquipment", "f", 1 ); return TRUE; break; case "flash": - sendevent( "PlayerBuyEquipment", "f", EQUIPMENT_FLASHBANG ); + sendevent( "PlayerBuyEquipment", "f", 2 ); return TRUE; break; case "hegren": - sendevent( "PlayerBuyEquipment", "f", EQUIPMENT_HEGRENADE ); + sendevent( "PlayerBuyEquipment", "f", 3 ); return TRUE; break; case "vsgren": - sendevent( "PlayerBuyEquipment", "f", EQUIPMENT_SMOKEGRENADE ); + sendevent( "PlayerBuyEquipment", "f", 4 ); return TRUE; break; case "defuser": - sendevent( "PlayerBuyEquipment", "f", EQUIPMENT_DEFUSALKIT ); + sendevent( "PlayerBuyEquipment", "f", 5 ); return TRUE; break; case "nvg": - sendevent( "PlayerBuyEquipment", "f", EQUIPMENT_NIGHTVISION ); + sendevent( "PlayerBuyEquipment", "f", 6 ); return TRUE; break; case "coverme": diff --git a/Source/Client/HUDWeaponSelect.c b/Source/Client/HUDWeaponSelect.c index da964a0c..1bf7a7bd 100755 --- a/Source/Client/HUDWeaponSelect.c +++ b/Source/Client/HUDWeaponSelect.c @@ -18,6 +18,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +// We can only carry one item per slot, so this is hacking around the last one +int iHUDGrenades; +int iHUDGrenadesSelected; + typedef struct { string sSprite; vector vOrigin; @@ -48,8 +52,8 @@ weaponsymbolinfo_t wpSymbolTable[ CS_WEAPON_COUNT ] = { { "sprites/640hud2.spr_0.tga", '0 0.703125' }, //WEAPON_G3SG1 { "sprites/640hud14.spr_0.tga", '0 0.703125' }, //WEAPON_SG550 { "sprites/640hud3.spr_0.tga", '0 0' }, //WEAPON_PARA - { "sprites/640hud1.spr_0.tga", '0 0' }, //WEAPON_C4BOMB - { "sprites/640hud3.spr_0.tga", '0 0.3515625' }, //WEAPON_FLASHBANG + { "sprites/640hud1.spr_0.tga", '0 0' }, //WEAPON_C4BOMB + { "sprites/640hud3.spr_0.tga", '0 0.3515625' }, //WEAPON_FLASHBANG { "sprites/640hud3.spr_0.tga", '0 0.17578125' }, //WEAPON_HEGRENADE { "sprites/640hud3.spr_0.tga", '0 0.52734375' } //WEAPON_SMOKEGRENADE }; @@ -85,12 +89,48 @@ float HUD_DrawWeaponSelect_NextItem( float fSlot ) { return HUD_DrawWeaponSelect_NextItem( SLOT_MELEE ); } } else if ( fSlot == SLOT_MELEE ) { - if ( getstatf( STAT_SLOT_GRENADE ) ) { + // This happens when we go into the slot for the first time + iHUDGrenades = 0; + + // Keep this order in order for the selection to work + if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_SMOKEGRENADE; + iHUDGrenades++; + } + if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) { + iHUDGrenadesSelected = WEAPON_FLASHBANG; + iHUDGrenades++; + } + + if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_HEGRENADE; + iHUDGrenades++; + } + + // If we have any grenades, proceed with that slot + if ( iHUDGrenades ) { return SLOT_GRENADE; - } else { + } else { return HUD_DrawWeaponSelect_NextItem( SLOT_GRENADE ); } } else { + // If we're in the grenade slot, go down + if ( iHUDGrenadesSelected == WEAPON_HEGRENADE ) { + // Do we have a flash bang? If yes, select that thing + if ( getstatf( STAT_ITEM_FLASHBANG ) ) { + iHUDGrenadesSelected = WEAPON_FLASHBANG; + return SLOT_GRENADE; + } else if ( getstatf( STAT_ITEM_SMOKEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_SMOKEGRENADE; + return SLOT_GRENADE; + } + } else if ( iHUDGrenadesSelected == WEAPON_FLASHBANG ) { + if ( getstatf( STAT_ITEM_SMOKEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_SMOKEGRENADE; + return SLOT_GRENADE; + } + } + if ( getstatf( STAT_SLOT_PRIMARY ) ) { return SLOT_PRIMARY; } else { @@ -108,7 +148,23 @@ Checks and returns the previous slot with a weapon in it */ float HUD_DrawWeaponSelect_PreviousItem( float fSlot ) { if ( fSlot == SLOT_PRIMARY ) { - if ( getstatf( STAT_SLOT_GRENADE ) ) { + iHUDGrenades = 0; + + // Keep this order in order for the selection to work + if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_HEGRENADE; + iHUDGrenades++; + } + if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) { + iHUDGrenadesSelected = WEAPON_FLASHBANG; + iHUDGrenades++; + } + if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_SMOKEGRENADE; + iHUDGrenades++; + } + + if ( iHUDGrenades ) { return SLOT_GRENADE; } else { return HUD_DrawWeaponSelect_PreviousItem( SLOT_GRENADE ); @@ -126,10 +182,24 @@ float HUD_DrawWeaponSelect_PreviousItem( float fSlot ) { return HUD_DrawWeaponSelect_PreviousItem( SLOT_SECONDARY ); } } else { - if ( getstatf( STAT_SLOT_MELEE ) ) { - return SLOT_MELEE; + if ( iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) { + if ( getstatf( STAT_ITEM_FLASHBANG ) ) { + iHUDGrenadesSelected = WEAPON_FLASHBANG; + return SLOT_GRENADE; + } else if ( getstatf( STAT_ITEM_HEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_HEGRENADE; + return SLOT_GRENADE; + } + } else if ( iHUDGrenadesSelected == WEAPON_FLASHBANG ) { + if ( getstatf( STAT_ITEM_HEGRENADE ) ) { + iHUDGrenadesSelected = WEAPON_HEGRENADE; + return SLOT_GRENADE; + } + } + if ( getstatf( STAT_SLOT_PRIMARY ) ) { + return SLOT_PRIMARY; } else { - return HUD_DrawWeaponSelect_PreviousItem( SLOT_MELEE ); + return HUD_DrawWeaponSelect_NextItem( SLOT_PRIMARY ); } } } @@ -149,7 +219,7 @@ float HUD_DrawWeaponSelect_GetWeapon( float fSlot ) { } else if ( fSlot == SLOT_MELEE ) { return getstatf( STAT_SLOT_MELEE ); } else { - return getstatf( STAT_SLOT_GRENADE ); + return iHUDGrenadesSelected; } } @@ -217,7 +287,7 @@ HUD_DrawWeaponSelect Drawn every frame through HUD.c ================= */ -void HUD_DrawWeaponSelect( void ) { +void HUD_DrawWeaponSelect( void ) { if ( fHUDWeaponSelectTime < time ) { if ( fHUDWeaponSelected ) { sound( self, CHAN_ITEM, "common/wpn_hudoff.wav", 0.5, ATTN_NONE ); @@ -231,11 +301,30 @@ void HUD_DrawWeaponSelect( void ) { for ( int i = 0; i < 4; i++ ) { HUD_DrawWeaponSelect_Num( vSelectPos, i ); - if ( wptTable[ fHUDWeaponSelected ].iSlot == i ) { - drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ fHUDWeaponSelected ].sSprite, wpSymbolTable[ fHUDWeaponSelected ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE ); - vSelectPos_x += 170; + // Again, grenades are treated seperately + if ( i == SLOT_GRENADE ) { + if ( wptTable[ fHUDWeaponSelected ].iSlot == SLOT_GRENADE ) { + if ( iHUDGrenadesSelected == WEAPON_HEGRENADE ) { + drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ WEAPON_HEGRENADE ].sSprite, wpSymbolTable[ WEAPON_HEGRENADE ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE ); + } + vSelectPos_y += 45; + + if ( iHUDGrenadesSelected == WEAPON_FLASHBANG ) { + drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ WEAPON_FLASHBANG ].sSprite, wpSymbolTable[ WEAPON_FLASHBANG ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE ); + } + vSelectPos_y += 45; + + if ( iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) { + drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ WEAPON_SMOKEGRENADE ].sSprite, wpSymbolTable[ WEAPON_SMOKEGRENADE ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE ); + } + } } else { - vSelectPos_x += 20; + if ( wptTable[ fHUDWeaponSelected ].iSlot == i ) { + drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ fHUDWeaponSelected ].sSprite, wpSymbolTable[ fHUDWeaponSelected ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE ); + vSelectPos_x += 170; + } else { + vSelectPos_x += 20; + } } } } diff --git a/Source/Client/VGUI.c b/Source/Client/VGUI.c index 4e87452c..11a4c073 100755 --- a/Source/Client/VGUI.c +++ b/Source/Client/VGUI.c @@ -22,17 +22,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // Menus with their window titles and draw functions vguiwindow_t vguiMenus[11] = { - { "Message Of The Day", VGUI_MessageOfTheDay }, - { "Team Selection", VGUI_TeamSelect_Main }, - { "Terrorist Selection", VGUI_TeamSelect_T }, - { "Counter-Terrorist Selection", VGUI_TeamSelect_CT }, - { "Buy Menu", VGUI_BuyMenu_Main }, - { "Handguns", VGUI_BuyMenu_Handguns }, - { "Shotgun", VGUI_BuyMenu_Shotguns }, - { "Sub-Machine-Guns", VGUI_BuyMenu_SMGs }, - { "Rifles", VGUI_BuyMenu_Rifles }, - { "Machineguns", VGUI_BuyMenu_Machineguns }, - { "Equipment", VGUI_BuyMenu_Equipment } + { _("Message Of The Day"), VGUI_MessageOfTheDay }, + { _("Team Selection"), VGUI_TeamSelect_Main }, + { _("Terrorist Selection"), VGUI_TeamSelect_T }, + { _("Counter-Terrorist Selection"), VGUI_TeamSelect_CT }, + { _("Buy Menu"), VGUI_BuyMenu_Main }, + { _("Handguns"), VGUI_BuyMenu_Handguns }, + { _("Shotgun"), VGUI_BuyMenu_Shotguns }, + { _("Sub-Machine-Guns"), VGUI_BuyMenu_SMGs }, + { _("Rifles"), VGUI_BuyMenu_Rifles }, + { _("Machineguns"), VGUI_BuyMenu_Machineguns }, + { _("Equipment"), VGUI_BuyMenu_Equipment } }; /* diff --git a/Source/Client/VGUIBuyMenu.c b/Source/Client/VGUIBuyMenu.c index 24983dae..8e9795fa 100755 --- a/Source/Client/VGUIBuyMenu.c +++ b/Source/Client/VGUIBuyMenu.c @@ -21,40 +21,40 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "VGUI.h" vguiweaponobject_t vguiWeaponTable[ CS_WEAPON_COUNT ] = { - { "None", "" }, - { "Knife", "" }, - { "H&K USP .45 Tactical", "gfx/vgui/640_usp" }, - { "Glock18 Select Fire", "gfx/vgui/640_glock18" }, - { "Desert Eagle .50AE", "gfx/vgui/640_deagle" }, - { "SIG P228", "gfx/vgui/640_p228" }, - { "Dual Beretta 96G Elite", "gfx/vgui/640_elite" }, - { "FN Five-Seven", "gfx/vgui/640_fiveseven" }, - { "Benelli M3 Super90", "gfx/vgui/640_m3" }, - { "Benelli XM1014", "gfx/vgui/640_xm1014" }, - { "H&K MP5-Navy", "gfx/vgui/640_mp5" }, - { "FN P90", "gfx/vgui/640_p90" }, - { "H&K UMP45", "gfx/vgui/640_ump45" }, - { "Ingram MAC-10", "gfx/vgui/640_mac10" }, - { "Steyr Tactical Machine Pistol", "gfx/vgui/640_tmp" }, - { "AK-47", "gfx/vgui/640_ak47" }, - { "Sig SG-552 Commando", "gfx/vgui/640_sg552" }, - { "Colt M4A1 Carbine", "gfx/vgui/640_m4a1" }, - { "Steyr Aug", "gfx/vgui/640_aug" }, - { "Steyr Scout", "gfx/vgui/640_scout" }, - { "AI Arctic Warfare/Magnum", "gfx/vgui/640_awp" }, - { "H&K G3/SG-1 Sniper Rifle", "gfx/vgui/640_g3sg1" }, - { "Sig SG-550 Sniper", "gfx/vgui/640_sg550" }, - { "FN M249 Para", "gfx/vgui/640_m249" } + { _("None"), "" }, + { _("Knife"), "" }, + { _("H&K USP .45 Tactical"), "gfx/vgui/640_usp" }, + { _("Glock18 Select Fire"), "gfx/vgui/640_glock18" }, + { _("Desert Eagle .50AE"), "gfx/vgui/640_deagle" }, + { _("SIG P228"), "gfx/vgui/640_p228" }, + { _("Dual Beretta 96G Elite"), "gfx/vgui/640_elite" }, + { _("FN Five-Seven"), "gfx/vgui/640_fiveseven" }, + { _("Benelli M3 Super90"), "gfx/vgui/640_m3" }, + { _("Benelli XM1014"), "gfx/vgui/640_xm1014" }, + { _("H&K MP5-Navy"), "gfx/vgui/640_mp5" }, + { _("FN P90"), "gfx/vgui/640_p90" }, + { _("H&K UMP45"), "gfx/vgui/640_ump45" }, + { _("Ingram MAC-10"), "gfx/vgui/640_mac10" }, + { _("Steyr Tactical Machine Pistol"), "gfx/vgui/640_tmp" }, + { _("AK-47"), "gfx/vgui/640_ak47" }, + { _("Sig SG-552 Commando"), "gfx/vgui/640_sg552" }, + { _("Colt M4A1 Carbine"), "gfx/vgui/640_m4a1" }, + { _("Steyr Aug"), "gfx/vgui/640_aug" }, + { _("Steyr Scout"), "gfx/vgui/640_scout" }, + { _("AI Arctic Warfare/Magnum"), "gfx/vgui/640_awp" }, + { _("H&K G3/SG-1 Sniper Rifle"), "gfx/vgui/640_g3sg1" }, + { _("Sig SG-550 Sniper"), "gfx/vgui/640_sg550" }, + { _("FN M249 Para"), "gfx/vgui/640_m249" } }; vguiequipobject_t vguiEquipmentTable[ 7 ] = { - { EQUIPMENT_KEVLAR, "Kevlar", "gfx/vgui/640_kevlar" }, - { EQUIPMENT_HELMET, "Kevlar & Helmet", "gfx/vgui/640_kevlar_helmet" }, - { EQUIPMENT_FLASHBANG, "Flashband", "gfx/vgui/640_flashbang" }, - { EQUIPMENT_HEGRENADE, "HE Grenade", "gfx/vgui/640_hegrenade" }, - { EQUIPMENT_SMOKEGRENADE, "Smoke Grenade", "gfx/vgui/640_smokegrenade" }, - { EQUIPMENT_DEFUSALKIT, "Defusal Kit", "gfx/vgui/640_defuser" }, - { EQUIPMENT_NIGHTVISION, "NightVision", "gfx/vgui/640_nightvision" }, + { EQUIPMENT_KEVLAR, _("Kevlar"), "gfx/vgui/640_kevlar" }, + { EQUIPMENT_HELMET, _("Kevlar & Helmet"), "gfx/vgui/640_kevlar_helmet" }, + { WEAPON_FLASHBANG, _("Flashbang"), "gfx/vgui/640_flashbang" }, + { WEAPON_HEGRENADE, _("HE Grenade"), "gfx/vgui/640_hegrenade" }, + { WEAPON_SMOKEGRENADE, _("Smoke Grenade"), "gfx/vgui/640_smokegrenade" }, + { EQUIPMENT_DEFUSALKIT, _("Defusal Kit"), "gfx/vgui/640_defuser" }, + { EQUIPMENT_NIGHTVISION, _("NightVision"), "gfx/vgui/640_nightvision" }, }; // TODO: Clean this up @@ -89,17 +89,17 @@ void VGUI_BuyMenu_Main( vector vPos ) { fVGUI_Display = VGUI_NONE; } - VGUI_Button( "Handguns", BuyMenu_Main_1, vPos + '16 116 0', '180 24 0' ); - VGUI_Button( "Shotguns", BuyMenu_Main_2, vPos + '16 148 0', '180 24 0' ); - VGUI_Button( "SMGs", BuyMenu_Main_3, vPos + '16 180 0', '180 24 0' ); - VGUI_Button( "Rifles", BuyMenu_Main_4, vPos + '16 212 0', '180 24 0' ); - VGUI_Button( "Machine Gun", BuyMenu_Main_5, vPos + '16 244 0', '180 24 0' ); + VGUI_Button( _("Handguns"), BuyMenu_Main_1, vPos + '16 116 0', '180 24 0' ); + VGUI_Button( _("Shotguns"), BuyMenu_Main_2, vPos + '16 148 0', '180 24 0' ); + VGUI_Button( _("SMGs"), BuyMenu_Main_3, vPos + '16 180 0', '180 24 0' ); + VGUI_Button( _("Rifles"), BuyMenu_Main_4, vPos + '16 212 0', '180 24 0' ); + VGUI_Button( _("Machine Gun"), BuyMenu_Main_5, vPos + '16 244 0', '180 24 0' ); - VGUI_Button( "Primary Ammo", BuyMenu_Main_6, vPos + '16 308 0', '180 24 0' ); - VGUI_Button( "Secondary Ammo", BuyMenu_Main_7, vPos + '16 340 0', '180 24 0' ); - VGUI_Button( "Equipment", BuyMenu_Main_8, vPos + '16 372 0', '180 24 0' ); + VGUI_Button( _("Primary Ammo"), BuyMenu_Main_6, vPos + '16 308 0', '180 24 0' ); + VGUI_Button( _("Secondary Ammo"), BuyMenu_Main_7, vPos + '16 340 0', '180 24 0' ); + VGUI_Button( _("Equipment"), BuyMenu_Main_8, vPos + '16 372 0', '180 24 0' ); - VGUI_Button( "Exit", BuyMenu_Main_9, vPos + '16 440 0', '180 24 0' ); + VGUI_Button( _("Exit"), BuyMenu_Main_9, vPos + '16 440 0', '180 24 0' ); } void VGUI_BuyMenu_Back( void ) { @@ -144,9 +144,9 @@ void VGUI_BuyMenu_WeaponButton( float fWeapon ) { if ( wptTable[ fWeapon ].iPrice <= getstatf( STAT_MONEY ) ) { if ( VGUI_Button( vguiWeaponTable[ fWeapon ].sName, VGUI_BuyMenu_BuyWeapon, vVGUIButtonPos, '264 24 0' ) == TRUE ) { drawpic( vVGUIWindowPos + '328 116', vguiWeaponTable[ fWeapon ].sImage, '256 64', '1 1 1', 1 ); - VGUI_Text( sprintf( "Price: %i", wptTable[ fWeapon ].iPrice ), vVGUIWindowPos + '328 250', '8 8 0' ); - VGUI_Text( sprintf( "Caliber: %i", wptTable[ fWeapon ].iCaliber ), vVGUIWindowPos + '328 260', '8 8 0' ); - VGUI_Text( sprintf( "Rounds Per Minute: %d", ( wptTable[ fWeapon ].fAttackFinished) * 3600 ), vVGUIWindowPos + '328 270', '8 8 0' ); + VGUI_Text( sprintf( _("Price: %i"), wptTable[ fWeapon ].iPrice ), vVGUIWindowPos + '328 250', '8 8 0' ); + VGUI_Text( sprintf( _("Caliber: %i"), wptTable[ fWeapon ].iCaliber ), vVGUIWindowPos + '328 260', '8 8 0' ); + VGUI_Text( sprintf( _("Rounds Per Minute: %d"), ( wptTable[ fWeapon ].fAttackFinished) * 3600 ), vVGUIWindowPos + '328 270', '8 8 0' ); } } else { VGUI_FakeButton( vguiWeaponTable[ fWeapon ].sName, vVGUIButtonPos, '264 24 0' ); @@ -168,7 +168,7 @@ void VGUI_BuyMenu_EquipmentButton( float fID ) { if ( eqptTable[ fID ].iPrice <= getstatf( STAT_MONEY ) ) { if ( VGUI_Button( vguiEquipmentTable[ fID ].sName, VGUI_BuyMenu_BuyEquipment, vVGUIButtonPos, '180 24 0' ) == TRUE ) { drawpic( vVGUIWindowPos + '290 116', vguiEquipmentTable[ fID ].sImage, '256 64', '1 1 1', 1 ); - VGUI_Text( sprintf( "Price: %i", eqptTable[ fID ].iPrice ) , vVGUIWindowPos + '256 250', '8 8 0' ); + VGUI_Text( sprintf( _("Price: %i"), eqptTable[ fID ].iPrice ) , vVGUIWindowPos + '256 250', '8 8 0' ); } } else { VGUI_FakeButton( vguiEquipmentTable[ fID ].sName, vVGUIButtonPos, '180 24 0' ); @@ -198,7 +198,7 @@ void VGUI_BuyMenu_Handguns( vector vPos ) { VGUI_BuyMenu_WeaponButton( WEAPON_FIVESEVEN ); } - VGUI_Button( "Back", VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); + VGUI_Button( _("Back"), VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); } /* @@ -212,7 +212,7 @@ void VGUI_BuyMenu_Shotguns( vector vPos ) { VGUI_BuyMenu_WeaponButton( WEAPON_M3 ); VGUI_BuyMenu_WeaponButton( WEAPON_XM1014 ); - VGUI_Button( "Back", VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); + VGUI_Button( _("Back"), VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); } /* @@ -236,7 +236,7 @@ void VGUI_BuyMenu_SMGs( vector vPos ) { VGUI_BuyMenu_WeaponButton( WEAPON_TMP ); } - VGUI_Button( "Back", VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); + VGUI_Button( _("Back"), VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); } /* @@ -267,7 +267,7 @@ void VGUI_BuyMenu_Rifles( vector vPos ) { VGUI_BuyMenu_WeaponButton( WEAPON_SG550 ); } - VGUI_Button( "Back", VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); + VGUI_Button( _("Back"), VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); } /* @@ -280,7 +280,7 @@ void VGUI_BuyMenu_Machineguns( vector vPos ) { VGUI_BuyMenu_WeaponButton( WEAPON_PARA ); - VGUI_Button( "Back", VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); + VGUI_Button( _("Back"), VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); } /* @@ -303,5 +303,5 @@ void VGUI_BuyMenu_Equipment( vector vPos ) { VGUI_BuyMenu_EquipmentButton( 6 ); - VGUI_Button( "Back", VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); + VGUI_Button( _("Back"), VGUI_BuyMenu_Back, vPos + '16 440 0', '180 24 0' ); } diff --git a/Source/Client/VGUIMOTD.c b/Source/Client/VGUIMOTD.c index 99902a37..6964480f 100755 --- a/Source/Client/VGUIMOTD.c +++ b/Source/Client/VGUIMOTD.c @@ -35,5 +35,5 @@ void VGUI_MessageOfTheDay( vector vPos ) { vTextPos_y += 10; } - VGUI_Button( "OK", MessageOfTheDay_ButtonOK, vPos + '16 440 0', '80 24 0' ); + VGUI_Button( _("OK"), MessageOfTheDay_ButtonOK, vPos + '16 440 0', '80 24 0' ); } diff --git a/Source/Client/VGUIRadio.c b/Source/Client/VGUIRadio.c index 06ba9603..43fc67bb 100755 --- a/Source/Client/VGUIRadio.c +++ b/Source/Client/VGUIRadio.c @@ -73,7 +73,7 @@ void VGUI_Radio_Draw( void ) { vSize_y = ( 10 * VGUIRADIO_COMMANDS ) + 64; vPos = [ 16, vVideoResolution_y - 148 - vSize_y ]; - VGUI_WindowSmall( "Radio Commands", vPos, vSize ); + VGUI_WindowSmall( _("Radio Commands"), vPos, vSize ); vPos_y += 24; vPos_x += 8; @@ -86,7 +86,7 @@ void VGUI_Radio_Draw( void ) { vSize_y = ( 10 * VGUIRADIO_GROUPCOMMANDS ) + 64; vPos = [ 16, vVideoResolution_y - 148 - vSize_y ]; - VGUI_WindowSmall( "Group Radio Commands", vPos, vSize ); + VGUI_WindowSmall( _("Group Radio Commands"), vPos, vSize ); vPos_y += 24; vPos_x += 8; @@ -99,7 +99,7 @@ void VGUI_Radio_Draw( void ) { vSize_y = ( 10 * VGUIRADIO_RESPONSES ) + 64; vPos = [ 16, vVideoResolution_y - 148 - vSize_y ]; - VGUI_WindowSmall( "Radio Responses", vPos, vSize ); + VGUI_WindowSmall( _("Radio Responses"), vPos, vSize ); vPos_y += 24; vPos_x += 8; @@ -110,7 +110,7 @@ void VGUI_Radio_Draw( void ) { } vPos_y += 20; - VGUI_Text( "0) Back", vPos, '8 8 0' ); + VGUI_Text( sprintf( "0) %s", _("Back") ), vPos, '8 8 0' ); if ( fInputKeyCode == 48 ) { fVGUI_Display = VGUI_NONE; diff --git a/Source/Client/VGUIScoreboard.c b/Source/Client/VGUIScoreboard.c index 1c628941..fcaeaed4 100755 --- a/Source/Client/VGUIScoreboard.c +++ b/Source/Client/VGUIScoreboard.c @@ -21,10 +21,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "VGUI.h" string sScoreTeams[4] = { - "Spectator", - "Terrorists", - "CT Forces", - "VIP", + _("Spectator"), + _("Terrorists"), + _("CT Forces"), + _("VIP"), }; // This is seperated from the other VGUI stuff so we can check scores while buying and whatnot @@ -52,9 +52,9 @@ vector VGUI_Scores_DrawTeam( vector vPos, float fTeam ) { } if ( getplayerkeyvalue( i, "*dead" ) == "1" ) { - drawstring( vNewPos + '38 0', sprintf( "%s [DEAD]", getplayerkeyvalue( i, "name" ) ), '8 8 0', vColor, 1, 0 ); + drawstring( vNewPos + '38 0', sprintf( _("%s [DEAD]"), getplayerkeyvalue( i, "name" ) ), '8 8 0', vColor, 1, 0 ); } else if ( getplayerkeyvalue( i, "*dead" ) == "2" ) { - drawstring( vNewPos + '38 0', sprintf( "%s [VIP]", getplayerkeyvalue( i, "name" ) ), '8 8 0', vColor, 1, 0 ); + drawstring( vNewPos + '38 0', sprintf( _("%s [VIP]"), getplayerkeyvalue( i, "name" ) ), '8 8 0', vColor, 1, 0 ); } else { drawstring( vNewPos + '38 0', getplayerkeyvalue( i, "name" ), '8 8 0', vColor, 1, 0 ); } @@ -98,7 +98,7 @@ vector VGUI_Scores_DrawTeam( vector vPos, float fTeam ) { // Now we know the playercount, so let's calculate the position next to the Teamname String and print it vector vCountPos = vPos + '24 6'; vCountPos_x += stringwidth( sScoreTeams[ fTeam ], FALSE, '16 16 0' ) + 8; - drawstring( vCountPos, sprintf( "(%i players)", iPlayerCount ), '8 8 0', vColor, 1, 0 ); + drawstring( vCountPos, sprintf( _("(%i players)"), iPlayerCount ), '8 8 0', vColor, 1, 0 ); } return vNewPos + '0 24'; } @@ -135,7 +135,7 @@ void VGUI_Scores_Show( void ) { drawstring( vMainPos + '24 13', serverkey( "hostname" ), '16 16 0', VGUI_WINDOW_FGCOLOR, 1, 0 ); // Tabs like Score, Ping etc. - drawstring( vMainPos + '280 32', "SCORE DEATHS LATENCY VOICE", '8 8 0', VGUI_WINDOW_FGCOLOR, 1, 0 ); + drawstring( vMainPos + '280 32', _("SCORE DEATHS LATENCY VOICE"), '8 8 0', VGUI_WINDOW_FGCOLOR, 1, 0 ); vector vOffset = VGUI_Scores_DrawTeam( vMainPos + '0 50', TEAM_CT ); vOffset = VGUI_Scores_DrawTeam( vOffset, TEAM_T ); diff --git a/Source/Client/VGUITeamSelect.c b/Source/Client/VGUITeamSelect.c index ae018ba1..1e2d6768 100755 --- a/Source/Client/VGUITeamSelect.c +++ b/Source/Client/VGUITeamSelect.c @@ -21,69 +21,69 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "VGUI.h" string sClassInfo[64] = { - "Phoenix Connexion", "gfx/vgui/640_terror", - "The Phoenix Faction was formed shortly", - "after the breakup of the USSR. Having", - "established a reputation for killing ", - "anyone that gets in their way, the", - "the Phoenix Faction is one of the most", - "feared terrorist groups in Eastern Europe.", + _("Phoenix Connexion"), "gfx/vgui/640_terror", + _("The Phoenix Faction was formed shortly"), + _("after the breakup of the USSR. Having"), + _("established a reputation for killing "), + _("anyone that gets in their way, the"), + _("the Phoenix Faction is one of the most"), + _("feared terrorist groups in Eastern Europe."), - "L337 Krew", "gfx/vgui/640_leet", - "Middle Eastern fundamentalist group bent", - "on world domination and various other", - "evil deeds", - "", - "", - "", + _("L337 Krew"), "gfx/vgui/640_leet", + _("Middle Eastern fundamentalist group bent"), + _("on world domination and various other"), + _("evil deeds"), + _(""), + _(""), + _(""), - "Arctic Avengers", "gfx/vgui/640_arctic", - "Swedish terrorist faction founded in 1977.", - "Famous for their bombing of the Canadian", - "embassy in 1990.", - "", - "", - "", + _("Arctic Avengers"), "gfx/vgui/640_arctic", + _("Swedish terrorist faction founded in 1977."), + _("Famous for their bombing of the Canadian"), + _("embassy in 1990."), + _(""), + _(""), + _(""), - "Guerilla Warfare", "gfx/vgui/640_guerilla", - "A terrorist faction founded in the", - "Middle East, Guerilla Warfare, has a", - "reputation for ruthlessness. Their disgust", - "for the American lifestyle was demonstrated", - "in their 1982 bombing of a school bus full", - "of Rock and Roll musicians.", + _("Guerilla Warfare"), "gfx/vgui/640_guerilla", + _("A terrorist faction founded in the"), + _("Middle East, Guerilla Warfare, has a"), + _("reputation for ruthlessness. Their disgust"), + _("for the American lifestyle was demonstrated"), + _("in their 1982 bombing of a school bus full"), + _("of Rock and Roll musicians."), - "Seal Team 6", "gfx/vgui/640_urban", - "Seal Team 6 (to be known later as DEVGRU)", - "was founded in 1980 under the command of", - "Lieutenant-Commander Richard Marcincko.", - "ST-6 was placed on permanent alert to", - "respond to terrorist attacks against ", - "American targets worldwide.", + _("Seal Team 6"), "gfx/vgui/640_urban", + _("Seal Team 6 (to be known later as DEVGRU)"), + _("was founded in 1980 under the command of"), + _("Lieutenant-Commander Richard Marcincko."), + _("ST-6 was placed on permanent alert to"), + _("respond to terrorist attacks against"), + _("American targets worldwide."), - "German GSG9", "gfx/vgui/640_gsg9", - "GSG-9 was born out of the tragic events", - "that led to the death of several", - "Israeli athletes during the 1972 Olympic", - "games in Munich, Germany.", - "", - "", + _("German GSG9"), "gfx/vgui/640_gsg9", + _("GSG-9 was born out of the tragic events"), + _("that led to the death of several"), + _("Israeli athletes during the 1972 Olympic"), + _("games in Munich, Germany."), + _(""), + _(""), - "UK SAS", "gfx/vgui/640_sas", - "The world-renowned British SAS was founded", - "in the Second World War by a man named", - "David Stirling. Their role during WW2", - "involved gathering intelligence behind enemy", - "lines and executing sabotage strikes and", - "assassinations against key targets.", + _("UK SAS"), "gfx/vgui/640_sas", + _("The world-renowned British SAS was founded"), + _("in the Second World War by a man named"), + _("David Stirling. Their role during WW2"), + _("involved gathering intelligence behind enemy"), + _("lines and executing sabotage strikes and"), + _("assassinations against key targets."), - "French GIGN", "gfx/vgui/640_gign", - "France's elite Counter-Terrorist unit was", - "designed to be a fast response force", - "that could decisively react to any large-", - "scale terrorist incident. Consisting of no", - "more than 100 men, the GIGN has earned its", - "reputation through a history of successful ops." + _("French GIGN"), "gfx/vgui/640_gign", + _("France's elite Counter-Terrorist unit was"), + _("designed to be a fast response force"), + _("that could decisively react to any large-"), + _("scale terrorist incident. Consisting of no"), + _("more than 100 men, the GIGN has earned its"), + _("reputation through a history of successful ops.") }; void VGUI_TeamSelect_Main( vector vPos ) { @@ -127,13 +127,13 @@ void VGUI_TeamSelect_Main( vector vPos ) { vTextPos_y += 10; } - VGUI_Button( "Terrorists", TeamSelect_Main_ButtonT, vPos + '16 116 0', '180 24 0' ); - VGUI_Button( "Counter-Terrorists", TeamSelect_Main_ButtonCT, vPos + '16 148 0', '180 24 0' ); + VGUI_Button( _("Terrorists"), TeamSelect_Main_ButtonT, vPos + '16 116 0', '180 24 0' ); + VGUI_Button( _("Counter-Terrorists"), TeamSelect_Main_ButtonCT, vPos + '16 148 0', '180 24 0' ); - VGUI_Button( "Auto-Assign", TeamSelect_Main_ButtonAuto, vPos + '16 336 0', '180 24 0' ); - VGUI_Button( "Spectate", TeamSelect_Main_ButtonSpectate, vPos + '16 368 0', '180 24 0' ); + VGUI_Button( _("Auto-Assign"), TeamSelect_Main_ButtonAuto, vPos + '16 336 0', '180 24 0' ); + VGUI_Button( _("Spectate"), TeamSelect_Main_ButtonSpectate, vPos + '16 368 0', '180 24 0' ); - VGUI_Button( "Exit", TeamSelect_Main_Exit, vPos + '16 440 0', '120 24 0' ); + VGUI_Button( _("Exit"), TeamSelect_Main_Exit, vPos + '16 440 0', '120 24 0' ); } void VGUI_TeamSelect_Back( void ) { @@ -175,7 +175,7 @@ void VGUI_TeamSelect_T( vector vPos ) { VGUI_TeamSelect_Button( 1, TeamSelect_T2, vPos + '16 192 0', '180 24 0' ); VGUI_TeamSelect_Button( 2, TeamSelect_T3, vPos + '16 224 0', '180 24 0' ); VGUI_TeamSelect_Button( 3, TeamSelect_T4, vPos + '16 256 0', '180 24 0' ); - VGUI_Button( "Back", VGUI_TeamSelect_Back, vPos + '16 440 0', '120 24 0' ); + VGUI_Button( _("Back"), VGUI_TeamSelect_Back, vPos + '16 440 0', '120 24 0' ); } void VGUI_TeamSelect_CT ( vector vPos ) { @@ -200,5 +200,5 @@ void VGUI_TeamSelect_CT ( vector vPos ) { VGUI_TeamSelect_Button( 5, TeamSelect_CT2, vPos + '16 192 0', '180 24 0' ); VGUI_TeamSelect_Button( 6, TeamSelect_CT3, vPos + '16 224 0', '180 24 0' ); VGUI_TeamSelect_Button( 7, TeamSelect_CT4, vPos + '16 256 0', '180 24 0' ); - VGUI_Button( "Back", VGUI_TeamSelect_Back, vPos + '16 440 0', '120 24 0' ); + VGUI_Button( _("Back"), VGUI_TeamSelect_Back, vPos + '16 440 0', '120 24 0' ); } diff --git a/Source/FreeCS-CE.prj b/Source/FreeCS-CE.prj new file mode 100755 index 00000000..049976d3 --- /dev/null +++ b/Source/FreeCS-CE.prj @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Globals.h b/Source/Globals.h index 906fbaa0..1f016ef8 100755 --- a/Source/Globals.h +++ b/Source/Globals.h @@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define PLAYER_SENDFLAG_UPDATE 1 #define PLAYER_SENDFLAG_INGAME 2 -string sCSPlayers[9] = { +string sCSPlayers[ 9 ] = { "", "models/player/terror/terror.mdl", "models/player/leet/leet.mdl", @@ -58,6 +58,9 @@ enum { STAT_SLOT_SECONDARY, STAT_SLOT_GRENADE, STAT_EQUIPMENT, + STAT_ITEM_FLASHBANG, + STAT_ITEM_HEGRENADE, + STAT_ITEM_SMOKEGRENADE, STAT_CURRENT_MAG, STAT_CURRENT_CALIBER, STAT_PROGRESS, @@ -114,17 +117,11 @@ enum { WEAPON_SMOKEGRENADE }; -#define CS_EQUIPMENT_COUNT 7 +#define CS_EQUIPMENT_COUNT 7 #define EQUIPMENT_KEVLAR 1 #define EQUIPMENT_HELMET 2 - -#define EQUIPMENT_DEFUSALKIT 32 -#define EQUIPMENT_NIGHTVISION 64 - -//#define WEAPON_C4BOMB 32 -#define EQUIPMENT_FLASHBANG 64 -#define EQUIPMENT_HEGRENADE 128 -#define EQUIPMENT_SMOKEGRENADE 256 +#define EQUIPMENT_DEFUSALKIT 4 +#define EQUIPMENT_NIGHTVISION 8 enum { CALIBER_50AE = 1, diff --git a/Source/Server/AmbientSound.c b/Source/Server/AmbientSound.c index dd390d84..1c203bcd 100755 --- a/Source/Server/AmbientSound.c +++ b/Source/Server/AmbientSound.c @@ -44,8 +44,14 @@ Not Toggled (32) - Older FGDs show this as Not Looped. .float pitch; void ambient_generic( void ) { static float ambient_generic_send( entity ePEnt, float fChanged ) { - sound( self, CHAN_VOICE, self.message, self.health, self.style, self.pitch, 0, SOUNDFLAG_FORCELOOP ); - return FALSE; + WriteByte( MSG_ENTITY, ENT_AMBIENTSOUND ); + WriteCoord( MSG_ENTITY, self.origin_x ); + WriteCoord( MSG_ENTITY, self.origin_y ); + WriteCoord( MSG_ENTITY, self.origin_z ); + WriteString( MSG_ENTITY, self.message ); + WriteFloat( MSG_ENTITY, self.health ); + WriteByte( MSG_ENTITY, self.style ); + return TRUE; } static void ambient_generic_use( void ) { sound( self, CHAN_VOICE, self.message, self.health, self.style, self.pitch ); @@ -88,7 +94,7 @@ void ambient_generic( void ) { self.vUse = ambient_generic_use; } else { self.noise = self.message; // Needed later for resuming - self.pvsflags = PVSF_USEPHS; + self.pvsflags = PVSF_NOREMOVE | PVSF_IGNOREPVS; self.vUse = ambient_generic_useloop; self.SendEntity = ambient_generic_send; self.state = TRUE; diff --git a/Source/Server/ArmouryEntity.c b/Source/Server/ArmouryEntity.c index 6ea40439..7e6da1ad 100755 --- a/Source/Server/ArmouryEntity.c +++ b/Source/Server/ArmouryEntity.c @@ -33,11 +33,11 @@ int iArmouryItems[ 19 ] = { WEAPON_M3, WEAPON_XM1014, WEAPON_PARA, - EQUIPMENT_FLASHBANG, - EQUIPMENT_HEGRENADE, + WEAPON_FLASHBANG, + WEAPON_HEGRENADE, EQUIPMENT_KEVLAR, EQUIPMENT_HELMET, - EQUIPMENT_SMOKEGRENADE, + WEAPON_SMOKEGRENADE, }; string sArmouryModels[ 19 ] = { diff --git a/Source/Server/Defs.h b/Source/Server/Defs.h index 79a2ca7e..0619af62 100755 --- a/Source/Server/Defs.h +++ b/Source/Server/Defs.h @@ -43,6 +43,13 @@ enum { BODY_LEGRIGHT }; +// Grenade states +enum { + GRENADE_UNREADY, + GRENADE_PULLING, + GRENADE_READY +}; + // Player specific fields .float fInBuyZone; .float fInHostageZone; diff --git a/Source/Server/Main.c b/Source/Server/Main.c index d758610c..0b8d271e 100755 --- a/Source/Server/Main.c +++ b/Source/Server/Main.c @@ -91,6 +91,10 @@ void worldspawn( void ) { precache_model( sWeaponModels[ i ] ); } + precache_model( "models/w_flashbang.mdl" ); + precache_model( "models/w_hegrenade.mdl" ); + precache_model( "models/w_smokegrenade.mdl" ); + precache_model( sCSPlayers[1] ); precache_model( sCSPlayers[2] ); precache_model( sCSPlayers[3] ); @@ -369,6 +373,9 @@ void worldspawn( void ) { clientstat( STAT_SLOT_PRIMARY, EV_FLOAT, fSlotPrimary ); clientstat( STAT_SLOT_SECONDARY, EV_FLOAT, fSlotSecondary ); clientstat( STAT_SLOT_GRENADE, EV_FLOAT, fSlotGrenade ); + clientstat( STAT_ITEM_FLASHBANG, EV_INTEGER, iAmmo_FLASHBANG ); + clientstat( STAT_ITEM_HEGRENADE, EV_INTEGER, iAmmo_HEGRENADE ); + clientstat( STAT_ITEM_SMOKEGRENADE, EV_INTEGER, iAmmo_SMOKEGRENADE ); clientstat( STAT_EQUIPMENT, EV_INTEGER, iEquipment ); clientstat( STAT_CURRENT_MAG, EV_INTEGER, iCurrentMag ); clientstat( STAT_CURRENT_CALIBER, EV_INTEGER, iCurrentCaliber ); diff --git a/Source/Shared/Equipment.c b/Source/Shared/Equipment.c index 120d0175..e9aa8497 100755 --- a/Source/Shared/Equipment.c +++ b/Source/Shared/Equipment.c @@ -21,9 +21,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. equipmentinfo_t eqptTable [ CS_EQUIPMENT_COUNT ] = { { EQUIPMENT_KEVLAR, 650 }, { EQUIPMENT_HELMET, 1000 }, - { EQUIPMENT_FLASHBANG, 300 }, - { EQUIPMENT_HEGRENADE, 300 }, - { EQUIPMENT_SMOKEGRENADE, 300 }, + { WEAPON_FLASHBANG, 300 }, + { WEAPON_HEGRENADE, 300 }, + { WEAPON_SMOKEGRENADE, 300 }, { EQUIPMENT_DEFUSALKIT, 200 }, { EQUIPMENT_NIGHTVISION, 1250 }, }; @@ -35,7 +35,25 @@ void CSEv_PlayerBuyEquipment_f( float fID ) { } if ( ( self.fMoney - eqptTable[ fID ].iPrice ) >= 0 ) { - if ( eqptTable[ fID ].iID == EQUIPMENT_KEVLAR ) { + if ( eqptTable[ fID ].iID == WEAPON_HEGRENADE ) { + if ( self.iAmmo_HEGRENADE < 2 ) { + self.iAmmo_HEGRENADE++; + } else { + centerprint( self, "You can't carry any more!" ); + } + } else if ( eqptTable[ fID ].iID == WEAPON_FLASHBANG ) { + if ( self.iAmmo_FLASHBANG < 2 ) { + self.iAmmo_FLASHBANG++; + } else { + centerprint( self, "You can't carry any more!" ); + } + } else if ( eqptTable[ fID ].iID == WEAPON_SMOKEGRENADE ) { + if ( self.iAmmo_SMOKEGRENADE < 2 ) { + self.iAmmo_SMOKEGRENADE++; + } else { + centerprint( self, "You can't carry any more!" ); + } + } else if ( eqptTable[ fID ].iID == EQUIPMENT_KEVLAR ) { if ( self.armor == 100 ) { // You already own kevlar etc. centerprint( self, "You already have kevlar!" ); @@ -76,7 +94,7 @@ void CSEv_PlayerBuyEquipment_f( float fID ) { self.fAttackFinished = time + 1.0; return; - } + } Money_AddMoney( self, -eqptTable[ fID ].iPrice ); self.iEquipment = self.iEquipment | ( eqptTable[ fID ].iID ); diff --git a/Source/Shared/WeaponFlashbang.c b/Source/Shared/WeaponFlashbang.c index 19ed8f2b..5d2f7d91 100755 --- a/Source/Shared/WeaponFlashbang.c +++ b/Source/Shared/WeaponFlashbang.c @@ -18,33 +18,38 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -.int iMag_GLOCK18; +.int iAmmo_FLASHBANG; + +// This is to keep track of us holding down the nade +#ifdef SSQC +.int iMode_FLASHBANG; +#endif // Weapon Info weaponinfo_t wptFLASHBANG = { - WEAPON_FLASHBANG, // Identifier - SLOT_GRENADE, // Slot - 0, // Price - 0, // Caliber ID - 1.0, // Max Player Speed - 1, // Bullets Per Shot - 1, // Clip/MagSize - 50, // Damage Per Bullet - 1, // Penetration Multiplier - 64, // Bullet Range - 0.75, // Range Modifier - TYPE_SEMI, // Firing Type - 1.0, // Attack-Delay - 1.0, // Reload-Delay - iAmmo_9MM, // Caliber Pointer - iMag_GLOCK18, // Clip Pointer - 1, // Accuracy Divisor - 1.0, // Accuracy Offset - 1.0, // Max Inaccuracy - 7, // Minimum Crosshair Distance - 3, // Crosshair Movement Delta - 1.0, // Armor penetration ratio - ATYPE_GRENADE // Animation Type + WEAPON_FLASHBANG, // Identifier + SLOT_GRENADE, // Slot + 200, // Price + 0, // Caliber ID + 1.0, // Max Player Speed + 1, // Bullets Per Shot + 1, // Clip/MagSize + 50, // Damage Per Bullet + 1, // Penetration Multiplier + 64, // Bullet Range + 0.75, // Range Modifier + TYPE_SEMI, // Firing Type + 1.0, // Attack-Delay + 1.0, // Reload-Delay + iAmmo_9MM, // Caliber Pointer + iAmmo_FLASHBANG, // Clip Pointer + 1, // Accuracy Divisor + 1.0, // Accuracy Offset + 1.0, // Max Inaccuracy + 7, // Minimum Crosshair Distance + 3, // Crosshair Movement Delta + 1.0, // Armor penetration ratio + ATYPE_GRENADE // Animation Type }; // Anim Table @@ -58,6 +63,7 @@ enum { void WeaponFLASHBANG_Draw( void ) { #ifdef SSQC BaseMelee_Draw(); + self.iMode_FLASHBANG = GRENADE_UNREADY; #else View_PlayAnimation( ANIM_FLASHBANG_DRAW ); #endif @@ -65,10 +71,75 @@ void WeaponFLASHBANG_Draw( void ) { void WeaponFLASHBANG_PrimaryFire( void ) { #ifdef SSQC + static void WeaponFLASHBANG_Release_Ready( void ) { + self.iMode_FLASHBANG = GRENADE_READY; + } + + if ( self.iMode_FLASHBANG != GRENADE_UNREADY ) { + return; + } + Client_SendEvent( self, EV_WEAPON_PRIMARYATTACK ); Animation_ShootWeapon(); self.fAttackFinished = time + wptFLASHBANG.fAttackFinished; + + // Mark the nade as ready once the pin has been pulled + self.iMode_FLASHBANG = GRENADE_PULLING; + self.think = WeaponFLASHBANG_Release_Ready; + self.nextthink = self.fAttackFinished; #else View_PlayAnimation( ANIM_FLASHBANG_PULLPIN ); #endif } + +#ifdef SSQC +void WeaponFLASHBANG_Throw( void ) { + static void WeaponFLASHBANG_Explode( void ) { + remove( self ); + } + static void Weapon_FLASHBANG_Touch( void ) { + if ( other.classname == "func_breakable" ) { + Damage_Apply( other, self, 10, self.origin ); + } + sound( self, CHAN_WEAPON, sprintf( "weapons/grenade_hit%d.wav", floor( random() * 3 ) + 1 ), 1, ATTN_NORM ); + } + + makevectors( self.v_angle ); + entity eNade = spawn(); + setorigin( eNade, ( self.origin + self.view_ofs ) + ( v_forward * 16 ) ); + setmodel( eNade, "models/w_flashbang.mdl" ); + setsize( eNade, '-4 -4 -4', '4 4 4' ); + + vector vDir = aim ( self, 100000 ); + eNade.owner = self; + eNade.solid = SOLID_TRIGGER; + eNade.angles = vectoangles( vDir ); + eNade.velocity = ( vDir * 800 ); + eNade.avelocity = ( v_forward * 600 ); + eNade.movetype = MOVETYPE_BOUNCE; + eNade.touch = Weapon_FLASHBANG_Touch; + + eNade.think = WeaponFLASHBANG_Explode; + eNade.nextthink = time + 3.0f; + + self.iAmmo_FLASHBANG--; + + if ( !self.iAmmo_FLASHBANG ) { + Weapon_SwitchBest(); + } +} +#endif + +void WeaponFLASHBANG_Release( void ) { +#ifdef SSQC + if ( self.iMode_FLASHBANG == GRENADE_READY ) { + // Throw immediately + WeaponFLASHBANG_Throw(); + self.iMode_FLASHBANG = GRENADE_UNREADY; + } else if ( self.iMode_FLASHBANG == GRENADE_PULLING ) { + // Trying to release the grenade before it's done pulling, throw asap + self.iMode_FLASHBANG = GRENADE_UNREADY; + self.think = WeaponFLASHBANG_Throw; + } +#endif +} diff --git a/Source/Shared/WeaponHEGrenade.c b/Source/Shared/WeaponHEGrenade.c index d3ea3101..2dfff548 100755 --- a/Source/Shared/WeaponHEGrenade.c +++ b/Source/Shared/WeaponHEGrenade.c @@ -18,33 +18,38 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -.int iMag_HEGRENADE; +.int iAmmo_HEGRENADE; + +// This is to keep track of us holding down the nade +#ifdef SSQC +.int iMode_HEGRENADE; +#endif // Weapon Info weaponinfo_t wptHEGRENADE = { - WEAPON_HEGRENADE, // Identifier - SLOT_GRENADE, // Slot - 0, // Price - 0, // Caliber ID - 1.0, // Max Player Speed - 1, // Bullets Per Shot - 1, // Clip/MagSize - 50, // Damage Per Bullet - 1, // Penetration Multiplier - 64, // Bullet Range - 0.75, // Range Modifier - TYPE_SEMI, // Firing Type - 1.0, // Attack-Delay - 1.0, // Reload-Delay - iAmmo_9MM, // Caliber Pointer - iMag_HEGRENADE, // Clip Pointer - 1, // Accuracy Divisor - 1.0, // Accuracy Offset - 1.0, // Max Inaccuracy - 7, // Minimum Crosshair Distance - 3, // Crosshair Movement Delta - 1.0, // Armor penetration ratio - ATYPE_GRENADE // Animation Type + WEAPON_HEGRENADE, // Identifier + SLOT_GRENADE, // Slot + 200, // Price + 0, // Caliber ID + 1.0, // Max Player Speed + 1, // Bullets Per Shot + 1, // Clip/MagSize + 50, // Damage Per Bullet + 1, // Penetration Multiplier + 64, // Bullet Range + 0.75, // Range Modifier + TYPE_SEMI, // Firing Type + 1.0, // Attack-Delay + 1.0, // Reload-Delay + iAmmo_9MM, // Caliber Pointer + iAmmo_HEGRENADE, // Clip Pointer + 1, // Accuracy Divisor + 1.0, // Accuracy Offset + 1.0, // Max Inaccuracy + 7, // Minimum Crosshair Distance + 3, // Crosshair Movement Delta + 1.0, // Armor penetration ratio + ATYPE_GRENADE // Animation Type }; // Anim Table @@ -58,6 +63,7 @@ enum { void WeaponHEGRENADE_Draw( void ) { #ifdef SSQC BaseMelee_Draw(); + self.iMode_HEGRENADE = GRENADE_UNREADY; #else View_PlayAnimation( ANIM_HEGRENADE_DRAW ); #endif @@ -65,10 +71,75 @@ void WeaponHEGRENADE_Draw( void ) { void WeaponHEGRENADE_PrimaryFire( void ) { #ifdef SSQC + static void WeaponHEGRENADE_Release_Ready( void ) { + self.iMode_HEGRENADE = GRENADE_READY; + } + + if ( self.iMode_HEGRENADE != GRENADE_UNREADY ) { + return; + } + Client_SendEvent( self, EV_WEAPON_PRIMARYATTACK ); Animation_ShootWeapon(); self.fAttackFinished = time + wptHEGRENADE.fAttackFinished; + + // Mark the nade as ready once the pin has been pulled + self.iMode_HEGRENADE = GRENADE_PULLING; + self.think = WeaponHEGRENADE_Release_Ready; + self.nextthink = self.fAttackFinished; #else View_PlayAnimation( ANIM_HEGRENADE_PULLPIN ); #endif } + +#ifdef SSQC +void WeaponHEGRENADE_Throw( void ) { + static void WeaponHEGRENADE_Explode( void ) { + remove( self ); + } + static void Weapon_HEGRENADE_Touch( void ) { + if ( other.classname == "func_breakable" ) { + Damage_Apply( other, self, 10, self.origin ); + } + sound( self, CHAN_WEAPON, sprintf( "weapons/grenade_hit%d.wav", floor( random() * 3 ) + 1 ), 1, ATTN_NORM ); + } + + makevectors( self.v_angle ); + entity eNade = spawn(); + setorigin( eNade, ( self.origin + self.view_ofs ) + ( v_forward * 16 ) ); + setmodel( eNade, "models/w_hegrenade.mdl" ); + setsize( eNade, '-4 -4 -4', '4 4 4' ); + + vector vDir = aim ( self, 100000 ); + eNade.owner = self; + eNade.solid = SOLID_TRIGGER; + eNade.angles = vectoangles( vDir ); + eNade.velocity = ( vDir * 800 ); + eNade.avelocity = ( v_forward * 600 ); + eNade.movetype = MOVETYPE_BOUNCE; + eNade.touch = Weapon_HEGRENADE_Touch; + + eNade.think = WeaponHEGRENADE_Explode; + eNade.nextthink = time + 3.0f; + + self.iAmmo_HEGRENADE--; + + if ( !self.iAmmo_HEGRENADE ) { + Weapon_SwitchBest(); + } +} +#endif + +void WeaponHEGRENADE_Release( void ) { +#ifdef SSQC + if ( self.iMode_HEGRENADE == GRENADE_READY ) { + // Throw immediately + WeaponHEGRENADE_Throw(); + self.iMode_HEGRENADE = GRENADE_UNREADY; + } else if ( self.iMode_HEGRENADE == GRENADE_PULLING ) { + // Trying to release the grenade before it's done pulling, throw asap + self.iMode_HEGRENADE = GRENADE_UNREADY; + self.think = WeaponHEGRENADE_Throw; + } +#endif +} \ No newline at end of file diff --git a/Source/Shared/WeaponM3.c b/Source/Shared/WeaponM3.c index 07e854af..b5bc8d45 100755 --- a/Source/Shared/WeaponM3.c +++ b/Source/Shared/WeaponM3.c @@ -97,6 +97,9 @@ void WeaponM3_PrimaryFire( void ) { #endif } +// The gun has no real secondary mode, but part of the reloading uses this function +// mainly for client-side cosmetics. The server doesn't have a function telling +// the client to switch animations (we save 1 byte in networking by reusing this) void WeaponM3_Reload( void); void WeaponM3_Secondary( void ) { #ifdef SSQC diff --git a/Source/Shared/WeaponSmokeGrenade.c b/Source/Shared/WeaponSmokeGrenade.c index 3579701f..83d5e4f2 100755 --- a/Source/Shared/WeaponSmokeGrenade.c +++ b/Source/Shared/WeaponSmokeGrenade.c @@ -18,33 +18,38 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -.int iMag_SMOKEGRENADE; +.int iAmmo_SMOKEGRENADE; + +// This is to keep track of us holding down the nade +#ifdef SSQC +.int iMode_SMOKEGRENADE; +#endif // Weapon Info weaponinfo_t wptSMOKEGRENADE = { - WEAPON_SMOKEGRENADE, // Identifier - SLOT_GRENADE, // Slot - 0, // Price - 0, // Caliber ID - 1.0, // Max Player Speed - 1, // Bullets Per Shot - 1, // Clip/MagSize - 50, // Damage Per Bullet - 1, // Penetration Multiplier - 64, // Bullet Range - 0.75, // Range Modifier - TYPE_SEMI, // Firing Type - 1.0, // Attack-Delay - 1.0, // Reload-Delay - iAmmo_9MM, // Caliber Pointer - iMag_SMOKEGRENADE, // Clip Pointer - 1, // Accuracy Divisor - 1.0, // Accuracy Offset - 1.0, // Max Inaccuracy - 7, // Minimum Crosshair Distance - 3, // Crosshair Movement Delta - 1.0, // Armor penetration ratio - ATYPE_GRENADE // Animation Type + WEAPON_SMOKEGRENADE, // Identifier + SLOT_GRENADE, // Slot + 200, // Price + 0, // Caliber ID + 1.0, // Max Player Speed + 1, // Bullets Per Shot + 1, // Clip/MagSize + 50, // Damage Per Bullet + 1, // Penetration Multiplier + 64, // Bullet Range + 0.75, // Range Modifier + TYPE_SEMI, // Firing Type + 1.0, // Attack-Delay + 1.0, // Reload-Delay + iAmmo_9MM, // Caliber Pointer + iAmmo_SMOKEGRENADE, // Clip Pointer + 1, // Accuracy Divisor + 1.0, // Accuracy Offset + 1.0, // Max Inaccuracy + 7, // Minimum Crosshair Distance + 3, // Crosshair Movement Delta + 1.0, // Armor penetration ratio + ATYPE_GRENADE // Animation Type }; // Anim Table @@ -58,6 +63,7 @@ enum { void WeaponSMOKEGRENADE_Draw( void ) { #ifdef SSQC BaseMelee_Draw(); + self.iMode_SMOKEGRENADE = GRENADE_UNREADY; #else View_PlayAnimation( ANIM_SMOKEGRENADE_DRAW ); #endif @@ -65,10 +71,75 @@ void WeaponSMOKEGRENADE_Draw( void ) { void WeaponSMOKEGRENADE_PrimaryFire( void ) { #ifdef SSQC + static void WeaponSMOKEGRENADE_Release_Ready( void ) { + self.iMode_SMOKEGRENADE = GRENADE_READY; + } + + if ( self.iMode_SMOKEGRENADE != GRENADE_UNREADY ) { + return; + } + Client_SendEvent( self, EV_WEAPON_PRIMARYATTACK ); Animation_ShootWeapon(); self.fAttackFinished = time + wptSMOKEGRENADE.fAttackFinished; + + // Mark the nade as ready once the pin has been pulled + self.iMode_SMOKEGRENADE = GRENADE_PULLING; + self.think = WeaponSMOKEGRENADE_Release_Ready; + self.nextthink = self.fAttackFinished; #else View_PlayAnimation( ANIM_SMOKEGRENADE_PULLPIN ); #endif } + +#ifdef SSQC +void WeaponSMOKEGRENADE_Throw( void ) { + static void WeaponSMOKEGRENADE_Explode( void ) { + remove( self ); + } + static void Weapon_SMOKEGRENADE_Touch( void ) { + if ( other.classname == "func_breakable" ) { + Damage_Apply( other, self, 10, self.origin ); + } + sound( self, CHAN_WEAPON, sprintf( "weapons/grenade_hit%d.wav", floor( random() * 3 ) + 1 ), 1, ATTN_NORM ); + } + + makevectors( self.v_angle ); + entity eNade = spawn(); + setorigin( eNade, ( self.origin + self.view_ofs ) + ( v_forward * 16 ) ); + setmodel( eNade, "models/w_smokegrenade.mdl" ); + setsize( eNade, '-4 -4 -4', '4 4 4' ); + + vector vDir = aim ( self, 100000 ); + eNade.owner = self; + eNade.solid = SOLID_TRIGGER; + eNade.angles = vectoangles( vDir ); + eNade.velocity = ( vDir * 800 ); + eNade.avelocity = ( v_forward * 600 ); + eNade.movetype = MOVETYPE_BOUNCE; + eNade.touch = Weapon_SMOKEGRENADE_Touch; + + eNade.think = WeaponSMOKEGRENADE_Explode; + eNade.nextthink = time + 3.0f; + + self.iAmmo_SMOKEGRENADE--; + + if ( !self.iAmmo_SMOKEGRENADE ) { + Weapon_SwitchBest(); + } +} +#endif + +void WeaponSMOKEGRENADE_Release( void ) { +#ifdef SSQC + if ( self.iMode_SMOKEGRENADE == GRENADE_READY ) { + // Throw immediately + WeaponSMOKEGRENADE_Throw(); + self.iMode_SMOKEGRENADE = GRENADE_UNREADY; + } else if ( self.iMode_SMOKEGRENADE == GRENADE_PULLING ) { + // Trying to release the grenade before it's done pulling, throw asap + self.iMode_SMOKEGRENADE = GRENADE_UNREADY; + self.think = WeaponSMOKEGRENADE_Throw; + } +#endif +} \ No newline at end of file diff --git a/Source/Shared/Weapons.c b/Source/Shared/Weapons.c index 3b6042bd..350ea517 100755 --- a/Source/Shared/Weapons.c +++ b/Source/Shared/Weapons.c @@ -206,6 +206,14 @@ Called when letting go one of the weapon firing buttons */ void Weapon_Release( void ) { self.flags = self.flags | FL_SEMI_TOGGLED; + + if ( self.weapon == WEAPON_FLASHBANG ) { + WeaponFLASHBANG_Release(); + } else if ( self.weapon == WEAPON_HEGRENADE ) { + WeaponHEGRENADE_Release(); + } else if ( self.weapon == WEAPON_SMOKEGRENADE ) { + WeaponSMOKEGRENADE_Release(); + } } /* diff --git a/Source/Web/about.html b/Source/Web/about.html new file mode 100755 index 00000000..d8fb1a8a --- /dev/null +++ b/Source/Web/about.html @@ -0,0 +1,47 @@ + + + + + + + + FreeCS - About FreeCS + + + + + + + + + + + + + + + + + + + + + +

+

+
+
Main Page
About FreeCS
The Team
The FAQ
Screenshots
Downloads
+
+ +
About FreeCS

The goal of this project is to provide a documented, open-source version of Counter-Strike 1.5. 

Counter-Strike, being one of the most popular multiplayer games to exist, surprisingly hasn't had +a free-software implementation done until now.

+

Six cool random things you can do with this:

+
  1. Play/Host CS on virtually every platform.
  2. Customize the game to whatever extent you like.
  3. Create entirely new weapons!
  4. Create completely new and refreshing gamemodes!
  5. Have a guarantee to be able to play it 20 years into the future!
  6. Use it as a base for your own games/mods!
+ +
+ +
+1995 - 2017 - by Marco 'eukara' Hladik +
+ + \ No newline at end of file diff --git a/Source/Web/back.gif b/Source/Web/back.gif new file mode 100755 index 00000000..b7be608a Binary files /dev/null and b/Source/Web/back.gif differ diff --git a/Source/Web/dloads.html b/Source/Web/dloads.html new file mode 100755 index 00000000..213caa54 --- /dev/null +++ b/Source/Web/dloads.html @@ -0,0 +1,43 @@ + + + + + + + + FreeCS - Downloads + + + + + + + + + + + + + + + + + + + + + +

+

+
+
Main Page
About FreeCS
The Team
The FAQ
Screenshots
Downloads
+
+ +
Downloads

Windows 32-bit: Coming soon, check repo!
Windows 64-bit: Coming soon, check repo!
Linux 32-bit: Coming soon, check repo!
Linux 64-bit: Coming soon, check repo!

Due to inconsistent packaging methods across all Linux distributions, I will only provide a tarball for the binaries. Sorry.

Check out the source-repo here:
https://github.com/eukara/FreeCS

This is where you can find FTE QuakeWorlds source-repo:
https://sourceforge.net/p/fteqw/

Currently hosted at GitHub. Will move it over to icculus hopefully
+
+ +
+1995 - 2017 - by Marco 'eukara' Hladik +
+ + \ No newline at end of file diff --git a/Source/Web/faq.html b/Source/Web/faq.html new file mode 100755 index 00000000..74acc1c5 --- /dev/null +++ b/Source/Web/faq.html @@ -0,0 +1,61 @@ + + + + + + + + FreeCS - The FAQ + + + + + + + + + + + + + + + + + + + + + +

+

+
+
Main Page
About FreeCS
The Team
The FAQ
Screenshots
Downloads
+
+ +
The Frequently Asked Questions

Please refer to this FAQ before sending any mails or C&D letters to my door.

Q: Is this the full version of Counter-Strike?
A: +These are only binaries for a rewritten, specific version of +Counter-Strike, the mod. It has nothing to do with the CS games of the +past 15 years.

Q: Do I have to own Half-Life to play this?
A: +It will run without. Hell, it can even "run" without the CS content. +But you certainly will have difficulties connecting to FreeCS servers.

Q: Why do I have to download CS 1.5 manually?
A: Legal reasons, cannot re-distribute them without potentially causing some trouble.

Q: Why is this not using the Half-Life engine?
A: +The SDK for that engine has one of the least open-source friendly +licenses ever written. Open-sourcing a Half-Life mod is actually +against the EULA of that SDK. Making it a QuakeWorld mod means I own +all the rights to it.

Q: What does FreeCS mean?
A: Primarily +it stands for Free Counter-Strike, as in Free-Software... it can also +mean "free" as in free beer because you don't have to pay anything to +download FreeCS itself. Some people have also speculated that it's a +political message... gotta love synonyms!

Q: Can I connect to Counter-Strike 1.5 servers with this?
A: No.

Q: Can I connect to (anything other than FreeCS) with this?
A: No.

Q: Hey, can I take redistribute this on the PlayStore and make money off of this?
A: +You'd be a scumbag if you did and possibly force me to adjust my +license. If you want to contribute towards a proper Android version, +contact me.

Q: What motivated you to do all this?
A: Good +memories, love, passion for Counter-Strike. Also as a middle finger to +anyone who told me to "do it better" when criticising the new CS game.

Q: How can I contact you for further questions?
A: E-Mail! Please send it to: marco at icculus dot org
+
+ +
+1995 - 2017 - by Marco 'eukara' Hladik +
+ + \ No newline at end of file diff --git a/Source/Web/header.png b/Source/Web/header.png new file mode 100755 index 00000000..ec81e8cc Binary files /dev/null and b/Source/Web/header.png differ diff --git a/Source/Web/index.html b/Source/Web/index.html new file mode 100755 index 00000000..c412adeb --- /dev/null +++ b/Source/Web/index.html @@ -0,0 +1,43 @@ + + + + + + + + FreeCS - Home + + + + + + + + + + + + + + + + + + + + + +

+

+
+
Main Page
About FreeCS
The Team
The FAQ
Screenshots
Downloads
+
+ +
Main Page

Hello! Welcome to the official site for FreeCS.
Check out those links on the left side. They're for navigation.
Gotta love the Web!(TM)
+
+ +
+1995 - 2017 - by Marco 'eukara' Hladik +
+ + \ No newline at end of file diff --git a/Source/Web/logo_m.png b/Source/Web/logo_m.png new file mode 100755 index 00000000..ed56de52 Binary files /dev/null and b/Source/Web/logo_m.png differ diff --git a/Source/Web/screens.html b/Source/Web/screens.html new file mode 100755 index 00000000..3b30f647 --- /dev/null +++ b/Source/Web/screens.html @@ -0,0 +1,43 @@ + + + + + + + + FreeCS - Screenshots + + + + + + + + + + + + + + + + + + + + + +

+

+
+
Main Page
About FreeCS
The Team
The FAQ
Screenshots
Downloads
+
+ +
Screenshot 1 Screenshot 2 Screenshot 3
Screenshot 4 Screenshot 5
+
+ +
+1995 - 2017 - by Marco 'eukara' Hladik +
+ + \ No newline at end of file diff --git a/Source/Web/screens/portable.jpg b/Source/Web/screens/portable.jpg new file mode 100755 index 00000000..1158ec85 Binary files /dev/null and b/Source/Web/screens/portable.jpg differ diff --git a/Source/Web/screens/portable_thmb.jpg b/Source/Web/screens/portable_thmb.jpg new file mode 100755 index 00000000..e29e1d8a Binary files /dev/null and b/Source/Web/screens/portable_thmb.jpg differ diff --git a/Source/Web/screens/screen1.png b/Source/Web/screens/screen1.png new file mode 100755 index 00000000..b729ae42 Binary files /dev/null and b/Source/Web/screens/screen1.png differ diff --git a/Source/Web/screens/screen1_thumb.jpg b/Source/Web/screens/screen1_thumb.jpg new file mode 100755 index 00000000..f75de7a0 Binary files /dev/null and b/Source/Web/screens/screen1_thumb.jpg differ diff --git a/Source/Web/screens/screen2.png b/Source/Web/screens/screen2.png new file mode 100755 index 00000000..598489b6 Binary files /dev/null and b/Source/Web/screens/screen2.png differ diff --git a/Source/Web/screens/screen2_thumb.jpg b/Source/Web/screens/screen2_thumb.jpg new file mode 100755 index 00000000..c9eb5b63 Binary files /dev/null and b/Source/Web/screens/screen2_thumb.jpg differ diff --git a/Source/Web/screens/screen3.png b/Source/Web/screens/screen3.png new file mode 100755 index 00000000..856f79e7 Binary files /dev/null and b/Source/Web/screens/screen3.png differ diff --git a/Source/Web/screens/screen3_thumb.jpg b/Source/Web/screens/screen3_thumb.jpg new file mode 100755 index 00000000..246513f4 Binary files /dev/null and b/Source/Web/screens/screen3_thumb.jpg differ diff --git a/Source/Web/screens/screen4.png b/Source/Web/screens/screen4.png new file mode 100755 index 00000000..1ad72738 Binary files /dev/null and b/Source/Web/screens/screen4.png differ diff --git a/Source/Web/screens/screen4_thumb.jpg b/Source/Web/screens/screen4_thumb.jpg new file mode 100755 index 00000000..4edc441f Binary files /dev/null and b/Source/Web/screens/screen4_thumb.jpg differ diff --git a/Source/Web/team.html b/Source/Web/team.html new file mode 100755 index 00000000..bf5c1468 --- /dev/null +++ b/Source/Web/team.html @@ -0,0 +1,43 @@ + + + + + + + + FreeCS - The Team + + + + + + + + + + + + + + + + + + + + + +

+

+
+
Main Page
About FreeCS
The Team
The FAQ
Screenshots
Downloads
+
+ +
The Team

Project Founder: Marco 'eukara' Hladik
Programming: See Project Founder
Website: See Programming
Hosting: Ryan C. Gordon aka icculus!

By the way, if you have experience making websites... shoot me a mail.
As you can probably tell: I don't!
+
+ +
+1995 - 2017 - by Marco 'eukara' Hladik +
+ + \ No newline at end of file diff --git a/freecs/csprogs.dat b/freecs/csprogs.dat index 9a9c9899..e41b73f5 100644 Binary files a/freecs/csprogs.dat and b/freecs/csprogs.dat differ diff --git a/freecs/freecs.ico b/freecs/freecs.ico new file mode 100755 index 00000000..cd3aab94 Binary files /dev/null and b/freecs/freecs.ico differ diff --git a/freecs/menu.dat b/freecs/menu.dat index 820f730f..fd32b102 100755 Binary files a/freecs/menu.dat and b/freecs/menu.dat differ diff --git a/freecs/progs.dat b/freecs/progs.dat index 07ca0757..520998a8 100644 Binary files a/freecs/progs.dat and b/freecs/progs.dat differ