Fixed multi_source trigger problem on complex maps like de_aztec

Added env_spark
Added scope border type 1
Misc fixes
This commit is contained in:
Marco Cawthorne 2017-07-01 02:39:15 +02:00
parent 072820002c
commit d25eb3850f
20 changed files with 278 additions and 77 deletions

View File

@ -26,7 +26,6 @@ Init all the cmds in one place
=================
*/
void CSQC_ConsoleCommand_Init( void ) {
registercommand( "+attack2" );
registercommand( "-attack2" );
registercommand( "+reload" );
@ -479,6 +478,18 @@ void CSQC_Parse_Event( void ) {
vExploPos_z = readcoord();
Effect_CreateExplosion( vExploPos );
} else if ( fHeader == EV_SPARK ) {
vector vSparkPos, vSparkAngle;
vSparkPos_x = readcoord();
vSparkPos_y = readcoord();
vSparkPos_z = readcoord();
vSparkAngle_x = readcoord();
vSparkAngle_y = readcoord();
vSparkAngle_z = readcoord();
Effect_CreateSpark( vSparkPos, vSparkAngle );
}
}

View File

@ -396,6 +396,13 @@ Called every frame in Draw.c
void HUD_Draw( void ) {
vHUDColor = autocvar_con_color * ( 1 / 255 );
// I guess viewzoom turns from 0.0-1.0 float into a 0-255 byte
if ( getstatf( STAT_VIEWZOOM ) < 255 ) {
HUD_DrawScope();
} else {
HUD_DrawCrosshair();
}
HUD_DrawTimer();
HUD_DrawRadar();
HUD_DrawHealth();
@ -406,5 +413,4 @@ void HUD_Draw( void ) {
HUD_DrawOrbituaries();
HUD_DrawProgressBar();
HUD_DrawWeaponSelect();
HUD_DrawCrosshair();
}

69
Source/Client/HUDScope.c Executable file
View File

@ -0,0 +1,69 @@
/*
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 fSBOffset;
float fSBScale;
/*
=================
HUD_DrawScope_Pic
The scope borders are split up into multiple parts.
We want to fill the screen, so we gotta do some hacking.
=================
*/
void HUD_DrawScope_Pic( vector vPos, vector vSize, string sSprite ) {
drawpic( ( vPos * fSBScale ) + [ fSBOffset, 0 ], sSprite, vSize * fSBScale, '1 1 1', 1.0f );
}
/*
=================
HUD_DrawScope
Tries to draw a scope whenever viewzoom < 1.0f
=================
*/
void HUD_DrawScope( void ) {
static vector vScopePos;
// Draw the scope in the middle, seperately from the border
vScopePos = ( vVideoResolution / 2 ) + '-128 -128';
drawpic( vScopePos, "sprites/sniper_scope.spr_0.tga", '256 256', '1 1 1', 1.0f, DRAWFLAG_NORMAL );
// Border scale to fit the screen
fSBScale = vVideoResolution_y / 480;
fSBOffset = ( vVideoResolution_x / 2 ) - ( ( 640 * fSBScale ) / 2 );
// Type 1 Border... more coming soon?
HUD_DrawScope_Pic( '0 0', '192 112', "sprites/top_left.spr_0.tga" );
HUD_DrawScope_Pic( '192 0', '256 112', "sprites/top.spr_0.tga" );
HUD_DrawScope_Pic( '448 0', '192 112', "sprites/top_right.spr_0.tga" );
HUD_DrawScope_Pic( '0 112', '192 256', "sprites/left.spr_0.tga" );
HUD_DrawScope_Pic( '448 112', '192 256', "sprites/right.spr_0.tga" );
HUD_DrawScope_Pic( '0 368', '192 112', "sprites/bottom_left.spr_0.tga" );
HUD_DrawScope_Pic( '192 368', '256 112', "sprites/bottom.spr_0.tga" );
HUD_DrawScope_Pic( '448 368', '192 112', "sprites/bottom_right.spr_0.tga" );
// Rect borders left and right
if ( fSBOffset > 0 ) {
drawfill( '0 0', [ fSBOffset, vVideoResolution_y ], '0 0 0', 1.0f );
drawfill( [ ( 640 * fSBScale ) + fSBOffset, 0 ], [ fSBOffset, vVideoResolution_y ], '0 0 0', 1.0f );
}
}

View File

@ -28,6 +28,16 @@ Comparable to worldspawn in SSQC in that it's mostly used for precaches
void CSQC_Init(float apilevel, string enginename, float engineversion) {
precache_model( HUD_NUMFILE );
precache_model( "sprites/top_left.spr" );
precache_model( "sprites/top.spr" );
precache_model( "sprites/top_right.spr" );
precache_model( "sprites/left.spr" );
precache_model( "sprites/right.spr" );
precache_model( "sprites/bottom_left.spr" );
precache_model( "sprites/bottom.spr" );
precache_model( "sprites/bottom_right.spr" );
precache_model( "sprites/sniper_scope.spr" );
precache_model( "sprites/fexplo.spr" );
precache_model( "sprites/muzzleflash1.spr" );
precache_model( "sprites/radar640.spr" );

View File

@ -39,7 +39,7 @@ vguiwindow_t vguiMenus[11] = {
=================
CSQC_VGUI_Draw
This is the entry point for OpenCS own VGUI implementation
This is the entry point for FreeCS own "VGUI" implementation
Run every frame
=================
*/
@ -79,7 +79,7 @@ void CSQC_VGUI_Init( void ) {
// First load the MESSAGE OF THE DAY
// TODO: Move this to the server and put strings into infokeys
filestream fmMOTD = fopen( "motd.txt", FILE_READ);
filestream fmMOTD = fopen( "motd.txt", FILE_READ );
for ( int i = 0; i < 25; i++ ) {
sTemp = fgets( fmMOTD );
if not ( sTemp ) {
@ -90,7 +90,7 @@ void CSQC_VGUI_Init( void ) {
fclose( fmMOTD );
// Now load the MAP DESCRIPTION
fmMOTD = fopen( sprintf( "maps/%s.txt", mapname ), FILE_READ);
fmMOTD = fopen( sprintf( "maps/%s.txt", mapname ), FILE_READ );
if ( fmMOTD != -1 ) {
for ( int i = 0; i < 35; i++ ) {
sTemp = fgets( fmMOTD );

View File

@ -170,14 +170,17 @@ void View_DrawViewModel( void ) {
fLastTime = time;
// Update muzzleflash position and draw it
if ( eMuzzleflash.alpha > 0.0f ) {
eMuzzleflash.origin = gettaginfo( eViewModel, eMuzzleflash.skin );
dynamiclight_add( eMuzzleflash.origin, 400 * eMuzzleflash.alpha, '1 0.45 0');
addentity( eMuzzleflash );
// Only bother when zoomed out
if ( getstatf( STAT_VIEWZOOM ) == 255 ) {
// Update muzzleflash position and draw it
if ( eMuzzleflash.alpha > 0.0f ) {
eMuzzleflash.origin = gettaginfo( eViewModel, eMuzzleflash.skin );
dynamiclight_add( eMuzzleflash.origin, 400 * eMuzzleflash.alpha, '1 0.45 0');
addentity( eMuzzleflash );
}
addentity( eViewModel );
}
addentity( eViewModel );
}
void View_PlayAnimation( int iSequence ) {

View File

@ -56,6 +56,7 @@ VGUIRadio.c
VGUI.c
Nightvision.c
HUDCrosshair.c
HUDScope.c
HUDWeaponSelect.c
HUDOrbituaries.c
HUD.c

View File

@ -7,6 +7,7 @@
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\HUD.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\HUDCrosshair.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\HUDOrbituaries.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\HUDScope.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\HUDWeaponSelect.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\Init.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\Nightvision.c" />
@ -59,7 +60,7 @@
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Server\TraceAttack.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Server\Triggers.c" />
</category>
<category name="Menu" expanded="yes">
<category name="Menu" expanded="no">
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Menu\Defs.h" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Menu\Draw.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Menu\Header.c" />
@ -70,7 +71,7 @@
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Menu\Objects.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Menu\progs.src" />
</category>
<category name="Shared" expanded="yes">
<category name="Shared" expanded="no">
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Shared\Animations.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Shared\BaseMelee.c" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Shared\Effects.c" />
@ -112,12 +113,7 @@
</project>
<workspace version="Crimson Editor 3.60">
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Shared\Animations.c" linenum="267" placement="0:1:-1:-1:-4:-23:22:22:958:326" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Shared\WeaponElites.c" linenum="32" placement="0:1:-1:-1:-4:-23:44:44:984:352" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\VGUIRadio.c" linenum="25" placement="0:1:-1:-1:-4:-23:44:44:896:513" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\VGUIObjects.c" linenum="72" placement="0:1:-1:-1:-4:-23:66:66:918:535" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Menu\Objects.c" linenum="150" placement="0:1:-1:-1:-4:-23:88:88:940:557" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\VGUIMOTD.c" linenum="1" placement="0:1:-1:-1:-4:-23:110:110:962:579" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\VGUIScoreboard.c" linenum="97" placement="2:3:-1:-1:-4:-23:132:132:984:601" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\HUDCrosshair.c" linenum="28" placement="0:1:-1:-1:-4:-23:132:132:980:597" />
<localfile path="C:\Cygwin\home\eukara\Projects\FreeCS\Source\Client\HUD.c" linenum="411" placement="2:3:-1:-1:-4:-23:154:154:1006:623" />
</workspace>

View File

@ -221,6 +221,7 @@ enum {
EV_WEAPON_RELOAD,
EV_IMPACT,
EV_EXPLOSION,
EV_SPARK,
EV_MODELGIB,
EV_CAMERATRIGGER,
EV_RADIOMSG,

View File

@ -61,7 +61,7 @@ void Entities_UseTargets( void ) {
entity eOld = self;
while ( eFind ) {
self = eFind;
//bprint( sprintf( "Triggering %s %s\n", self.classname, self.targetname ) );
dprint( sprintf( "Triggering %s %s\n", self.classname, self.targetname ) );
// Make sure we really do have a target...
if ( self.vUse != __NULL__ ) {

View File

@ -175,7 +175,6 @@ enumflags {
ENVEXPLO_NOSPARKS
};
// TODO: Finish cosmetic effects
void env_explosion( void ) {
static void env_explosion_use( void ) {
Effect_CreateExplosion( self.origin );
@ -191,3 +190,67 @@ void env_explosion( void ) {
self.vUse = env_explosion_use;
}
/*
=================
env_spark
Produces an electrical spark effect.
Attributes:
Name (targetname) - Property used to identify entities.
Pitch Yaw Roll (angles) - Sets the angles respectively.
Max Delay (MaxDelay) - Maximum delay between sparks.
Flags:
Toggle (32)
Start On (64)
Notes:
According to the fieldname MaxDelay, it is probably going to use
a random number to create a delay between the individual sparks.
I have no idea why they didn't just reuse the delay field.
We may never know.
=================
*/
#define SPARK_TOGGLE 32
#define SPARK_ON 64
.float MaxDelay;
void env_spark( void ) {
static void env_spark_fire( void ) {
Effect_CreateSpark( self.origin, self.angles );
}
static void env_spark_think( void ) {
env_spark_fire();
self.nextthink = time + ( random() * self.MaxDelay );
}
static void env_spark_use( void ) {
if ( self.spawnflags & SPARK_TOGGLE ) {
if ( self.think != __NULL__ ) {
self.think = __NULL__;
self.nextthink = 0;
} else {
self.think = env_spark_think;
self.nextthink = time + ( random() * self.MaxDelay );
}
} else {
env_spark_fire();
}
}
static void env_spark_respawn( void ) {
if ( self.MaxDelay <= 0 ) {
self.MaxDelay = 1.0f;
}
if ( self.spawnflags & SPARK_TOGGLE ) {
if ( self.spawnflags & SPARK_ON ) {
self.think = env_spark_think;
self.nextthink = time + ( random() * self.MaxDelay );
}
}
}
self.vUse = env_spark_use;
Entities_InitRespawnable( env_spark_respawn );
}

View File

@ -18,20 +18,14 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
=================
func_door Spawnflags
=================
*/
#define SF_BTT_NOMOVE 1
#define SF_BTT_TOGGLE 32
#define SF_BTT_TOUCH_ONLY 256
void() FuncButton_MoveAway;
void() FuncButton_MoveBack;
void() FuncButton_Touch;
#define SF_BTT_NOMOVE 1
#define SF_BTT_TOGGLE 32
#define SF_BTT_TOUCH_ONLY 256
enum {
STATE_RAISED = 0,
STATE_LOWERED,
@ -39,6 +33,11 @@ enum {
STATE_DOWN
};
enum {
FRAME_OFF,
FRAME_ON
};
.float speed;
.float lip;
.float dmg;
@ -55,74 +54,73 @@ FuncButton_PrecacheSounds
====================
*/
void FuncButton_PrecacheSounds( void ) {
string sSample = "buttons/button9.wav"; // Default sample?
switch( self.sounds ) {
case 0:
// if you ever wondered why a silent button sounded a bit noisey... it's because this one kinda blows
sSample = "common/null.wav";
self.noise = "common/null.wav";
break;
case 1:
sSample = "buttons/button1.wav";
self.noise = "buttons/button1.wav";
break;
case 2:
sSample = "buttons/button2.wav";
self.noise = "buttons/button2.wav";
break;
case 3:
sSample = "buttons/button3.wav";
self.noise = "buttons/button3.wav";
break;
case 4:
sSample = "buttons/button4.wav";
self.noise = "buttons/button4.wav";
break;
case 5:
sSample = "buttons/button5.wav";
self.noise = "buttons/button5.wav";
break;
case 6:
sSample = "buttons/button6.wav";
self.noise = "buttons/button6.wav";
break;
case 7:
sSample = "buttons/button7.wav";
self.noise = "buttons/button7.wav";
break;
case 8:
sSample = "buttons/button8.wav";
self.noise = "buttons/button8.wav";
break;
case 9:
sSample = "buttons/button9.wav";
self.noise = "buttons/button9.wav";
break;
case 10:
sSample = "buttons/button10.wav";
self.noise = "buttons/button10.wav";
break;
case 11:
sSample = "buttons/button11.wav";
self.noise = "buttons/button11.wav";
break;
case 12:
sSample = "buttons/latchlocked1.wav";
self.noise = "buttons/latchlocked1.wav";
break;
case 13:
sSample = "buttons/latchunlocked1.wav";
self.noise = "buttons/latchunlocked1.wav";
break;
case 14:
sSample = "buttons/lightswitch2.wav";
self.noise = "buttons/lightswitch2.wav";
break;
case 21:
sSample = "buttons/lever1.wav";
self.noise = "buttons/lever1.wav";
break;
case 22:
sSample = "buttons/lever2.wav";
self.noise = "buttons/lever2.wav";
break;
case 23:
sSample = "buttons/lever3.wav";
self.noise = "buttons/lever3.wav";
break;
case 24:
sSample = "buttons/lever4.wav";
self.noise = "buttons/lever4.wav";
break;
case 25:
sSample = "buttons/lever5.wav";
self.noise = "buttons/lever5.wav";
break;
default:
self.noise = "buttons/button9.wav";
}
precache_sound( sSample );
self.noise = sSample;
precache_sound( self.noise );
}
/*
@ -140,8 +138,10 @@ void FuncButton_Arrived( void ) {
return;
}
self.think = FuncButton_MoveBack;
self.nextthink = ( self.ltime + self.wait );
if ( self.wait != -1 ) {
self.think = FuncButton_MoveBack;
self.nextthink = ( self.ltime + self.wait );
}
}
/*
@ -155,6 +155,7 @@ void FuncButton_Returned( void ) {
}
self.state = STATE_LOWERED;
self.frame = FRAME_OFF;
}
/*
@ -169,7 +170,12 @@ void FuncButton_MoveBack( void ) {
}
self.state = STATE_DOWN;
Entities_MoveToDestination ( self.pos1, self.speed, FuncButton_Returned );
if ( self.pos2 != self.pos1 ) {
Entities_MoveToDestination ( self.pos1, self.speed, FuncButton_Returned );
} else {
FuncButton_Returned();
}
}
/*
@ -188,7 +194,14 @@ void FuncButton_MoveAway( void ) {
}
self.state = STATE_UP;
Entities_MoveToDestination ( self.pos2, self.speed, FuncButton_Arrived );
if ( self.pos2 != self.pos1 ) {
Entities_MoveToDestination ( self.pos2, self.speed, FuncButton_Arrived );
} else {
FuncButton_Arrived();
}
self.frame = FRAME_ON;
}
/*
@ -197,13 +210,15 @@ FuncButton_Trigger
====================
*/
void FuncButton_Trigger( void ) {
if ( self.fAttackFinished > self.ltime ) {
if ( self.fAttackFinished > time ) {
return;
}
self.fAttackFinished = self.ltime + self.wait;
self.fAttackFinished = time + self.wait;
if ( ( self.state == STATE_UP ) || ( self.state == STATE_RAISED ) ){
FuncButton_MoveBack();
if ( self.wait != -1 ) {
FuncButton_MoveBack();
}
return;
}
@ -258,7 +273,6 @@ func_button
Spawn function of a moving door entity
====================
*/
void func_button( void ) {
FuncButton_PrecacheSounds();
Entities_SetMovementDirection();

View File

@ -234,21 +234,21 @@ void func_door_rotating( void ) {
self.pos1 = self.angles;
// Only do X
// Only do Y
if ( self.spawnflags & SF_ROT_XAXIS ) {
self.pos2_x = self.pos1_x + self.distance;
self.pos2_y = self.pos1_y + self.distance;
}
// Only do Y
// Only do X
if ( self.spawnflags & SF_ROT_YAXIS ) {
self.pos2_y = self.pos1_y + self.distance;
self.pos2_x = self.pos1_x + self.distance;
}
// ...only do Y by default?
// ...only do X by default?
if ( !( self.spawnflags & SF_ROT_YAXIS ) && !( self.spawnflags & SF_ROT_XAXIS ) ) {
self.pos2_y = self.pos1_y + self.distance;
self.pos2_x = self.pos1_x + self.distance;
}
if ( self.spawnflags & SF_ROT_OPEN ) {

View File

@ -89,7 +89,7 @@ void Player_Death( int iHitBody ) {
Weapon_DropWeapon( SLOT_PRIMARY );
} else {
if ( self.fSlotSecondary ) {
Weapon_DropWeapon( SLOT_PRIMARY );
Weapon_DropWeapon( SLOT_SECONDARY );
}
}
if ( self.fSlotGrenade ) {
@ -177,16 +177,15 @@ Player_CrouchCheck
=================
*/
float Player_CrouchCheck( entity targ ) {
float fCheck = FALSE;
vector vTrace = self.origin + '0 0 20';
tracebox( vTrace, VEC_HULL_MIN, VEC_HULL_MAX, vTrace, FALSE, self );
if ( trace_startsolid == FALSE ) {
fCheck = TRUE;
return TRUE;
}
return fCheck;
return FALSE;
}
/*
@ -195,11 +194,11 @@ Player_CrouchDown
=================
*/
void Player_CrouchDown( void ) {
if( self.movetype != MOVETYPE_WALK ) {
if ( self.movetype != MOVETYPE_WALK ) {
return;
}
if( !( self.flags & FL_CROUCHING ) ) {
if ( !( self.flags & FL_CROUCHING ) ) {
setsize( self, VEC_CHULL_MIN, VEC_CHULL_MAX );
self.flags = self.flags | FL_CROUCHING;
self.view_ofs = VEC_PLAYER_CVIEWPOS;

View File

@ -210,6 +210,7 @@ void Spawn_MakeSpectator( void ) {
self.movetype = MOVETYPE_NOCLIP;
self.flags = FL_CLIENT;
self.weapon = 0;
self.viewzoom = 1.0f;
self.model = 0;
setsize (self, '-16 -16 -16', '16 16 16');

View File

@ -212,9 +212,17 @@ void multi_manager( void ) {
// Sigh, let's attempt to sanitize this
if ( ( argv( i ) != "classname" ) && ( argv( i ) != "origin" ) && ( argv( i ) != "targetname" ) ) {
entity eTemp = spawn();
eTemp.target = argv( i );
eTemp.think = multi_manager_enttrigger;
eTemp.nextthink = time + stof( argv( i + 1 ) );
// sigh, because you obviously don't want to tokenize inside a tokenized loop
if ( substring( argv( i ), strlen( argv( i ) ) - 3, 1 ) == "#" ) {
eTemp.target = substring( argv( i ), 0, strlen( argv( i ) ) - 3 );
} else if ( substring( argv( i ), strlen( argv( i ) ) - 2, 1 ) == "#" ) {
eTemp.target = substring( argv( i ), 0, strlen( argv( i ) ) - 2 );
} else {
eTemp.target = argv( i );
}
}
}
}

View File

@ -54,6 +54,25 @@ void Effect_CreateExplosion( vector vPos ) {
#endif
}
void Effect_CreateSpark( vector vPos, vector vAngle ) {
#ifdef SSQC
vPos_z += 48;
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
WriteByte( MSG_MULTICAST, EV_SPARK );
WriteCoord( MSG_MULTICAST, vPos_x );
WriteCoord( MSG_MULTICAST, vPos_y );
WriteCoord( MSG_MULTICAST, vPos_z );
WriteCoord( MSG_MULTICAST, vAngle_x );
WriteCoord( MSG_MULTICAST, vAngle_y );
WriteCoord( MSG_MULTICAST, vAngle_z );
msg_entity = self;
multicast( vPos, MULTICAST_PVS );
#else
pointparticles( PARTICLE_SPARK, vPos, vAngle, 1 );
pointsound( vPos, sprintf( "buttons/spark%d.wav", floor( random() * 6 ) + 1 ), 1, ATTN_STATIC );
#endif
}
#ifdef CSQC
.float framerate;
void Effect_AnimatedSprite( vector vPos, float fIndex, float fFPS, float fScale, float fAlpha, float fEffects ) {

Binary file not shown.

Binary file not shown.

Binary file not shown.