Core.Object | +--Engine.Actor | +--Engine.Triggers | +--XIDCine.RoofGrapnleDemonstrator
float
ActualPlayerRotationSpeed
Cine2
Jones
int
MemCurrentScript
HookPoint
PointGrappin
Actor
XIIIPosition
bool
LookAtJones(float dt)
{ return 1.0f - ((1.0f-f)**(150*dt)); }*/
Magic(float f, float dt)
/*
MoveToRightThePlace(float dt)
00001 //----------------------------------------------------------- 00002 // RoofGrapnleDemonstrator 00003 // Created by iKi 00004 // Last Modification by iKi 00005 //----------------------------------------------------------- 00006 class RoofGrapnleDemonstrator extends Triggers; 00007 00008 #exec Texture Import File=Textures\Rock_ico.pcx Name=Rock_ico Mips=Off 00009 00010 VAR() Cine2 Jones; 00011 VAR() HookPoint PointGrappin; 00012 VAR() Actor XIIIPosition; 00013 VAR(Sound) Sound HookSelectSound, HookFireSound, HookStartSound, HookStopSound, HookLetSound; 00014 VAR Vector WallNormal; 00015 VAR XIIIPlayerController PC; 00016 VAR CineHook Crochet; 00017 VAR CineHookLink PremierFilin, DernierFilin; 00018 VAR float TimeStamp, TaillePremierFilin; 00019 VAR TRANSIENT int MemCurrentScript; 00020 00021 CONST PlayerLinearSpeed=600; 00022 CONST PlayerRotationSpeed=180; 00023 CONST RotationAcceleration=245; 00024 VAR TRANSIENT float ActualPlayerRotationSpeed; 00025 00026 CONST LinkLength = 100.0; 00027 00028 //----------------------------------------------------------- 00029 00030 AUTO STATE STA_Init 00031 { 00032 EVENT Trigger(actor Other,pawn EventInstigator) 00033 { 00034 GotoState('STA_Lets_the_show_begins'); 00035 } 00036 } 00037 00038 //----------------------------------------------------------- 00039 /*FUNCTION float Magic(float f,float dt) 00040 { 00041 return 1.0f - ((1.0f-f)**(150*dt)); 00042 }*/ 00043 00044 FUNCTION bool LookAtJones(float dt) 00045 { 00046 LOCAL rotator r, Roto; 00047 00048 ActualPlayerRotationSpeed= fMin( PlayerRotationSpeed, ActualPlayerRotationSpeed+RotationAcceleration*dt ); 00049 Roto=ROTATOR( Jones.Location+vect(0,0,10)-PC.Pawn.Location ); 00050 00051 r.Yaw = Clamp( ( ( Roto.Yaw - PC.Rotation.Yaw + 32768 ) & 65535 ) - 32768, -ActualPlayerRotationSpeed*dt*182,ActualPlayerRotationSpeed*dt*182 ); 00052 r.Roll = Clamp( ( ( Roto.Roll - PC.Rotation.Roll + 32768 ) & 65535 ) - 32768, -ActualPlayerRotationSpeed*dt*182,ActualPlayerRotationSpeed*dt*182 ); 00053 r.Pitch = Clamp( ( ( Roto.Pitch - PC.Rotation.Pitch + 32768 ) & 65535 ) - 32768, -ActualPlayerRotationSpeed*dt* 41,ActualPlayerRotationSpeed*dt* 41 ); 00054 00055 PC.SetRotation( r + PC.Rotation ); 00056 if ( r.Yaw==0 && r.Pitch==0 && r.Roll==0) 00057 { 00058 ActualPlayerRotationSpeed=0; 00059 return true; 00060 } 00061 return false; 00062 } 00063 00064 FUNCTION bool MoveToRightThePlace(float dt) 00065 { 00066 LOCAL vector v; 00067 00068 v = XIIIPosition.Location-PC.Pawn.Location; 00069 v.Z = 0; 00070 PC.Pawn.Velocity = fMin( vSize(v)/dt, PlayerLinearSpeed ) * Normal( v ); 00071 if ( vSize( v )<1 ) 00072 return true; 00073 return false; 00074 } 00075 00076 STATE STA_Lets_the_show_begins 00077 { 00078 00079 EVENT BeginState() 00080 { 00081 // Player 00082 PC=XIIIGameInfo(Level.Game).MapInfo.XIIIController; 00083 PC.GotoState('NoControl'); 00084 00085 // Jones 00086 Jones.CineController.LockedActor=none; 00087 Jones.CineController.rWantedRotation=ROTATOR(-WallNormal); 00088 MemCurrentScript=Jones.CurrentScript; 00089 Jones.CurrentScript=-1; 00090 } 00091 00092 EVENT Tick(float dt) 00093 { 00094 LOCAL bool a,b; 00095 00096 a = MoveToRightThePlace(dt); 00097 b = LookAtJones(dt); 00098 if ( a && b ) 00099 GotoState( 'STA_Look_the_demonstrator' ); 00100 00101 /* LOCAL Vector v; 00102 LOCAL Rotator r; 00103 00104 v = Jones.Location-PC.Pawn.Location; 00105 v.Z = 0; 00106 r = ROTATOR(v); 00107 r-= PC.Rotation; 00108 r.Yaw = ( ( r.Yaw + 32768 ) & 65535 ) - 32768; 00109 r.Roll = ( ( r.Roll + 32768 ) & 65535 ) - 32768; 00110 r.Pitch = ( ( r.Pitch + 32768 ) & 65535 ) - 32768; 00111 PC.SetRotation( r * Magic(0.015,dt) + PC.Rotation ); 00112 00113 v = XIIIPosition.Location - PC.Pawn.Location; 00114 v.Z = 0; 00115 if ( vSize(v)>100 ) 00116 { 00117 PC.Pawn.SetLocation( PC.Pawn.Location + Magic(0.005,dt) * v ); 00118 } 00119 else 00120 { 00121 if ( Abs( r.Yaw ) < 100 ) 00122 GotoState( 'STA_Look_the_demonstrator' ); 00123 }*/ 00124 } 00125 } 00126 00127 //----------------------------------------------------------- 00128 00129 STATE STA_Look_the_demonstrator 00130 { 00131 EVENT BeginState( ) 00132 { 00133 // TriggerEvent( HookExitEvent, self, none ); 00134 Jones.PlaySound( HookSelectSound ); 00135 Jones.PlayAnim( 'LanceGrappin', , 0.5 ); 00136 Crochet = Spawn(class'CineHook',self,'Tag',Jones.GetBoneCoords('X R Finger1').Origin); 00137 00138 Jones.AttachToBone( Crochet, 'X R Finger1'); 00139 Crochet.SetRelativeLocation( vect( 2, -2, 8 ) ); 00140 Crochet.SetRelativeRotation( rot( 16384, 0, 0 ) ); 00141 SetTimer( 2.66, false ); 00142 TimeStamp = 0; 00143 } 00144 00145 EVENT Timer( ) 00146 { 00147 LOCAL Vector v; 00148 00149 v = 1200 * Normal( PointGrappin.Location - Crochet.Location ); 00150 00151 Jones.DetachFromBone( Crochet ); 00152 Crochet.SetRotation( ROTATOR( PointGrappin.Location - Crochet.Location ) ); 00153 PremierFilin = Spawn(class'CineHookLink',self,'Tag',Jones.GetBoneCoords('X R Finger1').Origin,Rotator(PointGrappin.Location-Crochet.Location)); 00154 00155 Crochet.Velocity=v; 00156 GotoState( 'STA_Demonstrator_CastHook' ); 00157 } 00158 00159 EVENT Tick(float dt) 00160 { 00161 // LOCAL Vector v; 00162 // LOCAL Rotator r; 00163 TimeStamp += dt; 00164 // v=Jones.GetBoneCoords('X').Origin-Jones.Location; 00165 // Jones.SetLocation(Jones.Location+v); 00166 00167 // Jones.PrePivot-=v; 00168 /* 00169 v = Jones.Location-PC.Pawn.Location; 00170 r = ROTATOR(v); 00171 r-= PC.Rotation; 00172 r.Yaw = ( ( r.Yaw + 32768 ) & 65535 ) - 32768; 00173 r.Roll = ( ( r.Roll + 32768 ) & 65535 ) - 32768; 00174 r.Pitch = ( ( r.Pitch + 32768 ) & 65535 ) - 32768; 00175 PC.SetRotation( r * Magic( 0.015, dt ) + PC.Rotation );*/ 00176 LookAtJones(dt); 00177 } 00178 } 00179 00180 //----------------------------------------------------------- 00181 00182 STATE STA_Demonstrator_CastHook 00183 { 00184 EVENT BeginState() 00185 { 00186 // TriggerEvent( CastHookEvent, self, none ); 00187 Jones.PlaySound( HookFireSound ); 00188 } 00189 00190 EVENT Tick(float dt) 00191 { 00192 LOCAL vector /*v,*/ vDir, vDown, vUp, vHand; 00193 LOCAL CineHookLink Filin; 00194 // LOCAL Rotator r; 00195 00196 vHand = Jones.GetBoneCoords('X R Finger0').Origin; 00197 vUp = Crochet.Location; 00198 vDir = Normal(Crochet.Location - vHand); 00199 PremierFilin.SetRotation( rotator(vDir) ); 00200 PremierFilin.SetLocation( vUp - Normal(vDir) * LinkLength * 0.5 ); 00201 vDown = PremierFilin.Location + VECTOR(PremierFilin.Rotation) * 0.5 * LinkLength; 00202 00203 Filin = PremierFilin.NextLink ; 00204 DernierFilin = PremierFilin; 00205 00206 while ( Filin != none ) 00207 { 00208 Filin.SetRotation( ROTATOR(vDir) ); 00209 vUp = Filin.PrevLink.Location - VECTOR(Filin.PrevLink.Rotation) * 0.5 * LinkLength; 00210 vDown = vUp - VECTOR(Filin.Rotation)*0.5*LinkLength; 00211 00212 Filin.SetLocation( Filin.PrevLink.Location - vDir * LinkLength ); 00213 DernierFilin=Filin; 00214 Filin = Filin.NextLink ; 00215 } 00216 if ( vSize(vDown-vHand) > LinkLength ) 00217 { 00218 DernierFilin.NextLink=Spawn(class'CineHookLink',,, DernierFilin.Location - VECTOR(DernierFilin.Rotation) * LinkLength,DernierFilin.Rotation); 00219 if ( DernierFilin.NextLink != none) 00220 DernierFilin.NextLink.PrevLink = DernierFilin; 00221 } 00222 if ( Crochet.Velocity.Z<1 ) 00223 GotoState('STA_Demonstrator_goes_up'); 00224 /* 00225 v = Jones.Location-PC.Pawn.Location; 00226 v.Z = 0; 00227 r = ROTATOR(v); 00228 r-= PC.Rotation; 00229 r.Yaw = ( ( r.Yaw + 32768 ) & 65535 ) - 32768; 00230 r.Roll = ( ( r.Roll + 32768 ) & 65535 ) - 32768; 00231 r.Pitch = ( ( r.Pitch + 32768 ) & 65535 ) - 32768; 00232 PC.SetRotation( r * Magic( 0.015, dt ) + PC.Rotation );*/ 00233 LookAtJones(dt); 00234 } 00235 } 00236 00237 STATE STA_Demonstrator_goes_up 00238 { 00239 EVENT BeginState() 00240 { 00241 Jones.SetPhysics( PHYS_Flying ); 00242 Jones.LoopAnim( 'GrappinMonte',,0.5 ); 00243 Jones.AirSpeed=600; 00244 // TriggerEvent( ClimbUpEvent, self, none ); 00245 Jones.PlaySound( HookStartSound ); 00246 } 00247 00248 EVENT Tick(float dt) 00249 { 00250 LOCAL vector /*v,*/ vDir, vDown, vUp, vHand; 00251 // LOCAL Rotator r; 00252 LOCAL CineHookLink Filin; 00253 LOCAL int i; 00254 00255 00256 vHand = Jones.GetBoneCoords('X R Finger0').Origin; 00257 vUp = Crochet.Location; 00258 vDir = Normal(Crochet.Location - vHand); 00259 00260 Jones.Velocity.X = 900 * vDir.X; 00261 Jones.Velocity.Y = 900 * vDir.Y; 00262 Jones.Velocity.Z = 450 * vDir.Z; 00263 00264 PremierFilin.SetRotation( rotator(vDir) ); 00265 PremierFilin.SetLocation( vUp - Normal(vDir) * LinkLength * 0.5 ); 00266 vDown = PremierFilin.Location + VECTOR(PremierFilin.Rotation) * 0.5 * LinkLength; 00267 00268 Filin = PremierFilin.NextLink; 00269 DernierFilin = PremierFilin; 00270 i=0; 00271 while ( Filin != none ) 00272 { 00273 if (Filin.Location.Z<Jones.Location.Z) 00274 { 00275 Filin.SetRotation( Filin.Rotation+ 0.1*(ROTATOR(vDir)+ exp(i*0.05)*cos(0.7*i+Level.TimeSeconds)*rot(512,0,0) -Filin.Rotation)); 00276 i++; 00277 } 00278 else 00279 Filin.SetRotation( ROTATOR(vDir) ); 00280 vUp = Filin.PrevLink.Location - VECTOR(Filin.PrevLink.Rotation) * 0.5 * LinkLength; 00281 vDown = vUp - VECTOR(Filin.Rotation)*LinkLength; 00282 00283 Filin.SetLocation( 0.5*(vUp+vDown) ); 00284 DernierFilin=Filin; 00285 Filin = Filin.NextLink ; 00286 } 00287 00288 if ( Crochet.Location.Z-Jones.Location.Z < 675 ) // 475 00289 GotoState('STA_Demonstrator_Swing_And_Jump'); 00290 00291 LookAtJones(dt); 00292 /* 00293 v = Jones.Location-PC.Pawn.Location; 00294 r = ROTATOR(v); 00295 r-= PC.Rotation; 00296 r.Yaw= ((r.Yaw+32768)&65535)-32768; 00297 r.Roll= ((r.Roll+32768)&65535)-32768; 00298 r.Pitch= ((r.Pitch+32768)&65535)-32768; 00299 PC.SetRotation(r*Magic(0.045,dt)+PC.Rotation);*/ 00300 } 00301 } 00302 00303 STATE STA_Demonstrator_Swing_And_Jump 00304 { 00305 EVENT BeginState() 00306 { 00307 Jones.PlayAnim( 'GrappinFin' ); 00308 Jones.Velocity=WallNormal*-125; // 75 00309 TimeStamp=0; 00310 SetTimer( 2.0, false ); 00311 // TriggerEvent( ClimbEndEvent, self, none ); 00312 Jones.PlaySound( HookStopSound ); 00313 } 00314 00315 EVENT EndState() 00316 { 00317 LOCAL CineHookLink Filin, FilinSuivant; 00318 00319 Filin=PremierFilin.NextLink; 00320 while (Filin!=none) 00321 { 00322 FilinSuivant=Filin.NextLink; 00323 Filin.Destroy(); 00324 Filin=FilinSuivant; 00325 } 00326 } 00327 00328 00329 EVENT Tick(float dt) 00330 { 00331 LOCAL vector /*v,*/ vDir, vDown, vUp, vHand, ds3d; 00332 // LOCAL Rotator r; 00333 LOCAL CineHookLink Filin; 00334 LOCAL FLOAT ds; 00335 00336 TimeStamp+=dt; 00337 vHand = Jones.GetBoneCoords('X R Finger0').Origin; 00338 vUp = Crochet.Location; 00339 vDir = Normal(Crochet.Location - vHand); 00340 00341 ds= vSize(Crochet.Location - vHand)/LinkLength; 00342 00343 ds3d = PremierFilin.DrawScale3D; 00344 ds3d.X = ds; 00345 PremierFilin.SetDrawScale3D( ds3d ); 00346 00347 PremierFilin.SetRotation( rotator(vDir) ); 00348 PremierFilin.SetLocation( vUp - Normal(vDir) * LinkLength*ds * 0.5 ); 00349 vDown = PremierFilin.Location + VECTOR(PremierFilin.Rotation) * 0.5 * LinkLength*ds; 00350 vDir = vect(0,0,1); 00351 Crochet.SetRotation( PremierFilin.Rotation ); 00352 00353 Filin = PremierFilin.NextLink; 00354 DernierFilin = PremierFilin; 00355 00356 while ( Filin != none ) 00357 { 00358 Filin.SetRotation( Filin.Rotation+ 0.1*(ROTATOR(vDir)-Filin.Rotation)); 00359 00360 ds3d = Filin.DrawScale3D; 00361 ds3d.X = FMax(0.01,1-(TimeStamp*0.66)); 00362 Filin.SetDrawScale3D( ds3d ); 00363 00364 vUp = Filin.PrevLink.Location - VECTOR(Filin.PrevLink.Rotation) * 0.5 * LinkLength * Filin.PrevLink.DrawScale3D.X; 00365 vDown = vUp - VECTOR(Filin.Rotation)*LinkLength*Filin.DrawScale3D.X; 00366 00367 Filin.SetLocation( 0.5*(vUp+vDown) ); 00368 DernierFilin=Filin; 00369 Filin = Filin.NextLink ; 00370 } 00371 00372 LookAtJones(dt); 00373 /* v = Jones.Location-PC.Pawn.Location; 00374 r = ROTATOR(v); 00375 r-= PC.Rotation; 00376 r.Yaw = ( ( r.Yaw + 32768 ) & 65535 ) - 32768; 00377 r.Roll = ( ( r.Roll + 32768 ) & 65535 ) - 32768; 00378 r.Pitch = ( ( r.Pitch + 32768 ) & 65535 ) - 32768; 00379 PC.SetRotation(r*Magic(0.015,dt)+PC.Rotation);*/ 00380 00381 } 00382 EVENT Timer() 00383 { 00384 GotoState('STA_Retract'); 00385 } 00386 00387 } 00388 00389 STATE STA_Retract 00390 { 00391 EVENT BeginState() 00392 { 00393 TimeStamp=0; 00394 TaillePremierFilin=PremierFilin.DrawScale3D.X; 00395 PC.GotoState('PlayerWalking'); 00396 SetTimer( 1.5, false ); 00397 // TriggerEvent( HookOffEvent, self, none ); 00398 Jones.PlaySound( HookStopSound ); 00399 } 00400 00401 EVENT Tick(float dt) 00402 { 00403 LOCAL vector vDir, vDown, vUp, vHand, ds3d; 00404 LOCAL CineHookLink Filin; 00405 LOCAL FLOAT ds; 00406 00407 TimeStamp+=dt; 00408 vHand = Jones.GetBoneCoords('X R Finger0').Origin; 00409 vDir = VECTOR(PremierFilin.Rotation); 00410 vUp = vHand+ vDir*ds3d.X*LinkLength; 00411 00412 ds3d = PremierFilin.DrawScale3D; 00413 ds3d.X = FMax(0.01,(1-(TimeStamp*1.0))*TaillePremierFilin); 00414 PremierFilin.SetDrawScale3D( ds3d ); 00415 00416 PremierFilin.SetLocation( vHand + vDir*ds3d.X*0.5*LinkLength); 00417 Crochet.SetLocation( vHand + vDir*ds3d.X*LinkLength ); 00418 } 00419 00420 EVENT Timer() 00421 { 00422 PremierFilin.Destroy(); 00423 Crochet.Destroy(); 00424 Jones.SetPhysics(PHYS_Walking); 00425 Jones.DropToGround(); 00426 Jones.SetLocation(Jones.GetBoneCoords('X').Origin); 00427 Jones.LoopAnim('WaitNeutre',,0.5); 00428 Jones.CurrentScript=MemCurrentScript; 00429 TriggerEvent(event,none,none); 00430 Destroy(); 00431 } 00432 } 00433 00434 00435 00436 defaultproperties 00437 { 00438 HookFireSound=Sound'XIIIsound.SpecActions__JonesHook.JonesHook__hFire' 00439 HookStartSound=Sound'XIIIsound.SpecActions__JonesHook.JonesHook__hStartLoop' 00440 HookStopSound=Sound'XIIIsound.SpecActions__JonesHook.JonesHook__hStopLoop' 00441 WallNormal=(X=-1.000000) 00442 Texture=Texture'XIDCine.Rock_ico' 00443 }