207 lines
6.9 KiB
BlitzBasic
207 lines
6.9 KiB
BlitzBasic
|
|
Type Tradelane
|
||
|
|
Field P1.TVector, P2.TVector, Dir.TVector
|
||
|
|
Field From$, Target$
|
||
|
|
Field FromSpot.Spotmark, TargetSpot.Spotmark
|
||
|
|
|
||
|
|
Field Gates.TList, Lasers.TList
|
||
|
|
Field RingsTop.TList, RingsBot.TList
|
||
|
|
Field RingsInnerTop.TList, RingsInnerBot.TList
|
||
|
|
Field TubesTop.TList, TubesBot.TList
|
||
|
|
|
||
|
|
Field PivotTubes
|
||
|
|
Field PivotRings
|
||
|
|
|
||
|
|
Field MeshA, MeshB, OBBa, OBBb
|
||
|
|
Field XTubeA, XTubeB
|
||
|
|
Field Range
|
||
|
|
End Type
|
||
|
|
|
||
|
|
Const Tradelane_Speed# = 50.0
|
||
|
|
Const Tradelane_SpeedForce# = 0.125
|
||
|
|
Const Tradelane_Force# = 0.1
|
||
|
|
|
||
|
|
Const Tradelane_GateDistance# = 5000.0
|
||
|
|
Const Tradelane_Offset# = 144
|
||
|
|
Const Tradelane_Size# = 115
|
||
|
|
|
||
|
|
Function CreateTradelane(StartX,StartY,StartZ, EndX,EndY,EndZ, From$, Target$)
|
||
|
|
Local T.Tradelane = New Tradelane
|
||
|
|
Local TempVec.TVector
|
||
|
|
|
||
|
|
; Information
|
||
|
|
T\From = From:T\Target = Target
|
||
|
|
|
||
|
|
; Start, End and Direction Vector
|
||
|
|
T\P1 = TVector_Create(StartX, StartY, StartZ)
|
||
|
|
T\P2 = TVector_Create(EndX, EndY, EndZ)
|
||
|
|
TempVec = TVector_Subtract(T\P2, T\P1)
|
||
|
|
T\Dir = TVector_Normalize(TempVec):Delete TempVec
|
||
|
|
Local Range# = TVector_Distance(T\P1, T\P2)
|
||
|
|
|
||
|
|
; Initialize LinkedLists
|
||
|
|
T\Gates = TList_Create()
|
||
|
|
T\Lasers = TList_Create()
|
||
|
|
T\RingsTop = TList_Create()
|
||
|
|
T\RingsBot = TList_Create()
|
||
|
|
T\RingsInnerTop = TList_Create()
|
||
|
|
T\RingsInnerBot = TList_Create()
|
||
|
|
T\TubesTop = TList_Create()
|
||
|
|
T\TubesBot = TList_Create()
|
||
|
|
|
||
|
|
T\PivotRings = CreatePivot(PVTxEFFECT)
|
||
|
|
T\PivotTubes = CreatePivot(PVTxEFFECT)
|
||
|
|
|
||
|
|
; Create Spots
|
||
|
|
T\FromSpot.Spotmark = CreateSpot(T\P1\X, T\P1\Y, T\P1\Z, 21, (From + ">>>" + Target))
|
||
|
|
T\FromSpot.Spotmark = CreateSpot(T\P2\X, T\P2\Y, T\P2\Z, 21, (Target + ">>>" + From))
|
||
|
|
|
||
|
|
; Create OBB Collisions
|
||
|
|
TVector_Angle(T\Dir)
|
||
|
|
Local TX#, TY#, TZ#
|
||
|
|
TX = (T\P1\X + T\P2\X) / 2.0
|
||
|
|
TY = (T\P1\Y + T\P2\Y) / 2.0
|
||
|
|
TZ = (T\P1\Z + T\P2\Z) / 2.0
|
||
|
|
|
||
|
|
Local TVecUp.TVector = TVector_Rotate(T\Dir, -90, 0, 0)
|
||
|
|
T\OBBa=CreateOBB(TX, TY, TZ, TVector_Pitch-90, TVector_Yaw, 0, 115, 115, Range/2)
|
||
|
|
T\OBBb=CreateOBB(TX, TY, TZ, TVector_Pitch-90, TVector_Yaw, 0, 115, 115, Range/2)
|
||
|
|
MoveEntity T\OBBa, 0, Tradelane_Offset, 0
|
||
|
|
MoveEntity T\OBBb, 0, -Tradelane_Offset, 0
|
||
|
|
Delete TVecUp
|
||
|
|
|
||
|
|
; Create Gates, Sprites and Rings
|
||
|
|
Local Count = Ceil(Range / Tradelane_GateDistance)
|
||
|
|
Local Stp# = Range / Count
|
||
|
|
For n = 0 To Count
|
||
|
|
; Calculate Position
|
||
|
|
TempVec = TVector_MultiplyScalar(T\Dir, n*Stp)
|
||
|
|
Local Pos.TVector = TVector_Add(T\P1, TempVec)
|
||
|
|
|
||
|
|
; Create Mesh
|
||
|
|
Local Mesh = CopyEntity(TLxMSH, PVTxNORMAL)
|
||
|
|
PositionEntity Mesh, Pos\X, Pos\Y, Pos\Z
|
||
|
|
AlignToVector Mesh, T\Dir\X, T\Dir\Y, T\Dir\Z, 0, 1
|
||
|
|
RotateEntity Mesh, EntityPitch(Mesh, 1), EntityYaw(Mesh, 1), 0, 1
|
||
|
|
EntityAutoFade Mesh,14500,15000
|
||
|
|
TList_AddLast(T\Gates, Mesh)
|
||
|
|
|
||
|
|
; Create Laser
|
||
|
|
Local Laser = CopyEntity(TLxMSX, Mesh)
|
||
|
|
EntityAutoFade Laser,9500,10000
|
||
|
|
TList_AddLast(T\Lasers, Laser)
|
||
|
|
|
||
|
|
; Create Rings
|
||
|
|
Local RingTop = CopyEntity(TLxENT, Mesh)
|
||
|
|
Local RingBot = CopyEntity(TLxENT, Mesh)
|
||
|
|
MoveEntity RingTop, 0, Tradelane_Offset, 0
|
||
|
|
MoveEntity RingBot, 0, -Tradelane_Offset, 0
|
||
|
|
ScaleSprite RingTop, 125, 125:SpriteViewMode RingTop, 2:EntityColor RingTop, 64, 198, 255:EntityAlpha RingTop, 0.5:EntityAutoFade RingTop, 4500, 5000:EntityBlend RingTop, 3:EntityFX RingTop, 1+16
|
||
|
|
ScaleSprite RingBot, 125, 125:SpriteViewMode RingBot, 2:EntityColor RingBot, 255, 0, 0:EntityAlpha RingBot, 0.5:EntityAutoFade RingBot, 4500, 5000:EntityBlend RingBot, 3:EntityFX RingBot, 1+16
|
||
|
|
TList_AddLast(T\RingsTop, RingTop)
|
||
|
|
TList_AddLast(T\RingsBot, RingBot)
|
||
|
|
|
||
|
|
Local RingInTop = CopyEntity(TLxENT2, Mesh)
|
||
|
|
Local RingInBot = CopyEntity(TLxENT2, Mesh)
|
||
|
|
MoveEntity RingInTop, 0, Tradelane_Offset, 0
|
||
|
|
MoveEntity RingInBot, 0, -Tradelane_Offset, 0
|
||
|
|
ScaleSprite RingInTop, 125, 125:SpriteViewMode RingInTop, 2:EntityAlpha RingInTop, 0.5:EntityAutoFade RingInTop, 4500, 5000:EntityBlend RingInTop, 3:EntityFX RingInTop, 1+16
|
||
|
|
ScaleSprite RingInBot, 125, 125:SpriteViewMode RingInBot, 2:EntityAlpha RingInBot, 0.5:EntityAutoFade RingInBot, 4500, 5000:EntityBlend RingInBot, 3:EntityFX RingInBot, 1+16
|
||
|
|
TList_AddLast(T\RingsInnerTop, RingInTop)
|
||
|
|
TList_AddLast(T\RingsInnerBot, RingInBot)
|
||
|
|
|
||
|
|
; Create Refraction Tubes
|
||
|
|
If n < Count
|
||
|
|
Local Tube
|
||
|
|
Tube = CreateCylinder(24, 0, RingInTop)
|
||
|
|
ScaleEntity Tube, Tradelane_Size, Stp/2, Tradelane_Size
|
||
|
|
TurnEntity Tube, -90, 0, 0
|
||
|
|
MoveEntity Tube, 0, -Stp/2, 0
|
||
|
|
EntityParent Tube, T\PivotTubes
|
||
|
|
EntityAutoFade Tube, 5000, 10000
|
||
|
|
EntityFX Tube, 1+8+16
|
||
|
|
EntityTexture Tube,StarBTex,0,0
|
||
|
|
EntityTexture Tube,ProjectTex,0,1
|
||
|
|
EntityAlpha Tube, 0.35
|
||
|
|
TList_AddLast(T\TubesTop, Tube)
|
||
|
|
|
||
|
|
Tube = CreateCylinder(24, 0, RingInBot)
|
||
|
|
ScaleEntity Tube, Tradelane_Size, Stp/2, Tradelane_Size
|
||
|
|
TurnEntity Tube, 90, 0, 0
|
||
|
|
MoveEntity Tube, 0, Stp/2, 0
|
||
|
|
EntityParent Tube, T\PivotTubes
|
||
|
|
EntityAutoFade Tube, 5000, 10000
|
||
|
|
EntityFX Tube, 1+8+16
|
||
|
|
EntityTexture Tube,StarBTex,0,0
|
||
|
|
EntityTexture Tube,ProjectTex,0,1
|
||
|
|
EntityAlpha Tube, 0.35
|
||
|
|
TList_AddLast(T\TubesBot, Tube)
|
||
|
|
EndIf
|
||
|
|
|
||
|
|
; Delete remaining temporary data
|
||
|
|
Delete Pos:Delete TempVec
|
||
|
|
Next
|
||
|
|
End Function
|
||
|
|
|
||
|
|
Function UpdateTradelane()
|
||
|
|
;set test on
|
||
|
|
TLxTST=0
|
||
|
|
|
||
|
|
; Create Camera Vector
|
||
|
|
Local vCam.TVector = New TVector
|
||
|
|
Local vGate.TVector = New TVector
|
||
|
|
Local vTmp.TVector = Null
|
||
|
|
Local vTmp2.TVector = Null
|
||
|
|
vCam\X = EntityX(cCamera, 1)
|
||
|
|
vCam\Y = EntityY(cCamera, 1)
|
||
|
|
vCam\Z = EntityZ(cCamera, 1)
|
||
|
|
|
||
|
|
For TL.Tradelane = Each Tradelane
|
||
|
|
; Rings
|
||
|
|
TList_Reset(TL\RingsTop):TList_Reset(TL\RingsInnerTop)
|
||
|
|
TList_Reset(TL\RingsBot):TList_Reset(TL\RingsInnerBot)
|
||
|
|
TList_Reset(TL\Gates)
|
||
|
|
While TList_HasNext(TL\Gates)
|
||
|
|
Local RT = TList_Next(TL\RingsTop)
|
||
|
|
Local RTI = TList_Next(TL\RingsInnerTop)
|
||
|
|
Local RB = TList_Next(TL\RingsBot)
|
||
|
|
Local RBI = TList_Next(TL\RingsInnerBot)
|
||
|
|
Local Gate = TList_Next(TL\Gates)
|
||
|
|
|
||
|
|
TurnEntity RT, 0, 0, -.1
|
||
|
|
TurnEntity RB, 0, 0, .1
|
||
|
|
|
||
|
|
vGate\X = EntityX(Gate, 1)
|
||
|
|
vGate\Y = EntityY(Gate, 1)
|
||
|
|
vGate\Z = EntityZ(Gate, 1)
|
||
|
|
|
||
|
|
vTmp = TVector_Subtract(vGate, vCam)
|
||
|
|
vTmp2 = TVector_Normalize(vTmp):Delete vTmp
|
||
|
|
|
||
|
|
Local Dot# = TVector_Dot(TL\Dir, vTmp2):Delete vTmp2
|
||
|
|
If Dot >= 0 Then
|
||
|
|
EntityColor RT, 64, 198, 255
|
||
|
|
EntityColor RB, 255, 0, 0
|
||
|
|
Else
|
||
|
|
EntityColor RB, 64, 198, 255
|
||
|
|
EntityColor RT, 255, 0, 0
|
||
|
|
EndIf
|
||
|
|
Wend
|
||
|
|
|
||
|
|
; Traveling
|
||
|
|
If EntityInOBB(TL\OBBa,pvShip)
|
||
|
|
AlignToVector pvShip, TL\Dir\X, TL\Dir\Y, TL\Dir\Z, 0, Tradelane_Force
|
||
|
|
ShipSpeedZ = (ShipSpeedZ * (1-Tradelane_SpeedForce)) + (Tradelane_Speed * Tradelane_SpeedForce)
|
||
|
|
TLxTST=1
|
||
|
|
EndIf
|
||
|
|
If EntityInOBB(TL\OBBB,pvShip)
|
||
|
|
AlignToVector pvShip, -TL\Dir\X, -TL\Dir\Y, -TL\Dir\Z, 0, Tradelane_Force
|
||
|
|
ShipSpeedZ = (ShipSpeedZ * (1-Tradelane_SpeedForce)) + (Tradelane_Speed * Tradelane_SpeedForce)
|
||
|
|
TLxTST=1
|
||
|
|
EndIf
|
||
|
|
Next
|
||
|
|
Delete vCam:Delete vGate
|
||
|
|
|
||
|
|
PositionTexture StarBTex, Sin(MilliSecs() / 10000.0), (MilliSecs() / 10000.0) Mod 1
|
||
|
|
|
||
|
|
End Function
|
||
|
|
;~IDEal Editor Parameters:
|