BattleTanks II Beta Release

Miscellaneous Forums/Blitz Showcase/BattleTanks II Beta Release

Note: BattleTanks II is no longer in Beta. Unfortunately, I can't edit the thread title.

BattleTanks II is a combination action/strategy tank combat game where you can battle against up to 3 other teams of computer-controlled tanks, in one of 5 unique battlefields. BattleTanks II features three tank types to choose from, each with their own strengths and weaknesses.

There are many ways to winning a war in BattleTanks II. If you like being the commander of your army, you can sit back away from the action, directing your army's actions strategically. However, if you prefer action, there's nothing stopping you from helping your tanks out and join the fight. You can make sneak attacks, massive assaults, try weakening your enemy with artillery, and much more. With BattleTanks II, the possibilities are endless.

Download BattleTanks II HERE (14.7 MB)

Note: Since the programming competition I am entering this game in requires that the game run on a GeForce 2, the default settings are set very low. If your computer is faster than this, you may want to turn all the settings up.






Suggestions/comments are welcome.

WOW, you've really gone to town on this!

i like this quite alot

Grey: Yeah. I've really put alot of work into this, so hopefully I'll have a chance to win the competition. :)

Devious: I'm glad you like it. Please let me know if you find any bugs, or have any ideas for improvement.

Cool....!

lots of action once the reinforcements come to town...

this is really decent... i had a lot of fun trying to kill something :) but those comrades of mine kept stealing my kills :0)

the action was smooth and fast... and i liked the options and the smooth menu transitions...

are you up for a suggestion or two (ya know it was comin :) )...

1- the commands to the group (real nice touch)... maybe a lil radio chatter when you give the command, and a second or two after, more chatter as the troops acknolwedge...

2- don't allow the tanks to go everywhere... try and have the enemy ai keep the tanks on a road, or along some path when they are in transit (that'll be a fun job)...


otherwise... great!!!

--Mike

Thanks for the comments / suggestions.

Red Ocktober: Today I just added some speech to BattleTanks II, so your team will reply "Roger" or "Affirmative" (or sometimes "Negative") after you give a command. Regarding suggestion #2, I don't think I'll have enough time to rewrite the pathfinding code, unfortunately (the competition is ending soon).

Looks cool, but I would expect real historical tanks if you use national symbols.

This week I was shooting mostly Americans, Japanese, Russians and Germans...

Great fun :).

After too much testing i've found the AI is easily defeated by using defeat in detail strategies.

but I would expect real historical tanks if you use national symbols.

They are actually (but I've only had enough time to do American tanks, so other countrys just use american tanks with different "paint". The light tank is the M4 Sherman, the medium tank is the M10 Wolverine, and the heavy tank is the M1 Abrams.

using defeat in detail strategies.

I don't think I understand. Are you saying that, by using strategy, the AI can be defeated too easily?

P.S. Have you tried "Veteran" AI mode, or is that also too easy?

Update: Shells and explosions now cause craters in the terrain:



this is great! How hard would it be to adapt to multiplayer, over gnet or lan? That would be neat!

I don't think I understand. Are you saying that, by using strategy, the AI can be defeated too easily?

Yes, play any scenario and press follow me or hold position orders for the first few respawns until you've a nice size battlegroup, then get your tanks to follow you and your massed ranks can easily defeat the AI by weight of numbers, whatever the difficulty or scenario - sadly :/

Still lots of fun though :)

John, it plays great!

Becky! I miss your tank game! Where is it! ;)

Oh yeah. Add infantry, air support and multiplayer and I'll join ya online for some of this.

Becky! I miss your tank game! Where is it! ;)

The last public release is here: http://www.bansheestudios.com/Paradise%20Island.html

/threadjack off :)

this is great! How hard would it be to adapt to multiplayer, over gnet or lan? That would be neat!

I've never made a multiplayer game before, so I would have to learn alot more about network coding first. I may make a multiplayer version later, but I'm not sure.

Yes, play any scenario and press follow me or hold position orders for the first few respawns until you've a nice size battlegroup, then get your tanks to follow you and your massed ranks can easily defeat the AI by weight of numbers, whatever the difficulty or scenario - sadly :/

Yeah. I've noticed that too. I'll try to think of a way to avoid this, maybe as an optional setting. One way currently to make it more fair is to go into the settings and lower the tank limit. You could also try the other reinforcement modes ("No Reinforcements", "When Clear", and "Periodic").

What I probably should do is add a scoring system so that you'll have to destroy tanks yourself to get any considerable score.

How about an AI strategy feature that calculates the number of tanks in the vicinity of the player and ensures tries to ensure that they also have a group (on a nominal 'leader' tank) of at least 75% the size?

Another possibility would be to have player orders effect tanks within a certain range, this would also help with ...

...How about allowing players to group and squad, or at least give direct orders too, tanks so that there are other strategic options instead of moving around as 1 unit. It would be nice to be able to place groups of tanks in key control areas on the map. Including such a feature would then require some level of teamwork AI also, else it would become too easy.

Banshee: Yeah.. those are some really good ideas. Thanks!

Update:
* "Victory" music played when you win
* Better music added
* Misc. minor bugs fixed

The final release of BattleTanks II will be out by Tuesday or Wednesday, if all goes well.

This is a good game, you have done blitz justice. My only points would be that the tank turret indicator graphic, to me, looks out of place and doesnt match the quality of the rest of the game.

Keep up the good work, look forward to the final version.

Chevron: I'm glad you like BattleTanks II. I've made the turret indicator slightly less intrusive, with .5 alpha now. I may improve the graphic in future versions, but it will have to do for now (the competition is ending soon).

Update: The final release of BattleTanks II is out!
To get it, simply re-download the link above, or click HERE

"They are actually (but I've only had enough time to do American tanks, so other countrys just use american tanks with different "paint"."

OK, I see. :) Good luck with this project. Looks very good so far.

-AF

M4 Sherman, the medium tank is the M10 Wolverine, and the heavy tank is the M1 Abrams.

Surely the heavy American tank is/should be the Pershing not the Abrams? As the others are WW2 vehicles. I'm not sure what you'd do for the Japanese, I dont think they made any heavy armour 'though I could be wrong. The British also had some good WW2 tanks, you could even argue the late-war Comet was the top super tank of the time - "Wolverine" btw is the British designation of the US M10, i'm not sure what the Americans called it - maybe the same name.

You're right; the M26 Pershing would have been better suited than the M1 Abrams. The reason I used the Abrams is that I never really concidered this a WWII game. I probably should have done more research before deciding on the tanks.

I'm not sure about what the M10 was called in the US, if not the Wolverine. Proabably just the "Tank Destroyer" or "TD". Either way, it doesn't matter. I just call it the "Medium Tank" :)

:)
Well if you do go down the WW2 route here's the tanks I would recommend looking into for their notoriety/fame/recogniseable distinctiveness etc. (I know far more about WW2 then is healthy for me).

German: Panzerkampfwagon III (light); Panzerkampfwagon IV (medium) and Panzerkampfwagon VI Ausf F Jaeger (heavy).

Russian: T70 (light); T34 (medium); JSII (IS-2) Iosef Stalin (heavy)

British: Sherman (light); Cromwell (medium); Comet (heavy)

Japanese: Type 94 Te Ke (light); Type 95 Ha Go (medium); Type 97 Chi Ha (heavy)

Thanks :). The tanks you listed seem perfect for the game. I'll probably add them in future versions.

What a Romp, drivin about shootin n scootin and splodin n crashin.

Great Stuff!

Is it alright to show the game to my friends as I am sure they would have a blast playing, seeing as how we are all old fogies and hanker for the old days daring do :)

Very well done.

Cheers
Garion

Garion: That would be fine - you can show it to anyone you want. I hope your friends enjoy it :)

Great little game. Develop it further!

Hey, i changed the options, changed resolution, asked to restart, clicked yes, and it didnt close the current app and it opened a new one so i had two music tunes going at the same time, had to alttab to switch off the other one (i just clicked on taskbar and it went off).

Now that you mention it, I think I remember something like that happening to me, too. I'll try to fix this ASAP.

Ok, I've got it fixed now. It seems that a fullscreen blitz app freezes (which is why it couldn't exit the old instance) when another full-screen blitz window is open. I fixed it by changing the current game into a window before executing the game again, which allows it to exit nicely. Unfortunately, I can't upload the new version for a few days (I'm on dial-up now, which uploads at around 1 KB/sec)

This looks great; I'll definitely try it when I get home tonight. I see that this is II, so did you do the code-only tanks game that was posted a little while ago? That was a hoot, so that same game but with better graphics should be awesome.

wow looks cool - ill be trying it when i get home from work too!

jhocking: Yeah, the gameplay is similar to the first version, but with base capture (optional), better graphics, music, sounds, etc., etc. However, BattleTanks II does not include the scoring system and the AI tank's chat box. I wanted to get these in BattleTanks II, but I didn't have enough time to develop a 3D text system (the 2D text used in BattleTanks I really slowed it down).

Okay, wow! Everyone who hasn't played this yet, do so.

Fantastic work, huts off.

VICTORY!

Nice:)

Very impressive. Great sound effects and music and alot of fun. Presentation is also very too.

One minor gripe ... It would be good to know your turret orientation on the map ... easier to know which direction "the others" are coming from :)

Update: Fixed slight problem where restarting after changing the resolution would leave 2 BattleTanks windows open, causing conflicting music.

Stevie G: I'm planning to change the map so it rotates as you rotate the turret.

What a wonderful game. The menu has clean graphics, and the terrain and world is great. The whole presentation of the thing is amazing. One thing that would be quite interesting would be to add a little machine gun on the tanks, instead of just a cannon. Of course this might take some effort, especially integrating it into the AI tanks.

Good luck with it all.

A machine gun wouldn't be too hard to impliment, although there's no real reason in this game for them; there's not much a machine gun can do to a tank's armor. :)

online multiplayer would rock!!!

Good job,very professional look.
By the way, what program did you use to make the colormaps-lightmaps for the terrains ?

The heightmaps and color/lightmaps were all made with L3DT. It works really well with Blitz3D, because you can export the heightmap, colormap, lightmap, etc. in almost any format you want.

Great game!
I noticed that the tanks get darker when you go in the shade.
How did you do that?

Also, I am realy confused about shadows in general.
Would you mind helping me out a little?

I noticed that the tanks get darker when you go in the shade.
How did you do that?

There's an array which holds a low-res (256x256) grayscale image of the terrain colormap, which is filled in during loading time (an array is used because it is much faster than reading from textures or images). Then it basically reads the pixel the tank is on (with interpolation, for smooth shade transitions), and colors it accordingly.

Also, I am realy confused about shadows in general.

The tank shadows are simply a alpha-blended textures (basically just a blurry rectangle) which are applied to the terrain by a dynamically deformed mesh to conform to the terrain's contours perfectly.

I also added several optimizations, including culling and frame-skip optimization (with interpolation) to boost speed.

I might release my shadow system for free. It's really easy to set up for your objects (just call ShowShadow(mesh, shadowimage) or HideShadow(mesh) to enable/disable shadows, and call UpdateShadows() before each render)

I don't think I can add anything to what's already been said, so I'll just say well done. Time flies out the window when you play this.

The music makes me want to join the army. But then leave the army because I want nothing to do with it. Great game! Keep it up man!

Thanks for the help!
That would be great if you would be willing to release your shadow system!

very cool. my team seems to prefer hanging around the armor replinishment area and shoot the walls. they don't seem to be aware that it's in the way.

oh, and i made you some loops...

www.strafed.net/stuff/battle1.mp3
www.strafed.net/stuff/battle2.mp3

Well done!

Some ideas (may have been posted already)
- Add "call" for a supply drop (crate that repairs nearby armor)
- Add "Arrows" to the outer circle of the mini map pointing to the next flag in that dir (red or blue)
- Change the gui from the keypad block in the lower middle to a more slick one (wider but narrow)
- Add a "message" like: Flag X has been taken / won
- Add more items to make the landscape more interesting.
- Add a level editor
- Add faster Jeeps = then you need the tank mg :)
- Limit ammo / bullets and add ammo crates near the flags.
- Make 1280x1024 resolution possible

blitznerd: Here you go:
;Terrain Shadow Library
;Copyright (C) 2006 John Judnich

;NOTE: Any shadow may not span more than SHADOW_TILES terrain tiles

;TODO:
;+	Ignore update of shadows behind camera
;+	Add frame-skip optimization with interpolated fill-in
;	 Add automatic shadow contour rendering

Const SHADOW_TILES = 256
Const Y_OFFSET# = .7
Const EDGE_Y_OFFSET# = .3

Global ShadowTerrain
Global ShadowTerrainScale#
Global ShadowPivot
Global ShadowFrameSkip = 1
Global FrameCount = 0

Type TerrainShadow
	Field Entity
	Field LastX#, LastY#, LastZ#
	Field LastPitch#, LastYaw#, LastRoll#
	
	Field Size#
	
	Field ShadowTexture
	Field ShadowMesh
	Field ShadowSurface
	
	Field ViewDist#
	Field Visible
	Field Hidden
	
	Field Alpha#
	Field Scale#
End Type


;This initializes the shadow system, making it ready for use. Basically, this just
;sets a variable to a terrain so the shadow system knows what to cast the shadows on.
;Optionally, you can set FrameSkip to adjust how many frames must elapse before the
;shadow mesh is regenerated to fit the terrain's shape. 0 will keep the shadow up to
;date at all times, while higher values may cause some visual "glitches" (mostly on
;mountainous terrains where the shape under the shadow caster changes constantly),
;although the shadow system will run much faster. The default value for FrameSkip is
;1, which works well for almost any terrains.
Function ShadowsInit(Terrain, TerrainScale#, FrameSkip = 1)
	ShadowTerrain = Terrain
	ShadowTerrainScale# = TerrainScale
	ShadowFrameSkip = FrameSkip
	FrameCount = FrameSkip
	If ShadowPivot = 0 Then ShadowPivot = CreatePivot()
End Function


;Use this function to turn on shadows for a specified entity. After calling this function,
;you should see it's shadow on your terrain (as long as you be sure to call UpdateShadows()
;before RenderWorld. "ShadowTexure" provides the option to specify your own shadow, instead
;of letting the shadow system automatically render it. Specifying your own shadow can improve
;loading time with many many entities. Note: When specifying a custom shadow image, you only
;need to do it once - after you do, you can omit the ShadowTexture parameter.
Function ShowShadow(Entity, ShadowTexture = 0)
	objnum = Int(EntityName$(Entity))
	obj.TerrainShadow = Object.TerrainShadow(objnum)
	
	If obj = Null Or ShadowTexture <> 0 Then ;If there is no shadow for Entity, or it's texture is being changed, then make a new one
		;If the shadow texture is being changed, delete the shadow and start over
		If obj <> Null Then DeleteShadow(Entity)
		
		;Create a new shadow
		obj.TerrainShadow = New TerrainShadow
		NameEntity Entity, Handle(obj)
		obj\Entity = Entity
		
		obj\Size = MeshWidth(Entity)
		depth# = MeshDepth(Entity)
		If depth > obj\Size Then obj\Size = depth
		
		obj\ShadowMesh = CreateMesh()
		EntityFX obj\ShadowMesh, 1+32
		EntityBlend obj\ShadowMesh, 1
		obj\ShadowSurface = CreateSurface(obj\ShadowMesh)
		
		HideEntity obj\ShadowMesh

		obj\Alpha = .7
		obj\ViewDist = 0
		obj\Scale = 1
		obj\Hidden = False
		obj\Visible = False
				
		;Render the shadow if a texture is not specified, otherwise use the given texture
		If ShadowTexture = 0 Then
			;TODO: Render soft shadow to texture
		Else
			obj\ShadowTexture = ShadowTexture
		End If
		
		;Apply texture
		EntityTexture obj\ShadowMesh, obj\ShadowTexture
	Else
		If obj\Hidden = True Then
			;Un-hide the shadow if it already exists
			ShowEntity obj\ShadowMesh
			obj\Hidden = False
		End If
	End If
End Function


;This can be used to temporarily turn off a shadow for an object. If you do not plan to show the
;shadow again, DeleteShadow() can be used instead, which deletes it from memory.
Function HideShadow(Entity)
	objnum = Int(EntityName$(Entity))
	obj.TerrainShadow = Object.TerrainShadow(objnum)
	
	If obj <> Null Then
		If obj\Hidden = False Then
			;Hide the shadow if it exists
			HideEntity obj\ShadowMesh
			obj\Hidden = True
		End If
	End If
End Function


;This turns off an object's shadow, deleting the shadow from memory. You must also be sure to call
;this function before deleting a shadowed entity, because the shadow system may crash, trying to
;access a deleted object when rendering the shadow.
Function DeleteShadow(Entity)
	objnum = Int(EntityName$(Entity))
	obj.TerrainShadow = Object.TerrainShadow(objnum)
	
	If obj <> Null Then
		;Delete the shadow if it exists
		FreeEntity obj\ShadowMesh
		Delete obj
	Else
		DebugLog "Warning: Tried to delete a non-existant shadow"
	End If
End Function


;This sets the view distance for a shadow. This can be used to increase performance when you have a
;very large amount of objects casting shadows. To disable the view distance limit, set the view
;distance value to 0. Note: When an object reaches the end of it's view distance, the shadow is not
;instantly hidden, the shadow's visibility varies with the object's distance from the camera. Default: 0
Function ShadowViewDistance(Entity, ViewDistance#)
	objnum = Int(EntityName$(Entity))
	obj.TerrainShadow = Object.TerrainShadow(objnum)
	
	obj\ViewDist = ViewDistance	
End Function


;This sets the alpha (transparency) value of a shadow. Values near 0 produce shadows that are barely visible,
;while values near 1 produce shadows almost completely opaque. Default: 0.6
Function ShadowAlpha(Entity, Alpha#)
	objnum = Int(EntityName$(Entity))
	obj.TerrainShadow = Object.TerrainShadow(objnum)
	
	obj\Alpha = Alpha
End Function


;You can use this function to adjust the size of an object's shadow. Default: 1.0
Function ShadowScale(Entity, Scale#)
	objnum = Int(EntityName$(Entity))
	obj.TerrainShadow = Object.TerrainShadow(objnum)
	
	obj\Scale = Scale 
End Function


;This is a completely optional function which you can use to pre-load shadows for an image, without
;actually showing them yet. You can use this during your loading screen if you are displaying shadows
;for a very large number of objects, and you are using the shadow system's built-in shadow render
;(which can be slow when preparing many objects' shadows). In most cases, however, this function is
;completely unnecessary and you don't need to use it, since the shadow system will automatically prepare
;an object's shadow the first time you call ShowShadow() for an entity.
Function PrepareShadow(Entity, ShadowTexture)
	objnum = Int(EntityName$(Entity))
	obj.TerrainShadow = Object.TerrainShadow(objnum)
	
	If obj = Null Then
		ShowShadow(Entity, ShadowTexture)
		HideShadow(Entity)
	End If
End Function


;This function updates all object's shadows so they appear correctly on your terrain. It is very important that
;you call this function before RenderWorld each loop or shadows may appear incorrectly. "Cam" must be set to
;your game's main camera for this to operate properly.
Function UpdateShadows(cam)
	FrameCount = FrameCount + 1
	If FrameCount > ShadowFrameSkip Then FrameCount = 0

	For shadow.TerrainShadow = Each TerrainShadow
		;Only consider shadows the user did not hide
		If shadow\Hidden = False Then
		
			x# = EntityX(shadow\Entity, True)
			y# = EntityY(shadow\Entity, True)
			z# = EntityZ(shadow\Entity, True)
			pitch# = EntityPitch(shadow\Entity, True)
			yaw# = EntityYaw(shadow\Entity, True)
			roll# = EntityRoll(shadow\Entity, True)
			
			;Calculate shadow alpha
			If shadow\ViewDist <> 0 Then
				xd# = EntityX(cam, True) - x
				yd# = EntityY(cam, True) - y
				zd# = EntityZ(cam, True) - z
				dist# = Sqr(xd*xd + yd*yd + zd*zd)
				
				alpha# = (shadow\ViewDist - dist) / shadow\ViewDist
			Else
				alpha# = 1
			End If
			alpha = alpha * shadow\Alpha
			If alpha < 0 Then alpha = 0
			
			;Calculate the visibility status of the shadow
			If alpha <> 0 Then
				;Check if the shadow is behind the camera or not
				TerrY# = TerrainY(ShadowTerrain, x, EntityY(ShadowTerrain), z)
				If PointVisible(cam, x, TerrY, z) Then
					Visible = True
				Else
					Visible = False
				End If
			Else
				Visible = False
			End If
			
			;If the shadow is visible, update it
			If Visible Then
				;Only update the shadow mesh if it's entity has moved/rotated
				If shadow\Visible <> Visible Or x <> shadow\LastX Or y <> shadow\LastY Or z <> shadow\LastZ Or pitch <> shadow\LastPitch Or yaw <> shadow\LastYaw Or roll <> shadow\LastRoll Then 
					If FrameCount = 0 Then
						;Regenerate the shadow mesh
						CreateTerrainDecal(shadow\ShadowMesh, shadow\ShadowSurface, x-shadow\Size*.5*shadow\Scale*1.4142, z-shadow\Size*.5*shadow\Scale*1.4142, x+shadow\Size*.5*shadow\Scale*1.4142, z+shadow\Size*.5*shadow\Scale*1.4142, pitch#, yaw#, roll#)
					Else
						;"Fake" mesh regeneration
						TranslateEntity shadow\ShadowMesh, x - shadow\LastX, y - shadow\LastY, z - shadow\LastZ
						TurnEntity shadow\ShadowMesh, 0, yaw - shadow\LastYaw, 0
					End If
				End If
				;Update the alpha
				EntityAlpha shadow\ShadowMesh, alpha
			End If
			
			;Hide/show the entity as necessary
			If shadow\Visible <> Visible Then
				If Visible Then
					ShowEntity shadow\ShadowMesh
				Else
					HideEntity shadow\ShadowMesh
				End If
				shadow\Visible = Visible
			End If
			
			shadow\LastX = x
			shadow\LastY = y
			shadow\LastZ = z
			shadow\LastPitch = pitch
			shadow\LastYaw = yaw
			shadow\LastRoll = roll
		End If
	Next
End Function


;****************** Internal Functions *******************
Dim VertGrid(SHADOW_TILES, SHADOW_TILES)
Function CreateTerrainDecal(mesh, surface, x1#, z1#, x2#, z2#, pitch#, yaw#, roll#)
	ClearSurface surface
	
	midx# = (x2 + x1) * .5
	midz# = (z2 + z1) * .5

	PositionEntity mesh, midx, 0, midz
	RotateEntity mesh, 0, 0, 0

	x1grid = Floor(x1 / ShadowTerrainScale)
	z1grid = Floor(z1 / ShadowTerrainScale)
	x2grid = Ceil(x2 / ShadowTerrainScale)
	z2grid = Ceil(z2 / ShadowTerrainScale)
	
	For xg = x1grid To x2grid
	For zg = z1grid To z2grid
		edge = False
	
		vertx# = xg * ShadowTerrainScale
		vertz# = zg * ShadowTerrainScale
		If xg = x1grid Then vertx = x1: edge = True
		If xg = x2grid Then vertx = x2: edge = True
		If zg = z1grid Then vertz = z1: edge = True
		If zg = z2grid Then vertz = z2: edge = True
		
		verty# = TerrainY(ShadowTerrain, vertx + EntityX(ShadowTerrain), EntityY(ShadowTerrain), vertz + EntityZ(ShadowTerrain))
		
		vertx# = vertx# + EntityX(ShadowTerrain)
		vertz# = vertz# + EntityZ(ShadowTerrain)
		If edge = False Then verty# = verty# + Y_OFFSET Else verty# = verty# + EDGE_Y_OFFSET#
		
		u# = (vertx-x1) / (x2-x1)
		v# = (vertz-z1) / (z2-z1)
		
		RotateEntity ShadowPivot, 0, -(yaw+180), 0
		ScaleEntity ShadowPivot, 1.4142, 1.4142, 1.4142
		TFormVector u - .5, 0, v - .5, ShadowPivot, 0
		u# = TFormedX() + .5
		v# = TFormedZ() + .5
		
		VertGrid(xg-x1grid, zg-z1grid) = AddVertex(surface, vertx - midx, verty, vertz - midz, u, v)
	Next
	Next
		
	For xg = 1 To (x2grid-x1grid)
	For zg = 1 To (z2grid-z1grid)
		AddTriangle surface, VertGrid(xg, zg), VertGrid(xg, zg-1), VertGrid(xg-1, zg-1)
		AddTriangle surface, VertGrid(xg-1, zg), VertGrid(xg, zg), VertGrid(xg-1, zg-1)
	Next
	Next
End Function

Function PointVisible(Viewer, x#, y#, z#)
	TFormPoint x, y, z, 0, Viewer
	If TFormedZ() <= 0 Then Return False Else Return True
End Function


When calling ShowShadow(), be sure to specify a shadow texture (which is applied to the terrain), because the current system can't render it for you yet.

CreateTerrainDecal(mesh, surface, x1#, z1#, x2#, z2#, pitch#, yaw#, roll#) is also useful for applying other decals to the terrain, like the shell craters.


Grisu: Thanks for the suggestions :) I hope to add some of those in the future. For now, you can download some nice mods others have made for BattleTanks II (add-on tanks and maps) here:
[a http://www.bundysoft.com/dokuwiki/doku.php?id=projects:johnj#battletanks_ii]BattleTanks II Expansion Packs[/a]
(scroll down to "Expansion Packs & Add-Ons")

If you want to create your own maps for BattleTanks II, read this:
[a http://www.bundysoft.com/dokuwiki/doku.php?id=projects:johnj:expanding_battletanks_ii]BattleTanks II Map-Making[/a]

Thaks a LOT!!!

Update: The competition results have been released!
Click Here To View

:D

Congratulations, Well Done!!!

Nice one John ... what was the prize?

Congratulations! :)

Stevie G: 1st prize was $500

John J.: Could you provide an example for your shadow system please? I can't seem to get it working.

Try this:
Texture = LoadTexture("Shadow.png", 1+2)
ShowShadow Entity, Texture
ShadowScale Tank\Mesh, 1.0
ShadowViewDistance Tank\Mesh, 100

And don't forget to add a
UpdateShadows Camera
inside your main loop or the shadows won't show up.

Here's the image I use:


Note: The shadows are only casted on terrains, not meshes.