Virus style 3d level editor...

Blitz3D Forums/Blitz3D Beginners Area/Virus style 3d level editor...

I'm interested about old style 3d games. Such as Virus, Conqueror, Zeewolf, Hunter, etc...If you know any related games/resources feel free to point them out. I already found the awesome Z-VIRUS by Stevie G.

Anyway, I think I should make a level editor. Old style terrain editor with the ability to import simple 3d models and later to add game objects. I really don't know where to start. Are there any tutorials or other handy resources for this kind of work? Things I definetly should know? The graphical style is completely new to me but I think I need to learn more about level editors in general as well.

I believe the "level editor" for Z-Virus was a paint program; If you look at the LevelData directory, you'll see nothing but bmp "relief maps". The game (presumably) loads in the image for the correct map and creates a mesh for it, the brightness of each pixel denoting the altitude of the vertex. Certain colours (various shades of red) denote objects to be placed on the map, presumably at the same altitude as a neighbouring pixel.

Octothorpe is right ... not quite a paint program .. more procedural. Here's the sourse ... very messy but did it's job .... I used the red color for heightmap, green for object type and blue for ground type ...

Graphics3D 800,600,16,3

Global Camera = CreateCamera()
Const size = 256
Global maxheight=0

Type TerrainType
	Field LandIndex
	Field ObjectIndex
	Field Height#
	Field r,g,b
End Type
	
Dim Terrain.TerrainType( size-1, size-1 )

TERRAINinit()

TERRAINcreate( 427, 300 , 200, "TestMap5.bmp" )
;TERRAINload( "TestMap3.bmp" )

;===========================
;===========================
;===========================

Function TERRAINinit()

	For z = 0 To size -1
		For x =0 To size -1
			terrain( x, z ) = New TerrainType
			terrain(x,z)\landindex = 0
			terrain(x,z)\objectindex = 0
			terrain(x,z)\height = 0
		Next
	Next
		
End Function	

;===========================
;===========================
;===========================

Function TERRAINload( file$ )

	map = LoadImage( file$ )
	SetBuffer ImageBuffer( map )
	
	;get heights
	For z =0 To size -1
		For x =0 To size -1
			GetColor x, z
			terrain(x,z)\Height = ColorRed() 
			terrain(x,z)\Landindex = Floor( ColorBlue() / 50 )
			terrain(x,z)\ObjectIndex = Floor( ColorGreen()/25)
		Next
	Next
	
	;color terrain
	For z = 0 To size -1
		For x =0 To size -1
				
			GetColor x, z
			LandIndex# = Floor( ColorBlue() / 50.0 ) 
			ObjectIndex# = Floor( ColorGreen() / 25.0 )
			
			t.TerrainType = Terrain( x, z )
			
			th#=GetHeight( x+.5 , z+.5 ) 
					
			Select LandIndex
			
			Case 0
				t\r=60+Rand(40)
				t\g=60+Rand(40)
				t\b=200+Rand(40)
			Case 1
				t\r=th *10 + 30 + Rand(30)
				t\g=th *10 + 30+ Rand(30) 
				t\b=200-th *10+Rand(40)
			Case 2, 3
				t\r = th+Rand(60)
				t\g = limit( th+60+Rand(60), 0, 255 )
				t\b = th+Rand(60)
				
				If th > 64
					t\r = limit( th+ Rand(80), 0, 255)
					t\g = limit( th+ 60 + Rand (60),0,255 )
					t\b = limit( th + Rand(80),0 , 255)
				EndIf
				
			Case 4
				detail = ( ( z>125 And z< 131 ) And ( x = 125 Or x = 129) ) Or ( x>125 And x<129 And z=128 )
				col= ( detail * 155 ) + (  ( Not detail ) * Rand(100) ) + 100
				t\r=col
				t\g=col
				t\b=col
			End Select
		Next
	Next	
	
	FreeImage map
	
	test = CreateImage ( size, size )
	SetBuffer ImageBuffer(test)
	For z = 0 To size-1
		For x =0 To size -1
			t.terraintype = terrain( x, z )
			Color t\r, t\g, t\b
			Plot x, z
		Next
	Next	
	SetBuffer BackBuffer()
		
	heightmap = CreateImage( size, size )
	SetBuffer ImageBuffer( heightmap )
	Color 0,0,0:Rect 0,0,size,size,1
	For z =0 To size -1
		For x =0 To size -1
			red = terrain(x,z)\height
			Color red,0,0
			Plot x,z
		Next
	Next
	
	objectmap = CreateImage( size, size )
	SetBuffer ImageBuffer( objectmap )
	Color 0,0,0:Rect 0,0,size,size,1
	For z =0 To size -1
		For x =0 To size -1
			green = terrain(x,z)\objectindex * 25
			If green > 0 
				Color green,green,green
				Plot x,z
			EndIf
		Next
	Next
	
	landmap = CreateImage( size, size )
	SetBuffer ImageBuffer( landmap )
	Color 0,0,0:Rect 0,0,size,size,1

	For z =0 To size -1
		For x =0 To size -1
			blue = terrain(x,z)\landindex * 50
			Color 0,0,blue
			Plot x,z
		Next
	Next
	SetBuffer BackBuffer()

	DrawImage test,0,0
	DrawImage heightmap,400,0
	DrawImage landmap,0,300
	DrawImage objectmap,400,300
	Flip
	MouseWait

End Function

;===========================
;===========================
;===========================

Function TERRAINcreate( Seed , Passes , Rocks, file$ )
	
	SeedRnd Seed
		
	;do heights
	For Parts =1 To Passes
	
		StartX = Rand(0,size)
		StartZ = Rand(0,size)
		SlopeType = Rand(0,1)
				
		If Parts >  ( Passes - Rocks )
			IsARock = 5
			StartY# = Rnd( 4, 8 )
			Radius# = Rand( 4,8 )
		Else
			IsARock = 0
			StartY# = Rnd(4,32)
			Radius# = Rand(4,32)
		EndIf
			
		For z=-radius To radius
			For x=-radius To radius
				Distance# = Sqr( x*x + z*z )
				If Distance < Radius
					If SlopeType = 0 py#=Cos( Distance / Radius * 90) * StartY * 2.0
					If SlopeType = 1 py#=( 1.0 - Sin( ( Distance / Radius ) *90 ) ) * StartY *3.0
					px = WRAP( StartX + X , Size)
					pz = WRAP( StartZ + Z, Size)
					nh# = LIMIT( terrain( px, pz)\height + py , 0, 255 ) 
					Terrain( px , pz )\height = nh
					Terrain( px,pz)\LandIndex = IsARock			
				EndIf
			Next
		Next
	Next
	
	;Colour Landscape
	
	For z = size-1 To 0 Step -1 
		For x = 0 To size-1 
			th#=GetHeight( x+.5 , z+.5 )
			If terrain( x, z )\LandIndex = 0 
				;beach		 
				If th < 13 	terrain(x,z)\LandIndex = 1
				;water
				If th < 3 terrain(x,z)\LandIndex = 0
				;land
				If th > 12 terrain(x,z)\LandIndex = 2 + ( th > 16 )
			EndIf
		Next
	Next
	
	;Color Landing Pad
	For z=-5 To 4 
		For x=-5 To 4
			col=Rnd(100)+100
			xp=wrap(size*.5+x,size):zp=wrap(size*.5+z,size) 
			If x >-5 And z >-5 
				terrain(xp,zp)\height=30
			EndIf
			terrain(xp,zp)\LandIndex=4
		Next
	Next
	
	;position objects
	For z=size-1 To 0 Step -1 
		For x=0 To size-1 
			terrain(x,z)\ObjectIndex=0
			If terrain(x,z)\LandIndex = 3  
				If (x Mod 2)=0 And (z Mod 2)=0 And Rand(0,20)=0
					If Rand( 0,4 ) < 4 
						;trees
						terrain(x,z)\ObjectIndex=Rand(1,4)
					Else
						;buildings
						terrain(x,z)\ObjectIndex=Rand(0,2)+5
					EndIf
					If Rand(0,16)=0
						;windmills
						terrain(x,z)\ObjectIndex=9
					EndIf
				EndIf
			EndIf
		Next
	Next
	
	;rockets
	For z=127 To 131 Step 2
		terrain(131,z)\ObjectIndex=10
	Next
	
	;radar towers
	For z=0 To 7:For x=0 To 7
		px=wrap(x*32+Rand(-4,4)*2,size)
		pz=wrap(z*32+Rand(-4,4)*2,size)
		If z=4 And x=4 px=130:pz=125
		terrain(px,pz)\ObjectIndex=8
	Next:Next
	
	;bonus crates
	crates=0:cratesno = 9
	Repeat
		x=Rand(0,size-1)
		z=Rand(0,size-1)
		If (x Mod 2)=0 And (z Mod 2)=0 And terrain(x,z)\landindex = 3 And terrain(x,z)\ObjectIndex = 0
			terrain(x,z)\ObjectIndex=11
			crates=crates+1
		EndIf
	Until crates = cratesno
	terrain(125,125)\ObjectIndex=11
		
	;test it works	
	heightmap = CreateImage( size, size )
	SetBuffer ImageBuffer( heightmap )
	Color 0,0,0:Rect 0,0,size,size,1
	For z =0 To size -1
		For x =0 To size -1
			green# = terrain(x,z)\height 
			blue = terrain(x,z)\landindex * 40 
			red = terrain(x,z)\objectindex * 20 
			Color red,green,blue
			Plot x,z
		Next
	Next
		
	objectmap = CreateImage( size, size )
	SetBuffer ImageBuffer( objectmap )
	Color 0,0,0:Rect 0,0,size,size,1
	For z =0 To size -1
		For x =0 To size -1
			green = terrain(x,z)\objectindex * 25
			If green > 0 
				Color green,green,green
				Plot x,z
			EndIf
		Next
	Next
	
	landmap = CreateImage( size, size )
	SetBuffer ImageBuffer( landmap )
	Color 0,0,0:Rect 0,0,size,size,1
	For z =0 To size -1
		For x =0 To size -1
			blue = terrain(x,z)\landindex * 50
			Color 0,0,blue
			Plot x,z
		Next
	Next
	SetBuffer BackBuffer()
	
	
	DrawImage heightmap,0,0
	DrawImage landmap,0,300
	DrawImage objectmap,400,300
	Flip
	MouseWait
	
	
	SaveImage ( heightmap, file$)
	FreeImage heightmap
	FreeImage landmap
	FreeImage objectmap 
					
End Function

;===========================
;===========================
;===========================

Function GetHeight( bx#,bz# )

	bx=wrap(bx,size)
	bz=wrap(bz,size)
	tx#=Floor(bx)
	tz#=Floor(bz)
	ix#=bx - tx:iz#=bz - tz  
	cx#=WRAP(tx+1.0,size) 
	cz#=WRAP(tz+1.0,size) 
	
	;collision height
	v1#=terrain(tx,tz)\height+(terrain(cx,tz)\height-terrain(tx,tz)\height)*ix
	v2#=terrain(tx,cz)\height+(terrain(cx,cz)\height-terrain(tx,cz)\height)*ix
	Return v1+(v2-v1)*iz

End Function

;===========================
;===========================
;===========================

Function WRAP#( q# , hi# , lo#=0 )
	
	If q < lo Then q = hi + (q-lo)
	If q >= hi Then q = lo + (q-hi)
	Return q
	
End Function

;===========================
;===========================
;===========================

Function limit#(q#,low#,hi#)

	If q < low q = low
	If q > hi q = hi
	Return q
	
end function



Thanks for that, Stevie. I'm having a lot of fun playing with your code :).

I guess a paint program could do the job. I'm not planning anything big. Still, it would be nice to add/move/delete objects in a 3d editor of some sort.

Any alternative ideas?