1 /*
2 * This code is released under the GNU General Public License. See COPYING for
3 * details. Copyright 2003 John Spray: spray_john@users.sourceforge.net
4 */
5
6
7 #include <stdlib.h>
8 #include <math.h>
9 #include <string.h>
10
11 #include "Missile.h"
12 #include "Game.h"
13 #include "Particle.h"
14 #include "Arena.h"
15 #include "Visual.h"
16 #include "SoundCore.h"
17
18
Missile()19 Missile::Missile(){
20 s=0.0f;
21 v=0.0f;
22 a=0.0f;
23 res=1.0f;
24 collided=0;
25 }
26
~Missile()27 Missile::~Missile(){
28 }
29
Physics()30 void Missile::Physics()
31 {
32 v*=pow(res,game->dtf);
33 v+=(game->dtf * a);
34 Collide();
35 s+=(game->dtf * v);
36 }
37
Explode()38 void Missile::Explode()
39 {
40 Particle newpart1,newpart2,newpart3;
41
42 newpart1.s=s;
43 newpart1.a=game->g;
44 newpart1.rad=2;
45 newpart1.life=200.0f;
46 newpart1.blendmode=GL_ONE;
47 strcpy(newpart1.texfile,"explosion1.png");
48 for(int i=0;i<5;i++){
49 newpart1.v=game->arena->GetLastQuad()->n*0.02;
50 newpart1.v.x+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
51 newpart1.v.y+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
52 newpart1.v.z+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
53 game->visual->NewParticle(&newpart1);
54 }
55 newpart2.s=s;
56 newpart2.a=game->g;
57 newpart2.rad=0.25;
58 newpart2.life=800.0f;
59 newpart2.blendmode=GL_ONE;
60 newpart2.collide=1;
61 newpart2.bounce=PARTICLE_BOUNCE_ONE;
62 strcpy(newpart2.texfile,"explosion1.png");
63 for(int i=0;i<5;i++){
64 newpart2.v=game->arena->GetLastQuad()->n*0.02;
65 newpart2.v.x+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
66 newpart2.v.y+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
67 newpart2.v.z+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
68 game->visual->NewParticle(&newpart2);
69 }
70
71 newpart3.s=s;
72 newpart3.a=game->g;
73 newpart3.rad=3;
74 newpart3.life=500.0f;
75 newpart3.blendmode=GL_ONE_MINUS_SRC_ALPHA;
76 strcpy(newpart3.texfile,"smoke1.png");
77 for(int i=0;i<5;i++){
78 newpart3.v=game->arena->GetLastQuad()->n*0.03;
79 newpart3.v.x+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
80 newpart3.v.y+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
81 newpart3.v.z+=0.02*((float)rand()/(float)RAND_MAX)-0.01;
82 game->visual->NewParticle(&newpart3);
83 }
84
85 game->sound->Play("boom.wav",0,s,v);
86
87 }
88
Collide()89 void Missile::Collide()
90 {
91 for(int j=0;j<2;j++){
92 if(game->arena->Collision(s,s+v*game->dtf)){
93 if(v.Mag2()<0.01){
94 s=game->arena->GetLastQuad()->PlaneIntersectionPoint(s,s+v*game->dtf);
95 Explode();
96 collided=1;
97 return;
98 }
99 else
100 v=game->arena->GetLastQuad()->BounceVector(v,0.6f);
101 }
102 }
103 }
104
105