2 <TITLE>File: navesenemigas.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=navesenemigas.pas><CENTER><H3>navesenemigas.pas</H3></A><I> from <A HREF=/proyecto/doc/src-html/AlgoWars.html> Project: AlgoWars.dpr</A></I></CENTER>
\r
9 <I><FONT COLOR="Navy">{** Distintos tipos de Naves Enemigas<br>
\r
12 27/11/00: Se realizan algunos cambios para adaptarse a la nueva implementacion de cNave con disparos.
\r
13 01/12/00: Se cambiaron las dimensiones de la nave para que los disparos sean mas "jugables".
\r
14 Se cambia el orden de los argumentos de mDisparar para aprovechar los argumentos por defecto.
\r
16 <B>unit</B> NavesEnemigas;
\r
30 <I><FONT COLOR="Navy">{** Es una nave con misiles y lasers (igual que la propia)
\r
31 que se desplaza por el epacio hasta que encuentra una nave propia para atacar.<br>
\r
32 <u>Características:</u>
\r
34 Dimensión: 25 metros
\r
35 Potencia: 2 Cantidad de daño que hace por intervalo de tiempo
\r
36 Energía: 100 Cantidad de daño que soporta antes de ser destruída
\r
37 Velocidad máxima: 0,17 metros/milisegundos (612 km/h)
\r
38 Campo de radar: 5000 metros (5 km)
\r
40 Misiles Dirigidos: 2
\r
42 cNavePesada = <B>class</B>( cNaveEnemiga )
\r
44 aCampoMinimo: tLongitud; <I><FONT COLOR="Navy">// Distancia minima a la nave propia </FONT></I>
\r
46 <I><FONT COLOR="Navy">{** Constructor}</FONT></I>
\r
47 <B>constructor</B> create( pos : cVector = <B>nil</B>; vel : cVector = <B>nil</B> );
\r
48 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
49 de la nave propia (en este caso la atacará con lasers y misiles)}</FONT></I>
\r
50 <B>procedure</B> <A HREF="#cNavePesada.mReaccionar">mReaccionar</A>( np : cNavePropia );<B>override</B>;
\r
51 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque se dibuja de forma distinta}</FONT></I>
\r
52 <B>function</B> <A HREF="#cNavePesada.mDibujar">mDibujar</A>: tObjetosVoladores; <B>override</B>;
\r
53 <I><FONT COLOR="Navy">// SERIALIZACION </FONT></I>
\r
54 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I>
\r
55 <B>function</B> <A HREF="#cNavePesada.mSerializar">mSerializar</A>: <B>string</B>; <B>override</B>;
\r
56 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
57 serializado.}</FONT></I>
\r
58 <B>procedure</B> <A HREF="#cNavePesada.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>override</B>;
\r
61 <I><FONT COLOR="Navy">{** Es una nave sin misiles, solo con lasers que
\r
62 se desplaza por el epacio hasta que encuentra una nave propia para atacar.<br>
\r
63 <u>Características:</u>
\r
65 Dimensión: 15 metros
\r
66 Potencia: 1 Cantidad de daño que hace por intervalo de tiempo
\r
67 Energía: 60 Cantidad de daño que soporta antes de ser destruída
\r
68 Velocidad máxima: 0,18 metros/milisegundos (648 km/h)
\r
69 Campo de radar: 3000 metros (3 km)
\r
71 Misiles Dirigidos: 0
\r
73 cNaveLiviana = <B>class</B>( cNaveEnemiga )
\r
75 aCampoMinimo: tLongitud; <I><FONT COLOR="Navy">// Distancia minima a la nave propia </FONT></I>
\r
77 <I><FONT COLOR="Navy">{** Constructor}</FONT></I>
\r
78 <B>constructor</B> create( pos : cVector = <B>nil</B>; vel : cVector = <B>nil</B> );
\r
79 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
80 de la nave propia (en este caso la atacará con lasers)}</FONT></I>
\r
81 <B>procedure</B> <A HREF="#cNaveLiviana.mReaccionar">mReaccionar</A>( np : cNavePropia );<B>override</B>;
\r
82 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque se dibuja de forma distinta}</FONT></I>
\r
83 <B>function</B> <A HREF="#cNaveLiviana.mDibujar">mDibujar</A>: tObjetosVoladores; <B>override</B>;
\r
84 <I><FONT COLOR="Navy">// SERIALIZACION </FONT></I>
\r
85 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I>
\r
86 <B>function</B> <A HREF="#cNaveLiviana.mSerializar">mSerializar</A>: <B>string</B>; <B>override</B>;
\r
87 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
88 serializado.}</FONT></I>
\r
89 <B>procedure</B> <A HREF="#cNaveLiviana.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>override</B>;
\r
92 <I><FONT COLOR="Navy">{** Es una nave sin armas que se desplaza por el epacio
\r
93 hasta que encuentra una nave propia, en ese momento empieza a huir avisando a
\r
94 las demas naves enemigas la ultima posicion de la nave propia.<br>
\r
95 <u>Características:</u>
\r
97 Dimensión: 10 metros
\r
98 Potencia: 1 Cantidad de daño que hace por intervalo de tiempo
\r
99 Energía: 30 Cantidad de daño que soporta antes de ser destruída
\r
100 Velocidad máxima: 0,2 metros/milisegundos (720 km/h)
\r
101 Campo de radar: 2000 metros (2 km)
\r
103 Misiles Dirigidos: 0
\r
104 </PRE>}</FONT></I>
\r
105 cNaveEspia = <B>class</B>( cNaveEnemiga )
\r
107 aPosicionEnemiga: cVector; <I><FONT COLOR="Navy">// Indica la posicion de la nave propia. Si todavía no </FONT></I>
\r
108 <I><FONT COLOR="Navy">// la encontró, su valor es nil </FONT></I>
\r
110 <I><FONT COLOR="Navy">{** Método heredado se modifica porque su forma de modificar la velocidad es diferente al
\r
111 resto de las naves enemigas}</FONT></I>
\r
112 <B>procedure</B> <A HREF="#cNaveEspia.mModificarVelocidad">mModificarVelocidad</A>( np: cNavePropia; modulo: tLongitud = -1 ); <B>override</B>;
\r
114 <I><FONT COLOR="Navy">{** Constructor }</FONT></I>
\r
115 <B>constructor</B> create( pos : cVector = <B>nil</B>; vel : cVector = <B>nil</B> );
\r
116 <I><FONT COLOR="Navy">{** Método que indica si está avisando }</FONT></I>
\r
117 <B>function</B> <A HREF="#cNaveEspia.mAvisando">mAvisando</A>: boolean;
\r
118 <I><FONT COLOR="Navy">{** Método que devuelve la última posición en dónde vió a la nave propia (si está avisando)}</FONT></I>
\r
119 <B>function</B> <A HREF="#cNaveEspia.mGetPosicionEnemiga">mGetPosicionEnemiga</A>: cVector;
\r
120 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
121 de la nave propia (en este caso huirá y empezará a avisar al resto de las naves que encuentre
\r
122 sobre la última posición de la nave propia)}</FONT></I>
\r
123 <B>procedure</B> <A HREF="#cNaveEspia.mReaccionar">mReaccionar</A>( np : cNavePropia );<B>override</B>;
\r
124 <I><FONT COLOR="Navy">{** Destructor}</FONT></I>
\r
125 <B>destructor</B> destroy; <B>override</B>;
\r
126 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque esta nave en particular no puede disparar}</FONT></I>
\r
127 <B>function</B> <A HREF="#cNaveEspia.mDisparar">mDisparar</A>( dT: tTiempo; ov : cObjetoVolador = <B>nil</B> ): cArma; <B>override</B>;
\r
128 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque se dibuja de forma distinta}</FONT></I>
\r
129 <B>function</B> <A HREF="#cNaveEspia.mDibujar">mDibujar</A>: tObjetosVoladores; <B>override</B>;
\r
130 <I><FONT COLOR="Navy">// SERIALIZACION </FONT></I>
\r
131 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I>
\r
132 <B>function</B> <A HREF="#cNaveEspia.mSerializar">mSerializar</A>: <B>string</B>; <B>override</B>;
\r
133 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
134 serializado.}</FONT></I>
\r
135 <B>procedure</B> <A HREF="#cNaveEspia.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>override</B>;
\r
138 <I><FONT COLOR="Navy">{** Es una nave sin armas que se desplaza por el epacio
\r
139 hasta que encuentra una nave propia y trata de chocarla.<br>
\r
140 <u>Características:</u>
\r
142 Dimensión: 10 metros
\r
143 Potencia: 4 Cantidad de daño que hace por intervalo de tiempo
\r
144 Energía: 30 Cantidad de daño que soporta antes de ser destruída
\r
145 Velocidad máxima: 0,2 metros/milisegundos (720 km/h)
\r
146 Campo de radar: 2500 metros (2,5 km)
\r
148 Misiles Dirigidos: 0
\r
149 </PRE>}</FONT></I>
\r
150 cNaveSuicida = <B>class</B>( cNaveEnemiga )
\r
152 <I><FONT COLOR="Navy">{** Constructor}</FONT></I>
\r
153 <B>constructor</B> create( pos : cVector = <B>nil</B>; vel : cVector = <B>nil</B> );
\r
154 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
155 de la nave propia (en este caso tratará de chocarla)}</FONT></I>
\r
156 <B>procedure</B> <A HREF="#cNaveSuicida.mReaccionar">mReaccionar</A>( np : cNavePropia );<B>override</B>;
\r
157 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque esta nave en particular no puede disparar}</FONT></I>
\r
158 <B>function</B> <A HREF="#cNaveSuicida.mDisparar">mDisparar</A>( dT: tTiempo; ov : cObjetoVolador = <B>nil</B> ): cArma; <B>override</B>;
\r
159 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque se dibuja de forma distinta}</FONT></I>
\r
160 <B>function</B> <A HREF="#cNaveSuicida.mDibujar">mDibujar</A>: tObjetosVoladores; <B>override</B>;
\r
163 <B>implementation</B>
\r
167 ObjetoPersistente,
\r
170 <I><FONT COLOR="Navy">{ cNavePesada }</FONT></I>
\r
172 <I><FONT COLOR="Navy">{** Crea una instancia de una nave pesada.
\r
173 @param pos Vector posición
\r
174 @param vel Vector velocidad}</FONT></I>
\r
175 <B>constructor</B> cNavePesada.create(pos, vel: cVector);
\r
177 <I><FONT COLOR="Navy">// La dimensión es 5 m de radio, la potencia 2, la energía 100, tiene 5 misiles comunes, </FONT></I>
\r
178 <I><FONT COLOR="Navy">// 2 dirigidos, su velocidad maxima es 0,17 m/mseg (612 km/h) y su Campo de radar 5 km </FONT></I>
\r
179 <B>inherited</B> create( pos, vel, 25 <I><FONT COLOR="Navy">{dim}</FONT></I>, 2 <I><FONT COLOR="Navy">{pot}</FONT></I>, 100 <I><FONT COLOR="Navy">{ene}</FONT></I>, 5 <I><FONT COLOR="Navy">{mis}</FONT></I>, 2 <I><FONT COLOR="Navy">{misdir}</FONT></I>,
\r
180 0.17 <I><FONT COLOR="Navy">{velmax}</FONT></I>, 5000 <I><FONT COLOR="Navy">{rad}</FONT></I>);
\r
181 aCampoMinimo := 500;
\r
184 <B>function</B> <A NAME=cNavePesada.mDibujar>cNavePesada.mDibujar</A>: tObjetosVoladores;
\r
186 result := OV_NAVEPESADA;
\r
189 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
190 de la nave propia cerca (en este caso la atacará con lasers y misiles)
\r
191 @param np Nave Propia con la cual esta reaccionando}</FONT></I>
\r
192 <B>procedure</B> <A NAME=cNavePesada.mReaccionar>cNavePesada.mReaccionar</A>(np: cNavePropia);
\r
194 modulo: tLongitud;
\r
196 modulo := mGetVelMax; <I><FONT COLOR="Navy">// nuevo modulo de la velocidad igual a la velocidad maxima </FONT></I>
\r
197 <B>if</B> mGetDistancia( np ) < aCampoMinimo <B>then</B> <I><FONT COLOR="Navy">// si esta cerca de la nave propia... </FONT></I>
\r
198 <B>if</B> np.mGetVelModulo < mGetVelMax <B>then</B> <I><FONT COLOR="Navy">// si la vel de la nave propia es menor a la maxima </FONT></I>
\r
199 modulo := np.mGetVelModulo; <I><FONT COLOR="Navy">// nuevo modulo de la velocidad igual al de la nave propia </FONT></I>
\r
200 mModificarVelocidad( np, modulo ); <I><FONT COLOR="Navy">// cambiar la velocidad segun la nave propia y el nuevo modulo </FONT></I>
\r
203 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
205 @param str Cadena de texto con el objeto serializado.}</FONT></I>
\r
206 <B>procedure</B> <A NAME=cNavePesada.mDesSerializar>cNavePesada.mDesSerializar</A>(str: <B>string</B>);
\r
210 <B>inherited</B> mDesSerializar( str ); <I><FONT COLOR="Navy">// SIEMPRE el ID debe ser el PRIMER atributo </FONT></I>
\r
211 r := TRegExpr.create;
\r
212 <I><FONT COLOR="Navy">// CAMPORADAR </FONT></I>
\r
213 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
214 r.Expression := '<campominimo>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</campominimo>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
215 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
216 aCampoMinimo := StrToFloat( r.Match[1] )
\r
217 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
218 <B>raise</B> ESerializacion.create( 'No se encontro el campo minimo' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
219 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
220 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
221 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
222 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el campo minimo utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
228 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.
\r
229 @return Cadena de texto con el objeto serializado.}</FONT></I>
\r
230 <B>function</B> <A NAME=cNavePesada.mSerializar>cNavePesada.mSerializar</A>: <B>string</B>;
\r
232 result := <B>inherited</B> mSerializar +
\r
233 '<campominimo>' + FloatToStrF( aCampoMinimo, ffGeneral, 18, 0 ) + '</campominimo>';
\r
236 <I><FONT COLOR="Navy">{ cNaveLiviana }</FONT></I>
\r
238 <I><FONT COLOR="Navy">{** Crea una instancia de una nave liviana.
\r
239 @param pos Vector posición
\r
240 @param vel Vector velocidad}</FONT></I>
\r
241 <B>constructor</B> cNaveLiviana.create(pos, vel: cVector);
\r
243 <I><FONT COLOR="Navy">// La dimensión es 3 m de radio, la potencia 1, la energía 60, no tiene misiles comunes </FONT></I>
\r
244 <I><FONT COLOR="Navy">// ni dirigidos, su velocidad maxima es 0,18 m/mseg (648 km/h) y su Campo de radar 3 km </FONT></I>
\r
245 <I><FONT COLOR="Navy">// El retardo del laser es de .5 segundos, el del misil de 2 segundos y el del misil </FONT></I>
\r
246 <I><FONT COLOR="Navy">// dirigido de 5 segundos. </FONT></I>
\r
247 <B>inherited</B> create( pos, vel, 15 <I><FONT COLOR="Navy">{dim}</FONT></I>, 1 <I><FONT COLOR="Navy">{pot}</FONT></I>, 60 <I><FONT COLOR="Navy">{ene}</FONT></I>, 0 <I><FONT COLOR="Navy">{mis}</FONT></I>, 0 <I><FONT COLOR="Navy">{misdir}</FONT></I>,
\r
248 0.18 <I><FONT COLOR="Navy">{velmax}</FONT></I>, 3000 <I><FONT COLOR="Navy">{rad}</FONT></I>, 500 <I><FONT COLOR="Navy">{retlaser}</FONT></I>);
\r
249 aCampoMinimo := 250;
\r
252 <I><FONT COLOR="Navy">{** Hace que se dispare un arma (todavía no está implementado)}</FONT></I>
\r
253 <B>function</B> <A NAME=cNaveLiviana.mDibujar>cNaveLiviana.mDibujar</A>: tObjetosVoladores;
\r
255 result := OV_NAVELIVIANA;
\r
258 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
259 de la nave propia (en este caso la atacará con lasers)
\r
260 @param np Nave Propia con la cual esta reaccionando}</FONT></I>
\r
261 <B>procedure</B> <A NAME=cNaveLiviana.mReaccionar>cNaveLiviana.mReaccionar</A>(np: cNavePropia);
\r
263 modulo: tLongitud;
\r
265 modulo := mGetVelMax; <I><FONT COLOR="Navy">// nuevo modulo de la velocidad igual a la velocidad maxima </FONT></I>
\r
266 <B>if</B> mGetDistancia( np ) < aCampoMinimo <B>then</B> <I><FONT COLOR="Navy">// si esta cerca de la nave propia... </FONT></I>
\r
267 <B>if</B> np.mGetVelModulo < mGetVelMax <B>then</B> <I><FONT COLOR="Navy">// si la vel de la nave propia es menor a la maxima </FONT></I>
\r
268 modulo := np.mGetVelModulo; <I><FONT COLOR="Navy">// nuevo modulo de la velocidad igual al de la nave propia </FONT></I>
\r
269 mModificarVelocidad( np, modulo ); <I><FONT COLOR="Navy">// cambiar la velocidad segun la nave propia y el nuevo modulo </FONT></I>
\r
272 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
274 @param str Cadena de texto con el objeto serializado.}</FONT></I>
\r
275 <B>procedure</B> <A NAME=cNaveLiviana.mDesSerializar>cNaveLiviana.mDesSerializar</A>(str: <B>string</B>);
\r
279 <B>inherited</B> mDesSerializar( str ); <I><FONT COLOR="Navy">// SIEMPRE el ID debe ser el PRIMER atributo </FONT></I>
\r
280 r := TRegExpr.create;
\r
281 <I><FONT COLOR="Navy">// CAMPORADAR </FONT></I>
\r
282 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
283 r.Expression := '<campominimo>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</campominimo>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
284 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
285 aCampoMinimo := StrToFloat( r.Match[1] )
\r
286 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
287 <B>raise</B> ESerializacion.create( 'No se encontro el campo minimo' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
288 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
289 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
290 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
291 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el campo minimo utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
297 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.
\r
298 @return Cadena de texto con el objeto serializado.}</FONT></I>
\r
299 <B>function</B> <A NAME=cNaveLiviana.mSerializar>cNaveLiviana.mSerializar</A>: <B>string</B>;
\r
301 result := <B>inherited</B> mSerializar +
\r
302 '<campominimo>' + FloatToStrF( aCampoMinimo, ffGeneral, 18, 0 ) + '</campominimo>';
\r
305 <I><FONT COLOR="Navy">{ cNaveEspia }</FONT></I>
\r
307 <I><FONT COLOR="Navy">{** Crea una instancia de una nave espía.
\r
308 @param pos Vector posición
\r
309 @param vel Vector velocidad}</FONT></I>
\r
310 <B>constructor</B> cNaveEspia.create(pos, vel: cVector);
\r
312 <I><FONT COLOR="Navy">// La dimensión es 2 m de radio, la potencia 1, la energía 30, no tiene misiles comunes </FONT></I>
\r
313 <I><FONT COLOR="Navy">// ni dirigidos, su velocidad maxima es 0,2 m/mseg (720 km/h) y su Campo de radar 3 km </FONT></I>
\r
314 <B>inherited</B> create( pos, vel, 10 <I><FONT COLOR="Navy">{dim}</FONT></I>, 1 <I><FONT COLOR="Navy">{pot}</FONT></I>, 30 <I><FONT COLOR="Navy">{ene}</FONT></I>, 0 <I><FONT COLOR="Navy">{mis}</FONT></I>, 0 <I><FONT COLOR="Navy">{misdir}</FONT></I>,
\r
315 0.2 <I><FONT COLOR="Navy">{velmax}</FONT></I>, 2000 <I><FONT COLOR="Navy">{rad}</FONT></I> );
\r
316 aPosicionEnemiga := <B>nil</B>;
\r
319 <I><FONT COLOR="Navy">{** Destructor}</FONT></I>
\r
320 <B>destructor</B> cNaveEspia.destroy;
\r
322 aPosicionEnemiga.free;
\r
326 <I><FONT COLOR="Navy">{** Hace que se dispare un arma
\r
327 @param ov Objetivo del disparo
\r
328 @return Arma disparada (o <i>nil</i> si no se puede disparar ningún arma)}</FONT></I>
\r
329 <B>function</B> <A NAME=cNaveEspia.mDisparar>cNaveEspia.mDisparar</A>( dT: tTiempo; ov : cObjetoVolador ): cArma;
\r
331 result := <B>nil</B>; <I><FONT COLOR="Navy">// No puede disparar nada (nunca!) </FONT></I>
\r
334 <I><FONT COLOR="Navy">{** Método que indica si está avisando
\r
335 @return <i>true</i> si está avisando, <i>false</i> si no lo está}</FONT></I>
\r
336 <B>function</B> <A NAME=cNaveEspia.mAvisando>cNaveEspia.mAvisando</A>: boolean;
\r
338 result := ( aPosicionEnemiga <> <B>nil</B> ); <I><FONT COLOR="Navy">// True si la posicion no es nil </FONT></I>
\r
341 <I><FONT COLOR="Navy">{** Método que devuelve la última posición en dónde vió a la nave propia (si está avisando)
\r
342 @return Última posición donde detectó a la nave propia (<i>nil</i> si no la detecto nunca)}</FONT></I>
\r
343 <B>function</B> <A NAME=cNaveEspia.mDibujar>cNaveEspia.mDibujar</A>: tObjetosVoladores;
\r
345 result := OV_NAVEESPIA;
\r
348 <B>function</B> <A NAME=cNaveEspia.mGetPosicionEnemiga>cNaveEspia.mGetPosicionEnemiga</A>: cVector;
\r
350 result := cVector.create( aPosicionEnemiga );
\r
353 <I><FONT COLOR="Navy">{** Modifica la velocidad de la nave en base a la nave propia.
\r
354 @param np Nave propia con la cual se calculará la dirección de la nueva velocidad
\r
355 @param modulo Nuevo módulo de la velocidad}</FONT></I>
\r
356 <B>procedure</B> <A NAME=cNaveEspia.mModificarVelocidad>cNaveEspia.mModificarVelocidad</A>(np: cNavePropia; modulo: tLongitud);
\r
358 pos, <I><FONT COLOR="Navy">// Vector temporal </FONT></I>
\r
359 vel: cVector; <I><FONT COLOR="Navy">// Vector temporal </FONT></I>
\r
361 pos := np.mGetPosicion;
\r
362 vel := mGetPosicion.mRestar( pos ); <I><FONT COLOR="Navy">// Crea un vector igual a su posicion </FONT></I>
\r
363 <I><FONT COLOR="Navy">// Le resta la posicion de la nave propia </FONT></I>
\r
364 mSetVelModulo( mGetVelMax ); <I><FONT COLOR="Navy">// Setea el modulo al maximo </FONT></I>
\r
365 mSetVelDir( vel ); <I><FONT COLOR="Navy">// Copia el vector a su velocidad </FONT></I>
\r
366 vel.free; <I><FONT COLOR="Navy">// Libera el vector temporal </FONT></I>
\r
367 pos.free; <I><FONT COLOR="Navy">// Libera el vector temporal </FONT></I>
\r
370 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
371 de la nave propia (en este caso huirá y empezará a avisar al resto de las naves que encuentre
\r
372 sobre la última posición de la nave propia)
\r
373 @param np Nave Propia con la cual esta reaccionando}</FONT></I>
\r
374 <B>procedure</B> <A NAME=cNaveEspia.mReaccionar>cNaveEspia.mReaccionar</A>(np: cNavePropia);
\r
376 mModificarVelocidad( np );
\r
377 <I><FONT COLOR="Navy">// Si ya tiene una posición, la modifica, si no crea una nueva </FONT></I>
\r
378 <B>if</B> aPosicionEnemiga <> <B>nil</B> <B>then</B>
\r
379 aPosicionEnemiga.free;
\r
380 aPosicionEnemiga := np.mGetPosicion;
\r
383 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
385 @param str Cadena de texto con el objeto serializado.}</FONT></I>
\r
386 <B>procedure</B> <A NAME=cNaveEspia.mDesSerializar>cNaveEspia.mDesSerializar</A>(str: <B>string</B>);
\r
390 <B>inherited</B> mDesSerializar( str ); <I><FONT COLOR="Navy">// SIEMPRE el ID debe ser el PRIMER atributo </FONT></I>
\r
391 r := TRegExpr.create;
\r
392 <I><FONT COLOR="Navy">// POSICIONENEMIGA </FONT></I>
\r
393 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
394 r.Expression := '<posicionenemiga>/s*(.+)/s*</posicionenemiga>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
395 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
396 <B>if</B> r.Match[1] = 'nil' <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si la posicion enemiga recuperada es nil... </FONT></I>
\r
397 aPosicionEnemiga.free; <I><FONT COLOR="Navy">// Libera la posicion actual </FONT></I>
\r
398 aPosicionEnemiga := <B>nil</B>; <I><FONT COLOR="Navy">// y la pone en nil </FONT></I>
\r
399 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// si es otra cosa, la interpreta </FONT></I>
\r
400 <B>if</B> aPosicionEnemiga <> <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no es nulo </FONT></I>
\r
401 aPosicionEnemiga.mDesSerializar( r.Match[1] ) <I><FONT COLOR="Navy">// Lo deserializa </FONT></I>
\r
402 <B>else</B> <I><FONT COLOR="Navy">// si es nulo </FONT></I>
\r
403 aPosicionEnemiga := cVector.crearDeSerializado( r.Match[1] ) <I><FONT COLOR="Navy">// lo crea </FONT></I>
\r
404 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
405 <B>raise</B> ESerializacion.create( 'No se encontro la posicion enemiga' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
406 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
407 on e: ESerializacion <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si fueron de serializacion... </FONT></I>
\r
408 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
409 <B>raise</B> ESerializacion.create( ClassName + ': Error al deserializar la posicion enemiga: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
411 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
412 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
413 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer la posicion enemiga utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
419 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.
\r
420 @return Cadena de texto con el objeto serializado.}</FONT></I>
\r
421 <B>function</B> <A NAME=cNaveEspia.mSerializar>cNaveEspia.mSerializar</A>: <B>string</B>;
\r
423 posene: <B>string</B>;
\r
425 <I><FONT COLOR="Navy">// Si el objetivo es nil o está destruido, se setea el atributo class del </FONT></I>
\r
426 <I><FONT COLOR="Navy">// TAG objetivo como '0' y entre el TAG se indica que es nil. Si no se </FONT></I>
\r
427 <I><FONT COLOR="Navy">// setea como el nombre de la clase y su expresion serializada respectivamente </FONT></I>
\r
429 <B>if</B> aPosicionEnemiga <> <B>nil</B> <B>then</B>
\r
430 posene := aPosicionEnemiga.mSerializar;
\r
431 result := <B>inherited</B> mSerializar +
\r
432 '<posicionenemiga>' + posene + '</posicionenemiga>';
\r
435 <I><FONT COLOR="Navy">{ cNaveSuicida }</FONT></I>
\r
437 <I><FONT COLOR="Navy">{** Crea una instancia de una nave suicida.
\r
438 @param pos Vector posición
\r
439 @param vel Vector velocidad}</FONT></I>
\r
440 <B>constructor</B> cNaveSuicida.create(pos, vel: cVector);
\r
442 <I><FONT COLOR="Navy">// La dimensión es 2 m de radio, la potencia 4, la energía 30, no tiene misiles comunes </FONT></I>
\r
443 <I><FONT COLOR="Navy">// ni dirigidos, su velocidad maxima es 0,2 m/mseg (720 km/h) y su Campo de radar 1 km </FONT></I>
\r
444 <B>inherited</B> create( pos, vel, 10 <I><FONT COLOR="Navy">{dim}</FONT></I>, 4 <I><FONT COLOR="Navy">{pot}</FONT></I>, 30 <I><FONT COLOR="Navy">{ene}</FONT></I>, 0 <I><FONT COLOR="Navy">{mis}</FONT></I>, 0 <I><FONT COLOR="Navy">{misdir}</FONT></I>,
\r
445 0.2 <I><FONT COLOR="Navy">{velmax}</FONT></I>, 2500 <I><FONT COLOR="Navy">{rad}</FONT></I>);
\r
448 <I><FONT COLOR="Navy">{** Método heredado que hace que la nave reaccione ante la presencia
\r
449 de la nave propia (en este caso tratará de chocarla)
\r
450 @param np Nave Propia con la cual esta reaccionando}</FONT></I>
\r
451 <B>function</B> <A NAME=cNaveSuicida.mDibujar>cNaveSuicida.mDibujar</A>: tObjetosVoladores;
\r
453 result := OV_NAVESUICIDA;
\r
456 <B>procedure</B> <A NAME=cNaveSuicida.mReaccionar>cNaveSuicida.mReaccionar</A>(np: cNavePropia);
\r
458 mModificarVelocidad( np );
\r
461 <I><FONT COLOR="Navy">{** Hace que se dispare un arma
\r
462 @param ov Objetivo del disparo
\r
463 @return Arma disparada (o <i>nil</i> si no se puede disparar ningún arma)}</FONT></I>
\r
464 <B>function</B> <A NAME=cNaveSuicida.mDisparar>cNaveSuicida.mDisparar</A>( dT: tTiempo; ov : cObjetoVolador ): cArma;
\r
466 result := <B>nil</B>; <I><FONT COLOR="Navy">// No puede disparar nada (nunca!) </FONT></I>
\r