#include "Powerups.h" void InitPowerup(VPowerup * p) { InitObject(&p->Object); p->Type = POWERUPTYPENONE; p->Amount.i = 0; p->taggedForRemoval = 0; } void CleanUpPowerup(VPowerup * p) { CleanUpObject(&p->Object); } void SetupPowerup(VPowerup * p, int type, ...) { va_list args; va_start(args, type); p->Type = type; switch (type) { case POWERUPTYPEROCKETS: p->Amount.i = va_arg(args, int); BuildRocketPowerupModel(&p->Object.Model); CalculateRadius(&p->Object); p->Object.Front.x = 0.0; p->Object.Front.y = 1.0; p->Object.Front.z = 0.0; p->Object.Right.x = 1.0; p->Object.Right.y = 0.0; p->Object.Right.z = 0.0; p->Object.Up.x = 0.0; p->Object.Up.y = 0.0; p->Object.Up.z = -1.0; break; case POWERUPTYPEHEALTH: p->Amount.f = va_arg(args, float); /* Code goes here */ break; } } void RunPowerup(VPowerup * p, float interval, void * w) { VWorld * world; Quaternion quat; Vector axis = {0.0, 1.0, 0.0}; world = (VWorld *) w; if (world != NULL && fabs(((world->Camera.Position.x - p->Object.Position.x) * (world->Camera.Position.x - p->Object.Position.x)) + ((world->Camera.Position.y - p->Object.Position.y) * (world->Camera.Position.y - p->Object.Position.y)) + ((world->Camera.Position.z - p->Object.Position.z) * (world->Camera.Position.z - p->Object.Position.z))) <= (PLAYERSHIPRADIUS + p->Object.Radius)) { p->taggedForRemoval = true; switch (p->Type) { case POWERUPTYPEROCKETS: world->Console.NumberOfRockets += p->Amount.i; if (world->Console.NumberOfRockets > MAXROCKETS) world->Console.NumberOfRockets = MAXROCKETS; break; case POWERUPTYPEHEALTH: world->Console.Health += p->Amount.f; if (world->Console.Health > MAXHEALTH) world->Console.Health = MAXHEALTH; break; } return; } QuaternionRotateVector(POWERUPROTATESPEED, interval, &axis, &p->Object.Right, &quat); p->Object.Right.x = quat.v.x; p->Object.Right.y = quat.v.y; p->Object.Right.z = quat.v.z; NormalizeVector(&p->Object.Right); CrossProduct(&p->Object.Right, &p->Object.Up, &p->Object.Front); NormalizeVector(&p->Object.Front); CrossProduct(&p->Object.Front, &p->Object.Right, &p->Object.Up); NormalizeVector(&p->Object.Up); } void DrawPowerup(VPowerup * p) { DrawObject(&p->Object); }