#include "Powerups.h" #include "WorldManager.h" #include "SoundManager.h" void InitPowerup(VPowerup * p) { InitObject(&p->Object); p->Type = POWERUPTYPENONE; p->Amount = 0; p->taggedForRemoval = 0; } void CleanUpPowerup(VPowerup * p) { CleanUpObject(&p->Object); } void SetupPowerup(VPowerup * p, int type, int amount) { p->Type = type; switch (type) { case POWERUPTYPEROCKETS: p->Amount = amount; 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 = amount; BuildHealthPowerupModel(&p->Object.Model); CalculateRadius(&p->Object); break; case POWERUPTYPETURBO: BuildTurboPowerupModel(&p->Object.Model); CalculateRadius(&p->Object); break; case POWERUPTYPEMACHINEGUN: BuildMachineGunPowerupModel(&p->Object.Model); CalculateRadius(&p->Object); break; case POWERUPTYPESPREADGUN: BuildSpreadGunPowerupModel(&p->Object.Model); CalculateRadius(&p->Object); break; case POWERUPTYPELONGSHOTGUN: BuildLongShotGunPowerupModel(&p->Object.Model); CalculateRadius(&p->Object); 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)) { PlaySound(GetSoundManager(), GETPOWERUPSOUND); p->taggedForRemoval = true; switch (p->Type) { case POWERUPTYPEROCKETS: world->Player.NumRockets += p->Amount; if (world->Player.NumRockets > MAXROCKETS) world->Player.NumRockets = MAXROCKETS; break; case POWERUPTYPEHEALTH: world->Player.Shields += p->Amount; if (world->Player.Shields > MAXSHIELDS) world->Player.Shields = MAXSHIELDS; break; case POWERUPTYPETURBO: world->Physics.SpeedMultiplier = 2.0; world->Player.HasTurbo = 1; break; case POWERUPTYPEMACHINEGUN: world->Player.HasMachineGun = 1; break; case POWERUPTYPESPREADGUN: world->Player.HasSpreadGun = 1; break; case POWERUPTYPELONGSHOTGUN: world->Player.HasLongShotGun = 1; 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); } void CopyPowerup(VPowerup * src, VPowerup * dest) { dest->Type = src->Type; dest->Amount = src->Amount; dest->taggedForRemoval = src->taggedForRemoval; CopyObject(&src->Object, &dest->Object); }