No needs to remind the game which has inspired this...
Controls:
Joystick
Left: turn left
Right: turn right
button 2: thrust
button 6: left airbrake
button 7: right airbrake
button 6+Button7: brake
button 1: switch camera view
Keyboard
Key <: turn left
Key ?: turn right
Key lctrl: thrust
Key L: left airbrake
Key :: right airbrake
Key L+Key:: brake
Key <+Key >: turn left + airbrake
Key ?+Key >: turn right + airbrake
Key q: switch camera view
I'm absolutly rubbish at artwork...
Will try to improve this later...
In case of low framerate or shader2.0 not supported, set EnableGlow=0 to disable bloom shader
(made with DBPro 7.5 / Vista32. Project file included in the download)
More stuff related to this mini game coming soon!
Fell free to feedback!
TrackDir$="Tracks\Track 1\" :EnableGlow = 1 :Set Display Mode 800, 600, 32 :Global PerfTimerDI As Double Integer, PrevTimerDI As Double Integer, TimerDeltaDF As Double Float, TimerFreqDF As Double Float, MainCamera As Integer, EnginePower#, MaxSpeed#, ElapsedTime#, TrustInput# :SelectVal2(-2, 0.0, 0.0) :Set Window Off :If EnableGlow :SetVector3(-1, 0.0, 0.0, 0.0) :Set Object Mask 13, %1 :Texture Object 13, 0, 10 :Texture Object 13, 1, 13 :MainCamera = 1 :EndIf :Backdrop Off 0 :Open To Read 1, TrackDir$+"Level.txt" :Read String 1, TextureCount$ :Read String 1, SpeedPadCount$ :Read String 1, SkyBoxTexture$ :For MemBlock = 1 To 11 :Read String 1, FileName$ :Open To Read 2, TrackDir$+FileName$ :Read MemBlock 2, MemBlock :Close File 2 :Next MemBlock :Close File 1
Open To Read 1, "ShipSettings.bin" :Read MemBlock 1, 12 :Close File 1 :Open To Read 1, TrackDir$+"Textures.txt" :For i = 16 To 15+Val(TextureCount$) :Read String 1, s$ :Load Image "Textures\"+s$, i :Next i :Close File 1 :Object = 16 :For t = 1 To Val(TextureCount$) :For GridIndex = 0 To 15 :FileName$ = TrackDir$+"ObjectGrid"+Chr$(65+t)+Chr$(65+GridIndex)+".dbo" :If File Exist(FileName$) :Load Object FileName$, Object :Texture Object Object, 15 + t :Set Object Object, 1, 0, 1, 1, 0 :Set Object Texture Object, 2, 2 :Set Object Mask Object, 2^MainCamera :Inc Object :EndIf :Next GridIndex :Next t :Load Image "Media\SpeedPad.bmp", 15 :For i = 1 To Val(SpeedPadCount$)
Load Object TrackDir$+"SpeedPad"+Str$(i)+".dbo", Object :Set Object Object, 1, 0, 1, 1, 0 :Set Object Texture Object, 2, 2 :Texture Object Object, 15 :Set Object Mask Object, 2^MainCamera :Inc Object :Next :Load Image "SkyBoxes\"+SkyBoxTexture$, 5 :SetVector3FromMemBlock(-1, 0, 0) :Set Vector3 17, MemBlock Float(9, 4), MemBlock Float(9, 8), MemBlock Float(9, 12) :Build LookAt LHMatrix4 2, SetVector3(16, 0.0, 0.0, 0.0), SetVector3(15, MemBlock Float(9, 28), MemBlock Float(9, 32), MemBlock Float(9, 36)), SetVector3(28, MemBlock Float(9, 16), MemBlock Float(9, 20), MemBlock Float(9, 24)) :Transpose Matrix4 1, 2 :Set Camera Range MainCamera, 0.25, 4096.25 :Load Sound "Media\Engine16.wav", 1 :Load Sound "Media\Collide16.wav", 2 :Loop Sound 1 :Set Sound Volume 1, 90 :MaxSpeed# = 230.0 :MaxLap = 4 :StartRaceTimer = Timer() :Dim LapTime(MaxLap+1, 1) :CurrentLap = 1 :Perfect = 1 :Sync Rate 0 :Sync On
PrevTimerDI = PerfTimer() :Sync :Do :PerfTimerDI = PerfTimer() :TimerDeltaDF = PerfTimerDI - PrevTimerDI :PrevTimerDI = PerfTimerDI :TimerDeltaDF = TimerDeltaDF / TimerFreqDF :ElapsedTime# = TimerDeltaDF :TrustInput# = KeyState(29) Or Joystick Fire X(2) :Set Vector2 4, (KeyState(51) And (KeyState(53)=0)) Or JoyStick Left(), (KeyState(53) And (KeyState(51)=0)) Or JoyStick Right() :Set Vector2 5, JoyStick Fire X(6) Or KeyState(38) Or (KeyState(51) And KeyState(52)), JoyStick Fire X(7) Or KeyState(39) Or (KeyState(53) And KeyState(52)) :If CamMode = 0 And ((KeyState(16)=1) Or Joystick Fire X(1)) :CamMode = 3 :Hide Object 1 :EndIf :CamMode = SelectVal2(CamMode = 3 And (KeyState(16)=0) And (Joystick Fire X(1)=0), CamMode, 1) :If CamMode = 1 And ((KeyState(16)=1) Or Joystick Fire X(1)) :CamMode = 2 :Show Object 1 :EndIf :CamMode = SelectVal2(CamMode = 2 And (KeyState(16)=0) And (Joystick Fire X(1)=0), CamMode, 0) :Set Vector2 3, TrustInput# > EnginePower#, EnginePower# + SelectVal2(TrustInput# > EnginePower#, SelectVal2(X Vector2(5) + Y Vector2(5) = 2.0, -MemBlock Float(12, 260), -MemBlock Float(12, 328)), MemBlock Float(12, 256) * SelectVal2(CannonStart, 1.0, 4.0)) * ElapsedTime# :EnginePower# = SelectVal2(SelectVal2(X Vector2(3), Y Vector2(3) < TrustInput#, Y Vector2(3) > TrustInput#), Y Vector2(3), TrustInput#) :Multiply Vector2 5, (X Vector2(3) Or ((X Vector2(5) + Y Vector2(5)) <> 2.0)) :EnginePowerT# = EnginePowerT# + (EnginePower# - EnginePowerT#) * MemBlock Float(12, 264) * ElapsedTime#
TanAccel# = (EnginePowerT# - PreviousEnginePowerT#) / (ElapsedTime# * MemBlock Float(12, 256)) :PreviousEnginePowerT# = EnginePowerT# :If GameState = 2 :For l = 1 To MaxLap :RaceTimeMins = (LapTime(l, 0) - LapTime(l-1, 0)) / 60000 :RaceTimeSecs = ((LapTime(l, 0) - LapTime(l-1, 0))-(RaceTimeMins*60000))/1000 :Hundredths = ((LapTime(l, 0) - LapTime(l-1, 0)) - RaceTimeMins*60000 - RaceTimeSecs*1000) / 10 :Text 100, 100+l*20, "Lap " + Str$(l) + " " + Str$(RaceTimeMins)+":"+Str$(RaceTimeSecs)+"."+ Mid$("0", Hundredths<10)+Str$(Hundredths) :Text 300-350*(LapTime(l, 1)=0), 100+l*20, "*PL*" :Next l :Endif :If GameState = 1 :Flags = Flags && 0x00ff :VOp(-2, 0, 0, 0, 0.0) :VOp(0, 23, 23, SetVector3(16, X Vector2(6)-X Vector3(23), Y Vector2(6)-Y Vector3(23), 0.0), MemBlock Float(12, 304) * ElapsedTime#) :VOp(0, 24, 24, SetVector3(16, X Vector2(7)-X Vector3(24), Y Vector2(7)-Y Vector3(24), 0.0), MemBlock Float(12, 316) * ElapsedTime#) :YawSpeed# = Sqrt(Y Vector3(19)) - Sqrt(X Vector3(19)) :AirBrakesFlapsSpeed# = (Y Vector3(24) + X Vector3(24)) :FinalYawSpeed# = (YawSpeed# * ((1.0 - EnginePower#) * MemBlock Float(12, 288) + EnginePower# * MemBlock Float(12, 292))) + ((Sqrt(Y Vector3(23)) - Sqrt(X Vector3(23))) * EnginePower#) * ((1.0 - Abs(YawSpeed#)) * MemBlock Float(12, 320) + Abs(YawSpeed#) * MemBlock Float(12, 324)) :Set Vector3 27, Get Matrix4 Element(1, 8), Get Matrix4 Element(1, 9), Get Matrix4 Element(1, 10) :wgi = ((Int(X Vector3(17)/16.0) - ((X Vector3(17)/16.0) < 0.0)) * 0x8da6b343 + (Int(Y Vector3(17)/16.0) - ((Y Vector3(17)/16.0) < 0.0)) * 0xd8163841 + (Int(Z Vector3(17)/16.0) - ((Z Vector3(17)/16.0) < 0.0)) * 0xcb1ab31f) Mod 4096 :wgi = (wgi >= 0) * wgi + (wgi < 0) * (wgi+4096) :QuadInfo = 0 :Inside = 0 :Entry = MemBlock Word(3, wgi*2)
If Entry :For i = 0 To 1 :Quad = MemBlock Word(4, Entry*4) * 64 :Subtract Vector3 25, SetVector3FromMemBlock(25, 1, MemBlock Word(2, Quad+26)), 17 :If Squared Length Vector3(25) <= MemBlock Float(2, Quad+28) :Subtract Vector3 25, 17, SetVector3FromMemBlock(25, 1, MemBlock Word(2, Quad+20)) :Set Vector2 11, MemBlock Float(2, Quad+32), MemBlock Float(2, Quad+36) :Set Vector2 9, Dot Product Vector3(25, SetVector3FromMemBlock(26, 1, MemBlock Word(2, Quad+22)))-X Vector2(11), Dot Product Vector3(25, SetVector3FromMemBlock(15, 1, MemBlock Word(2, Quad+24)))-Y Vector2(11) :Set Vector2 12, MemBlock Float(2, Quad+40)-X Vector2(11), MemBlock Float(2, Quad+44)-Y Vector2(11) :Set Vector2 13, MemBlock Float(2, Quad+48)-X Vector2(11), MemBlock Float(2, Quad+52)-Y Vector2(11) :Set Vector2 14, MemBlock Float(2, Quad+56)-X Vector2(11), MemBlock Float(2, Quad+60)-Y Vector2(11) :Ax2# = (X Vector2(14)*(Y Vector2(13)-Y Vector2(12)) - Y Vector2(14)*(X Vector2(13)-X Vector2(12))) * 2.0 :Ax2# = SelectVal2(Abs(Ax2#) < 0.03125, Ax2#, 0.03125) :B# = X Vector2(14)*Y Vector2(12) - Y Vector2(14)*X Vector2(12) + X Vector2(9)*(Y Vector2(14)-Y Vector2(13)+Y Vector2(12)) - Y Vector2(9)*(X Vector2(14)-X Vector2(13)+X Vector2(12)) :t# = (Sqrt(B# * B# - 2.0 * Ax2# * (Y Vector2(9)*X Vector2(12) - X Vector2(9)*Y Vector2(12))) - B#) / Ax2# :Set Vector2 10, X Vector2(14)*t#, Y Vector2(14)*t# :Subtract Vector2 11, 9, 10 :Linear Interpolate Vector2 9, 12, 13, t# :Subtract Vector2 9, 9, 10 :Set Vector2 10, Length Vector2(11) / Length Vector2(9) * (((Dot Product Vector2(9, 11) >= 0.0)*2-1)*1.0), t# :Inside = ((X Vector2(10)>=-0.005) And (Y Vector2(10)>=-0.005) And (X Vector2(10)<=1.005) And (Y Vector2(10)<=1.005)) :EndIf :i = (MemBlock Word(4, Entry*4+2) = 0) Or Inside :Entry = MemBlock Word(4, Entry*4+2) :Next i
EndIf :If Inside :Normalize Vector3 26,VOp(1, 26,VOp(1, 15, SetVector3FromMemBlock(31, 1, MemBlock Word(2, Quad+12)), SetVector3FromMemBlock(34, 1, MemBlock Word(2, Quad+18)), Y Vector2(10)),VOp(1, 16, SetVector3FromMemBlock(32, 1, MemBlock Word(2, Quad+14)), SetVector3FromMemBlock(33, 1, MemBlock Word(2, Quad+16)), Y Vector2(10)), X Vector2(10)) :Linear Interpolate Vector3 25,VOp(1, 15, SetVector3FromMemBlock(31, 1, MemBlock Word(2, Quad+4)), SetVector3FromMemBlock(34, 1, MemBlock Word(2, Quad+10)), Y Vector2(10)),VOp(1, 16, SetVector3FromMemBlock(32, 1, MemBlock Word(2, Quad+6)), SetVector3FromMemBlock(33, 1, MemBlock Word(2, Quad+ 8)), Y Vector2(10)), X Vector2(10) :SetVector3FromMemBlock(27, 1, MemBlock Word(2, Quad+24)) :QuadInfo = MemBlock DWord(2, Quad) :Else :Set Vector3 25, X Vector3(17), 3.5, Z Vector3(17) :Set Vector3 26, 0.0, 1.0, 0.0 :EndIf :Flags = Flags || (((QuadInfo && 0x80000000) <> 0) * 0x2000) :HeightFromSurface# = Dot Product Vector3(SetVector3(15, X Vector3(17)-X Vector3(25), Y Vector3(17)-Y Vector3(25), Z Vector3(17)-Z Vector3(25)), 26) :VOp(0, 35, 35, SetVector3(15, X Vector3(26), Y Vector3(26)-1.0, Z Vector3(26)), ElapsedTime#*(3.5+3.5*(HoveringState <> 20))*Abs(Dot Product Vector3(15, SetVector3(16, Get Matrix4 Element(1, 8), Get Matrix4 Element(1, 9), Get Matrix4 Element(1, 10))))) :VOp(0, 35, 35, SetVector3(15, X Vector3(35), Y Vector3(35), Z Vector3(35)), -0.25 * ElapsedTime#) :HoveringState = HoveringState * ((HeightFromSurface# < 2.0) Or (HoveringState = 2)) :HoveringState = (((Flags && 0x2000) = 0))*HoveringState + ((Flags && 0x2000) <> 0)*20 :ViscosityFactor# = ViscosityFactor# + SelectVal2(HeightFromSurface# >= 2.0, -1.0, 1.0) * ElapsedTime# :ViscosityFactor# = SelectVal2(ViscosityFactor# > 1.0, SelectVal2(ViscosityFactor# < 0.0, ViscosityFactor#, 0.0), 1.0) :ExtraBoost# = ExtraBoost# - 0.8 * ElapsedTime# :ExtraBoost# = SelectVal2(ExtraBoost# < 0.0, ExtraBoost#, 0.0) :NextHoveringState = HoveringState :NormalVel# = NormalVel# - 18.0 * ElapsedTime# * (HoveringState = 0) :NextHoveringState = (HoveringState <> 0) * NextHoveringState + (HoveringState = 0) * ((HeightFromSurface# >= 2.0) * NextHoveringState + (HeightFromSurface# < 2.0) * ((NormalVel# < -20.0) * 30 + (NormalVel# >= -20.0))) :BounceTimer# = BounceTimer# * (HoveringState <> 1) :NormalVel# = SelectVal2(HoveringState = 1, NormalVel#, -2.0 * (1.0 - HeightFromSurface# * 0.5) - 20.0 * HeightFromSurface# * 0.5)
NextHoveringState = (HoveringState <> 1) * NextHoveringState + ((HoveringState = 1) And (HeightFromSurface# < 0.0)) * 10 :NextHoveringState = NextHoveringState * ((HoveringState <> 2) Or (JumpTresholdVelocity# >= 0.0)) :Flags = Flags || 0x8000 * ((HoveringState = 2) And (JumpTresholdVelocity# >= 0.0)) :If HoveringState = 10 :JumpTresholdVelocity# = (VerticalVelocity# < JumpTresholdVelocity#) * JumpTresholdVelocity# + (VerticalVelocity# >= JumpTresholdVelocity#) * VerticalVelocity# :NextHoveringState = (VerticalVelocity# >= JumpTresholdVelocity#) * NextHoveringState + (VerticalVelocity# < JumpTresholdVelocity#) * 2 :NormalVel# = SelectVal2(HeightFromSurface# < -1.0, SelectVal2(HeightFromSurface# < -0.2, SelectVal2(HeightFromSurface# > 0.2, 0.0, -1.0), 1.0), ((-1.0-HeightFromSurface#) / ElapsedTime#)) :EndIf :NormalVel# = (HoveringState <> 20) * NormalVel# + (HoveringState = 20) * ((0.0 - HeightFromSurface#) / ElapsedTime#) :NextHoveringState = NextHoveringState * ((HoveringState <> 20) Or ((Flags && 0x2000) <> 0)) :BounceTimer# = BounceTimer# * (HoveringState <> 30) :NextHoveringState = ((HoveringState <> 30) Or (HeightFromSurface# >= -2.20)) * NextHoveringState + ((HoveringState = 30) And (HeightFromSurface# < -2.20)) * 31 :If HoveringState = 31 :Set Vector3 35, 0.0, 0.0, 0.0 :NormalVel# = (-2.20*(1.0-Sin(BounceTimer#*200.0))-HeightFromSurface#) / ElapsedTime# :BounceTimer# = BounceTimer# + ElapsedTime# :NextHoveringState = SelectVal2(BounceTimer#*200.0 >= 90.0, NextHoveringState, 10) :Flags = Flags || 0x4000 :EndIf :HoveringState = NextHoveringState :Set Vector3 38, -(0.3-0.1*EnginePower#)*Sin(Y Vector3(38)*50.0), WrapValue(Y Vector3(38) + ElapsedTime#), SelectVal2(-1, 0, Z Vector3(38) + SelectVal2(HoveringState = 10, -0.6, 0.6) * ElapsedTime#) :Build Rotation Axis Matrix4 2, SetVector3(15, Get Matrix4 Element(1, 4), Get Matrix4 Element(1, 5), Get Matrix4 Element(1, 6)), FinalYawSpeed# * ElapsedTime# * 0.01745329252 :Multiply Matrix4 1, 1, 2 :SetVector3(21, Get Matrix4 Element(1, 8), Get Matrix4 Element(1, 9), Get Matrix4 Element(1, 10)) :Multiply Vector3 21, ((EnginePowerT#-0.40*EnginePowerT#*ViscosityFactor#) * (1.0+ExtraBoost#*1.5*Dot Product Vector3(21, 30))) * MaxSpeed#
Linear Interpolate Vector3 21, 21, 22, (1.0 - AirBrakesFlapsSpeed#) * 0.10 + AirBrakesFlapsSpeed# * 0.45 :Set Vector3 21, X Vector3(21), ((Flags && 0x8000) = 0) * Y Vector3(21) + ((Flags && 0x8000) <> 0) * JumpTresholdVelocity#, Z Vector3(21) :JumpTresholdVelocity# = JumpTresholdVelocity# - 36.0 * ElapsedTime# :VerticalVelocity# = Dot Product Vector3(SetVector3(15, 0.0, 1.0, 0.0), 21) :VOp(0, 15, 21, SetVector3(16, X Vector3(26), Y Vector3(26), Z Vector3(26)), -(Dot Product Vector3(21, 26) * (Dot Product Vector3(21, 26) < 0.0))*((HoveringState <> 0) And (HoveringState <> 2))) :VOp(0, 15, 15, SetVector3(28, X Vector3(26), Y Vector3(26), Z Vector3(26)), NormalVel#) :VOp(0, 17, 17, SetVector3(16, X Vector3(15) + X Vector3(35), Y Vector3(15) + Y Vector3(35), Z Vector3(15) + Z Vector3(35)), ElapsedTime#) :HeightFromSurface2# = Dot Product Vector3(SetVector3(15, X Vector3(17)-X Vector3(25), Y Vector3(17)-Y Vector3(25), Z Vector3(17)-Z Vector3(25)), 26) :VOp(0, 17, 17, SetVector3(15, X Vector3(26), Y Vector3(26), Z Vector3(26)), (-1.0-HeightFromSurface2#) * (HeightFromSurface2# < -1.0) * (HoveringState < 20)) :Copy Vector3 SelectVal2(HoveringState = 20 Or (HeightFromSurface# < -10.0), 34, 28), 26 :If (HoveringState <> 20) And (HeightFromSurface# >= -10.0) :If HoveringState = 0 :Add Vector3 15, SetVector3(16, 0.0, -0.001, 0.0), SetVector3(15, X Vector3(17)-X Vector3(36), Y Vector3(17)-Y Vector3(36), Z Vector3(17)-Z Vector3(36)) :Cross Product Vector3 34, 15, SetVector3(16, Get Matrix4 Element(1, 0), Get Matrix4 Element(1, 1), Get Matrix4 Element(1, 2)) :Normalize Vector3 34, 34 :EndIf :Normalize Vector3 28,VOp(1, 28, SetVector3(28, Get Matrix4 Element(1, 4), Get Matrix4 Element(1, 5), Get Matrix4 Element(1, 6)), 34, 0.99*ElapsedTime#) :EndIf :Cross Product Vector3 15, 28, SetVector3(15, Get Matrix4 Element(1, 8), Get Matrix4 Element(1, 9), Get Matrix4 Element(1, 10)) :Cross Product Vector3 15, 15, 28 :Build LookAt LHMatrix4 2, SetVector3(16, 0.0, 0.0, 0.0), 15, 28 :Transpose Matrix4 1, 2 :For cp = 0 To 15 :Transform Normals Vector3 15, SetVector3(15, Memblock Float(12, (cp*16))*Cos(Roll#), Memblock Float(12, (cp*16)+4), Memblock Float(12, (cp*16)+8)), 1 :Add Vector3 16, 17, 15
cpwgi = ((Int(X Vector3(16)/16.0) - ((X Vector3(16)/16.0) < 0.0)) * 0x8da6b343 + (Int(Y Vector3(16)/16.0) - ((Y Vector3(16)/16.0) < 0.0)) * 0xd8163841 + (Int(Z Vector3(16)/16.0) - ((Z Vector3(16)/16.0) < 0.0)) * 0xcb1ab31f) Mod 4096 :cpwgi = (cpwgi >= 0) * cpwgi + (cpwgi < 0) * (cpwgi+4096) :Pit = 0 :Entry = MemBlock Word(7, cpwgi*2) :If Entry :For i = 0 To 1 :Wall = MemBlock Word(8, Entry*4) * 24 :Subtract Vector3 15, 16, SetVector3FromMemBlock(31, 5, MemBlock Word(6, Wall+2)) :Dist# = Dot Product Vector3(15, SetVector3(34, Memblock Float(6, Wall+8), Memblock Float(6, Wall+12), Memblock Float(6, Wall+16))) :If Dist# < 0.0 :Subtract Vector3 32, SetVector3FromMemBlock(32, 5, MemBlock Word(6, Wall+4)), 31 :Subtract Vector3 33, SetVector3FromMemBlock(33, 5, MemBlock Word(6, Wall+6)), 31 :DP01# = Dot Product Vector3(32, 33) :DP12# = Dot Product Vector3(33, 15) :DP02# = Dot Product Vector3(32, 15) :u# = (Dot Product Vector3(33, 33) * DP02# - DP01# * DP12#) * Memblock Float(6, Wall+20) :If (u# >= 0.0) :v# = (Dot Product Vector3(32, 32) * DP12# - DP01# * DP02#) * Memblock Float(6, Wall+20) :If (v# >= 0.0) And ((u# + v#) =< 1.0) :Pit = VOp(0, 17, 17, SetVector3(15, X Vector3(34), Y Vector3(34), Z Vector3(34)), -Dist#) :VOp(0, 17, 17, SetVector3(28, X Vector3(26), Y Vector3(26), Z Vector3(26)), -Dot Product Vector3(15, 26)*(Abs(Dot Product Vector3(34, 26)) < 0.707)) :If MemBlock Word(6, Wall) = 1 :EnginePowerT# = SelectVal2(-1, 0, EnginePowerT# - (1.0/16.0) * Speed# * ElapsedTime#) :EnginePower# = SelectVal2(-1, 0, EnginePower# - (1.0/16.0) * Speed# * ElapsedTime#) :PreviousEnginePowerT# = EnginePowerT#
Multiply Vector3 22, 0.95*ElapsedTime# :Multiply Vector3 34, Speed#*0.25*ElapsedTime# :Add Vector3 35, 34, 35 :Flags = Flags || 0x4000 :Perfect = 0 :EndIf :EndIf :EndIf :EndIf :i = (MemBlock Word(8, Entry*4+2) = 0) Or Pit :Entry = MemBlock Word(8, Entry*4+2) :Next i :EndIf :Next cp :wgi = ((Int(X Vector3(17)/16.0) - ((X Vector3(17)/16.0) < 0.0)) * 0x8da6b343 + (Int(Y Vector3(17)/16.0) - ((Y Vector3(17)/16.0) < 0.0)) * 0xd8163841 + (Int(Z Vector3(17)/16.0) - ((Z Vector3(17)/16.0) < 0.0)) * 0xcb1ab31f) Mod 4096 :wgi = (wgi >= 0) * wgi + (wgi < 0) * (wgi+4096) :NewLapCountState = 0 :Entry = MemBlock Word(10, wgi*2) :If Entry :For i = 0 To 1 :LvlObj = MemBlock Word(11, Entry*4) * 56 :Cross Product Vector3 28, SetVector3(16, MemBlock Float(9, LvlObj+28), MemBlock Float(9, LvlObj+32), MemBlock Float(9, LvlObj+36)), SetVector3(15, MemBlock Float(9, LvlObj+16), MemBlock Float(9, LvlObj+20), MemBlock Float(9, LvlObj+24)) :Build LookAt LHMatrix4 2, SetVector3(15, 0.0, 0.0, 0.0), 16, 28 :Transform Normals Vector3 15, SetVector3(15, X Vector3(17)-MemBlock Float(9, LvlObj+4), Y Vector3(17)-MemBlock Float(9, LvlObj+8), Z Vector3(17)-MemBlock Float(9, LvlObj+12)), 2 :If LvlObj = 56
If (X Vector3(15) >= -30.0) And (X Vector3(15) <= 30.0) And (Y Vector3(15) >= -7.5) And (Y Vector3(15) <= 7.5) And (Z Vector3(15) >= -10.0) And (Z Vector3(15) < 0.0) :NewLapCountState = -1 :LapCount = LapCount - (LapCountState = 1) :EndIf :If (X Vector3(15) >= -30.0) And (X Vector3(15) <= 30.0) And (Y Vector3(15) >= -7.5) And (Y Vector3(15) <= 7.5) And (Z Vector3(15) >= 0.0) And (Z Vector3(15) <= 10.0) :NewLapCountState = 1 :LapCount = LapCount + (LapCountState = -1) :If LapCount > CurrentLap :LapTime(CurrentLap, 0) = Timer() :LapTime(CurrentLap, 1) = Perfect :CurrentLap = LapCount :Perfect = 1 :EndIf :EndIf :EndIf :If MemBlock DWord(9, LvlObj) = 1 :If (X Vector3(15) >= -5.0) And (X Vector3(15) <= 5.0) And (Y Vector3(15) >= -2.0) And (Y Vector3(15) <= 4.0) And (Z Vector3(15) >= -5.0) And (Z Vector3(15) <= 5.0) :Copy Vector3 30, 16 :ExtraBoost# = SelectVal2(-1, 0, ExtraBoost# + 8.0 * ElapsedTime#) :EndIf :EndIf :i = (MemBlock Word(11, Entry*4+2) = 0) :Entry = MemBlock Word(11, Entry*4+2) :Next i :EndIf
LapCountState = NewLapCountState :GameState = (LapCount <= MaxLap) * GameState + (LapCount > MaxLap) * 2 :Set Alpha Mapping On 3, EnginePower# * 100.0 :RaceTimer = Timer() - StartRaceTimer :CannonStart = CannonStart * ((Timer() - StartRaceTimer) < 1200) :If Dot Product Vector3(SetVector3(15, Get Matrix4 Element(1, 8), Get Matrix4 Element(1, 9), Get Matrix4 Element(1, 10)), 27) < 0.0 :Text 350, 292, "WRONG WAY" :EndIf :If ((Timer() - LapTime(CurrentLap-1, 0)) < 3000) And LapTime(CurrentLap-1, 1) :Text 350, 292, "Perfect Lap !" :EndIf :If (Timer() - StartRaceTimer) < 2000 :Text 390, 292, "GO!" :EndIf :EndIf :If GameState = 0 :DisableCannonStart = DisableCannonStart || (((Timer() - StartRaceTimer) > 2000) And ((Timer() - StartRaceTimer) < 2500) And (EnginePower# > 0.0)) :If (Timer() - StartRaceTimer) > 3000 :GameState = 1 :StartRaceTimer = Timer() :LapTime(0, 0) = StartRaceTimer :CannonStart = (EnginePower# <> 0.0) * (DisableCannonStart <> 1) :EnginePower# = 0.0 :EnginePowerT# = 0.0 :PreviousEnginePowerT# = 0.0
EndIf :Set Vector3 38, -(0.3)*Sin(Y Vector3(38)*50.0), WrapValue(Y Vector3(38) + ElapsedTime#), 1.0 :Text 394, 292, Str$(3 - (Timer() - StartRaceTimer) / 1000) :EndIf :VOp(0, 37, 17, SetVector3(28, Get Matrix4 Element(1, 4), Get Matrix4 Element(1, 5), Get Matrix4 Element(1, 6)), X Vector3(38)*Z Vector3(38)) :Position Object 1, X Vector3(37), Y Vector3(37), Z Vector3(37) :set point light 0,X Vector3(37), Y Vector3(37)+50.0, Z Vector3(37) :AX# = AtanFull(Get Matrix4 Element(1, 6), Get Matrix4 Element(1, 10)) :sx# = Sin(Ax#) :cx# = Cos(Ax#) :Set Vector3 29, AX#, AtanFull(-Get Matrix4 Element(1, 2), SelectVal2(Abs(sx#) > Abs(cx#), Get Matrix4 Element(1, 10), Get Matrix4 Element(1, 6)) / SelectVal2(Abs(sx#) > Abs(cx#), cx#, sx#)), AtanFull(-cx# * Get Matrix4 Element(1, 4) + sx# * Get Matrix4 Element(1, 8), cx# * Get Matrix4 Element(1, 5) - sx# * Get Matrix4 Element(1, 9)) :Rotate Object 1, X Vector3(29), Y Vector3(29), Z Vector3(29) :Roll# = (Sqrt(X Vector3(20)) - Sqrt(Y Vector3(20))) * 30.0 + (X Vector2(7)-Y Vector2(7)) * 15.0 :Roll Object Left 1, Roll# :Position Object 3, X Vector3(37), Y Vector3(37), Z Vector3(37) :Rotate Object 3, X Vector3(29), Y Vector3(29), Z Vector3(29) :Roll Object Left 3, Roll# :Divide Vector3 SetVector3(15, X Vector3(17)-X Vector3( 36), Y Vector3(17)-Y Vector3( 36), Z Vector3(17)-Z Vector3( 36)), ElapsedTime# :Speed# = Length Vector3(15) :Copy Vector3 36, 17 :Scroll Object texture 3, 0, tv# :tv# = WrapValue((tv#+1.0* ElapsedTime#)*360.0) / 360.0 :Rotate Camera MainCamera, X Vector3(29), Y Vector3(29), Z Vector3(29) :If (CamMode && 1) = 0 :Transform Normals Vector3 15, SetVector3(15, (YawSpeed#)* 1.0+(Sqrt(Y Vector3(23)) - Sqrt(X Vector3(23)))*2.5, 3.0+SelectVal2(HeightFromSurface# < 0.3, 0.0, 0.3-HeightFromSurface#), -14.0-(TanAccel#*2.0+ExtraBoost#)*(GameState <> 0)), 1
Set Vector3 18, X Vector3(17)+X Vector3(15), Y Vector3(17)+Y Vector3(15), Z Vector3(17)+Z Vector3(15) :Position Camera MainCamera, X Vector3(18), Y Vector3(18), Z Vector3(18) :Pitch Camera Down MainCamera, (HoveringState <> 20) * Dot Product Vector3(SetVector3(15, 0.0, 1.0, 0.0), SetVector3(16, Get Matrix4 Element(1, 8), Get Matrix4 Element(1, 9), Get Matrix4 Element(1, 10))) * 10.0 :Else :Transform Normals Vector3 15, SetVector3(15, 0.0, 0.75, 0.5), 1 :Add Vector3 18, 37, 15 :Position Camera MainCamera, X Vector3(18), Y Vector3(18), Z Vector3(18) :Roll Camera Left MainCamera, Roll# :EndIf :Position Object 5, X Vector3(18), Y Vector3(18), Z Vector3(18) :Set Sound Speed 1, 13000.0 + 14000.0 * (EnginePower# + ExtraBoost#*0.5) :If (Sound Playing(2) = 0) And ((Flags && 0x4000) <> 0) :Play Sound 2 :Set Sound Speed 2, 20000+RND(4000) :EndIf :RaceTimeSecs = (RaceTimer-((RaceTimer / 60000)*60000))/1000 :Text 0, 0, "Race Time " + Str$(RaceTimer / 60000)+":"+Mid$("0", RaceTimeSecs<10)+Str$(RaceTimeSecs)+"."+Str$((RaceTimer - (RaceTimer / 60000)*60000 - RaceTimeSecs*1000) / 100) + " Lap "+Str$((CurrentLap<=MaxLap)*CurrentLap + (CurrentLap>MaxLap)*MaxLap) + "/"+Str$(MaxLap)+" Speed "+Str$(Int(Speed#*3.6)) :Text 0, Screen Height()-20, Str$(Screen FPS()) :For i = 1 To 5*EnableGlow :Sync Mask 2^i :FastSync :Next i :Sync Mask %1 :Sync :Loop
Function VOp(Op, ResultV3, VectorAV3, VectorBV3, s#) :If Op = 1 :Linear Interpolate Vector3 ResultV3, VectorAV3, VectorBV3, s# :EndIf :If Op = 0 :Multiply Vector3 VectorBV3, s# :Add Vector3 ResultV3, VectorAV3, VectorBV3 :EndIf :If Op = -2 :VOp(0, 22, 22, SetVector3(15, Get Matrix4 Element(1, 8), Get Matrix4 Element(1, 9), Get Matrix4 Element(1, 10)), TrustInput# * 0.4* 0.6 * MaxSpeed# * ElapsedTime#) :VOp(0, 22, 22, SetVector3(15, X Vector3(22), Y Vector3(22), Z Vector3(22)), -((0.4 * MaxSpeed#) / MaxSpeed#) * ElapsedTime#) :Set Vector2 10, (1.0 - EnginePower#) * MemBlock Float(12, 268) + MemBlock Float(12, 272) * EnginePower#, (1.0 - EnginePower#) * MemBlock Float(12, 276) + MemBlock Float(12, 280) * EnginePower# :Set Vector2 3, X Vector2(4) > X Vector2(8), Y Vector2(4) > Y Vector2(8) :Set Vector2 8, X Vector2(8) + SelectVal2(X Vector2(3), -Y Vector2(10), X Vector2(10)) * ElapsedTime#, Y Vector2(8) + SelectVal2(Y Vector2(3), -Y Vector2(10), X Vector2(10)) * ElapsedTime# :Set Vector2 8, SelectVal2(SelectVal2(X Vector2(3), X Vector2(8) < X Vector2(4), X Vector2(8) > X Vector2(4)), X Vector2(8), X Vector2(4)), SelectVal2(SelectVal2(Y Vector2(3), Y Vector2(8) < Y Vector2(4), Y Vector2(8) > Y Vector2(4)), Y Vector2(8), Y Vector2(4)) :Set Vector2 3, X Vector2(8)*X Vector2(8), Y Vector2(8)*Y Vector2(8) :Linear Interpolate Vector2 3, 3, 8, MemBlock Float(12, 284) :VOp(0, 19, 19, SetVector3(15, X Vector2(3)-X Vector3(19), Y Vector2(3)-Y Vector3(19), 0.0), 10.0 * ElapsedTime#) :VOp(0, 20, 20, SetVector3(16, X Vector3(19)-X Vector3(20), Y Vector3(19)-Y Vector3(20), 0.0), 4.0 * ElapsedTime#) :Set Vector2 3, X Vector2(5) > 0.0, Y Vector2(5) > 0.0 :Set Vector2 6, X Vector2(6) + SelectVal2(X Vector2(3), -MemBlock Float(12, 300), MemBlock Float(12, 296)) * ElapsedTime#, Y Vector2(6) + SelectVal2(Y Vector2(3), -MemBlock Float(12, 300), MemBlock Float(12, 296)) * ElapsedTime# :Set Vector2 6, SelectVal2(SelectVal2(X Vector2(3), X Vector2(6) < 0.0, X Vector2(6) > 1.0), X Vector2(6), X Vector2(3)), SelectVal2(SelectVal2(Y Vector2(3), Y Vector2(6) < 0.0, Y Vector2(6) > 1.0), Y Vector2(6), Y Vector2(3)) :Set Vector2 7, X Vector2(7) + SelectVal2(X Vector2(3), -MemBlock Float(12, 312), MemBlock Float(12, 308)) * ElapsedTime#, Y Vector2(7) + SelectVal2(Y Vector2(3), -MemBlock Float(12, 312), MemBlock Float(12, 308)) * ElapsedTime# :Set Vector2 7, SelectVal2(SelectVal2(X Vector2(3), X Vector2(7) < 0.0, X Vector2(7) > 1.0), X Vector2(7), X Vector2(3)), SelectVal2(SelectVal2(Y Vector2(3), Y Vector2(7) < 0.0, Y Vector2(7) > 1.0), Y Vector2(7), Y Vector2(3)) :EndIf
EndFunction ResultV3 :Function SelectVal2(Value, Value1#, Value2#) :If Value >= 0 :Value2# = Value1# * (1-Value) + Value2# * Value :EndIf :If Value = -1 :Value2# = Value2# * (Value2# >= 0.0) :Value2# = (Value2# <= 1.0) * Value2# + (Value2# > 1.0) :EndIf :If Value = -2 :r = Make Matrix4(1) :r = Make Matrix4(2) :For i = 3 To 14 :r = Make Vector2(i) :Next i :For i = 15 To 38 :r = Make Vector3(i) :Next i :Load DLL "kernel32.dll", 1 :Ptr = Make Memory(8) :Call DLL 1, "QueryPerformanceFrequency", Ptr :Delete DLL 1 :TimerFreqDF = *Ptr :Hide Mouse :EndIf
EndFunction Value2# :Function SetVector3(ResultV3, X#, Y#, Z#) :If ResultV3 > 0 :Set Vector3 ResultV3, X#, Y#, Z# :Else :For cam = 1 To 5 :Make Camera cam :Set Camera To Image cam, 9+cam, Screen Width()/Val(Mid$("12441", cam)), Screen Height()/Val(Mid$("12441", cam)), 2*(Cam<>5), 21*(Cam<>5) :Color Backdrop cam, 0 :Next cam :Backdrop Off 5 :Backdrop Off 1 :For fx = 1 To 4 :Load Effect "Media\fx"+Chr$(48+fx)+".fx", fx, 0, 1 :Set Effect Constant Float fx, "viewport_inv_width", Val(Mid$("2441", fx)) / (Screen Width() * 1.0) :Set Effect Constant Float fx, "viewport_inv_height", Val(Mid$("2441", fx)) / (Screen Height() * 1.0) :Load Object "Media\Quad.dbo", 9+fx :Set Object Mask 9+fx, 2^(fx+1) :Set Object Light 9+fx, 0 :Set Object Effect 9+fx, fx :Texture Object 9+fx, 0, 9+fx :Disable Object ZRead 9+fx :Disable Object ZWrite 9+fx :Next fx :EndIf
EndFunction ResultV3 :Function SetVector3FromMemBlock(ResultV3, MemBlock, Index) :If ResultV3 > 0 :Set Vector3 ResultV3, MemBlock Float(MemBlock, Index*12), MemBlock Float(MemBlock, Index*12+4), MemBlock Float(MemBlock, Index*12+8) :Else :Load Object "Media\Ship.dbo", 1 :Load Image "Media\ShipTxt.jpg", 1 :Texture Object 1, 1 :Set Object Mask 1, 2^MainCamera :Make Mesh From Object 1, 1 :set shadow shading on 1,1,1000,1 :set light range 0,1000 :Load Object "Media\Trail.dbo", 3 :Load Image "Media\Trail12RGBA.png", 3 :Texture Object 3, 3 :Set Object Texture 3, 2, 0 :Set Object 3, 1, 2, 0, 1, 0 :Set Object Mask 3, 2^MainCamera :Set Alpha Mapping On 3, 0 :Load Object "Media\SkyBox.dbo", 5 :Texture Object 5, 5 :Set Object Light 5, 0 :Set Object Mask 5, 2^MainCamera :Scale Object 5, 236400.0, 236400.0, 236400.0 :EndIf
EndFunction ResultV3
