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