Ooops
October 28, 2020, 06:33:08 AM

Author Topic: [bb] Lotus Particle System R2 - Part 1 by N [ 1+ years ago ]  (Read 1433 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Lotus Particle System R2 - Part 1
Author : N
Posted : 1+ years ago

Description : This is part 1 of the source code (since it's too large to go into one entry, as Rob pointed out).  For part 2: <a href="codearcs62a3.html?code=1657" >Lotus Particle System R2 - Part 2[/url]

In the interest of furthering the potential usefulness of Lotus R2 (I will try to document some of it later, just don't expect it overnight), I'm releasing it into the public domain.

Hopefully this will help those people who are particularly hateful of licenses (can't blame'em considering I loathe anything longer than 100 lines).

Anywho, feel free to use and abuse.  I'll add a comment when I begin documenting the source.  (No guarantee that it will work with the DIMs arranged in the order they're in, however I don't think there will be a problem with them).

Media for Lotus R2 is laid out like so:
Code: [Select]
particles.png
_________________
| 0 | 1 | 2 | 3 |
|___|___|___|___|
| 4 | 5 | 6 | 7 |
|___|___|___|___|

Where numbers indicate the indices of particle cells (textures).  These cells are individual particles or animation frames (depending on which Load function you use).

The Graph functionality allows you to have keyframe'd values (color and size were all that were finished last I checked) instead of linearly interpolating between two values.

The public domain license does not apply to the existing archive of Lotus R2.  That is to say, all media, samples, the editor, etc. are still under the license they were originally released under. [/i]

Code :
Code: BlitzBasic
  1. Dim gSine#(0)
  2. Dim gCosine#(0)
  3. Dim gGraphArray#( 0, 1 )
  4. Dim gAlphaPartArray#( 0, 0 )
  5. Dim gLotusUpdateTimes%( 5 )
  6.  
  7. Function Min#(A#,B#)
  8.         If A < B Then Return B
  9.         Return A
  10. End Function
  11.  
  12. Function Max#(A#,B#)
  13.         If A > B Then Return B
  14.         Return A
  15. End Function
  16.  
  17. Function lSort( L, R )
  18.        
  19.         If R <= L Then Return False
  20.        
  21.         Local A, B, SwapA#, SwapB#, Middle#
  22.         A = L
  23.         B = R
  24.        
  25.         Middle# = gAlphaPartArray( (L+R)/2, 0 )
  26.        
  27.         Repeat
  28.                
  29.                 While gAlphaPartArray( A, 0 ) < Middle
  30.                         A = A + 1
  31.                         If A > R Then Exit
  32.                 Wend
  33.                
  34.                 While  Middle < gAlphaPartArray( B, 0 )
  35.                         B = B - 1
  36.                         If B < 0 Then Exit
  37.                 Wend
  38.                
  39.                 If A > B Then Exit
  40.                
  41.                 SwapA = gAlphaPartArray( A, 0 )
  42.                 SwapB = gAlphaPartArray( A, 1 )
  43.                 gAlphaPartArray( A, 0 ) = gAlphaPartArray( B, 0 )
  44.                 gAlphaPartArray( A, 1 ) = gAlphaPartArray( B, 1 )
  45.                 gAlphaPartArray( B, 0 ) = SwapA
  46.                 gAlphaPartArray( B, 1 ) = SwapB
  47.                
  48.                 A = A + 1
  49.                 B = B - 1
  50.                
  51.                 If B < 0 Then Exit
  52.                
  53.         Forever
  54.        
  55.         If L < B Then lSort( L, B )
  56.         If A < R Then lSort( A, R )
  57. End Function
  58.  
  59. Function InsertionSort( Size% )
  60.         Local i, j, index
  61.        
  62.         For i = 1 To Size - 1
  63.                 index = gGraphArray( i, 0 )
  64.                 j = i
  65.                 While j > 0 And gGraphArray( j-1, 0 ) > index
  66.                         gGraphArray( j, 0 ) = gGraphArray( j - 1, 0 )
  67.                         j = j - 1
  68.                 Wend
  69.                 gGraphArray( j, 0 ) = index
  70.         Next
  71. End Function
  72.  
  73.  
  74. ;; Line Helper functions, written by Jeremy Alessi (they are public domain)
  75. Function ReturnedY#(x#, X1#, Y1#, X2#, Y2#)
  76.         Return (  Slope( X1#, Y1#, X2#, Y2# ) * x# + YIntercept( X1#, Y1#, X2#, Y2# ) )
  77. End Function
  78.  
  79. Function Slope#(X1#, Y1#, X2#, Y2#)
  80.         m# = ( ( Y2# - Y1# ) / ( X2# - X1# ) )
  81.  
  82.         If m#=0
  83.                 Return .01 ;avoid infinity
  84.         EndIf
  85.        
  86.         Return m#
  87. End Function
  88.  
  89. Function YIntercept(X1#, Y1#, X2#, Y2#)
  90.         Return (Y1# - Slope#( X1#, Y1#, X2#, Y2# ) * X1#)
  91. End Function
  92.  
  93. Type LotusParticle
  94.         Field Texture.LotusTexture
  95.         Field Frame%
  96.         Field FrameStart%
  97.         Field FrameLength%
  98.         Field Animated%
  99.        
  100.         Field Parent.LotusEmitter
  101.         Field Child.LotusEmitter
  102.         Field Trail.LotusEmitter
  103.        
  104.         Field LastPositionX#
  105.         Field LastPositionY#
  106.         Field LastPositionZ#
  107.        
  108.         Field PositionX#
  109.         Field PositionY#
  110.         Field PositionZ#
  111.        
  112.         Field TranslationX#
  113.         Field TranslationY#
  114.         Field TranslationZ#
  115.        
  116.         Field VelocityX#
  117.         Field VelocityY#
  118.         Field VelocityZ#
  119.        
  120.         Field OVelocityX#
  121.         Field OVelocityY#
  122.         Field OVelocityZ#
  123.        
  124.         Field AccelerationX#
  125.         Field AccelerationY#
  126.         Field AccelerationZ#
  127.        
  128.         Field VelocityDecay#
  129.        
  130.         Field AngleX#
  131.         Field AngleY#
  132.         Field AngleZ#
  133.        
  134.         Field AngleVelocityX#
  135.         Field AngleVelocityY#
  136.         Field AngleVelocityZ#
  137.        
  138.         Field AngleAccelerationX#
  139.         Field AngleAccelerationY#
  140.         Field AngleAccelerationZ#
  141.        
  142.         Field DeflectorSpeedX#
  143.         Field DeflectorSpeedY#
  144.         Field DeflectorSpeedZ#
  145.        
  146.         Field RedFrom%
  147.         Field GreenFrom%
  148.         Field BlueFrom%
  149.         Field AlphaFrom#
  150.        
  151.         Field RedTo%
  152.         Field GreenTo%
  153.         Field BlueTo%
  154.         Field AlphaTo#
  155.        
  156.         Field ColorGraph.LotusGraph
  157.        
  158.         Field SizeFromX#
  159.         Field SizeFromY#
  160.         Field SizeFromZ#
  161.        
  162.         Field SizeToX#
  163.         Field SizeToY#
  164.         Field SizeToZ#
  165.        
  166.         Field SizeGraph.LotusGraph
  167.        
  168.         Field WaveRadiusX#
  169.         Field WaveRadiusY#
  170.         Field WaveRadiusZ#
  171.        
  172.         Field WaveSpeedX#
  173.         Field WaveSpeedY#
  174.         Field WaveSpeedZ#
  175.        
  176.         Field BlendMode%
  177.        
  178.         Field Vertex%
  179.        
  180.         Field RollMode%
  181.        
  182.         Field LifeSpan#
  183.         Field LifeBegan#
  184.         Field Life#
  185.         Field ParticleMesh%
  186.         Field Previous.LotusParticle
  187.        
  188.         Field GravityEnabled%
  189.         Field Gravity#
  190.         Field Weight#
  191.        
  192.         Field Range#
  193.        
  194.         Field ViewMode%
  195.         Field LifeMode%
  196.        
  197.         Field ChildMode%
  198.         Field Frozen%
  199.         Field Hidden%
  200.         Field Draw%
  201.         Field Cull%
  202.         Field Sorting%
  203.        
  204.         Field Bounce%
  205.         Field BounceDecay#
  206.         Field BounceMax%
  207.         Field Bounces%
  208.        
  209.         Field MinY#
  210.        
  211.         Field BounceSound%
  212.         Field BounceSoundChannel%
  213.         Field BounceSoundRange#
  214.        
  215.         Field SplineMesh%
  216.        
  217.         Field DeflectorsAffect%
  218. End Type
  219.  
  220. Type LotusEmitter
  221.         Field Name$
  222.  
  223.         Field Entity%
  224.         Field Texture.LotusTexture
  225.         Field Frame%
  226.         Field FrameStart%
  227.         Field FrameLength%
  228.         Field Animated%
  229.  
  230.         Field Parent.LotusEmitter
  231.         Field Child.LotusEmitter
  232.         Field Trail.LotusEmitter
  233.        
  234.         Field TranslationJitterUp%
  235.         Field TranslationJitterDown%
  236.        
  237.         Field PositionX#
  238.         Field PositionY#
  239.         Field PositionZ#
  240.        
  241.         Field AngleX#
  242.         Field AngleY#
  243.         Field AngleZ#
  244.        
  245.         Field TranslationJitterX#
  246.         Field TranslationJitterY#
  247.         Field TranslationJitterZ#
  248.        
  249.         Field VelocityJitterUp
  250.         Field VelocityJitterDown
  251.        
  252.         Field VelocityJitterX#
  253.         Field VelocityJitterY#
  254.         Field VelocityJitterZ#
  255.        
  256.         Field VelocityDecay#
  257.        
  258.         Field TranslationX#
  259.         Field TranslationY#
  260.         Field TranslationZ#
  261.        
  262.         Field VelocityX#
  263.         Field VelocityY#
  264.         Field VelocityZ#
  265.        
  266.         Field AccelerationX#
  267.         Field AccelerationY#
  268.         Field AccelerationZ#
  269.        
  270.         Field AngleVelocityX#
  271.         Field AngleVelocityY#
  272.         Field AngleVelocityZ#
  273.        
  274.         Field AngleAccelerationX#
  275.         Field AngleAccelerationY#
  276.         Field AngleAccelerationZ#
  277.        
  278.         Field RandomRotationX#
  279.         Field RandomRotationY#
  280.         Field RandomRotationZ#
  281.        
  282.         Field CircleRadiusX#
  283.         Field CircleSpeedX#
  284.         Field CircleRadiusY#
  285.        
  286.         Field CircleSpeedY#
  287.         Field CircleRadiusZ#
  288.         Field CircleSpeedZ#
  289.        
  290.         Field RedFrom%
  291.         Field GreenFrom%
  292.         Field BlueFrom%
  293.         Field AlphaFrom#
  294.        
  295.         Field RedTo%
  296.         Field GreenTo%
  297.         Field BlueTo%
  298.         Field AlphaTo#
  299.        
  300.         Field ColorJitterRed%
  301.         Field ColorJitterGreen%
  302.         Field ColorJitterBlue%
  303.         Field ColorJitterAlpha#
  304.         Field ColorJitterUniform%
  305.         Field ColorJitterUp%
  306.         Field ColorJitterDown%
  307.        
  308.         Field ColorGraph.LotusGraph
  309.        
  310.         Field SizeJitterX#
  311.         Field SizeJitterY#
  312.         Field SizeJitterZ#
  313.         Field SizeJitterUniform%
  314.         Field SizeJitterUp%
  315.         Field SizeJitterDown%
  316.        
  317.         Field SizeFromX#
  318.         Field SizeFromY#
  319.         Field SizeFromZ#
  320.        
  321.         Field SizeToX#
  322.         Field SizeToY#
  323.         Field SizeToZ#
  324.        
  325.         Field SizeGraph.LotusGraph
  326.        
  327.         Field CylinderX#
  328.         Field CylinderY#
  329.         Field CylinderZ#
  330.        
  331.         Field CubeX#
  332.         Field CubeY#
  333.         Field CubeZ#
  334.        
  335.         Field WaveRadiusX#
  336.         Field WaveRadiusY#
  337.         Field WaveRadiusZ#
  338.        
  339.         Field WaveSpeedX#
  340.         Field WaveSpeedY#
  341.         Field WaveSpeedZ#
  342.        
  343.         Field BlendMode%
  344.        
  345.         Field LifeSpan%
  346.         Field LifeSpanJitter%
  347.         Field LifeSpanJitterUp%
  348.         Field LifeSpanJitterDown%
  349.        
  350.         Field Active%
  351.         Field ActiveSpan%
  352.         Field FreeOnEndActive%
  353.        
  354.         Field GravityEnabled%
  355.         Field Gravity#
  356.         Field GravityJitter#
  357.         Field GravityJitterUp%
  358.         Field GravityJitterDown%
  359.         Field Weight#
  360.        
  361.         Field RollMode%
  362.        
  363.         Field Emit%
  364.         Field EmissionRate%
  365.        
  366.         Field InnerRadius#
  367.         Field Radius#
  368.         Field YRadius#
  369.        
  370.         Field ParticleMesh%
  371.         Field Latest.LotusParticle
  372.         Field ViewMode%
  373.         Field LifeMode%
  374.         Field WaitA#            ;; Auto-emission wait
  375.         Field WaitB#            ;; Child-emission wait
  376.         Field WaitC#            ;; Trail-emission wait
  377.         Field WaitSpan%
  378.         Field ChildMode%
  379.         Field Range#
  380.        
  381.         Field Frozen%
  382.         Field Hidden%
  383.         Field Cull%
  384.         Field Sorting%
  385.         Field DWaitSpan%
  386.         Field WaitSpanJitter%
  387.        
  388.         Field Bounce%
  389.         Field BounceDecay#
  390.         Field BounceMax%
  391.        
  392.         Field MinY#
  393.        
  394.         Field EmitSound%
  395.         Field BounceSound%
  396.         Field LoopEmitSound%
  397.         Field EmitSoundChannel%
  398.         Field EmitSoundRange#
  399.         Field BounceSoundRange#
  400.        
  401.         Field SplineMesh%
  402.        
  403.         Field DeflectorsAffect%
  404. End Type
  405.  
  406. Type LotusDeflector
  407.         Field PositionX#
  408.         Field PositionY#
  409.         Field PositionZ#
  410.         Field Entity%
  411.         Field Radius#
  412.         Field Strength#
  413.         Field Active%
  414. End Type
  415.  
  416. Type LotusTexture
  417.         Field Bitmap%
  418.         Field Flags%
  419.         Field Path$
  420.         Field Add%
  421.         Field Multiply%
  422.         Field Alpha%
  423.         Field UStep#
  424.         Field VStep#
  425.         Field Rows%
  426.         Field Columns%
  427. End Type
  428.  
  429. Type LotusGraph
  430.         Field Bank%
  431.         Field Keys%
  432.         Field Width#
  433. End Type
  434.  
  435. Dim LoadedEmitters%(255)                                                ;; The emitters loaded by LoadASCIIEmitters
  436. Global gLoadedEmittersCount%                                    ;; The amount of emitters loaded through LoadASCIIEmitters
  437.  
  438. Dim LoadedDeflectors%(255)                                      ;; The deflectors loaded by LoadASCIIEmitters
  439. Global gLoadedDeflectorsCount%                          ;; The amount of deflectors loaded through LoadASCIIEmitters
  440.  
  441. Dim LoadedTextures%(255)                                                ;; The textures loaded by LoadASCIIEmitters
  442. Global gLoadedTexturesCount%                                    ;; The amount of textures loaded through LoadASCIIEmitters
  443.  
  444. Global gLotusParticlePivot%                                     ;; Pivot used to determine various properties and the position and rotation of particles
  445. Global gLotusTPivot%                                            ;; Extra pivot used for view mode calculations
  446. Global gLotusParticleMesh%                                      ;; The container-mesh for all Lotus particles
  447. Global gLotusCamera%                                            ;; The camera particles will face (when told to)
  448.  
  449. Global gLotusNullTexture.LotusTexture                   ;; The 'Null Texture' object- used in the case that no texture is available
  450. Global gLotusEmitterTexture%                                    ;; The texture assigned to emitter cones.
  451. Global gNullTexture%                                            ;; The handle of the 'Null Texture'
  452.  
  453. Global gLotusParticleCount%                                     ;; The amount of particles in existence
  454. Global gLotusAlphaParticleCount%                                ;; The amount of alpha-blended particles to be sorted
  455. Global gLotusParticlesDrawn%                                    ;; The amount of particles drawn during the last call to UpdateLotusParticles
  456.  
  457. Const cP_QUAD% = 0                                                      ;; SetEmitterParticleMesh enumerator; sets a particle's mesh to a quad (two triangles)
  458. Const cP_TRIANGLE% = 1                                          ;; SetEmitterParticleMesh enumerator; sets a particle's mesh to a triangle
  459. Const cP_TRAIL% = 2                                                     ;; SetEmitterParticleMesh enumerator; sets a particle's mesh to the trail style (all particles are 'connected' by quads)
  460. Const cP_TRAILVERTICAL% = 3                                     ;; SetEmitterParticleMesh enumerator; sets a particle's mesh to the vertical trail style (all particles are 'connected' by quads)
  461. Const cP_DENT% = 4                                                      ;; SetEmitterParticleMesh enumerator; sets a particle's mesh to a quad with a dent in the center (four triangles)
  462.  
  463. Const updTimeSort% = 0                                          ;; Indices for update times
  464. Const updTimeEmit% = 1
  465. Const updTimePart% = 2
  466. Const updTimeDrawAlpha% = 3
  467. Const updTimeTexture% = 4
  468. Const updTimeAll% = 5
  469.  
  470. Global gWidth%                                                                  ;; The screen buffer width and height
  471. Global gHeight%
  472.  
  473. Const cUSE_EMITTERCONES = 0                                             ;; Whether or not to use emitter cones (little graphical thingy); recommended to leave off
  474.  
  475. Global gFacingX#,gFacingY#,gFacingZ#                            ;; Facing vector
  476.  
  477. Type LotusVector
  478.         Field X#
  479.         Field Y#
  480.         Field Z#
  481. End Type
  482.  
  483. Global gTempLotusVector.LotusVector     ;can be used for temporary LotusVector operations.
  484. Global gNullLotusVector.LotusVector     ;zero-LotusVector.
  485.  
  486. Type LotusStringPiece
  487.         Field Text$
  488. End Type
  489.  
  490. Function DivideString(Text$,Sep$)
  491.         Text$ = Trim(Text$)
  492.         Local Pieces = 0
  493.         OT$ = Text$
  494.         Text$ = ""
  495.         For E = 1 To Len(OT)
  496.                 C = Asc(Mid(OT,E,1))
  497.                 S = Instr(Sep,Chr(C))
  498.  
  499.                 If (Not StringOpen) And C = 39 Then Exit
  500.  
  501.                 If C = 34 Then StringOpen = Not StringOpen
  502.  
  503.                 If (S > 0 Or C = 32) And (Not StringOpen) Then
  504.                         Text = Text + Chr(4)
  505.                 Else
  506.                         Text = Text + Chr(C)
  507.                 EndIf
  508.         Next
  509.  
  510.         While Text$ <> ""
  511.                 If Asc(Left(Text$,1)) = 34 Then
  512.                         Text$ = Right(Text$,Len(Text$)-1)
  513.                         Closest = Instr(Text$,Chr(34))
  514.                 Else
  515.                         Closest = Instr(Text$,Chr(4))
  516.                 EndIf
  517.  
  518.                 If Closest Then
  519.                         NText$ = Trim(Left(Text$,Closest-1))
  520.                         Text$ = Trim(Right(Text$,Len(Text$)-Closest))
  521.                 Else
  522.                         NText$ = Text$
  523.                         Text$ = ""
  524.                 EndIf
  525.  
  526.                 P.LotusStringPiece = New LotusStringPiece
  527.                 PText$ = Replace(NText$,""+Chr(34),Chr(34))
  528.                 Pieces = Pieces + 1
  529.         Wend
  530.  
  531.         Return Pieces
  532. End Function
  533.  
  534. ;creates a LotusVector and returns it
  535. Function LotusVec.LotusVector(X#=0,Y#=0,Z#=0)
  536.         V.LotusVector = New LotusVector
  537.         VX = X
  538.         VY = Y
  539.         V = Z
  540.         Return V
  541. End Function
  542.  
  543. ;adds LotusVector B to LotusVector A
  544. Function LotusVec_Add(A.LotusVector, B.LotusVector)
  545.         If Not A <> Null Or B <> Null Then Return False
  546.         AX = AX + BX
  547.         AY = AY + BY
  548.         A = A + B
  549.         Return True
  550. End Function
  551.  
  552. ;subtracts LotusVector B from LotusVector A
  553. Function LotusVec_Subtract(A.LotusVector, B.LotusVector)
  554.         If Not A <> Null Or B <> Null Then Return False
  555.         AX = AX - BX
  556.         AY = AY - BY
  557.         A = A - B
  558.         Return True
  559. End Function
  560.  
  561. ;returns the difference of LotusVector A and LotusVector B
  562. Function LotusVec_Difference.LotusVector(A.LotusVector, B.LotusVector)
  563.         If Not A <> Null Or B <> Null Then Return Null
  564.         Return LotusVec(AX-BX,AY-BY,A-B)
  565. End Function
  566.  
  567. ;returns the sum of LotusVector A and LotusVector B
  568. Function LotusVec_Sum.LotusVector(A.LotusVector, B.LotusVector)
  569.         If Not A <> Null Or B <> Null Then Return Null
  570.         Return LotusVec(AX+BX,AY+BY,A+B)
  571. End Function
  572.  
  573. ;multiplies LotusVector A by LotusVector B
  574. Function LotusVec_Multiply(A.LotusVector, B.LotusVector)
  575.         If Not A <> Null Or B <> Null Then Return False
  576.         AX = AX * BX
  577.         AY = AY * BY
  578.         A = A * B
  579.         Return True
  580. End Function
  581.  
  582. ;divides LotusVector A by LotusVector B
  583. Function LotusVec_Divide(A.LotusVector, B.LotusVector)
  584.         If Not A <> Null Or B <> Null Then Return False
  585.         AX = AX / BX
  586.         AY = AY / BY
  587.         A = A / B
  588.         Return True
  589. End Function
  590.  
  591. ;scales LotusVector A by Scalar B
  592. Function LotusVec_Scale(A.LotusVector, B#)
  593.         If Not A <> Null Then Return False
  594.         AX = AX * B
  595.         AY = AY * B
  596.         A = A * B
  597.         Return True
  598. End Function
  599.  
  600. ;divides LotusVector A by Scalar B
  601. Function LotusVec_SDivide(A.LotusVector,B#)
  602.         If Not A <> Null Or B = 0 Then Return False
  603.         AX = AX / B
  604.         AY = AY / B
  605.         A = A / B
  606.         Return True
  607. End Function
  608.  
  609. ;makes LotusVector A the cross product of LotusVectors A and B
  610. Function LotusVec_CrossProduct(A.LotusVector, B.LotusVector)
  611.         If Not A <> Null Or B <> Null Then Return False
  612.         X# = AY*B - A*BY
  613.         Y# = A*BX - AX*B
  614.         Z# = AX*BY - AY*BX
  615.         AX = X
  616.         AY = Y
  617.         A = Z
  618.         Return True
  619. End Function
  620.  
  621. ;returns the dot product of LotusVectors A and B
  622. Function LotusVec_DotProduct#(A.LotusVector, B.LotusVector)
  623.         If Not A <> Null Or B <> Null Then Return False
  624.         Return AX * BX + AY * BY + A * B;
  625. End Function
  626.  
  627. ;copies the contents of LotusVector A to a new LotusVector and returns it
  628. Function LotusVec_Copy.LotusVector(A.LotusVector)
  629.         If Not A <> Null Then Return Null
  630.         B.LotusVector = New LotusVector
  631.         BX = AX
  632.         BY = AY
  633.         B = A
  634.         Return B
  635. End Function
  636.  
  637. ;copies the contents of LotusVector B to LotusVector A
  638. Function LotusVec_CopyTo(A.LotusVector,B.LotusVector)
  639.         If Not A <> Null Or B <> Null Then Return False
  640.         AX = BX
  641.         AY = BY
  642.         A = B
  643. End Function
  644.  
  645. ;normalizes LotusVector A
  646. Function LotusVec_Normalize(A.LotusVector)
  647.         If Not A <> Null Then Return False
  648.         M# = LotusVec_Magnitude(A)
  649.         AX = AX / M
  650.         AY = AY / M
  651.         A = A / M
  652.         Return True
  653. End Function
  654.  
  655. ;returns the magnitude of LotusVector A
  656. Function LotusVec_Magnitude#(A.LotusVector)
  657.         If Not A <> Null Then Return False
  658.         Return Sqr(AX*AX+AY*AY+A*A)
  659. End Function
  660.  
  661. ;returns the distance between LotusVector A and LotusVector B
  662. Function LotusVec_Distance#(A.LotusVector,B.LotusVector)
  663.         If Not A <> Null Or B <> Null Then Return False
  664.         DX# = AX - BX
  665.         DY# = AY - BY
  666.         DZ# = A - B
  667.         Return Sqr(DX*DX+DY*DY+DZ*DZ)
  668. End Function
  669.  
  670. ;inverts LotusVector A
  671. Function LotusVec_Invert(A.LotusVector)
  672.         If Not A <> Null Then Return False
  673.         AX = -AX
  674.         AY = -AY
  675.         A = -A
  676.         Return True
  677. End Function
  678.  
  679. ;returns an inverted LotusVector A
  680. Function LotusVec_Inverse.LotusVector(A.LotusVector)
  681.         If Not A <> Null Then Return Null
  682.         B.LotusVector = LotusVec_Copy(A)
  683.         LotusVec_Invert B
  684.         Return B
  685. End Function
  686.  
  687. ;returns the position of an entity in a LotusVector.  G = Global
  688. Function LotusVec_Entity_Position.LotusVector(Entity,G = False)
  689.         If Entity = 0 Then Return Null
  690.         V.LotusVector = New LotusVector
  691.         VX = EntityX(Entity,G)
  692.         VY = EntityY(Entity,G)
  693.         V = EntityZ(Entity,G)
  694.         Return V
  695. End Function
  696.  
  697. ;returns the angle of an entity in a LotusVector.  G = Global
  698. Function LotusVec_Entity_Angle.LotusVector(Entity,G = False)
  699.         If Entity = 0 Then Return Null
  700.         V.LotusVector = New LotusVector
  701.         VX = EntityPitch(Entity,G)
  702.         VY = EntityYaw(Entity,G)
  703.         V = EntityRoll(Entity,G)
  704.         Return V
  705. End Function
  706.  
  707. ;positions an entity at LotusVector A
  708. Function LotusVec_PositionEntity(Entity,A.LotusVector,Glb=False)
  709.         If Entity = 0 Or A = Null Then Return False
  710.         PositionEntity Entity,AX,AY,A,Glb
  711. End Function
  712.  
  713. ;rotates an entity to LotusVector A
  714. Function LotusVec_RotateEntity(Entity,A.LotusVector,Glb=False)
  715.         If Entity = 0 Or A = Null Then Return False
  716.         RotateEntity Entity,AX,AY,A,Glb
  717. End Function
  718.  
  719. ;turns an entity by LotusVector A
  720. Function LotusVec_TurnEntity(Entity,A.LotusVector)
  721.         If Entity = 0 Or A = Null Then Return False
  722.         TurnEntity Entity,AX,AY,A
  723. End Function
  724.  
  725. ;aligns an entity to LotusVector A
  726. Function LotusVec_AlignToLotusVector(Entity,A.LotusVector,Axes=3,Trans#=1)
  727.         If Entity = 0 Or A = Null Then Return False
  728.         AlignToVector Entity,AX,AY,A,Axes,Trans
  729. End Function
  730.  
  731. ;moves an entity by LotusVector A
  732. Function LotusVec_MoveEntity(Entity,A.LotusVector)
  733.         If Entity = 0 Or A = Null Then Return False
  734.         MoveEntity Entity,AX,AY,A
  735. End Function
  736.  
  737. ;translates an entity by LotusVector A
  738. Function LotusVec_TranslateEntity(Entity,A.LotusVector)
  739.         If Entity = 0 Or A = Null Then Return False
  740.         TranslateEntity Entity,AX,AY,A
  741. End Function
  742.  
  743. ;returns the normals of a vertex
  744. Function LotusVec_VertexNormal.LotusVector(Surface,Index)
  745.         If Surface = 0 Or Index < 0 Or Index > CountVertices(Surface)-1 Then Return Null
  746.         Return LotusVec(VertexNX(Surface,Index),VertexNY(Surface,Index),VertexNZ(Surface,Index))
  747. End Function
  748.  
  749. ;returns the local position of a vertex
  750. Function LotusVec_VertexPosition.LotusVector(Surface,Index)
  751.         If Surface = 0 Or Index < 0 Or Index > CountVertices(Surface)-1 Then Return Null
  752.         Return LotusVec(VertexX(Surface,Index),VertexY(Surface,Index),VertexZ(Surface,Index))
  753. End Function
  754.  
  755. ;sets the position of a vertex to LotusVector A
  756. Function LotusVec_VertexCoords(Surface,Index,A.LotusVector)
  757.         If Surface = 0 Or Index < 0 Or Index > CountVertices(Surface)-1 Or A = Null Then Return False
  758.         VertexCoords Surface,Index,AX,AY,A
  759. End Function
  760.  
  761. ;returns the normal of a triangle
  762. Function LotusVec_TriangleNormal.LotusVector(Surface,Index)
  763.         If Surface = 0 Or Index < 0 Or Index > CountTriangles(Surface)-1 Then Return Null
  764.         Local VNormals.LotusVector[2]
  765.         For N = 0 To 2
  766.                         VNormals[N] = LotusVec_VertexNormal(Surface,TriangleVertex(Surface,Index,N))
  767.         Next
  768.         LotusVec_Subtract VNormals[0],VNormals[1]
  769.         LotusVec_Subtract VNormals[1],VNormals[2]
  770.         LotusVec_CrossProduct(VNormals[0],VNormals[1])
  771.         Delete VNormals[1]
  772.         Delete VNormals[2]
  773.         Return VNormals[0]
  774. End Function
  775.  
  776. ;returns the local position of a triangle
  777. Function LotusVec_TrianglePosition.LotusVector(Surface,Index)
  778.         If Surface = 0 Or Index < 0 Or Index > CountTriangles(Surface)-1 Then Return Null
  779.         Local VNormals.LotusVector[2]
  780.         For N = 0 To 2
  781.                         VNormals[N] = LotusVec_VertexPosition(Surface,TriangleVertex(Surface,Index,N))
  782.         Next
  783.         LotusVec_Add(VNormals[0],VNormals[1])
  784.         LotusVec_Add(VNormals[0],VNormals[2])
  785.         LotusVec_SDivide(VNormals[0],3)
  786.         Delete VNormals[1]
  787.         Delete VNormals[2]
  788.         Return VNormals[0]
  789. End Function
  790.  
  791. ;transforms LotusVector A from one coordinate system to another
  792. Function LotusVec_TFormPoint(A.LotusVector,EntityA,EntityB)
  793.         If Not A <> Null Then Return False
  794.         TFormPoint AX,AY,A,EntityA,EntityB
  795. End Function
  796.  
  797. ;returns the TFormed vector
  798. Function LotusVec_TFormedA.LotusVector()
  799.         Return LotusVec(TFormedX(),TFormedY(),TFormedZ())
  800. End Function
  801.  
  802. ;puts the values of the TFormed vector into LotusVector A
  803. Function LotusVec_TFormedB(A.LotusVector)
  804.         If A = Null Then Return False
  805.         AX = TFormedX()
  806.         AY = TFormedY()
  807.         A = TFormedZ()
  808. End Function
  809.  
  810. Global ParticleTiles=0
  811. Global BulletHoleEmitter=0
  812. Global BulletSparkEmitter=0
  813. Global BulletSmokeEmitter=0
  814.  
  815. Function FXP_SetupTilesets()
  816.         If ParticleTiles = 0 Then
  817.                 Tiles = LoadLotusTileset("media/particles.png",59,2,4,1,0,1)
  818.                 ParticleTiles = Tiles
  819.         Else
  820.                 Tiles = ParticleTiles
  821.         EndIf
  822.        
  823.         Return Tiles
  824. End Function
  825.  
  826. Function CreateBulletSpark(X#,Y#,Z#,NX#,NY#,NZ#)
  827.         Tiles = FXP_SetupTilesets()
  828.        
  829.         If BulletSparkEmitter = 0 Then
  830.                 e = CreateEmitter()
  831.                 ApplyTexture e,Tiles,3
  832.                
  833.                 SetEmitterVelocity e,0,.2,0
  834.                 SetEmitterSizeJitter e,1,0,0,0,1,1
  835.                 SetEmitterLifespan e,8
  836.                 SetEmitterSorting e,1
  837.                 SetEmitterBlend e,3
  838.                 SetEmitterColorFrom e,246,167,76,.6
  839.                 SetEmitterColorTo e,235,155,0,0
  840.                 SetEmitterSizeTo e,1,.5
  841.                 SetEmitterSizeFrom e,.5,.25
  842.                 SetEmitterRandomRotation e,25,25,0
  843.                 SetEmitterRollMode e,1
  844.                 SetEmitterEmissionRate e,32
  845.                 BulletSparkEmitter = e
  846.         Else
  847.                 e = BulletSparkEmitter
  848.         EndIf
  849.        
  850.         If BulletSmokeEmitter = 0 Then
  851.                 s = CreateEmitter()
  852.                 SetEmitterLifespan s,120
  853.                 SetEmitterVelocity s,0,.005,0
  854.                 SetEmitterVelocityDecay s,1
  855.                 SetEmitterEmissionRate s,4
  856.                 SetEmitterColorFrom s,88,86,84,.7
  857.                 SetEmitterColorTo s,77,76,75,0
  858.                 SetEmitterColorJitter s,15,15,15,0,1
  859.                 ApplyTexture s,Tiles,4
  860.                 SetEmitterSizeFrom s,0,0
  861.                 SetEmitterRandomRotation s,0,0,180
  862.                 SetEmitterSizeTo s,1,2
  863.                 SetEmitterSizeJitter s,.4,.4,.4,1,1,0
  864.                 SetEmitterTranslation s,0,.01,0
  865.                 SetEmitterTranslationJitter s,0,.025,0,1,0
  866.                 BulletSmokeEmitter = s
  867.         Else
  868.                 s = BulletSmokeEmitter
  869.         EndIf
  870.        
  871.         If BulletHoleEmitter = 0 Then
  872.                 b = CreateEmitter()
  873.                 SetEmitterLifespan b,3000
  874.                 SetEmitterViewmode b,2
  875.                 SetEmitterColorFrom b,0,0,0,8
  876.                 SetEmitterColorTo b,0,0,0,0
  877.                 SetEmitterSize b,1,1,1
  878.                 SetEmitterRandomRotation b,0,0,180
  879.                 SetEmitterSizeJitter b,.4,.4,.4,1,1,1
  880.                 ApplyTexture b,Tiles,1
  881.         Else
  882.                 b = BulletHoleEmitter
  883.         EndIf
  884.        
  885.         PositionEntity e,X,Y,Z
  886.         PositionEntity s,X,Y,Z
  887.         AlignToVector e,NX,NY,NZ,2,1
  888.         AlignToVector s,NX,NY,NZ,3,1
  889.         MoveEntity s,0,0,.7
  890.         MoveEntity e,0,0,.2
  891.         PositionEntity b,X,Y,Z
  892.         AlignToVector b,NX,NY,NZ,3,1
  893.         MoveEntity b,0,0,.025
  894.        
  895.         CreateParticle(s)
  896.         CreateParticle(e)
  897.         CreateParticle(b)
  898. End Function
  899.  
  900. Function CreateTorch()
  901.         Tiles = FXP_SetupTilesets()
  902.        
  903.         E = CreateEmitter()
  904.         ApplyTexture E,Tiles,0
  905.         SetEmitterTranslation E,0,.045,0
  906.         SetEmitterLifespan E,600,400
  907.         SetEmitterBlend E,3
  908.         SetEmitterSizeFrom E,.45,.45
  909.         SetEmitterColor E,209,151,78,1
  910.         SetEmitterColorTo E,150,80,0,0
  911.         SetEmitterColorJitter E,42,42,42,0,1
  912.         SetEmitterSizeTo E,1.25,1.25
  913.         SetEmitterRandomRotation E,0,0,50
  914.         SetEmitterViewMode E,1
  915.         SetEmitterSizeJitter E,.25,.25,.25,1,1,0
  916.        
  917.         N = CreateEmitter()
  918.         ApplyTexture N,Tiles,7
  919.         SetEmitterParent N,E
  920.         SetEmitterChildMode E,2
  921.         SetEmitterTranslation N,0,.045,0
  922.         SetEmitterVelocity N,0,0,.0025
  923.         SetEmitterRandomRotation N,20,360,180
  924.         SetEmitterLifeSpan N,3500
  925.         SetEmitterColorFrom N,120,120,120,.7
  926.         SetEmitterColorTo N,100,100,100,0
  927.         SetEmitterBlend N,1
  928.         SetEmitterWaitSpan E,2
  929.         SetEmitterWaitSpan N,5
  930.         SetEmitterSizeJitter N,.5,.5,.5,1,1,0
  931.         SetEmitterLifeMode N,2
  932.         SetEmitterSizeFrom N,.05,.05
  933.         SetEmitterSizeTo N,1.5,1.5
  934.         SetEmitterEmissionRate E,1
  935.         SetEmitterLifeMode E,2
  936.        
  937.         SetEmitterCulling N,0
  938.        
  939.         Return E
  940. End Function
  941.  
  942. ;#Region LotusXML.bb
  943.         ;#Region DESCRIPTION
  944.                 ; XML load / parse / save functions
  945.                 ; Written by Blitztastic, butchered by Noel Cower
  946.         ;#End Region
  947.        
  948.         ;#Region CLASSES
  949.                 Type XMLnodelist
  950.                         Field node.XMLnode
  951.                         Field nextnode.XMLnodelist
  952.                         Field prevnode.XMLnodelist
  953.                 End Type
  954.                
  955.                 ; for internal use, do not use in code outside of this file
  956.                 Type XMLworklist
  957.                         Field node.XMLnode
  958.                 End Type
  959.                
  960.                
  961.                 Type XMLnode
  962.                         Field tag$,value$,path$
  963.                         Field firstattr.XMLattr
  964.                         Field lastattr.XMLattr 
  965.                         Field attrcount,fileid
  966.                         Field endtag$
  967.                        
  968.                         ; linkage functionality
  969.                         Field firstchild.XMLnode
  970.                         Field lastchild.XMLnode
  971.                         Field childcount
  972.                         Field nextnode.XMLnode
  973.                         Field prevnode.XMLnode
  974.                         Field parent.XMLnode
  975.                 End Type
  976.                
  977.                 Type XMLattr
  978.                         Field name$,value$
  979.                         Field sibattr.XMLattr
  980.                         Field parent.XMLnode
  981.                 End Type
  982.                
  983.                 Global XMLFILEID
  984.         ;#End Region
  985.        
  986.         ;#Region PROCEDURES
  987.                 Function ReadXML.XMLnode(filename$)
  988.                         infile = ReadFile(filename$)
  989.                         XMLFILEID=MilliSecs()
  990.                         x.XMLnode = XMLReadNode(infile,Null)
  991.                         CloseFile infile
  992.                         Return x
  993.                 End Function
  994.                
  995.                 Function WriteXML(filename$,node.XMLnode,writeroot=False)
  996.                         outfile = WriteFile(filename$)
  997.                         WriteLine outfile,"<?xml version="+Chr$(34)+"1.0"+Chr$(34)+" ?>"
  998.                         XMLwriteNode(outfile,node)
  999.                         CloseFile outfile
  1000.                 End Function
  1001.                
  1002.                 Function XMLOpenNode.XMLnode(parent.XMLnode,tag$="")
  1003.                         x.XMLnode = New XMLnode
  1004.                         x       ag$=tag$
  1005.                         xfileid = XMLFILEID; global indicator to group type entries (allows multiple XML files to be used)
  1006.                         XMLaddNode(parent,x)
  1007.                         Return x
  1008.                 End Function
  1009.                
  1010.                 Function XMLCloseNode.XMLnode(node.XMLnode)
  1011.                         Return nodeparent
  1012.                 End Function
  1013.                
  1014.                 ; adds node to end of list (need separate function for insert, or mod this on)
  1015.                 Function XMLAddNode(parent.XMLnode,node.XMLnode)
  1016.                         If parent <> Null
  1017.                                 If parentchildcount = 0 Then
  1018.                                         parentfirstchild = node
  1019.                                 Else
  1020.                                         parentlastchild
  1021. extnode = node
  1022.                                 End If
  1023.                                 nodeprevnode = parentlastchild
  1024.                                 parentlastchild = node
  1025.                                 parentchildcount = parentchildcount +1
  1026.                                 nodepath$ = parentpath$+parent  ag$
  1027.                         End If
  1028.                         nodeparent = parent
  1029.                         nodepath$=nodepath$+"/"
  1030.                 End Function
  1031.                
  1032.                 Function XMLDeleteNode(node.XMLnode)
  1033.                         n.XMLnode = nodefirstchild
  1034.                         ; delete any children recursively
  1035.                         While n <> Null
  1036.                                 nn.XMLnode= n
  1037. extnode
  1038.                                 XMLdeletenode(n)
  1039.                                 n = nn
  1040.                         Wend
  1041.                
  1042.                         ; delete attributes for this node
  1043.                         a.XMLattr = nodefirstattr
  1044.                         While a <> Null
  1045.                                 na.XMLattr = asibattr
  1046.                                 Delete a
  1047.                                 a = na
  1048.                         Wend
  1049.                
  1050.                         ; dec parents child count
  1051.                         If nodeparent <> Null
  1052.                                 nodeparentchildcount = nodeparentchildcount -1
  1053.                                
  1054.                                 ; heal linkages
  1055.                                 If nodeprevnode <> Null Then nodeprevnode
  1056. extnode = node
  1057. extnode
  1058.                                 If node
  1059. extnode <> Null Then node
  1060. extnodeprevnode = nodeprevnode
  1061.                                 If nodeparentfirstchild = node Then nodeparentfirstchild = node
  1062. extnode
  1063.                                 If nodeparentlastchild = node Then nodeparentlastchild = nodeprevnode
  1064.                         End If
  1065.                         ; delete this node             
  1066.                         Delete node
  1067.                
  1068.                 End Function
  1069.                
  1070.                 ; node functions
  1071.                 Function XMLfindNode.XMLnode(node.XMLnode,path$)
  1072.                
  1073.                         ret.XMLnode = Null
  1074.                         p=Instr(path$,"/")
  1075.                         If p > 0 Then
  1076.                                 tag$=Left$(path$,p-1)
  1077.                                 a.XMLnode = node
  1078.                                 While ret=Null And a<>Null
  1079.                                         If Lower(tag$)=Lower(a  ag$) Then
  1080.                                                 If p=Len(path$) Then
  1081.                                                                 ret = a
  1082.                                                 Else
  1083.                                                         If afirstchild <> Null Then
  1084.                                                                 ret = XMLfindnode(afirstchild,Mid$(path$,p+1))
  1085.                                                         End If
  1086.                                                 End If
  1087.                                         End If
  1088.                                         a = a
  1089. extnode
  1090.                                 Wend
  1091.                         End If
  1092.                         Return ret
  1093.                 End Function
  1094.                
  1095.                 Function XMLDeleteList(nl.XMLnodelist)
  1096.                         While nl <> Null
  1097.                                 na.XMLnodelist = nl
  1098. extnode
  1099.                                 Delete nl
  1100.                                 nl = na
  1101.                         Wend
  1102.                 End Function
  1103.                
  1104.                
  1105.                 Function XMLSelectNodes.XMLnodelist(node.XMLnode,path$,recurse=True)
  1106.                         root.XMLnodelist=Null
  1107.                         XMLselectnodesi(node,path$,recurse)
  1108.                         prev.XMLnodelist=Null
  1109.                         c = 0
  1110.                         For wl.XMLworklist = Each XMLworklist
  1111.                                 c = c + 1
  1112.                                 nl.XMLnodelist = New XMLnodelist
  1113.                                 nl
  1114. ode = wl
  1115. ode
  1116.                                 If prev = Null Then
  1117.                                         root = nl
  1118.                                         prev = nl
  1119.                                 Else
  1120.                                         prev
  1121. extnode = nl
  1122.                                         nlprevnode = prev
  1123.                                 End If
  1124.                                 prev = nl
  1125.                                 Delete wl
  1126.                         Next
  1127.                         ;gak debuglog "XML: "+c+" nodes selected"
  1128.                         Return root
  1129.                 End Function
  1130.                
  1131.                 ; internal selection function, do not use outside this file
  1132.                 Function XMLSelectNodesI(node.XMLnode,path$,recurse=True)
  1133.                         wl.XMLworklist=Null
  1134.                         If node = Null Then
  1135.                         End If
  1136.                         ret.XMLnode = Null
  1137.                         p=Instr(path$,"/")
  1138.                         If p > 0 Then
  1139.                                 tag$=Left$(path$,p-1)
  1140.                                 a.XMLnode = node
  1141.                                 While a<>Null
  1142.                                         If Lower(path$)=Lower(Right$(apath$+a   ag$+"/",Len(path$))) Then
  1143.                                                         wl = New XMLworklist
  1144.                                                         wl
  1145. ode = a
  1146.                                         End If
  1147.                                         If afirstchild <> Null And (recurse) Then
  1148.                                                 XMLSelectNodesI(afirstchild,path$)
  1149.                                         End If
  1150.                                         a = a
  1151. extnode
  1152.                                 Wend
  1153.                         End If
  1154.                
  1155.                 End Function
  1156.                
  1157.                 Function XMLNextNode.XMLnode(node.XMLnode)
  1158.                         Return node
  1159. extnode
  1160.                 End Function
  1161.                
  1162.                 Function XMLPrevNode.XMLnode(node.XMLnode)
  1163.                         Return nodeprevnode
  1164.                 End Function
  1165.                
  1166.                 Function XMLAddAttr(node.XMLnode,name$,value$)
  1167.                         ;gak debuglog "XML:adding attribute "+name$+"="+value$+" ("+Len(value$)+")"
  1168.                         a.XMLattr = New XMLattr
  1169.                         a
  1170. ame$ = name$
  1171.                         avalue$ = value$
  1172.                         If nodeattrcount = 0 Then
  1173.                                 nodefirstattr = a
  1174.                         Else
  1175.                                 nodelastattrsibattr = a
  1176.                         End If
  1177.                         nodelastattr=a
  1178.                         nodeattrcount = nodeattrcount + 1
  1179.                         aparent = node
  1180.                         If Upper(avalue)="TRUE" avalue=1
  1181.                         If Upper(aValue)="FALSE" avalue=0
  1182.                         If Upper(aValue)="GRAPHICSWIDTH" avalue=GraphicsWidth()
  1183.                         If Upper(aValue)="GRAPHICSHEIGHT" avalue=GraphicsHeight()
  1184.                 End Function
  1185.                
  1186.                 Function XMLReadNode.XMLnode(infile,parent.XMLnode,pushed=False)
  1187.                         mode = 0
  1188.                         root.XMLnode = Null
  1189.                         cnode.XMLnode = Null
  1190.                         x.XMLnode = Null
  1191.                         ispushed = False
  1192.                         done = False
  1193.                         While (Not done) And (Not Eof(infile))
  1194.                                 c = ReadByte(infile)
  1195.                                 If c<32 Then c=32
  1196.                                 ch$=Chr$(c)
  1197.                 ;               ;gak debuglog "{"+ch$+"} "+c+" mode="+mode
  1198.                                 Select mode
  1199.                                   Case 0 ; looking for the start of a tag, ignore everything else
  1200.                                         If ch$ = "<" Then
  1201.                                                 mode = 1; start collecting the tag
  1202.                                         End If
  1203.                                   Case 1 ; check first byte of tag, ? special tag
  1204.                                         If ch$ = "?" Or ch$ = "!" Then
  1205.                                                 mode = 0; class special nodes as garbage & consume
  1206.                                         Else
  1207.                                                 If ch$ = "/" Then
  1208.                                                         mode = 2 ; move to collecting end tag
  1209.                                                         xendtag$=ch$
  1210.                                                         ;gak debuglog "** found end tag"
  1211.                                                 Else
  1212.                                                         cnode=x
  1213.                                                         x.XMLnode = XMLOpennode(cnode)
  1214.                                                         If cnode=Null Then root=x
  1215.                                                         x       ag$=ch$
  1216.                                                         mode = 3 ; move to collecting start tag
  1217.                                                 End If
  1218.                                         End If
  1219.                                   Case 2 ; collect the tag name (close tag)
  1220.                                         If ch$=">" Then
  1221.                                                 mode = 0 ; end of the close tag so jump out of loop
  1222.                                                 ;done = True
  1223.                                                 x = XMLclosenode(x)
  1224.                                         Else
  1225.                                                 xendtag$ = xendtag$ + ch$
  1226.                                         End If
  1227.                                   Case 3 ; collect the tag name
  1228.                                         If ch$=" " Then
  1229.                                                 ;gak debuglog "TAG:"+x  ag$
  1230.                                                 mode = 4 ; tag name collected, move to collecting attributes
  1231.                                         Else
  1232.                                                 If ch$="/" Then
  1233.                                                         ;gak debuglog "TAG:"+x  ag$
  1234.                                                         xendtag$=x      ag$
  1235.                                                         mode = 2; start/end tag combined, move to close
  1236.                                                 Else
  1237.                                                         If ch$=">" Then
  1238.                                                                 ;gak debuglog "TAG:"+x  ag$
  1239.                                                                 mode = 20; tag closed, move to collecting value
  1240.                                                         Else
  1241.                                                                 x       ag$ = x ag$ + ch$
  1242.                                                         End If
  1243.                                                 End If
  1244.                                         End If
  1245.                                   Case 4 ; start to collect attributes
  1246.                                         If Lower(ch$)>="a" And Lower(ch$)<="z" Then
  1247.                                                 aname$=ch$;
  1248.                                                 mode = 5; move to collect attribute name
  1249.                                         Else
  1250.                                                 If ch$=">" Then
  1251.                                                         xvalue$=""
  1252.                                                         mode = 20; tag closed, move to collecting value
  1253.                                                 Else
  1254.                                                         If ch$="/" Then
  1255.                                                                 mode = 2 ; move to collecting end tag
  1256.                                                                 xendtag$=ch$
  1257.                                                                 ;gak debuglog "** found end tag"
  1258.                                                         End If
  1259.                                                 End If
  1260.                                         End If
  1261.                                   Case 5 ; collect attribute name
  1262.                                         If ch$="=" Then
  1263.                                           ;gak debuglog "ATT:"+aname$
  1264.                                           aval$=""
  1265.                                           mode = 6; move to collect attribute value
  1266.                                         Else
  1267.                                           aname$=aname$+ch$
  1268.                                         End If
  1269.                                   Case 6 ; collect attribute value
  1270.                                         If c=34 Then
  1271.                                                 mode = 7; move to collect string value
  1272.                                         Else
  1273.                                                 If c <= 32 Then
  1274.                                                         ;gak debuglog "ATV:"+aname$+"="+aval$
  1275.                                                         XMLAddAttr(x,aname$,aval$)
  1276.                                                         mode = 4; start collecting a new attribute
  1277.                                                 Else
  1278.                                                         aval$=aval$+ch$
  1279.                                                 End If
  1280.                                         End If
  1281.                                   Case 7 ; collect string value
  1282.                                         If c=34 Then
  1283.                                                 ;gak debuglog "ATV:"+aname$+"="+aval$
  1284.                                                 XMLADDattr(x,aname$,aval$)
  1285.                                                 mode = 4; go and collect next attribute
  1286.                                         Else
  1287.                                                 aval$=aval$+ch$
  1288.                                         End If
  1289.                                   Case 20 ; COLLECT THE VALUE PORTION
  1290.                                         If ch$="<" Then
  1291.                                                 ;gak debuglog "VAL:"+x  ag$+"="+xvalue$
  1292.                                                 mode=1; go to tag checking
  1293.                                         Else
  1294.                                                 xvalue$=xvalue$+ch$
  1295.                                         End If
  1296.                                 End Select
  1297.                                
  1298.                                 If Eof(infile) Then done=True
  1299.                        
  1300.                         Wend
  1301.                
  1302.                         Return root
  1303.                
  1304.                 End Function
  1305.                
  1306.                 ; write out an XML node (and children)
  1307.                 Function XMLWriteNode(outfile,node.XMLnode,tab$="")
  1308.                 ;       ;gak debuglog "Writing...."+node        ag$+".."
  1309.                         s$="<"+node     ag$
  1310.                         a.XMLattr = nodefirstattr
  1311.                         While a<>Null
  1312.                                 s$ = s$+" "+Lower(a
  1313. ame$)+"="+Chr$(34)+avalue$+Chr$(34)
  1314.                                 a = asibattr
  1315.                         Wend
  1316.                        
  1317.                         If nodevalue$="" And nodechildcount = 0 Then
  1318.                                 s$=s$+"/>"
  1319.                                 et$=""
  1320.                         Else
  1321.                                 s$=s$+">"+nodevalue$
  1322.                                 et$="</"+node   ag$+">"
  1323.                         End If
  1324.                        
  1325.                         WriteLine outfile,XMLcleanStr$(tab$+s$)
  1326.                         n.XMLnode = nodefirstchild
  1327.                         While n <> Null
  1328.                                 XMLwriteNode(outfile,n,tab$+"  ")
  1329.                                 n = n
  1330. extnode
  1331.                         Wend
  1332.                        
  1333.                         If et$<> "" Then WriteLine outfile,XMLCleanStr$(tab$+et$)
  1334.                
  1335.                 End Function
  1336.                
  1337.                 ; remove non-visible chars from the output stream
  1338.                 Function XMLCleanStr$(s$)
  1339.                         a$=""
  1340.                         For i = 1 To Len(s$)
  1341.                                 If Asc(Mid$(s$,i,1))>=32 Then a$ = a$ +Mid$(s$,i,1)
  1342.                         Next
  1343.                         Return a$
  1344.                
  1345.                 End Function
  1346.                
  1347.                 ; attribute functions
  1348.                 ; return an attribute of a given name
  1349.                 Function XMLFindAttr.XMLattr(node.XMLnode,name$)
  1350.                         ret.XMLattr = Null
  1351.                         If node <> Null Then
  1352.                                 a.XMLattr = nodefirstattr
  1353.                                 done = False
  1354.                                 While ret=Null And a<>Null
  1355.                                         If Lower(name$)=Lower(a
  1356. ame$) Then
  1357.                                                 ret = a
  1358.                                         End If
  1359.                                         a = asibattr
  1360.                                 Wend
  1361.                         End If
  1362.                         Return ret
  1363.                 End Function
  1364.                
  1365.                 ; return an attribute value as a string
  1366.                 Function XMLAttrValueStr$(node.XMLnode,name$,dflt$="")
  1367.                         ret$=dflt$
  1368.                         a.XMLattr = XMLfindattr(node,name$)
  1369.                         If a <> Null Then ret$=avalue$
  1370.                         Return ret$
  1371.                 End Function
  1372.                
  1373.                 ; return an attribute value as an integer
  1374.                 Function XMLAttrValueInt(node.XMLnode,name$,dflt=0)
  1375.                         ret=dflt
  1376.                         a.XMLattr = XMLfindattr(node,name$)
  1377.                         If a <> Null Then ret=avalue
  1378.                         Return ret
  1379.                 End Function
  1380.                
  1381.                 ; return an attribute value as a float
  1382.                 Function XMLAttrValueFloat#(node.XMLnode,name$,dflt#=0)
  1383.                         ret#=dflt#
  1384.                         a.XMLattr = XMLfindattr(node,name$)
  1385.                         If a <> Null Then ret#=avalue
  1386.                         Return ret
  1387.                 End Function
  1388.                
  1389.                 Function XMLHasChildren(node.XMLnode)
  1390.                         Return nodefirstchild <> Null
  1391.                 End Function
  1392.                
  1393.                 Function XMLHasAttributes(node.XMLnode)
  1394.                         Return nodefirstattr <> Null
  1395.                 End Function
  1396.                
  1397.                 Function XMLGetChild.XMLNode(node.XMLNode,index=0)
  1398.                         child.XMLNode = nodeFirstChild
  1399.                         For i = 0 To index-1
  1400.                                 child.XMLNode = child
  1401. extnode
  1402.                         Next
  1403.                         Return child
  1404.                 End Function
  1405.                
  1406.                 Function XMLGetFirstAttribute.XMLAttr(node.XMLNode)
  1407.                         Return nodefirstattr
  1408.                 End Function
  1409.                
  1410.                 Function XMLGetNextAttribute.XMLAttr(attr.XMLAttr)
  1411.                         Return attrsibattr
  1412.                 End Function
  1413.                
  1414.                 Function XMLHasAttribute(n.XMLNode,attr$)
  1415.                         If XMLHasAttributes(n) = 0 Then Return 0
  1416.                        
  1417.                         a.XMLAttr = XMLGetFirstAttribute(n)
  1418.                         While (a <> Null)
  1419.                                 If Lower(a
  1420. ame) = Lower(attr) Return 1
  1421.                                 a = XMLGetNextAttribute(a)
  1422.                         Wend
  1423.                         Return 0
  1424.                 End Function
  1425.                
  1426.                 Function XMLGetParent.XMLNode(node.XMLNode)
  1427.                         Return nodeparent
  1428.                 End Function
  1429.                
  1430.                 Function PrintXMLNode(i.XMLNode,start$="")
  1431.                         If i = Null Then Return
  1432.                         Write start+"<"+i       ag
  1433.                         a.XMLAttr = XMLGetFirstAttribute(i)
  1434.                         While a <> Null
  1435.                                 Write " "+a
  1436. ame+"="+Chr(34)+avalue+Chr(34)
  1437.                                 a = XMLGetNextAttribute(a)
  1438.                         Wend
  1439.                         Write ">"
  1440.                         Print ""
  1441.                        
  1442.                         f.XMLNode = XMLGetChild(i,0)
  1443.                         While f.XMLNode <> Null
  1444.                                 PrintXMLNode(f,start+"    ")
  1445.                                 f = XMLNextNode(f)
  1446.                         Wend
  1447.                         Print start+"</"+i      ag+">"
  1448.                 End Function
  1449.         ;#End Region
  1450. ;#End Region
  1451.  
  1452. ;; DE/INITIALIZATION
  1453. Function InitLotus()
  1454.         Dim gSine#(359)
  1455.         Dim gCosine#(359)
  1456.        
  1457.         For A = 0 To 359
  1458.                 gSine#(A) = Sin(A)
  1459.                 gCosine#(A) = Cos(A)
  1460.         Next
  1461.        
  1462.         gLotusParticlePivot = CreatePivot()
  1463.         gLotusTPivot = CreatePivot()
  1464.         gLotusParticleMesh = CreateMesh()
  1465.         EntityFX gLotusParticleMesh,1+2+8+16+32
  1466.        
  1467.         gLotusNullTexture.LotusTexture = New LotusTexture
  1468.         gNullTexture = Handle(gLotusNullTexture)
  1469.         gLotusNullTextureRows = 1
  1470.         gLotusNullTextureColumns = 1
  1471.         gLotusNullTextureUStep = 1
  1472.         gLotusNullTextureVStep = 1
  1473.        
  1474.         Brush = CreateBrush()
  1475.         BrushFX Brush,1+2+16+32
  1476.        
  1477.         BrushBlend Brush,1
  1478.         gLotusNullTextureAlpha = CreateSurface(gLotusParticleMesh)
  1479.         PaintSurface gLotusNullTextureAlpha,Brush
  1480.        
  1481.         FreeBrush Brush
  1482.        
  1483.         gNullLotusVector = New LotusVector
  1484.         gTempLotusVector = New LotusVector
  1485.        
  1486.         If cUSE_EMITTERCONES Then
  1487.                 gLotusEmitterTexture = CreateTexture(64,64,1+16+32)
  1488.                 Buffer = GraphicsBuffer()
  1489.                 T = gLotusEmitterTexture
  1490.                 SetBuffer TextureBuffer(T)
  1491.                 R = ColorRed()
  1492.                 G = ColorGreen()
  1493.                 B = ColorBlue()
  1494.                 Color 255,255,255
  1495.                 Rect 0,0,64,64,True
  1496.                 Color 255,120,40
  1497.                 Rect 0,60,64,4
  1498.                 Color R,G,B
  1499.                 SetBuffer Buffer
  1500.         EndIf
  1501.        
  1502.         gLotusParticleCount = 0
  1503.        
  1504.         gWidth = GraphicsWidth()
  1505.         gHeight = GraphicsHeight()
  1506. End Function
  1507.  
  1508. Function KillLotus()
  1509.         Dim gSine#(0)
  1510.         Dim gCosine#(0)
  1511.         FreeEntity gLotusParticlePivot
  1512.         FreeEntity gLotusTPivot
  1513.         FreeEntity gLotusParticleMesh
  1514.         If cUSE_EMITTERCONES Then FreeTexture gLotusEmitterTexture
  1515.         gLotusParticlePivot = 0
  1516.         gLotusParticleMesh = 0
  1517.         gLotusEmitterTexture = 0
  1518.        
  1519.         For T.LotusTexture = Each LotusTexture
  1520.                 FreeTexture TBitmap
  1521.         Next
  1522.        
  1523.         For E.LotusEmitter = Each LotusEmitter
  1524.                 FreeEntity EEntity
  1525.         Next
  1526.        
  1527.         For G.LotusGraph = Each LotusGraph
  1528.                 FreeBank GBank
  1529.         Next
  1530.        
  1531.         For D.LotusDeflector = Each LotusDeflector
  1532.                 FreeEntity DEntity
  1533.         Next
  1534.        
  1535.         Delete Each LotusParticle
  1536.         Delete Each LotusEmitter
  1537.         Delete Each LotusGraph
  1538.         Delete Each LotusDeflector
  1539.         Delete Each LotusVector
  1540.         Delete Each LotusTexture
  1541.         Delete Each LotusStringPiece
  1542.         gLotusParticleCount = 0
  1543. End Function
  1544.  
  1545.  
  1546. ;; TEXTURE
  1547. Function LoadLotusTexture(Path$,Flags%=59,Alpha=0,Multiply=0,Add=0)
  1548.         For T.LotusTexture = Each LotusTexture
  1549.                 If Lower(TPath) = Lower(Path) Then Return Handle(T)
  1550.         Next
  1551.         Bitmap = LoadTexture(Path$,Flags)
  1552.         If Bitmap = 0 Then Return False
  1553.         T.LotusTexture = New LotusTexture
  1554.         TBitmap = Bitmap
  1555.         TFlags = Flags
  1556.         TRows = 1
  1557.         TColumns = 1
  1558.         TUStep = 1
  1559.         TVStep = 1
  1560.         TPath = Path
  1561.         SetTextureBlendModes Handle(T),Alpha,Multiply,Add
  1562.         Return Handle(T)
  1563. End Function
  1564.  
  1565. Function LoadLotusAnimTexture(Path$,Flags%=59,Rows%=1,Columns%=1,Alpha=0,Multiply=0,Add=0)
  1566.         For T.LotusTexture = Each LotusTexture
  1567.                 If Lower(TPath) = Lower(Path) Then Return Handle(T)
  1568.         Next
  1569.         Texture = LoadLotusTexture(Path$,Flags,Alpha,Multiply,Add)
  1570.         T.LotusTexture = Object.LotusTexture(Texture)
  1571.         If T = Null Or T = gLotusNullTexture Then Return False
  1572.         Rows = Min(Rows,1):Columns = Min(Columns,1)
  1573.         TRows = Rows
  1574.         TColumns = Columns
  1575.         FrameWidth# = TextureWidth(TBitmap)/Columns
  1576.         FrameHeight# = TextureHeight(TBitmap)/Rows
  1577.         TUStep = FrameWidth/TextureWidth(TBitmap)
  1578.         TVStep = FrameHeight/TextureHeight(TBitmap)
  1579.         Return Texture
  1580. End Function
  1581.  
  1582. Function LoadLotusTileSet(Path$,Flags%=59,Rows%=3,Columns%=3,Alpha=0,Multiply=0,Add=0)
  1583.         For T.LotusTexture = Each LotusTexture
  1584.                 If Lower(TPath) = Lower(Path) Then Return Handle(T)
  1585.         Next
  1586.         Texture = LoadLotusTexture(Path$,Flags,Alpha,Multiply,Add)
  1587.         T.LotusTexture = Object.LotusTexture(Texture)
  1588.         If T = Null Or T = gLotusNullTexture Then Return False
  1589.         Rows = Min(Rows,1):Columns = Min(Columns,1)
  1590.         TRows = Rows
  1591.         TColumns = Columns
  1592.         FrameWidth# = TextureWidth(TBitmap)/Columns
  1593.         FrameHeight# = TextureHeight(TBitmap)/Rows
  1594.         TUStep = FrameWidth/TextureWidth(TBitmap)
  1595.         TVStep = FrameHeight/TextureHeight(TBitmap)
  1596.         Return Texture
  1597. End Function
  1598.  
  1599. Function ApplyTexture(Emitter,Texture,Frame=-1,Animated%=-1,FrameLength%=-1)
  1600.         If EmitterExists( Emitter ) = 0 Then Return False
  1601.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1602.         If E = Null Then Return False
  1603.         ETexture = Object.LotusTexture(Texture)
  1604.         If Frame > -1 Then EFrame = Frame EFrameStart = Frame
  1605.         If Animated > -1 Then EAnimated = Animated
  1606.         If FrameLength > -1 Then EFrameLength = FrameLength
  1607. End Function
  1608.  
  1609. Function SetTextureTiles(Texture,Rows,Columns)
  1610.         T.LotusTexture = Object.LotusTexture(Texture)
  1611.         If T = Null Or T = gLotusNullTexture Then Return False
  1612.         Rows = Min(Rows,1):Columns = Min(Columns,1)
  1613.         TRows = Rows
  1614.         TColumns = Columns
  1615.         FrameWidth# = TextureWidth(TBitmap)/Columns
  1616.         FrameHeight# = TextureHeight(TBitmap)/Rows
  1617.         TUStep = FrameWidth/TextureWidth(TBitmap)
  1618.         TVStep = FrameHeight/TextureHeight(TBitmap)
  1619.         Return True
  1620. End Function
  1621.  
  1622. Function SetTextureBlendModes(Texture,Alpha=True,Multiply=False,Add=True,RebuildSurfaces = 0)
  1623.         T.LotusTexture = Object.LotusTexture(Texture)
  1624.         If T = Null Then Return False
  1625.         Brush = CreateBrush()
  1626.         BrushTexture Brush,TBitmap
  1627.         BrushFX Brush,1+2+16+32
  1628.        
  1629.         If Add > 0 And (TAdd = 0 Or RebuildSurfaces > 0)
  1630.                 TAdd = CreateSurface(gLotusParticleMesh)
  1631.                 BrushBlend Brush,3
  1632.                 PaintSurface TAdd,Brush
  1633.         ElseIf Add = 0 And TAdd <> 0 Then
  1634.                 TAdd = 0
  1635.                 Rebuild = True
  1636.         EndIf
  1637.        
  1638.         If Alpha > 0 And (TAlpha = 0 Or RebuildSurfaces > 0)
  1639.                 TAlpha = CreateSurface(gLotusParticleMesh)
  1640.                 BrushBlend Brush,1
  1641.                 PaintSurface TAlpha,Brush
  1642.         ElseIf Alpha = 0 And TAlpha <> 0 Then
  1643.                 TAlpha = 0
  1644.                 Rebuild = True
  1645.         EndIf
  1646.        
  1647.         If Multiply > 0 And (TMultiply = 0 Or RebuildSurfaces > 0)
  1648.                 TMultiply = CreateSurface(gLotusParticleMesh)
  1649.                 BrushBlend Brush,2
  1650.                 PaintSurface TMultiply,Brush
  1651.         ElseIf Multiply = 0 And TMultiply <> 0 Then
  1652.                 TMultiply = 0
  1653.                 Rebuild = True
  1654.         EndIf
  1655.        
  1656.         If Rebuild Then RebuildLotusTextures()
  1657.        
  1658.         FreeBrush Brush
  1659. End Function
  1660.  
  1661. Function FreeLotusTexture(Texture)
  1662.         T.LotusTexture = Object.LotusTexture(Texture)
  1663.         If T = Null Then Return False
  1664.         FreeTexture TBitmap
  1665.         Delete T
  1666.         RebuildLotusTextures()
  1667. End Function
  1668.  
  1669. Function ClearLotusTextures()
  1670.         For T.LotusTexture = Each LotusTexture
  1671.                 If T <> gLotusNullTexture Then
  1672.                         FreeTexture TBitmap
  1673.                         Delete T
  1674.                 EndIf
  1675.         Next
  1676.        
  1677.         RebuildLotusTextures()
  1678. End Function
  1679.  
  1680. Function RebuildLotusTextures()
  1681.         FreeEntity gLotusParticleMesh
  1682.         gLotusParticleMesh = CreateMesh()
  1683.         EntityFX gLotusParticleMesh,1+2+16+32
  1684.        
  1685.         Brush = CreateBrush()
  1686.         BrushFX Brush,1+2+16+32
  1687.        
  1688.         BrushBlend Brush,1
  1689.         gLotusNullTextureAlpha = CreateSurface(gLotusParticleMesh)
  1690.         PaintSurface gLotusNullTextureAlpha,Brush
  1691.        
  1692.         FreeBrush Brush
  1693.        
  1694.         For T.LotusTexture = Each LotusTexture
  1695.                 If T <> gLotusNullTexture Then SetTextureBlendModes Handle(T),Abs(TAlpha),Abs(TMultiply),Abs(TAdd),1
  1696.         Next
  1697. End Function
  1698.  
  1699. Function TextureUsesAdd(Texture)
  1700.         T.LotusTexture = Object.LotusTexture(Texture)
  1701.         If T = Null Then Return False
  1702.         If T = gLotusNullTexture Then Return True
  1703.         If TAdd <> 0 Then Return True
  1704. End Function
  1705.  
  1706. Function TextureUsesMultiply(Texture)
  1707.         T.LotusTexture = Object.LotusTexture(Texture)
  1708.         If T = Null Then Return False
  1709.         If T = gLotusNullTexture Then Return True
  1710.         If TAlpha <> 0 Then Return True
  1711. End Function
  1712.  
  1713. Function TextureUsesAlpha(Texture)
  1714.         T.LotusTexture = Object.LotusTexture(Texture)
  1715.         If T = Null Then Return False
  1716.         If T = gLotusNullTexture Then Return True
  1717.         If TAlpha <> 0 Then Return True
  1718. End Function
  1719.        
  1720. ;; DEFLECTOR
  1721. Function DeflectorExists(Deflector)
  1722.         For D.LotusDeflector = Each LotusDeflector
  1723.                 If DEntity = Deflector Then
  1724.                         Return DEntity
  1725.                 EndIf
  1726.         Next
  1727.         Return 0
  1728. End Function
  1729.  
  1730. Function CreateDeflector(Parent=0)
  1731.         D.LotusDeflector = New LotusDeflector
  1732.         DRadius = 0
  1733.         DStrength = .5
  1734.         DActive = 0
  1735.         DEntity = CreatePivot()
  1736.         NameEntity DEntity,Handle(D)
  1737.         Return DEntity
  1738. End Function
  1739.  
  1740. Function SetDeflectorStrength(Deflector, Strength#=.5)
  1741.         If DeflectorExists(Deflector) = 0 Then Return False
  1742.         D.LotusDeflector = Object.LotusDeflector(EntityName(Deflector))
  1743.         If D = Null Then Return False
  1744.         DStrength = Strength
  1745. End Function
  1746.  
  1747. Function SetDeflectorActive(Deflector,Active = 1)
  1748.         If DeflectorExists(Deflector) = 0 Then Return False
  1749.         D.LotusDeflector = Object.LotusDeflector(EntityName(Deflector))
  1750.         If D = Null Then Return False
  1751.         DActive = Active
  1752. End Function
  1753.  
  1754. Function SetDeflectorRadius(Deflector, Radius#=0)
  1755.         If DeflectorExists(Deflector) = 0 Then Return False
  1756.         D.LotusDeflector = Object.LotusDeflector(EntityName(Deflector))
  1757.         If D = Null Then Return False
  1758.         DRadius = Radius
  1759. End Function
  1760.  
  1761. Function ActivateDeflector(Deflector)
  1762.         If DeflectorExists(Deflector) = 0 Then Return False
  1763.         D.LotusDeflector = Object.LotusDeflector(EntityName(Deflector))
  1764.         If D = Null Then Return False
  1765.         DActive = True
  1766. End Function
  1767.  
  1768. Function DeActivateDeflector(Deflector)
  1769.         If DeflectorExists(Deflector) = 0 Then Return False
  1770.         D.LotusDeflector = Object.LotusDeflector(EntityName(Deflector))
  1771.         If D = Null Then Return False
  1772.         DActive = False
  1773. End Function
  1774.        
  1775.  
  1776.  
  1777. ;; EMITTER
  1778. Function NameEmitter(Emitter,Name$)
  1779.         If EmitterExists( Emitter ) = 0 Then Return False
  1780.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1781.         If E = Null Then Return False
  1782.         EName = Name$
  1783. End Function
  1784.  
  1785. Function GetEmitterName$(Emitter)
  1786.         If EmitterExists( Emitter ) = 0 Then Return False
  1787.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1788.         If E = Null Then Return False
  1789.         Return EName
  1790. End Function
  1791.  
  1792. Function CreateEmitter%(Texture = 0)
  1793.         If Texture = 0 Then Texture = Handle(gLotusNullTexture)
  1794.         If cUSE_EMITTERCONES Then
  1795.                 P = CreateCone(4)
  1796.                 For S = 1 To CountSurfaces(P)
  1797.                         Surface = GetSurface(P,S)
  1798.                         For V = 0 To CountVertices(Surface)-1
  1799.                                 eV# = 1.0-VertexY(Surface,V)/2
  1800.                                 eU# = VertexX(Surface,V)/2
  1801.                                 If eV > 1 Then eV = eV - .5
  1802.                                 If eV < 0 Then eV = eV + .5
  1803.                                 If eV > 1 Then Stop
  1804.                                 VertexTexCoords Surface,V,eU,eV,0,0
  1805.                         Next
  1806.                 Next
  1807.                 Surface = 0
  1808.                 EntityTexture P,gLotusEmitterTexture
  1809.                 EntityFX P,1
  1810.                 RotateMesh P,-90,0,0
  1811.                 PositionMesh P,0,0,-2
  1812.         Else
  1813.                 P = CreatePivot()
  1814.         EndIf
  1815.        
  1816.         HideEntity P
  1817.         E.LotusEmitter = New LotusEmitter
  1818.         NameEntity P,Handle(E)
  1819.        
  1820.         EWeight = 1
  1821.         ETexture = Object.LotusTexture(Texture)
  1822.         EEntity = P
  1823.         EWaitSpan = 1
  1824.         EDWaitSpan = 1
  1825.         ECircleSpeedX = 1
  1826.         ECircleSpeedY = 1
  1827.         ECircleSpeedZ = 1
  1828.         ESizeFromX = 1
  1829.         ESizeFromY = 1
  1830.         ESizeFromZ = 1
  1831.         ESizeToX = 1
  1832.         ESizeToY = 1
  1833.         ESizeToZ = 1
  1834.         EWaveSpeedX = 1
  1835.         EWaveSpeedY = 1
  1836.         EWaveSpeedZ = 1
  1837.         ERedFrom = 255
  1838.         EBlueFrom = 255
  1839.         EGreenFrom = 255
  1840.         ERedTo = 255
  1841.         EBlueTo = 255
  1842.         EGreenTo = 255
  1843.         EAlphaFrom = 1.0
  1844.         EBlendMode = 1
  1845.         ELifeSpan = 80
  1846.         EEmissionRate = 1
  1847.         ECull = 1
  1848.         ESorting = 1
  1849.         EViewMode = 1
  1850.         ELifeMode = 1
  1851.         EChildMode = 1
  1852.         EActiveSpan = -1
  1853.         EActive = -1
  1854.         Return P
  1855. End Function
  1856.  
  1857. Function LoadEmitter%(Path$,Flags%=59,Alpha=1,Multiply=0,Add=0)
  1858.         For T.LotusTexture = Each LotusTexture
  1859.                 If Lower(TPath$) = Lower(Path$) Then Exit
  1860.         Next
  1861.         If T <> Null Then
  1862.                 Return CreateEmitter(Handle(T))
  1863.         EndIf
  1864.        
  1865.         Texture = LoadLotusTexture(Path$,Flags,Alpha,Multiply,Add)
  1866.         Return CreateEmitter(Texture)
  1867. End Function
  1868.  
  1869. Function KillLotusEmitter(Emitter)      ;; Recommendation: When calling this or FreeEmitter(E), call it like so: YourEmitter = FreeEmitter(YourEmitter) so that the integer, YourEmitter, gets set to zero
  1870.         If EmitterExists( Emitter ) = 0 Then Return False
  1871.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1872.         If E = Null Then Return False
  1873.                
  1874.         If EEmitSoundChannel Then StopChannel( EEmitSoundChannel )
  1875.         Delete E
  1876.         FreeEntity Emitter
  1877.         Return 0
  1878. End Function
  1879.  
  1880. Function FreeEmitter(Emitter)
  1881.         Return KillLotusEmitter( Emitter )
  1882. End Function
  1883.  
  1884. Function ClearEmitters()                ;; Reset all references to emitters to 0 after calling this
  1885.         For E.LotusEmitter = Each LotusEmitter
  1886.                 KillLotusEmitter EEntity
  1887.         Next
  1888. End Function
  1889.  
  1890. Function EmitterExists(Emitter)
  1891.         For E.LotusEmitter = Each LotusEmitter
  1892.                 If EEntity = Emitter Then Return EEntity
  1893.         Next
  1894.         Return 0
  1895. End Function
  1896.  
  1897. Function CopyEmitter(Emitter)
  1898.         If EmitterExists( Emitter ) = 0 Then Return False
  1899.         EOld.LotusEmitter = Object.LotusEmitteR(Int(EntityName$(Emitter)))
  1900.         If EOld = Null Then Return False
  1901.         If cUSE_EMITTERCONES Then
  1902.                 P = CreateCone(4)
  1903.                 For S = 1 To CountSurfaces(P)
  1904.                         Surface = GetSurface(P,S)
  1905.                         For V = 0 To CountVertices(Surface)-1
  1906.                                 eV# = 1.0-VertexY(Surface,V)/2
  1907.                                 eU# = VertexX(Surface,V)/2
  1908.                                 If eV > 1 Then eV = eV - .5
  1909.                                 If eV < 0 Then eV = eV + .5
  1910.                                 If eV > 1 Then Stop
  1911.                                 VertexTexCoords Surface,V,eU,eV,0,0
  1912.                         Next
  1913.                 Next
  1914.                 Surface = 0
  1915.                 EntityTexture P,gLotusEmitterTexture
  1916.                 EntityFX P,1
  1917.                 RotateMesh P,-90,0,0
  1918.                 PositionMesh P,0,0,-2
  1919.         Else
  1920.                 P = CreatePivot()
  1921.         EndIf
  1922.         HideEntity P
  1923.         E.LotusEmitter = New LotusEmitter
  1924.         NameEntity P,Handle(E)
  1925.         PositionEntity P,EntityX(Emitter,True),EntityY(Emitter,True),EntityZ(Emitter,True)
  1926.         RotateEntity P,EntityPitch(Emitter,True),EntityYaw(Emitter,True),EntityRoll(Emitter,True)
  1927.         ETexture = EOldTexture
  1928.         EFrame = EOldFrame
  1929.         EAnimated = EOldAnimated
  1930.         EEntity = P
  1931.         ETranslationJitterX = EOldTranslationJitterX
  1932.         ETranslationJitterY = EOldTranslationJitterY
  1933.         ETranslationJitterZ = EOldTranslationJitterZ
  1934.         ETranslationX = EOldTranslationX
  1935.         ETranslationY = EOldTranslationY
  1936.         ETranslationZ = EOldTranslationZ
  1937.         EVelocityX = EOldVelocityX
  1938.         EVelocityY = EOldVelocityY
  1939.         EVelocityZ = EOldVelocityZ
  1940.         EAngleVelocityX = EOldAngleVelocityX
  1941.         EAngleVelocityY = EOldAngleVelocityY
  1942.         EAngleVelocityZ = EOldAngleVelocityZ
  1943.         EAccelerationX = EOldAccelerationX
  1944.         EAccelerationY = EOldAccelerationY
  1945.         EAccelerationZ = EOldAccelerationZ
  1946.         EAngleAccelerationX = EOldAngleAccelerationX
  1947.         EAngleAccelerationY = EOldAngleAccelerationY
  1948.         EAngleAccelerationZ = EOldAngleAccelerationZ
  1949.         ESizeFromX = EOldSizeFromX
  1950.         ESizeFromY = EOldSizeFromY
  1951.         ESizeFromZ = EOldSizeFromZ
  1952.         ESizeToX = EOldSizeToX
  1953.         ESizeToY = EOldSizeToY
  1954.         ESizeToZ = EOldSizeToZ
  1955.         ESizeJitterX = EOldSizeJitterX
  1956.         ESizeJitterY = EOldSizeJitterY
  1957.         ESizeJitterZ = EOldSizeJitterZ
  1958.         EVelocityJitterX = EOldVelocityJitterX
  1959.         EVelocityJitterY = EOldVelocityJitterY
  1960.         EVelocityJitterZ = EOldVelocityJitterZ
  1961.         ECubeX = EOldCubeX
  1962.         ECubeY = EOldCubeY
  1963.         ECubeZ = EOldCubeZ
  1964.         ECylinderX = EOldCylinderX
  1965.         ECylinderY = EOldCylinderY
  1966.         ECylinderZ = EOldCylinderZ
  1967.         EWaveRadiusX = EOldWaveRadiusX
  1968.         EWaveRadiusY = EOldWaveRadiusY
  1969.         EWaveRadiusZ = EOldWaveRadiusZ
  1970.         EWaveSpeedX = EOldWaveSpeedX
  1971.         EWaveSpeedY = EOldWaveSpeedY
  1972.         EWaveSpeedZ = EOldWaveSpeedZ
  1973.         ECircleSpeedX = EOldCircleSpeedX
  1974.         ECircleSpeedY = EOldCircleSpeedY
  1975.         ECircleSpeedZ = EOldCircleSpeedZ
  1976.         ECircleRadiusX = EOldCircleRadiusX
  1977.         ECircleRadiusY = EOldCircleRadiusY
  1978.         ECircleRadiusZ = EOldCircleRadiusZ
  1979.         ERandomRotationX = EOldRandomRotationX
  1980.         ERandomRotationY = EOldRandomRotationY
  1981.         ERandomRotationZ = EOldRandomRotationZ
  1982.         ETranslationJitterUp = EOldTranslationJitterUp
  1983.         ETranslationJitterDown = EOldTranslationJitterDown
  1984.         EVelocityJitterUp = EOldVelocityJitterUp
  1985.         EVelocityJitterDown = EOldVelocityJitterDown
  1986.         ERedFrom = EOldRedFrom
  1987.         EGreenFrom = EOldGreenFrom
  1988.         EBlueFrom = EOldBlueFrom
  1989.         EAlphaFrom = EOldAlphaFrom
  1990.         ERedTo = EOldRedTo
  1991.         EGreenTo = EOldGreenTo
  1992.         EBlueTo = EOldBlueTo
  1993.         EAlphaTo = EOldAlphaTo
  1994.         EBlendMode = EOldBlendMode
  1995.         ELifeSpan = EOldLifeSpan
  1996.         EWaitSpan = EOldWaitSpan
  1997.         EDWaitSpan = EOldDWaitSpan
  1998.         EWaitSpanJitter = EOldWaitSpanJitter
  1999.         EParticleMesh = EOldParticleMesh
  2000.         EEmit = EOldEmit
  2001.         ESizeJitterUniform = EOldSizeJitterUniform
  2002.         EColorJitterRed = EOldColorJitterRed
  2003.         EColorJitterGreen = EOldColorJitterGreen
  2004.         EColorJitterBlue = EOldColorJitterBlue
  2005.         EColorJitterAlpha = EOldColorJitterAlpha
  2006.         EColorJitterUniform = EOldColorJitterUniform
  2007.         EColorJitterDown = EOldColorJitterDown
  2008.         EColorJitterUp = EOldColorJitterUp
  2009.         EFrozen = EOldFrozen
  2010.         EHidden = EOldHidden
  2011.         EEmissionRate = EOldEmissionRate
  2012.         EViewMode = EOldViewMode
  2013.         ELifeMode = EOldLifeMode
  2014.         EChildMode = EOldChildMode
  2015.         EGravity = EOldGravity
  2016.         EGravityEnabled = EOldGravityEnabled
  2017.         EWeight = EOldWeight
  2018.         ESizeJitterUp = EOldSizeJitterUp
  2019.         ESizeJitterDown = EOldSizeJitterDown
  2020.         ECull = EOldCull
  2021.         ESorting = EOldSorting
  2022.         ERollMode = EOldRollMode
  2023.         ERange = EOldRange
  2024.         ELifeSpanJitter = EOldLifeSpanJitter
  2025.         ELifeSpanJitterUp = EOldLifeSpanJitterUp
  2026.         ELifeSpanJitterDown = EOldLifeSpanJitterDown
  2027.         EColorGraph = EOldColorGraph
  2028.         ESizeGraph = EOldSizeGraph
  2029.         EEmitSound = EOldEmitSound
  2030.         EBounceSound = EOldBounceSound
  2031.         ELoopEmitSound = EOldLoopEmitSound
  2032.         EVelocityDecay = EOldVelocityDecay
  2033.         ESplineMesh = EOldSplineMesh
  2034.         EActiveSpan = EOldActiveSpan
  2035.         EActive = EOldActive
  2036.         EFreeOnEndActive = EOldFreeOnEndActive
  2037.         EDeflectorsAffect = EOldDeflectorsAffect
  2038.         EParent = EOldParent
  2039.         EChild = EOldChild
  2040.         ETrail = EOldTrail
  2041.         EntityParent EEntity,GetParent(EOldEntity)
  2042.         Return P
  2043. End Function
  2044.  
  2045. Function SortParticles()
  2046.         Dim gAlphaPartArray#( Min(gLotusAlphaParticleCount-1,0), 1 )
  2047.         For P.LotusParticle = Each LotusParticle
  2048.                 If PBlendMode = 1 And PSorting >= 1 Then
  2049.                         PositionEntity gLotusParticlePivot, PPositionX, PPositionY, PPositionZ, 1
  2050.                         gAlphaPartArray( ACount, 0 ) = -EntityDistance( gLotusCamera, gLotusParticlePivot )
  2051.                         gAlphaPartArray( ACount, 1 ) = Handle( P )
  2052.                         ACount = ACount + 1
  2053.                 EndIf
  2054.                 If ACount >= gLotusAlphaParticleCount Then Exit
  2055.         Next
  2056.        
  2057.         If gLotusAlphaParticleCount > 1 Then
  2058.                 lSort( 0, gLotusAlphaParticleCount-1 )
  2059.         EndIf
  2060. End Function
  2061.  
  2062. ;; UPDATE
  2063. Function UpdateLotusParticles(DeltaTime#=1,Camera=0)
  2064.  
  2065.         gLotusParticlesDrawn = 0
  2066.         Local ET% = MilliSecs()
  2067. ;       gLotusUpdateTimes( uptTimeAll ) = ET
  2068.        
  2069. ;       gLotusUpdateTimes( updTimeTexture ) = MilliSecs()
  2070.         For T.LotusTexture = Each LotusTexture
  2071.                 If TAdd <> 0 Then ClearSurface TAdd,1,1
  2072.                 If TMultiply <> 0 Then ClearSurface TMultiply,1,1
  2073.                 If TAlpha <> 0 Then ClearSurface TAlpha,1,1
  2074.         Next
  2075. ;       gLotusUpdateTimes( updTimeTexture ) = MilliSecs() - gLotusUpdateTimes( updTimeTexture )
  2076.        
  2077.         If Camera = 0 Then
  2078.                 Camera = gLotusCamera
  2079.                 If Camera = 0 Then Return False
  2080.         Else
  2081.                 gLotusCamera = Camera
  2082.         EndIf
  2083.        
  2084.         If DeltaTime > 0 Then
  2085.         ;       gLotusUpdateTimes( updTimeEmit ) = MilliSecs()
  2086.                 For E.LotusEmitter = Each LotusEmitter
  2087.                         KillIt = False
  2088.                        
  2089.                         EPositionX = EntityX(EEntity,1)
  2090.                         EPositionY = EntityY(EEntity,1)
  2091.                         EPositionZ = EntityZ(EEntity,1)
  2092.                        
  2093.                         EAngleX = EntityPitch(EEntity,1)
  2094.                         EAngleY = EntityYaw(EEntity,1)
  2095.                         EAngleZ = EntityRoll(EEntity,1)
  2096.                        
  2097.                         If EFrozen = False
  2098.                                 If EEmit And EWaitA = 0 Then
  2099.                                         CreateParticle EEntity
  2100.                                 EndIf
  2101.                                 EWaitA = EWaitA + DeltaTime
  2102.                                 If EWaitA >= EWaitSpan Then
  2103.                                         EWaitA = 0
  2104.                                         EWaitSpan = EDWaitSpan+Rand(-EWaitSpanJitter,EWaitSpanJitter)
  2105.                                 EndIf
  2106.                                 If EActive > -1 Then
  2107.                                         EActive = EActive - 1
  2108.                                         If EActive = 0 Then
  2109.                                                 EActive = -1
  2110.                                                 StopEmitter( EEntity )
  2111.                                                 If EFreeOnEndActive >= 1 Then KillIt = True
  2112.                                         EndIf
  2113.                                 EndIf
  2114.                                 If EEmitSound <> 0 And EEmitSoundChannel <> 0 And ELoopEmitSound > 0 And EEmit = 1 Then
  2115.                                         If ChannelPlaying( EEmitSoundChannel ) <= 0 Then EEmitSoundChannel = PlaySound( EEmitSound )
  2116.                                 ElseIf EEmitSound <> 0 And EEmitsoundChannel = 0 And EEmit = 1 Then
  2117.                                         EEmitSoundChannel = PlaySound( EEmitSound )
  2118.                                 ElseIf EEmitSoundChannel <> 0 And EEmit = 0 And ELoopEmitSound = 1 Then
  2119.                                         StopChannel( EEmitSoundChannel )
  2120.                                 EndIf
  2121.                                
  2122.                                 If EEmitSoundChannel <> 0 And EEmitSoundRange > 0 Then
  2123.                                         Vol# = EntityDistance( EEntity, gLotusCamera ) / EEmitSoundRange
  2124.                                         If Vol# > 1 Then Vol = 1
  2125.                                         If Vol# < 0 Then Vol = 0
  2126.                                         Vol# = 1.0 - Vol
  2127.                                         ChannelVolume( EEmitSoundChannel, Vol# )
  2128.                                 EndIf
  2129.                         EndIf
  2130.                        
  2131.                         EWaitB = EWaitB + DeltaTime
  2132.                         EWaitC = EWaitC + DeltaTime
  2133.                         If EWaitB > EWaitSpan Then EWaitB = 0
  2134.                         If EWaitC > EWaitSpan Then EWaitC = 0
  2135.                                
  2136.                         If KillIt = True Then KillLotusEmitter( EEntity )
  2137.                 Next
  2138.         ;       gLotusUpdateTimes( updTimeEmit ) = MilliSecs() - gLotusUpdateTimes( updTimeEmit )
  2139.                
  2140.                 For LD.LotusDeflector = Each LotusDeflector
  2141.                         If LDActive Then
  2142.                                 LDPositionX = EntityX(LDEntity,True)
  2143.                                 LDPositionY = EntityY(LDEntity,True)
  2144.                                 LDPositionZ = EntityZ(LDEntity,True)
  2145.                         EndIf
  2146.                 Next
  2147.                
  2148.         ;       gLotusUpdateTimes( updTimePart ) = MilliSecs()
  2149.                 For P.LotusParticle = Each LotusParticle
  2150.                         If PLife >= 0 Then
  2151.                                
  2152.                                 N = 0
  2153.                                 Decay# = 1.0
  2154.                                 While N < DeltaTime*(Not PFrozen)
  2155.                                         If PTrail <> Null Then
  2156.                                                 If PTrailWaitC <= 0 Then
  2157.                                                         PositionEntity PTrailEntity,PPositionX,PPositionY,PPositionZ,1
  2158.                                                         RotateEntity PTrailEntity,PAngleX,PAngleY,0,1
  2159.                                                         CreateParticle(PTrailEntity)
  2160.                                                         RotateEntity PTrailEntity,PTrailAngleX,PTrailAngleY,PTrailAngleZ,1
  2161.                                                         PositionEntity PTrailEntity,PTrailPositionX,PTrailPositionY,PTrailPositionZ,1
  2162.                                                 EndIf
  2163.                                         EndIf
  2164.                                         D# = Max(DeltaTime-N,1)
  2165.                                         LFrom# = PLife/PLifeSpan
  2166.                                         LTo# = 1.0 - LFrom#
  2167.                                        
  2168.                                         PLastPositionX = PPositionX
  2169.                                         PLastPositionY = PPositionY
  2170.                                         PLastPositionZ = PPositionZ
  2171.                                        
  2172.                                         PPositionX = PPositionX + PTranslationX*D
  2173.                                         PPositionY = PPositionY + PTranslationY*D
  2174.                                         PPositionZ = PPositionZ + PTranslationZ*D
  2175.                                        
  2176.                                         PGravity = (PGravity - (.1*PWeight)*D)*PGravityEnabled
  2177.                                         PPositionY = PPositionY + PGravity*D
  2178.                                        
  2179.                                         OPitch# = PAngleX
  2180.                                         OYaw# = PAngleY
  2181.                                        
  2182.                                         If PSplineMesh = 0 Then
  2183.                                                 PAngleX = PAngleX + (PAngleVelocityX + PAngleAccelerationX*LTo)*D
  2184.                                                 PAngleY = PAngleY + (PAngleVelocityY + PAngleAccelerationY*LTo)*D
  2185.                                         Else
  2186.                                                 Surface = GetSurface( PSplineMesh, 1 )
  2187.                                                 Vertices = CountVertices( Surface ) - 1
  2188.                                                 Vertex = Int( Vertices * LTo )
  2189.                                                 If Vertex <= 0 Then Vertex = Vertex + 1
  2190.                                                 NX# = VertexX( Surface, Vertex - 1 ) - VertexX( Surface, Vertex )
  2191.                                                 NY# = VertexY( Surface, Vertex - 1 ) - VertexY( Surface, Vertex )
  2192.                                                 NZ# = VertexZ( Surface, Vertex - 1 ) - VertexZ( Surface, Vertex )
  2193.                                                 RotateEntity PSplineMesh,OPitch,OYaw,0
  2194.                                                 TFormNormal -NX,-NY,-NZ,PSplineMesh,0
  2195.                                                 AlignToVector gLotusParticlePivot,TFormedX(),TFormedY(),TFormedZ(),3,1
  2196.                                                 PAngleX = EntityPitch( gLotusParticlePivot, 1 )
  2197.                                                 PAngleY = EntityYaw( gLotusParticlePivot, 1 )
  2198.                                         EndIf
  2199.                                        
  2200.                                         PAngleZ = PAngleZ + (PAngleVelocityZ + PAngleAccelerationZ*LTo)*D
  2201.                                        
  2202.                                         If PAngleX <> OPitch Or PAngleY <> OYaw Then
  2203.                                                 RotateEntity gLotusParticlePivot,PAngleX,PAngleY,0
  2204.                                                 TFormVector POVelocityX,POVelocityY,POVelocityZ,gLotusParticlePivot,0
  2205.                                                 PVelocityX = TFormedX()
  2206.                                                 PVelocityY = TFormedY()
  2207.                                                 PVelocityZ = TFormedZ()
  2208.                                         EndIf
  2209.                                        
  2210.                                         If PSplineMesh <> 0 Then
  2211.                                                 PAngleX = OPitch
  2212.                                                 PAngleY = OYaw
  2213.                                         EndIf
  2214.                                        
  2215.                                         If PVelocityDecay# <> 0 Then
  2216.                                                 Decay# = (PVelocityDecay*LFrom)
  2217.                                         EndIf
  2218.                                        
  2219.         ;                               MoveEntity gLotusParticlePivot,((PVelocityX+(PAccelerationX*LTo))*Decay)*D,((PVelocityY+(PAccelerationY*LTo))*Decay)*D,((PVelocityZ+(PAccelerationZ*LTo))*Decay)*D
  2220.                                        
  2221.                                         If PDeflectorsAffect Then
  2222.                                                 PDeflectorSpeedX = PDeflectorSpeedX * .98
  2223.                                                 PDeflectorSpeedY = PDeflectorSpeedY * .98
  2224.                                                 PDeflectorSpeedZ = PDeflectorSpeedZ * .98
  2225.                                                
  2226.                                                 PositionEntity gLotusParticlePivot,PPositionX,PPositionY,PPositionZ
  2227.                                                
  2228.                                                 For LD.LotusDeflector = Each LotusDeflector
  2229.                                                         If LDActive = True And LDStrength <> 0 And LDRadius > 0 Then
  2230.                                                                 Distance# = EntityDistance(LDEntity,gLotusParticlePivot)
  2231.                                                                
  2232.                                                                 If Distance# < LDRadius Then
  2233.                                                                         Magnitude# = (1.0 - (Distance# / LDRadius))*LDStrength
  2234.                                                                         If PWeight <> 0 Then Magnitude# = Magnitude# * PWeight
  2235.                                                                                
  2236.                                                                         DX# = PPositionX - LDPositionX
  2237.                                                                         DY# = PPositionY - LDPositionY
  2238.                                                                         DZ# = PPositionZ - LDPositionZ
  2239.                                                                        
  2240.                                                                         PDeflectorSpeedX = PDeflectorSpeedX + DX * Magnitude
  2241.                                                                         PDeflectorSpeedY = PDeflectorSpeedY + DY * Magnitude
  2242.                                                                         PDeflectorSpeedZ = PDeflectorSpeedZ + DZ * Magnitude
  2243.                                                                 EndIf
  2244.                                                         EndIf
  2245.                                                 Next
  2246.                                         EndIf
  2247.                                        
  2248.                                         PPositionX = PPositionX + ((PVelocityX+(PAccelerationX*LTo))*Decay)*D + PDeflectorSpeedX*D
  2249.                                         PPositionY = PPositionY + ((PVelocityY+(PAccelerationY*LTo))*Decay)*D + PDeflectorSpeedY*D
  2250.                                         PPositionZ = PPositionZ + ((PVelocityZ+(PAccelerationZ*LTo))*Decay)*D + PDeflectorSpeedZ*D
  2251.                                        
  2252.                                         If PMinY <> 0 Then
  2253.                                                 If PPositionY <= PMinY And PBounce > 0 Then
  2254.                                                         PBounces = PBounces + 1
  2255.                                                        
  2256.                                                         If PBounceMax > 0 And PBounces > PBounceMax Then
  2257.                                                                 KillIt = True
  2258.                                                                 Exit
  2259.                                                         EndIf
  2260.                                                        
  2261.                                                         PPositionY = PMinY + .01
  2262.                                                        
  2263.                                                         PVelocityX = PVelocityX * PBounceDecay
  2264.                                                         PVelocityY = PVelocityY * PBounceDecay
  2265.                                                         PVelocityZ = PVelocityZ * PBounceDecay
  2266.                                                        
  2267.                                                         PGravity = -PGravity*(PBounceDecay*1.3)
  2268.                                                        
  2269.                                                         If PBounceSound <> 0 Then PBounceSoundChannel = PlaySound( PBounceSound )
  2270.                                                 ElseIf PPositionY <= PMinY And PBounce = 0 Then
  2271.                                                         KillIt = True
  2272.                                                         Exit
  2273.                                                 EndIf
  2274.                                         EndIf
  2275.                                        
  2276.                                         Select PLifeMode
  2277.                                                 Case 1
  2278.                                                         PLife = PLife - D#
  2279.                                                 Case 2
  2280.                                                         PLife = PLifeSpan - (ET - PLifeBegan)
  2281.                                         End Select
  2282.                                        
  2283.                                         N = N + 1
  2284.                                 Wend
  2285.                                
  2286.                                 If KillIt = True Then
  2287.                                         KillParticle P
  2288.                                         KillIt = False
  2289.                                 ElseIf PBlendMode <> 1 Or PSorting = False
  2290.                                         DrawLotusParticle P,gLotusTPivot
  2291.                                 EndIf
  2292.                         Else
  2293.                                 KillParticle P
  2294.                         EndIf
  2295.                 Next
  2296.         ;       gLotusUpdateTimes( updTimePart ) = MilliSecs() - gLotusUpdateTimes( updTimePart )
  2297.         EndIf
  2298.        
  2299. ;       gLotusUpdateTimes( updTimeSort ) = MilliSecs()
  2300.         SortParticles()
  2301. ;       gLotusUpdateTimes( updTimeSort ) = MilliSecs() - gLotusUpdateTimes( updTimeSort )
  2302.        
  2303. ;       gLotusUpdateTimes( updTimeDrawAlpha ) = MilliSecs()
  2304.         For HJ = 0 To gLotusAlphaParticleCount - 1
  2305.                 DrawLotusParticle Object.LotusParticle( gAlphaPartArray( HJ, 1 ) ), gLotusTPivot
  2306.         Next
  2307. ;       gLotusUpdateTimes( updTimeDrawAlpha ) = MilliSecs() - gLotusUpdateTimes( updTimeDrawAlpha )
  2308.        
  2309. ;       gLotusUpdateTimes( uptTimeAll ) = MilliSecs() - gLotusUpdateTimes( uptTimeAll )
  2310. End Function


Comments :


big10p(Posted 1+ years ago)

 Incomplete code listing, Noel. Looks like you've hit the limit imposed on archive entries. You'll have to break it down into 2 or more listings.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal