#include "Weapons.h"#include "WorldManager.h"#include "ObjectWrapper.h"void InitWeapon(VWeapon * w, int type) {	w->Type = type;	w->InitialPos.x = 0.0;	w->InitialPos.y = 0.0;	w->InitialPos.z = 0.0;	w->Target = w->InitialPos;	w->taggedForRemoval = 0;	w->next = NULL;	InitObject(&w->Object);	switch (type) {		case WEAPONTYPEBULLET:			BuildBulletModel(&w->Object.Model);			w->Speed = BULLETSPEED;			w->MaxDistance = MAXBULLETDISTANCE;			break;		case WEAPONTYPEROCKET:			BuildRocketModel(&w->Object.Model);			w->Speed = ROCKETSPEED;			w->MaxDistance = MAXROCKETDISTANCE;			break;	}	CalculateRadius(&w->Object);}void CleanUpWeapon(VWeapon * w) {	CleanUpObject(&w->Object);}void StartWeapon(VWeapon * w, Vector * startPos, Vector * target, Vector * forward, Vector * up, float speedAdjustment) {	w->InitialPos = *startPos;	w->Object.Position = *startPos;	if (target != NULL) w->Target = *target;	w->Object.Front = *forward;	w->Object.Up = *up;	CrossProduct(&w->Object.Up, &w->Object.Front, &w->Object.Right);	NormalizeVector(&w->Object.Right);	w->Speed += speedAdjustment;	/* Start at the near clipping plane */	w->Object.Position.x += (w->Object.Front.x * 1.0);	w->Object.Position.y += (w->Object.Front.y * 1.0);	w->Object.Position.z += (w->Object.Front.z * 1.0);}void RunWeapon(VWeapon * w, float interval, void * TheWorld){	VWorld * world;	VObject * Object;	VObjectWrapper * ObjectList;	world = (VWorld *) TheWorld;	ObjectList = world->Objects;		w->Target = w->Object.Front;	for (; ObjectList != NULL; ObjectList = ObjectList->next)	{		if (ObjectList->Type != VENEMY && ObjectList->Type != VOBJECT)			continue;				WObjectObject(ObjectList, &Object);		if (Object != NULL) w->Target = Object->Position;		break;	}	ObjectList = world->Objects;		switch (w->Type) {		case WEAPONTYPEBULLET:						break;		case WEAPONTYPEROCKET:			if (w->Target.x != w->Object.Front.x && w->Target.y != w->Object.Front.y && w->Target.z != w->Object.Front.z)			{				Vector intendedAngle;								SubtractVector(&w->Target, &w->Object.Position, &intendedAngle);								NormalizeVector(&intendedAngle);				intendedAngle.x *= (ROCKETROTATERATE / interval);				intendedAngle.y *= (ROCKETROTATERATE / interval);				intendedAngle.z *= (ROCKETROTATERATE / interval);				w->Object.Front.x += intendedAngle.x;				w->Object.Front.y += intendedAngle.y;				w->Object.Front.z += intendedAngle.z;				NormalizeVector(&w->Object.Front);				CrossProduct(&w->Object.Front, &w->Object.Right, &w->Object.Up);				CrossProduct(&w->Object.Up, &w->Object.Front, &w->Object.Right);				NormalizeVector(&w->Object.Right);				NormalizeVector(&w->Object.Up);			}			if (w->Speed < MAXROCKETSPEED) {        w->Speed += ROCKETACCELERATION;        if (w->Speed > MAXROCKETSPEED) w->Speed = MAXROCKETSPEED;      } else if (w->Speed > MAXROCKETSPEED) {        w->Speed -= ROCKETACCELERATION;        if (w->Speed < MAXROCKETSPEED) w->Speed = MAXROCKETSPEED;      }						break;	}		w->Object.Position.x += ((w->Object.Front.x / interval) * w->Speed);	w->Object.Position.y += ((w->Object.Front.y / interval) * w->Speed);	w->Object.Position.z += ((w->Object.Front.z / interval) * w->Speed);		for (; ObjectList != NULL; ObjectList = ObjectList->next)	{		if (ObjectList->Type != VENEMY && ObjectList->Type != VOBJECT)			continue;		WObjectObject(ObjectList, &Object);		if (Object != NULL && fabs(((w->Object.Position.x - Object->Position.x) * 			(w->Object.Position.x - Object->Position.x)) +			((w->Object.Position.y - Object->Position.y) * 			(w->Object.Position.y - Object->Position.y)) + 			((w->Object.Position.z - Object->Position.z) * 			(w->Object.Position.z - Object->Position.z))) <= 			(w->Object.Radius + Object->Radius))		{			ObjectList->taggedForRemoval = true;			ObjectList->exploded = true;			w->taggedForRemoval = true;			break;		}	}	if ((((w->Object.Position.x - w->InitialPos.x) * 		(w->Object.Position.x - w->InitialPos.x)) + 		((w->Object.Position.y - w->InitialPos.y) * 		(w->Object.Position.y - w->InitialPos.y)) + 		((w->Object.Position.z - w->InitialPos.z) * 		(w->Object.Position.z - w->InitialPos.z))) > w->MaxDistance)	{		w->taggedForRemoval = true;	}}void DrawWeapon(VWeapon * w) {	DrawObject(&w->Object);}