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