/// <summary>
/// Run this task and all subtasks against a bullet
/// This is called once a frame during runtime.
/// </summary>
/// <returns>ERunStatus: whether this task is done, paused, or still running</returns>
/// <param name="bullet">The bullet to update this task against.</param>
public override ERunStatus Run(Bullet bullet)
{
//Find which direction to shoot the new bullet
if (DirNode != null)
{
//get the direction continade in the node
float newBulletDirection = (int)DirNode.GetValue(this) * (float)Math.PI / (float)180;
switch (DirNode.NodeType)
{
case ENodeType.sequence:
{
bullet.GetFireData().srcDir += newBulletDirection;
}
break;
case ENodeType.absolute:
{
bullet.GetFireData().srcDir = newBulletDirection;
}
break;
case ENodeType.relative:
{
bullet.GetFireData().srcDir = newBulletDirection + bullet.Direction;
}
break;
default:
{
bullet.GetFireData().srcDir = newBulletDirection + bullet.GetAimDir();
}
break;
}
}
else
{
//otherwise if no direction node, aim the bullet at the bad guy
bullet.GetFireData().srcDir = bullet.GetAimDir();
}
//Create the new bullet
Bullet newBullet = bullet.MyBulletManager.CreateBullet();
if (newBullet == null)
{
//wtf did you do???
TaskFinished = true;
return(ERunStatus.End);
}
//initialize the bullet from a reference node, or our bullet node
if (RefNode != null)
{
//Add an empty task to the bullet and populate it with all the params
BulletMLTask bulletBlankTask = newBullet.CreateTask();
//Add all the params to the new task we just added to that bullet
for (int i = 0; i < RefNode.ChildNodes.Count; i++)
{
bulletBlankTask.ParamList.Add(RefNode.ChildNodes[i].GetValue(this));
}
//init the bullet now that all our stuff is prepopulated
BulletMLNode subNode = bullet.MyNode.GetRootNode().FindLabelNode(RefNode.Label, ENodeName.bullet);
newBullet.Init(subNode);
}
else
{
//if there is no ref node, there has to be bullet node
newBullet.Init(BulletNode);
}
//set the location of the new bullet
newBullet.X = bullet.X;
newBullet.Y = bullet.Y;
//set the owner of the new bullet to this dude
newBullet._tasks[0].Owner = this;
//set the direction of the new bullet
newBullet.Direction = bullet.GetFireData().srcDir;
//Has the speed for new bullets been set in the source bullet yet?
if (!bullet.GetFireData().speedInit&& newBullet.GetFireData().speedInit)
{
bullet.GetFireData().srcSpeed = newBullet.Velocity;
bullet.GetFireData().speedInit = true;
}
else
{
//find the speed for new bullets and store it in the source bullet
if (SpeedNode != null)
{
//Get the speed from a speed node
float newBulletSpeed = SpeedNode.GetValue(this);
if (SpeedNode.NodeType == ENodeType.sequence || SpeedNode.NodeType == ENodeType.relative)
{
bullet.GetFireData().srcSpeed += newBulletSpeed;
}
else
{
bullet.GetFireData().srcSpeed = newBulletSpeed;
}
}
else
{
if (!newBullet.GetFireData().speedInit)
{
bullet.GetFireData().srcSpeed = 1;
}
else
{
bullet.GetFireData().srcSpeed = newBullet.Velocity;
}
}
}
newBullet.GetFireData().speedInit = false;
newBullet.Velocity = bullet.GetFireData().srcSpeed;
TaskFinished = true;
return(ERunStatus.End);
}