The following should be run-able as is. Check out the Yaw values, though, I dunno why I can't seem to fix them to stay to 90 degree increments. :S
;Dungeon
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
Global screenbk=CreateImage(GraphicsWidth(),GraphicsHeight())
Global underw_a
;*****************************INITIALISE******************************
SeedRnd MilliSecs()
AmbientLightR=128
AmbientLightG= 128
AmbientLightB= 128
MasterFogRangeNear=-12
MasterFogRangeFar=8
Global cam=CreateCamera()
EntityType cam,2,0
CameraViewport cam,0,0,800,600
ScaleEntity cam,0.5,1,0.5
CameraFogMode cam,1
CameraFogColor cam,AmbientLightR /8,AmbientLightG /8,AmbientLightB /8
CameraFogRange cam,MasterFogRangeNear,MasterFogRangeFar
CameraRange cam,0.01,MasterFogRangeFar+2
ViewFar=MasterFogRangeFar
ViewNear=MasterFogRangeNear
camlight=CreateLight(2)
EntityParent camlight,cam,1
LightRange camlight,4
EntityRadius cam,0.3
Global fpcounter#
Global timer
Global TORCH=0
Global poison=0
Global tempPoison#=0
Global tpadd#=0.01
;****************************BUILD ARRAYS *****************************
Dim vpos#(1,1)
Dim Map(200)
;***************************CREATE QUICK RANDOM MAP**********************
Fl=CreatePlane()
MoveEntity fl,0,-1,0
;ftx=LoadTexture("Floor.bmp")
;EntityTexture Fl,ftx
;FreeTexture ftx
For f= 1 To 200
Map(f)=CreateWall()
ScaleMesh Map(f),1,4,1
Morph(Map(f))
PositionEntity Map(f),Rand(-15,15),0,Rand(-15,15)
Next
;******************************* SET COLLISIONS ******************
Collisions 2,3,3,1
;*************************** MAIN LOOP ****************************
Global fps#=0
timer=MilliSecs()
While Not KeyDown(1)
;*************************CONTROLS*****************************
PositionEntity cam,Int(EntityX(cam)),0,Int(EntityZ(cam)),1
RotateEntity cam,0,Floor(EntityYaw(cam)),0,1
If KeyDown(200) Then walkforward(cam)
If KeyDown(208) Then walkbackward(cam)
If KeyDown(203) Then turnleft(cam)
If KeyDown(205) Then turnright(cam)
If KeyDown(25)
Delay 150
poison = (1-poison)
If poison=1
AmbientLightR=AmbientLightR-64
AmbientLightB=AmbientLightB-64
End If
If poison=0
CameraZoom cam,1
AmbientLightR=AmbientLightR+64
AmbientLightB=AmbientLightB+64
EndIf
AmbientLight AmbientLightR,AmbientLightG,AmbientLightB
EndIf
If KeyDown(20)
Delay 150
TORCH=(Not TORCH)
If TORCH
AmbientLightR=AmbientLightR+64
AmbientLightG=AmbientLightG+64
AmbientLightB=AmbientLightB+32
FogRangeFar=MasterFogRangeFar+2
CameraRange cam,0.01,FogRangeFar+2
CameraFogRange cam,FogRangeNear,Rand(FogRangeFar,FogRangeFar+4)
LightColor camlight,Rand(32)+16+AmbientLightR,Rand(32)+16+AmbientLightG,AmbientLightB+16
ShowEntity camlight
ViewFar=(ViewFar*2)
EndIf
If Not TORCH
AmbientLightR=AmbientLightR-64
AmbientLightG=AmbientLightG-64
AmbientLightB=AmbientLightB-32
CameraFogRange cam,FogRangeNear,MasterFogRangeFar
CameraRange cam,0.01,MasterFogRangeFar-2
HideEntity camlight
EndIf
AmbientLight AmbientLightR,AmbientLightG,AmbientLightB
CameraFogColor cam,AmbientLightR/8,AmbientLightG/8,AmbientLightB/8
CameraFogColor cam,AmbientLightR /8,AmbientLightG /8,AmbientLightB /8
CameraFogRange cam,FogRangeNear,FogRangeFar
CameraRange cam,0.01,FogRangeFar+2
EndIf
If TORCH
EndIf
;*************************TORCHLIGHT*******************************
render()
Wend
End
;*******************************************FUNCTIONS************************
Function walkforward(entity)
If poison=1
CameraClsMode cam,0,0
End If
For f= 1 To 5
MoveEntity entity,0,0.05,0.1
render()
Next
For f= 1 To 5
MoveEntity entity,0,-0.05,0.1
render()
Next
If poison=1 Then CameraClsMode cam,1,1
End Function
Function walkbackward(entity)
If poison=1
CameraClsMode cam,0,0
End If
For f= 1 To 5
MoveEntity entity,0,0.1,-0.1
render()
Next
For f= 1 To 5
MoveEntity entity,0,-0.1,-0.1
render()
Next
If poison=1
CameraClsMode cam,1,1
End If
End Function
Function turnleft(entity)
yw=Int(Floor(EntityYaw(entity)))
For f=0 To 20
TurnEntity entity,0,4.5,0,True
render()
Next
RotateEntity entity,0,yw+90,0,True
;q=EntityYaw(entity,True) Mod 90
;If q<>0 Then TurnEntity entity,0,-q,0,True
End Function
Function turnright(entity)
yw=Int(Floor(EntityYaw(entity)))
For f=0 To 20
TurnEntity entity,0,-4.5,0,True
render()
Next
;RotateEntity entity,0,yw-90,0,True
;q=EntityYaw(entity,True) Mod 90
;If q<>0 Then TurnEntity entity,0,q,0,True
End Function
Function CreateWall()
;*****************************CREATE SEGMENTED CUBE FROM 6 SIDES **************
mesh=CreateMesh()
segs=3
For scnt=0 To 3
surf=CreateSurface( mesh )
stx#=-.5
sty#=stx
stp#=Float(1)/Float(segs)
y#=sty
For a=0 To segs
x#=stx
v#=a/Float(segs)
For b=0 To segs
u#=b/Float(segs)
AddVertex(surf,x,y,0.5,u,v)
x=x+stp
Next
y=y+stp
Next
For a=0 To segs-1
For b=0 To segs-1
v0=a*(segs+1)+b:v1=v0+1
v2=(a+1)*(segs+1)+b+1:v3=v2-1
AddTriangle( surf,v0,v1,v2 )
AddTriangle( surf,v0,v2,v3 )
Next
Next
RotateMesh mesh,0,90,0
Next
UpdateNormals mesh
EntityType Mesh,3,1
EntityBox mesh,-0.5,0,-0.5,1,4,1
;wtx=LoadTexture("Wall.bmp")
;EntityTexture Mesh,wtx
;FreeTexture wtx
Return mesh
End Function
;**************************MORPH VERTS*****************************
Function Morph(mesh)
surftotal=CountSurfaces(mesh)
For xx= 1 To surftotal
as1=GetSurface(mesh,xx)
; record the locations of the verts
Dim vpos#(CountVertices(as1)-1,3)
For n=0 To CountVertices(as1)-1
vpos(n,0)=VertexX(as1,n)
vpos(n,1)=VertexY(as1,n)
vpos(n,2)=VertexZ(as1,n)
vpos(n,3)=0
Next
For n=0 To CountVertices(as1)-1
; change these to make it more or less messy
xm#=Rnd(-.1,.1)
ym#=Rnd(-.1,.1)
zm#=Rnd(-.1,.1)
For nn=0 To CountVertices(as1)-1
; if the vert has not been monkeyed with monkey away
If vpos(nn,3)=0
If vpos(n,0)=vpos(nn,0) And vpos(n,1)=vpos(nn,1) And vpos(n,2)=vpos(nn,2)
VertexCoords as1,nn,vpos(nn,0)+xm,vpos(nn,1)+ym,vpos(nn,2)+zm
vpos(nn,3)=1
EndIf
EndIf
Next
Next
Next
Return mesh
End Function
Function render()
;*************************MAINTAIN FACING*******************
RotateEntity cam,0,EntityYaw(cam),0,True
If poison=1
tempPoison#=tempPoison#+tpadd#
If TempPoison#>1 Then tpadd#=(0-0.01)
If TempPoison#<0.8 Then tpadd#=0.01
CameraZoom cam,tempPoison#
EndIf
UpdateWorld
RenderWorld
Text 600,50,EntityX(cam,True)+" , "+EntityZ(cam,True),1,1
Text 600,70,EntityYaw(cam,True)
Text 0,100,"POLYS: "+TrisRendered(),0,1
Text 0,200,"FPS: "+fps#,0,1
If poison Text 0,250,"POISON AFFLICTION APPLIED",0,1
If TORCH Text 0,280,"TORCHLIGHT ACTIVE",0,1
fpcounter#=fpcounter#+1
If (MilliSecs()-timer)>=1000
timer=MilliSecs()
fps#=fpcounter#
fpcounter#=0
EndIf
If poison=1
CaptureScreen()
WobbleView()
End If
Flip
End Function
; COLLISIONS INDECES
;1 = PLAYER
;2 = CAMERA
;3 = WALL
Function capturescreen()
CopyRect 0,0,GraphicsWidth(),GraphicsHeight(),0,0,BackBuffer(),ImageBuffer(screenbk)
End Function
Function WobbleView()
gw#=GraphicsWidth()
gh#=GraphicsHeight()
underw_a=(underw_a+4)
steph#=gh/32
mu8#=gh/60
If underw_a>359 Then underw_a=0
For iif#=0 To gh-4 Step .001
wsin#=(Sin((underw_a+iif)Mod 360.0)*mu8#)
CopyRect 0, iif, gw,steph+4, 0,iif+wsin#, ImageBuffer(screenbk),BackBuffer()
iif=iif+steph
Next
End Function
|