B3D Shooter:
AppTitle "3d Shooter" Graphics3D 640,480,0,1 SeedRnd MilliSecs() Const Number_of_enemies = 10 Global CenterX = GraphicsWidth()/2 Global CenterY = GraphicsHeight()/2 Global Abort = 0 Global FrameCount = MilliSecs() Global Camera = CreateCamera() CameraRange Camera,1,10000 Global Truce = 500 * Number_of_enemies Global DoFPS Global Writing$ = "Press Enter to view FPS" ;assemble the player Global CloneMe = CreatePivot() Global Player = CreateCylinder() EntityParent Player,CloneMe EntityColor Player,0,0,255 Global XLook Eyes = CreateImage(16,16) SetBuffer ImageBuffer(Eyes) Color 200,155,45 Rect 0,0,16,16 Color 64,32,0 Plot 4,8 Plot 12,8 Global FPSCalc = 0 TranslateEntity CloneMe,0,-7,1 TranslateEntity Camera,0,-3,1 ScaleMesh Player,1,3,1 Gun = CreateCylinder() EntityParent Gun,CloneMe PositionEntity Gun,0,2,2 ScaleMesh Gun,0.25,2,0.25 RotateEntity Gun,90,0,0 EntityColor gun,64,32,0 Sight = CreateCube() ScaleMesh Sight,0.0125,0.1,0.1 EntityColor Sight,0,0,0 HeadTexture = CreateTexture(64,64) SetBuffer TextureBuffer(HeadTexture) Color 200,155,45 Rect 0,0,64,64 DrawImage Eyes,8,16 Global Grass = CreateTexture(32,32) Global Light = CreateLight(2) LightColor Light,10,10,10 EntityParent Light,Camera Global Head = CreateSphere() Global Turban = CreateSphere() RotateEntity Head,0,-90,0 EntityParent Head,CloneMe EntityParent Turban,CloneMe EntityColor Turban,230,230,230 ScaleMesh Turban,1.25,0.75,1.25 EntityParent Sight,CloneMe PositionEntity Sight,0,2.25,3.75 EntityTexture Head,HeadTexture PositionEntity Head,0,4,0 PositionEntity Turban,0,5,0 SetBuffer TextureBuffer(Grass);Make grass texture Color 0,255,0 Rect 0,0,16,16 Rect 16,16,16,16 Color 0,250,0 Rect 16,0,16,16 Rect 0,16,16,16 SetBuffer BackBuffer() EntityType CloneMe,17 EntityRadius CloneMe,3 EntityPickMode CloneMe,1 ;done... ;make bullet Bullet = CreateCylinder() RotateEntity Bullet,90,0,0 ScaleMesh Bullet,0.125,150,0.125 EntityColor Bullet,255,255,16 Target = CreatePivot() ;RotateEntity Target,90,0,0 Blood = CreateCylinder() ScaleMesh Blood,5,.001,5 EntityColor Blood,160,0,0 Color 255,128,0 ;done... ;Build Enemies Dim NPC(Number_of_enemies + 1) Dim NPCBlood(Number_of_enemies) Dim NPCName$(Number_of_enemies) Dim NPCPrey(Number_of_enemies + 1) Dim NPCDead(Number_of_enemies + 1) Dim NPCInjurePoint(Number_of_enemies + 1) Dim NPCFiredShot(Number_of_enemies + 1) Dim NPCDirection(Number_of_enemies) Dim NPCTime(Number_of_enemies) Dim NPCGunshot(Number_of_enemies + 1) Dim NPCInaccuracy#(Number_of_enemies + 1) Dim NPCFiringDelay(Number_of_enemies + 1) For loop = 1 To Number_of_enemies NPCName(Loop) = Rename$() NPC(Loop) = CopyEntity(CloneMe) NPCGunshot(Loop) = CopyEntity(Bullet) NPCInjurePoint(Loop) = CopyEntity(Target) NPCInaccuracy(Loop) = Rnd(5,15) NPCBlood(Loop) = CopyEntity(Blood) HideEntity NPCBlood(Loop) EntityParent NPCInjurePoint(Loop),NPC(Loop) PositionEntity NPCInjurePoint(Loop),0,2,1 HideEntity NPCGunshot(Loop) EntityParent NPCGunshot(Loop),NPC(Loop) PositionEntity NPCGunshot(Loop),0,2,150 NPCDirection(Loop) = Rnd(-1,1) NPCTime(Loop) = Rand(1,100) PositionEntity NPC(Loop),Rand(-100,100),-7,Rand(-100,100) Next NPC(Number_of_enemies + 1) = CopyEntity(CloneMe) NPCGunshot(Loop) = CopyEntity(Bullet) EntityParent NPCGunshot(Number_of_enemies + 1),NPC(Number_of_enemies + 1) PositionEntity NPCGunshot(Number_of_enemies + 1),0,2,150 NPCInaccuracy(Number_of_enemies + 1) = Rnd(5,15) HideEntity NPCGunshot(Number_of_enemies + 1) NPCInjurePoint(Number_of_enemies + 1) = CopyEntity(Target) EntityParent NPCInjurePoint(Number_of_enemies + 1),NPC(Number_of_enemies + 1) PositionEntity NPCInjurePoint(Number_of_enemies + 1),0,2,1 HideEntity Blood HideEntity CloneMe HideEntity Bullet HideEntity Target HideEntity Turban EntityParent Camera,NPC(Number_of_enemies + 1) PositionEntity NPC(Number_of_enemies + 1),Rand(-100,100),-7,Rand(-100,100) Collisions 17,17,1,2 Global Ground = CreatePlane() EntityTexture Ground,Grass TranslateEntity Ground,0,-10,0 Runtime() End Function Runtime();Runtime function Repeat Timer = MilliSecs() Bounderies() UpdateNPCs() MouseLook() If Truce = 0 GunShot() TurnEntity NPC(Number_of_enemies + 1),0,-Xlook/5,0 MoveEntity NPC(Number_of_enemies + 1),KeyDown(205) - KeyDown(203),0,KeyDown(200) * 2 - KeyDown(208) UpdateWorld() RenderWorld() If KeyDown(28) Text CenterX,10,"FPS:",1,0 If KeyDown(28) Text CenterX,20,FPS(),1,0 Text CenterX,0,Writing,1,0 Flip If KeyHit(1) Abort = 1 While Not MilliSecs() - Timer > 25 Wend Until Abort = 1 End Function Function MouseLook() Xlook = MouseX() - CenterX MoveMouse CenterX,CenterY End Function Function UpdateNPCs() For Loop = 1 To Number_of_enemies If NPCDead(Loop) = 0 NPCTime(Loop) = NPCTime(Loop) - 1 If NPCTime(Loop) < 1 NPCTime(Loop) = Rand(1,100) NPCDirection(Loop) = Rnd(-1,1) EndIf If NPCPrey(Loop) = 0 TurnEntity NPC(Loop),0,NPCDirection(Loop),0 If Truce > 0 Truce = Truce - 1 If Truce = 0 Writing = "Let the killing begin!" FlushMouse Else ChooseTarget() Attack() DeadTarget() EndIf If NPCPrey(Loop) = 0 MoveEntity NPC(Loop),0,0,1 ElseIf NPCDead(NPCPrey(Loop)) = 0 If EntityDistance(NPC(Loop),NPC(NPCPrey(Loop))) > 250 MoveEntity NPC(Loop),0,0,1 EndIf EndIf Next End Function ;Function Function Gunshot() If MouseHit(1) NPCFiredShot(Number_of_enemies + 1) = 1 For Loop = 1 To Number_of_enemies If NPCDead(Loop) = 0 If NPCPrey(Loop) > 0 If NPCDead(NPCPrey(Loop)) = 0 NPCFiringDelay(Loop) = NPCFiringDelay(Loop) - 1 If NPCFiringDelay(Loop) <= 0 If EntityDistance(NPC(Loop),NPC(NPCPrey(Loop))) < 285 NPCFiredShot(Loop) = 1 NPCFiringDelay(Loop) = Rnd(30,40) EndIf EndIf EndIf EndIf EndIf Next For Loop = 1 To Number_of_enemies + 1 If NPCDead(Loop) = 0 If NPCFiredShot(Loop) = 1 TurnEntity NPC(Loop),0,Rnd(-NPCInaccuracy(Loop),NPCInaccuracy(Loop)),0 ShowEntity NPCGunshot(Loop) DeleteEntity% = EntityPick(NPCInjurePoint(Loop),300) NPCFiredShot(Loop) = 2 ElseIf NPCFiredShot(Loop) = 2 NPCFiredShot(Loop) = 0 HideEntity NPCGunshot(Loop) EndIf EndIf For Loop2 = 1 To Number_of_Enemies + 1 If NPC(Loop2) = DeleteEntity% If NPCDead(Loop2) = 0 If Loop2 = Number_of_Enemies + 1 GameOver(NPCName(Loop)) PositionEntity NPCBlood(Loop2),EntityX(NPC(Loop2)),-10,EntityZ(NPC(Loop2)) FreeEntity NPC(Loop2) ;NPC(Loop2) = 0 NPCDead(Loop2) = 1 ShowEntity NPCBlood(Loop2) If Loop = Number_of_Enemies + 1 Kill(NPCName(Loop2)) EndIf EndIf Next Next ;Is An NPC Dead End Function Function Rename$() Return Namegen$() + " " + Namegen$() End Function Function Namegen$() NameLength = Rand(4,8) Local Letter$[12] For loop = 1 To namelength char = Rand(1,26) Select char Case 1 Letter[Loop] = "a" Vowel = Vowel + 1 Case 2 Letter[Loop] = "b" Case 3 Letter[Loop] = "c" Case 4 Letter[Loop] = "d" Case 5 Letter[Loop] = "e" Vowel = Vowel + 1 Case 6 Letter[Loop] = "f" Case 7 Letter[Loop] = "g" Case 8 Letter[Loop] = "h" Case 9 Letter[Loop] = "i" Vowel = Vowel + 1 Case 10 Letter[Loop] = "j" Case 11 Letter[Loop] = "k" Case 12 Letter[Loop] = "l" Case 13 Letter[Loop] = "m" Case 14 Letter[Loop] = "n" Case 15 Letter[Loop] = "o" Vowel = Vowel + 1 Case 16 Letter[Loop] = "p" Case 17 Letter[Loop] = "q" Case 18 Letter[Loop] = "r" Case 19 Letter[Loop] = "s" Case 20 Letter[Loop] = "t" Case 21 Letter[Loop] = "u" Vowel = Vowel + 1 Case 22 Letter[Loop] = "v" Case 23 Letter[Loop] = "w" Case 24 Letter[Loop] = "x" Case 25 Letter[Loop] = "y" Vowel = Vowel + 1 Case 26 Letter[Loop] = "z" End Select If Vowel < Ceil(loop/2) Letter[Loop] = Re_vowel$() Vowel = Vowel + 1 If Loop = 1 Letter[Loop] = Upper$(Letter[Loop]) Name$ = name + Letter[Loop] Next Return Name End Function Function Re_vowel$() Numb = Rand(1,64) If Numb > 0 And Numb <= 16 Return "a" If Numb > 16 And Numb <= 34 Return "e" If Numb > 34 And Numb <= 46 Return "i" If Numb > 46 And Numb <= 56 Return "o" If Numb > 56 And Numb <= 62 Return "u" If Numb > 62 Return "y" End Function Function FPS() FramesPerSecond# = MilliSecs() - FrameCount FrameCount = MilliSecs() Return 1000 / FramesPerSecond End Function Function DeadTarget() For Loop = 1 To Number_of_Enemies If NPCDead(Loop) = 0 If NPCDead(NPCPrey(Loop)) = 1 NPCPrey(Loop) = 0 EndIf Next End Function Function ChooseTarget() For Loop = 1 To Number_Of_Enemies If NPCDead(Loop) = 0 If NPCPrey(Loop) = 0 For Loop2 = 1 To Number_Of_Enemies + 1 If NPCDead(Loop2) = 0 If Not Loop = Loop2 If JRAILib_Engage(NPC(Loop),80,NPC(Loop2),500) NPCPrey(Loop) = Loop2 EndIf EndIf Next EndIf EndIf Next End Function Function Attack() For Loop = 1 To Number_Of_Enemies If NPCDead(Loop) = 0 If NPCPrey(Loop)> 0 TurnEntity NPC(Loop),0,JRAILib_Orient#(NPC(Loop),NPC(NPCPrey(Loop)),5,1,9),0 EndIf Next End Function Function JRAILib_Orient#(JRAILib_Source,JRAILib_Recipient,JRAILib_Speed#,JRAILib_ReducedSpeed#,JRAILib_ReducedDistance#) JRAILib_DeltaPitch# = DeltaYaw#(JRAILib_Source,JRAILib_Recipient) If Abs(JRAILib_DeltaPitch) <= JRAILib_ReducedSpeed Return JRAILib_Pitch# + JRAILib_DeltaPitch If Abs(JRAILib_DeltaPitch) > JRAILib_ReducedDistance JRAILib_PitchChangeAmount# = JRAILib_Speed Else JRAILib_PitchChangeAmount# = JRAILib_ReducedSpeed EndIf If JRAILib_DeltaPitch# < 0 JRAILib_PitchChangeAmount# = JRAILib_PitchChangeAmount# * -1 Return JRAILib_PitchChangeAmount# End Function ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Function JRAILib_Engage(JRAILib_Hunter,JRAILib_BowlOfVision,JRAILib_Prey,JRAILib_SightRange) JRAILib_DeltaPitch = DeltaYaw#(JRAILib_Hunter,JRAILib_Prey) If Abs(JRAILib_DeltaPitch) <= JRAILib_BowlOfVision And EntityDistance(JRAILib_Hunter,JRAILib_Prey) <= JRAILib_SightRange And EntityVisible(JRAILib_Hunter,JRAILib_Prey) Return 1 Else Return 0 EndIf End Function Function GameOver(Murderer$) ClsColor 128,0,0 Cls Text CenterX,0,"You were gunned down by " + Murderer,1,0 Flip Repeat Until KeyHit(1) End End Function Function Kill(Victim$) Writing = "You Killed " + Victim End Function Function Bounderies() For Loop = 1 To Number_of_enemies + 1 If NPCDead(Loop) = 0 If EntityX(NPC(Loop)) > 1000 Or EntityX(NPC(Loop)) < -1000 Or EntityZ(NPC(Loop)) > 1000 Or EntityZ(NPC(Loop)) < -1000 PositionEntity NPC(Loop),Rand(-1000,1000),-7,Rand(-1000,1000) EndIf EndIf Next End Function