Elite NPC movement

Blitz3D Forums/Blitz3D Programming/Elite NPC movement

;Determine targetleaders x,y,z location relative to the enemy ship
			EntityParent TargetLeader,e\entity
			TargetX# = EntityX(TargetLeader,False)
			TargetY# = EntityY(TargetLeader,False)
			TargetZ# = EntityZ(TargetLeader,False)
			EntityParent TargetLeader,pvt
			;--------------------------
			;Calculate Steering factor. The further away an entity is the higher the factor
			SteeringFactor# = EntityDistance(TargetLeader,e\entity)/1000
			
			;--------------------------
			;Rotate z based on x position (Roll the ship so target is near vertical axis)
			If targetX < -30*(SteeringFactor#-RandomFactor#) 
				If TargetY < 0 ;Below and to the left, turn right
					e\roll# = e\roll# -(e\spz/TurningFactor%)
				Else
				 	e\roll# = e\roll# +(e\spz/TurningFactor%);Above and to the left, roll left
				End If
			End If
			If TargetX > 30*SteeringFactor# 
				If TargetY > 0;Above And To the Right, turn Right
					e\roll# = e\roll# -(e\spz/TurningFactor%)
				Else 
					e\roll# = e\roll# +(e\spz/TurningFactor%);Below and to the right, turn left
				End If
			End If
			
			;--------------------------
			;Rotate x based on y (Climb or dive to face the target only if the target is near the 
			;vertical axis). Climb is the target is behind.
			If TargetZ < 0 Then 
				e\pitch# = e\pitch# - (e\spx/TurningFactor%)
			Else
				If Abs(TargetX) <(100* (SteeringFactor#-RandomFactor#)) Then
					If TargetY > 30*SteeringFactor# Then
						e\pitch# = e\pitch# - (e\spx/TurningFactor%)
					End If
					If TargetY < -30*SteeringFactor# Then
						e\pitch# = e\pitch# + (e\spx/TurningFactor%)
					End If				
				End If
			End If
		;************* TURN AND MOVE THE SHIP  **********************************	
		
		;Rotate z based on roll position so craft flies horizontal
			If Abs(e\roll)<0.1 And Abs(e\pitch)<0.1 Then
				If EntityRoll(e\entity) < -5 
					;e\roll# = e\roll# +(e\spz/TurningFactor%)
					TurnEntity e\entity,0,0,(e\spz/TurningFactor%)
				End If
				If EntityRoll(e\entity) > 5 
					;e\roll# = e\roll# -(e\spz/TurningFactor%)
					TurnEntity e\entity,0,0,-(e\spz/TurningFactor%)
				End If	
			End If

		e\pitch = e\pitch/1.1
		e\roll = e\roll/1.1
		e\yaw = e\yaw/1.1
		TurnEntity e\entity,e\pitch#*FL\SpeedFactor,e\yaw#*FL\SpeedFactor,e\roll#*FL\SpeedFactor
		MoveEntity e\entity, 0, 0 ,e\spd*FL\SpeedFactor
		;--------------------------




This is a small snippet of code from the AI function in my current project TRAFFIKA. It is also based on Elite and is coming along fantastically well.
It basically rolls the ship until the target is relatively vertical then pitches until it is infront. There are many other parts to this function to speed up, slow down, dodge, etc. But, I think this is the sort of thing you were after.

You can download a working copy of the game so far at http://www.blitzcoder.com/cgi-bin/showcase/showcase_showentry.pl?id=bigjohnno03142005145609&comments=no. It's about 40% complete and has come along way since I posted it. Check it out and let me know how you get along.

Oh, a few things to note;
e\entity - enemy entity
e\roll - enemy's roll
e\pitch - enemy's pitch
e\spx - enemy's climb speed
e\spz - enemy's pitch speed
e\randomfactor - random number to give each ship slightly different action. It is very noticable when groups of 5 or more are flying together.
e\targetleader - distanceof a pivot infront of the target which the enemy aims at. If it aims at the target it never hits it because its moving. e\targetleader is recalculated every round by taking into acount distances and speeds.