]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/modelo/ov/naves/NavesEnemigas.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / doc / src-html / modelo / ov / naves / NavesEnemigas.pas
1 <HTML><HEAD>\r
2 <TITLE>File: navesenemigas.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\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
7 <HR>\r
8 <PRE>\r
9 <I><FONT COLOR="Navy">{** Distintos tipos de Naves Enemigas<br> \r
10     <i>Cambios:</i> \r
11     <PRE> \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
15     </PRE>}</FONT></I> \r
16 <B>unit</B> NavesEnemigas; \r
17  \r
18 <B>interface</B> \r
19  \r
20 <B>uses</B> \r
21   Tipos, \r
22   Vectores, \r
23   Nave, \r
24   NaveEnemiga, \r
25   NavePropia, \r
26   ObjetoVolador, \r
27   Armas; \r
28  \r
29 <B>type</B> \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
33       <PRE> \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
39       Misiles:              5 \r
40       Misiles Dirigidos:    2 \r
41       </PRE>}</FONT></I> \r
42   cNavePesada = <B>class</B>( cNaveEnemiga ) \r
43     <B>private</B> \r
44       aCampoMinimo: tLongitud; <I><FONT COLOR="Navy">// Distancia minima a la nave propia </FONT></I>\r
45     <B>public</B> \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
59   <B>end</B>; \r
60  \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
64       <PRE> \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
70       Misiles:              0 \r
71       Misiles Dirigidos:    0 \r
72       </PRE>}</FONT></I> \r
73   cNaveLiviana = <B>class</B>( cNaveEnemiga ) \r
74     <B>private</B> \r
75       aCampoMinimo: tLongitud; <I><FONT COLOR="Navy">// Distancia minima a la nave propia </FONT></I>\r
76     <B>public</B> \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
90   <B>end</B>; \r
91  \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
96       <PRE> \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
102       Misiles:              0 \r
103       Misiles Dirigidos:    0 \r
104       </PRE>}</FONT></I> \r
105   cNaveEspia = <B>class</B>( cNaveEnemiga ) \r
106     <B>private</B> \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
109     <B>protected</B> \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
113     <B>public</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
136   <B>end</B>; \r
137  \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
141       <PRE> \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
147       Misiles:              0 \r
148       Misiles Dirigidos:    0 \r
149       </PRE>}</FONT></I> \r
150   cNaveSuicida = <B>class</B>( cNaveEnemiga ) \r
151     <B>public</B> \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
161   <B>end</B>; \r
162  \r
163 <B>implementation</B> \r
164  \r
165 <B>uses</B> \r
166   RegExpr, \r
167   ObjetoPersistente, \r
168   Sysutils; \r
169  \r
170 <I><FONT COLOR="Navy">{ cNavePesada }</FONT></I> \r
171  \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
176 <B>begin</B> \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
182 <B>end</B>; \r
183  \r
184 <B>function</B> <A NAME=cNavePesada.mDibujar>cNavePesada.mDibujar</A>: tObjetosVoladores; \r
185 <B>begin</B> \r
186   result := OV_NAVEPESADA; \r
187 <B>end</B>; \r
188  \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
193 <B>var</B> \r
194   modulo: tLongitud; \r
195 <B>begin</B> \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
201 <B>end</B>; \r
202  \r
203 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto \r
204     serializado. \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
207 <B>var</B> \r
208   r: TRegExpr; \r
209 <B>begin</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
223     <B>end</B>; \r
224   <B>end</B>; \r
225   r.free; \r
226 <B>end</B>; \r
227  \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
231 <B>begin</B> \r
232   result := <B>inherited</B> mSerializar + \r
233             '<campominimo>' + FloatToStrF( aCampoMinimo, ffGeneral, 18, 0 ) + '</campominimo>'; \r
234 <B>end</B>; \r
235  \r
236 <I><FONT COLOR="Navy">{ cNaveLiviana }</FONT></I> \r
237  \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
242 <B>begin</B> \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
250 <B>end</B>; \r
251  \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
254 <B>begin</B> \r
255   result := OV_NAVELIVIANA; \r
256 <B>end</B>; \r
257  \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
262 <B>var</B> \r
263   modulo: tLongitud; \r
264 <B>begin</B> \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
270 <B>end</B>; \r
271  \r
272 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto \r
273     serializado. \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
276 <B>var</B> \r
277   r: TRegExpr; \r
278 <B>begin</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
292     <B>end</B>; \r
293   <B>end</B>; \r
294   r.free; \r
295 <B>end</B>; \r
296  \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
300 <B>begin</B> \r
301   result := <B>inherited</B> mSerializar + \r
302             '<campominimo>' + FloatToStrF( aCampoMinimo, ffGeneral, 18, 0 ) + '</campominimo>'; \r
303 <B>end</B>; \r
304  \r
305 <I><FONT COLOR="Navy">{ cNaveEspia }</FONT></I> \r
306  \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
311 <B>begin</B> \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
317 <B>end</B>; \r
318  \r
319 <I><FONT COLOR="Navy">{** Destructor}</FONT></I> \r
320 <B>destructor</B> cNaveEspia.destroy; \r
321 <B>begin</B> \r
322   aPosicionEnemiga.free; \r
323   <B>inherited</B>; \r
324 <B>end</B>; \r
325  \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
330 <B>begin</B> \r
331   result := <B>nil</B>; <I><FONT COLOR="Navy">// No puede disparar nada (nunca!) </FONT></I>\r
332 <B>end</B>; \r
333  \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
337 <B>begin</B> \r
338   result := ( aPosicionEnemiga <> <B>nil</B> ); <I><FONT COLOR="Navy">// True si la posicion no es nil </FONT></I>\r
339 <B>end</B>; \r
340  \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
344 <B>begin</B> \r
345   result := OV_NAVEESPIA; \r
346 <B>end</B>; \r
347  \r
348 <B>function</B> <A NAME=cNaveEspia.mGetPosicionEnemiga>cNaveEspia.mGetPosicionEnemiga</A>: cVector; \r
349 <B>begin</B> \r
350   result := cVector.create( aPosicionEnemiga ); \r
351 <B>end</B>; \r
352  \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
357 <B>var</B> \r
358   pos,          <I><FONT COLOR="Navy">// Vector temporal </FONT></I>\r
359   vel: cVector; <I><FONT COLOR="Navy">// Vector temporal </FONT></I>\r
360 <B>begin</B> \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
368 <B>end</B>; \r
369  \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
375 <B>begin</B> \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
381 <B>end</B>; \r
382  \r
383 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto \r
384     serializado. \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
387 <B>var</B> \r
388   r: TRegExpr; \r
389 <B>begin</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
410     <B>end</B>; \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
414     <B>end</B>; \r
415   <B>end</B>; \r
416   r.free; \r
417 <B>end</B>; \r
418  \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
422 <B>var</B> \r
423   posene: <B>string</B>; \r
424 <B>begin</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
428   posene := 'nil'; \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
433 <B>end</B>; \r
434  \r
435 <I><FONT COLOR="Navy">{ cNaveSuicida }</FONT></I> \r
436  \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
441 <B>begin</B> \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
446 <B>end</B>; \r
447  \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
452 <B>begin</B> \r
453   result := OV_NAVESUICIDA; \r
454 <B>end</B>; \r
455  \r
456 <B>procedure</B> <A NAME=cNaveSuicida.mReaccionar>cNaveSuicida.mReaccionar</A>(np: cNavePropia); \r
457 <B>begin</B> \r
458   mModificarVelocidad( np ); \r
459 <B>end</B>; \r
460  \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
465 <B>begin</B> \r
466   result := <B>nil</B>; <I><FONT COLOR="Navy">// No puede disparar nada (nunca!) </FONT></I>\r
467 <B>end</B>; \r
468  \r
469 <B>end</B>. \r
470 </PRE>\r
471 </BODY>\r
472 </HTML>\r