]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - src/test/cb/NavesEnemigasTest.pas
Se expanden keywords del svn.
[z.facultad/75.07/algowars.git] / src / test / cb / NavesEnemigasTest.pas
1 {** Distintos tipos de Naves Enemigas }\r
2 unit NavesEnemigas;\r
3 \r
4 interface\r
5 \r
6 uses\r
7   Tipos,\r
8   Vectores,\r
9   Nave,\r
10   NaveEnemiga,\r
11   NavePropia,\r
12   ObjetoVolador,\r
13   Armas;\r
14 \r
15 type\r
16   {** Es una nave con misiles y lasers (igual que la propia)\r
17       que se desplaza por el epacio hasta que encuentra una nave propia para atacar.<br>\r
18       <u>Características:</u>\r
19       <PRE>\r
20       Dimensión:            5         metros\r
21       Potencia:             2         Cantidad de daño que hace por intervalo de tiempo\r
22       Energía:              100       Cantidad de daño que soporta antes de ser destruída\r
23       Velocidad máxima:     0,17      metros/milisegundos (612 km/h)\r
24       Campo de radar:       2500      metros (2,5 km)\r
25       Misiles:              5\r
26       Misiles Dirigidos:    2\r
27       </PRE>}\r
28   cNavePesada = class( cNaveEnemiga )\r
29     private\r
30       aRadioMinimo: tLongitud; // Distancia minima a la nave propia\r
31     protected\r
32       {** Hace que se dispare un arma (todavía no está implementado)}\r
33       procedure mDisparar;\r
34     public\r
35       {** Constructor}\r
36       constructor create( pos : cVector = nil; vel : cVector = nil );\r
37       {** Método heredado que hace que la nave reaccione ante la presencia\r
38           de la nave propia (en este caso la atacará con lasers y misiles)}\r
39       procedure mReaccionar( np : cNavePropia );override;\r
40       {** Método heredado, se sobreescribe porque se dibuja de forma distinta}\r
41       function   mDibujar: string; override;\r
42   end;\r
43 \r
44   {** Es una nave sin misiles, solo con lasers que\r
45       se desplaza por el epacio hasta que encuentra una nave propia para atacar.<br>\r
46       <u>Características:</u>\r
47       <PRE>\r
48       Dimensión:            3         metros\r
49       Potencia:             1         Cantidad de daño que hace por intervalo de tiempo\r
50       Energía:              60        Cantidad de daño que soporta antes de ser destruída\r
51       Velocidad máxima:     0,18      metros/milisegundos (648 km/h)\r
52       Campo de radar:       2000      metros (2 km)\r
53       Misiles:              0\r
54       Misiles Dirigidos:    0\r
55       </PRE>}\r
56   cNaveLiviana = class( cNaveEnemiga )\r
57     private\r
58       aRadioMinimo: tLongitud; // Distancia minima a la nave propia\r
59     protected\r
60       {** Dispara el laser (todavía no está implementado)}\r
61       procedure mDisparar;\r
62     public\r
63       {** Constructor}\r
64       constructor create( pos : cVector = nil; vel : cVector = nil );\r
65       {** Método heredado que hace que la nave reaccione ante la presencia\r
66           de la nave propia (en este caso la atacará con lasers)}\r
67       procedure mReaccionar( np : cNavePropia );override;\r
68       {** Método heredado, se sobreescribe porque se dibuja de forma distinta}\r
69       function   mDibujar: string; override;\r
70   end;\r
71 \r
72   {** Es una nave sin armas que se desplaza por el epacio\r
73       hasta que encuentra una nave propia, en ese momento empieza a huir avisando a\r
74       las demas naves enemigas la ultima posicion de la nave propia.<br>\r
75       <u>Características:</u>\r
76       <PRE>\r
77       Dimensión:            2         metros\r
78       Potencia:             1         Cantidad de daño que hace por intervalo de tiempo\r
79       Energía:              30        Cantidad de daño que soporta antes de ser destruída\r
80       Velocidad máxima:     0,2       metros/milisegundos (720 km/h)\r
81       Campo de radar:       1500      metros (1,5 km)\r
82       Misiles:              0\r
83       Misiles Dirigidos:    0\r
84       </PRE>}\r
85   cNaveEspia = class( cNaveEnemiga )\r
86     private\r
87       aPosicionEnemiga: cVector; // Indica la posicion de la nave propia. Si todavía no\r
88                                  //  la encontró, su valor es nil\r
89     protected\r
90       {** Método heredado se modifica porque su forma de modificar la velocidad es diferente al\r
91           resto de las naves enemigas}\r
92       procedure mModificarVelocidad( np: cNavePropia; modulo: tLongitud = -1 ); override;\r
93     public\r
94       {** Constructor }\r
95       constructor create( pos : cVector = nil; vel : cVector = nil );\r
96       {** Método que indica si está avisando }\r
97       function mAvisando: boolean;\r
98       {** Método que devuelve la última posición en dónde vió a la nave propia (si está avisando)}\r
99       function mGetPosicionEnemiga: cVector;\r
100       {** Método heredado que hace que la nave reaccione ante la presencia\r
101           de la nave propia (en este caso huirá y empezará a avisar al resto de las naves que encuentre\r
102           sobre la última posición de la nave propia)}\r
103       procedure mReaccionar( np : cNavePropia );override;\r
104       {** Destructor}\r
105       destructor destroy; override;\r
106       {** Método heredado, se sobreescribe porque se dibuja de forma distinta}\r
107       function   mDibujar: string; override;\r
108   end;\r
109 \r
110   {** Es una nave sin armas que se desplaza por el epacio\r
111       hasta que encuentra una nave propia y trata de chocarla.<br>\r
112       <u>Características:</u>\r
113       <PRE>\r
114       Dimensión:            2         metros\r
115       Potencia:             1         Cantidad de daño que hace por intervalo de tiempo\r
116       Energía:              30        Cantidad de daño que soporta antes de ser destruída\r
117       Velocidad máxima:     0,2       metros/milisegundos (720 km/h)\r
118       Campo de radar:       1000      metros (1 km)\r
119       Misiles:              0\r
120       Misiles Dirigidos:    0\r
121       </PRE>}\r
122   cNaveSuicida = class( cNaveEnemiga )\r
123     public\r
124       {** Constructor}\r
125       constructor create( pos : cVector = nil; vel : cVector = nil );\r
126       {** Método heredado que hace que la nave reaccione ante la presencia\r
127           de la nave propia (en este caso tratará de chocarla)}\r
128       procedure mReaccionar( np : cNavePropia );override;\r
129       {** Método heredado, se sobreescribe porque se dibuja de forma distinta}\r
130       function   mDibujar: string; override;\r
131   end;\r
132 \r
133 implementation\r
134 \r
135 { cNavePesada }\r
136 \r
137 {** Crea una instancia de una nave pesada.\r
138     @param pos Vector posición\r
139     @param vel Vector velocidad}\r
140 constructor cNavePesada.create(pos, vel: cVector);\r
141 begin\r
142   // La dimensión es 5 m de radio, la potencia 2, la energía 100, tiene 5 misiles comunes,\r
143   //  2 dirigidos, su velocidad maxima es 0,17 m/mseg (612 km/h) y su Campo de radar 2,5 km\r
144   inherited create( pos, vel, 5 , 2, 100, 5 , 2, 0.17, 2500);\r
145   aRadioMinimo := 500;\r
146 end;\r
147 \r
148 {** Hace que se dispare un arma (todavía no está implementado)}\r
149 function cNavePesada.mDibujar: string;\r
150 begin\r
151   result := '.\bitmaps\navepesada.bmp';\r
152 end;\r
153 \r
154 procedure cNavePesada.mDisparar;\r
155 begin\r
156   // Todavía no está implementado\r
157 end;\r
158 \r
159 {** Método heredado que hace que la nave reaccione ante la presencia\r
160     de la nave propia cerca (en este caso la atacará con lasers y misiles)\r
161     @param np Nave Propia con la cual esta reaccionando}\r
162 procedure cNavePesada.mReaccionar(np: cNavePropia);\r
163 var\r
164   modulo: tLongitud;\r
165 begin\r
166   modulo := mGetVelMax; // nuevo modulo de la velocidad igual a la velocidad maxima\r
167   if mGetDistancia( np ) < aRadioMinimo then // si esta cerca de la nave propia...\r
168     if np.mGetVelModulo < mGetVelMax then // si la vel de la nave propia es menor a la maxima\r
169       modulo := np.mGetVelocidad.mGetModulo; // nuevo modulo de la velocidad igual al de la nave propia\r
170   mModificarVelocidad( np, modulo ); // cambiar la velocidad segun la nave propia y el nuevo modulo\r
171   // Falta implementar la parte de disparos...\r
172   mDisparar;\r
173 end;\r
174 \r
175 { cNaveLiviana }\r
176 \r
177 {** Crea una instancia de una nave liviana.\r
178     @param pos Vector posición\r
179     @param vel Vector velocidad}\r
180 constructor cNaveLiviana.create(pos, vel: cVector);\r
181 begin\r
182   // La dimensión es 3 m de radio, la potencia 1, la energía 60, no tiene misiles comunes\r
183   //  ni dirigidos, su velocidad maxima es 0,18 m/mseg (648 km/h) y su Campo de radar 2 km\r
184   inherited create( pos, vel, 3, 1,60, 0, 0, 0.18, 2000);\r
185   aRadioMinimo := 250;\r
186 end;\r
187 \r
188 {** Hace que se dispare un arma (todavía no está implementado)}\r
189 function cNaveLiviana.mDibujar: string;\r
190 begin\r
191   result := '.\bitmaps\naveliviana.bmp';\r
192 end;\r
193 \r
194 procedure cNaveLiviana.mDisparar;\r
195 begin\r
196   // Todavía no está implementado\r
197 end;\r
198 \r
199 {** Método heredado que hace que la nave reaccione ante la presencia\r
200     de la nave propia (en este caso la atacará con lasers)\r
201     @param np Nave Propia con la cual esta reaccionando}\r
202 procedure cNaveLiviana.mReaccionar(np: cNavePropia);\r
203 var\r
204   modulo: tLongitud;\r
205 begin\r
206   modulo := mGetVelMax; // nuevo modulo de la velocidad igual a la velocidad maxima\r
207   if mGetDistancia( np ) < aRadioMinimo then // si esta cerca de la nave propia...\r
208     if np.mGetVelModulo < mGetVelMax then // si la vel de la nave propia es menor a la maxima\r
209       modulo := np.mGetVelocidad.mGetModulo; // nuevo modulo de la velocidad igual al de la nave propia\r
210   mModificarVelocidad( np, modulo ); // cambiar la velocidad segun la nave propia y el nuevo modulo\r
211   // Falta implementar la parte de disparos...\r
212   mDisparar;\r
213 end;\r
214 \r
215 { cNaveEspia }\r
216 \r
217 {** Crea una instancia de una nave espía.\r
218     @param pos Vector posición\r
219     @param vel Vector velocidad}\r
220 constructor cNaveEspia.create(pos, vel: cVector);\r
221 begin\r
222   // La dimensión es 2 m de radio, la potencia 1, la energía 30, no tiene misiles comunes\r
223   //  ni dirigidos, su velocidad maxima es 0,2 m/mseg (720 km/h) y su Campo de radar 1,5 km\r
224   inherited create( pos, vel, 2, 1, 30, 0, 0, 0.2, 1500 );\r
225   aPosicionEnemiga := nil;\r
226 end;\r
227 \r
228 {** Destructor}\r
229 destructor cNaveEspia.destroy;\r
230 begin\r
231   aPosicionEnemiga.free;\r
232   inherited;\r
233 end;\r
234 \r
235 {** Método que indica si está avisando\r
236     @return <i>true</i> si está avisando, <i>false</i> si no lo está}\r
237 function cNaveEspia.mAvisando: boolean;\r
238 begin\r
239   result := ( aPosicionEnemiga <> nil ); // True si la posicion no es nil\r
240 end;\r
241 \r
242 {** Método que devuelve la última posición en dónde vió a la nave propia (si está avisando)\r
243     @return Última posición donde detectó a la nave propia (<i>nil</i> si no la detecto nunca)}\r
244 function cNaveEspia.mDibujar: string;\r
245 begin\r
246   result := '.\bitmaps\naveespia.bmp';\r
247 end;\r
248 \r
249 function cNaveEspia.mGetPosicionEnemiga: cVector;\r
250 begin\r
251   result := cVector.create( aPosicionEnemiga );\r
252 end;\r
253 \r
254 {** Modifica la velocidad de la nave en base a la nave propia.\r
255     @param np     Nave propia con la cual se calculará la dirección de la nueva velocidad\r
256     @param modulo Nuevo módulo de la velocidad}\r
257 procedure cNaveEspia.mModificarVelocidad(np: cNavePropia; modulo: tLongitud);\r
258 var\r
259   pos,          // Vector temporal\r
260   vel: cVector; // Vector temporal\r
261 begin\r
262   pos := np.mGetPosicion;\r
263   vel := mGetPosicion.mRestar( pos ); // Crea un vector igual a su posicion\r
264                                       // Le resta la posicion de la nave propia\r
265   mSetVelModulo( mGetVelMax );        // Setea el modulo al maximo\r
266   mSetVelDir( vel );                  // Copia el vector a su velocidad\r
267   vel.free;                           // Libera el vector temporal\r
268   pos.free;                           // Libera el vector temporal\r
269 end;\r
270 \r
271 {** Método heredado que hace que la nave reaccione ante la presencia\r
272     de la nave propia (en este caso huirá y empezará a avisar al resto de las naves que encuentre\r
273     sobre la última posición de la nave propia)\r
274     @param np Nave Propia con la cual esta reaccionando}\r
275 procedure cNaveEspia.mReaccionar(np: cNavePropia);\r
276 begin\r
277   mModificarVelocidad( np );\r
278   // Si ya tiene una posición, la modifica, si no crea una nueva\r
279   if aPosicionEnemiga <> nil then\r
280     aPosicionEnemiga.free;\r
281   aPosicionEnemiga := np.mGetPosicion;\r
282 end;\r
283 \r
284 { cNaveSuicida }\r
285 \r
286 {** Crea una instancia de una nave suicida.\r
287     @param pos Vector posición\r
288     @param vel Vector velocidad}\r
289 constructor cNaveSuicida.create(pos, vel: cVector);\r
290 begin\r
291   // La dimensión es 2 m de radio, la potencia 1, la energía 30, no tiene misiles comunes\r
292   //  ni dirigidos, su velocidad maxima es 0,2 m/mseg (720 km/h) y su Campo de radar 1 km\r
293   inherited create( pos, vel, 2, 1, 30, 0, 0, 0.2, 1000);\r
294 end;\r
295 \r
296 {** Método heredado que hace que la nave reaccione ante la presencia\r
297     de la nave propia (en este caso tratará de chocarla)\r
298     @param np Nave Propia con la cual esta reaccionando}\r
299 function cNaveSuicida.mDibujar: string;\r
300 begin\r
301   result := '.\bitmaps\navesuicida.bmp';\r
302 end;\r
303 \r
304 procedure cNaveSuicida.mReaccionar(np: cNavePropia);\r
305 begin\r
306   mModificarVelocidad( np );\r
307 end;\r
308 \r
309 end.\r