]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/modelo/ov/naves/Nave.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / doc / src-html / modelo / ov / naves / Nave.pas
1 <HTML><HEAD>\r
2 <TITLE>File: nave.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\r
5 <BODY BGCOLOR="#FFFFFF">\r
6 <A NAME=nave.pas><CENTER><H3>nave.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">{** Contiene una clase abstracta con elementos comunes a todas las naves.<br> \r
10     <i>Cambios:</i> \r
11     <PRE> \r
12     27/11/00: Se agrega toda la parte del manejo de disparos, agregándose los métodos mPuedeDispararLaser, \r
13               mPuedeDispararMisil, mPuedeDispararMisDir y mDisparar, además de varios atributos para manejar \r
14               los retardos de las armas. El método mDisparar se hace virtual ya que puede ser modificado por \r
15               las subclases para que cambie su mecanismo de disparos. \r
16     29/11/00: Se agregan métodos para obtener la cantidad de armamento que le queda a la nave para poder ser \r
17               mostrados (mGetMisiles y mGetMisilesDirigidos) \r
18     01/12/00: Se modifican levemente los metodos mPuedeDispararXxxx para que permitan disparar si el puntero \r
19               al Objeto Volador objetivo es nil. \r
20               Se Agregan los métodos mRetardarLaser, mRetardarMisil, mRetardarMisDir que resetea el contador \r
21               del retardo, mActualizarRetardos que resta el dT a los retardos, y mCrearLaserDisparado, \r
22               mCrearMisilDisparado y mCrearMisDirDisparado que crea el arma correspondiente (actualizando \r
23               retardos y todo lo que sea necesario) para que las subclases puedan escribir su propio mDisparar. \r
24               Se cambia el orden de los argumentos de mDisparar para aprovechar los argumentos por defecto. \r
25     08/12/00: Se sobreescribieron los métodos para establecer la velocidad y su módulo para evitar que se \r
26               sobrepase el límite de la velocidad máxima. \r
27     </PRE>}</FONT></I> \r
28 <B>unit</B> Nave; \r
29  \r
30 <B>interface</B> \r
31  \r
32 <B>uses</B> \r
33   ObjetoVolador, \r
34   Tipos, \r
35   Vectores, \r
36   Armas; \r
37  \r
38 <B>type</B> \r
39   <I><FONT COLOR="Navy">{** Clase abstracta con elementos comunes a todas las naves.}</FONT></I> \r
40   cNave = <B>class</B>( cObjetoVolador ) \r
41     <B>private</B> \r
42       aMisiles:           tMaxMisil;         <I><FONT COLOR="Navy">// Cantidad de misilies comunes </FONT></I>\r
43       aMisilesDirigidos:  tMaxMisilDirigido; <I><FONT COLOR="Navy">// Cantidad de misiles dirigidos </FONT></I>\r
44       aVelMaxima:         tLongitud;        <I><FONT COLOR="Navy">// Velocidad máxima de la nave </FONT></I>\r
45       aRetardoLaser:      tTiempo;          <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar </FONT></I>\r
46       aRetardoMisil:      tTiempo;          <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar </FONT></I>\r
47       aRetardoMisDir:     tTiempo;          <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar </FONT></I>\r
48       aRetardoLaserCont:  tTiempo;          <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar (contador) </FONT></I>\r
49       aRetardoMisilCont:  tTiempo;          <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar (contador) </FONT></I>\r
50       aRetardoMisDirCont: tTiempo;          <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar (contador) </FONT></I>\r
51     <B>protected</B> \r
52       <I><FONT COLOR="Navy">{** Setea la velocidad máxima}</FONT></I> \r
53       <B>function</B> <A HREF="#cNave.mSetVelMax">mSetVelMax</A>( velMax: tLongitud ): cNave; \r
54       <I><FONT COLOR="Navy">{** Resta un misil}</FONT></I> \r
55       <B>function</B> <A HREF="#cNave.mRestarMisil">mRestarMisil</A>: cNave; \r
56       <I><FONT COLOR="Navy">{** Resta un misil dirigido}</FONT></I> \r
57       <B>function</B> <A HREF="#cNave.mRestarMisilDirigido">mRestarMisilDirigido</A>: cNave; \r
58       <I><FONT COLOR="Navy">{** Devuelve true si todavía tiene misiles}</FONT></I> \r
59       <B>function</B> <A HREF="#cNave.mTieneMisil">mTieneMisil</A>: boolean; \r
60       <I><FONT COLOR="Navy">{** Devuelve true si todavía tiene misiles dirigidos}</FONT></I> \r
61       <B>function</B> <A HREF="#cNave.mTieneMisilDirigido">mTieneMisilDirigido</A>: boolean; \r
62       <I><FONT COLOR="Navy">{** Resetea el contador del retardo del láser}</FONT></I> \r
63       <B>procedure</B> <A HREF="#cNave.mRetardarLaser">mRetardarLaser</A>; \r
64       <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil}</FONT></I> \r
65       <B>procedure</B> <A HREF="#cNave.mRetardarMisil">mRetardarMisil</A>; \r
66       <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil dirigido}</FONT></I> \r
67       <B>procedure</B> <A HREF="#cNave.mRetardarMisDir">mRetardarMisDir</A>; \r
68       <I><FONT COLOR="Navy">{** Actualiza los retardadores}</FONT></I> \r
69       <B>procedure</B> <A HREF="#cNave.mActualizarRetardadores">mActualizarRetardadores</A>( dT: tTiempo ); \r
70       <I><FONT COLOR="Navy">{** Crea un laser (actualizando retardos y todo lo que sea necesario)}</FONT></I> \r
71       <B>function</B> <A HREF="#cNave.mCrearLaserDisparado">mCrearLaserDisparado</A>: cLaser; \r
72       <I><FONT COLOR="Navy">{** Crea un misil (actualizando retardos y todo lo que sea necesario)}</FONT></I> \r
73       <B>function</B> <A HREF="#cNave.mCrearMisilDisparado">mCrearMisilDisparado</A>: cMisil; \r
74       <I><FONT COLOR="Navy">{** Crea un misil dirigido (actualizando retardos y todo lo que sea necesario)}</FONT></I> \r
75       <B>function</B> <A HREF="#cNave.mCrearMisDirDisparado">mCrearMisDirDisparado</A>( ov : cObjetoVolador ): cMisilDirigido; \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>; dim: tLongitud = 5; \r
79                           pot: tEnergia = 1; ene: tEnergia = 100; misiles: tMaxMisil = 0; \r
80                           misilesDirigidos: tMaxMisilDirigido = 0; velMax: tLongitud = 0.2; \r
81                           retardoLaser:   tTiempo = 1000;  <I><FONT COLOR="Navy">{1 segundo}</FONT></I> \r
82                           retardoMisil:  tTiempo = 60000; <I><FONT COLOR="Navy">{1 minuto}</FONT></I> \r
83                           retardoMisDir: tTiempo = 180000 <I><FONT COLOR="Navy">{3 minutos}</FONT></I>); overload; \r
84       <I><FONT COLOR="Navy">{** Hace que se dispare un arma (todavía no está implementado), devolviendo la nueva \r
85           municion disparada}</FONT></I> \r
86       <B>function</B> <A HREF="#cNave.mDisparar">mDisparar</A>( dT: tTiempo; ov : cObjetoVolador = <B>nil</B> ): cArma; <B>virtual</B>; \r
87       <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles que le quedan a la nave}</FONT></I> \r
88       <B>function</B> <A HREF="#cNave.mGetMisiles">mGetMisiles</A>: tMaxMisil; \r
89       <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles Dirigidos que le quedan a la nave}</FONT></I> \r
90       <B>function</B> <A HREF="#cNave.mGetMisilesDirigidos">mGetMisilesDirigidos</A>: tMaxMisilDirigido; \r
91       <I><FONT COLOR="Navy">{** Obtiene la velocidad máxima}</FONT></I> \r
92       <B>function</B> <A HREF="#cNave.mGetVelMax">mGetVelMax</A>: tLongitud; \r
93       <I><FONT COLOR="Navy">{** Método para establecer la velocidad}</FONT></I> \r
94       <B>function</B> <A HREF="#cNave.mSetVelocidad">mSetVelocidad</A>( velocidad: cVector ): cObjetoVolador; <B>override</B>; \r
95       <I><FONT COLOR="Navy">{** Método para establecer el modulo de la velocidad}</FONT></I> \r
96       <B>function</B> <A HREF="#cNave.mSetVelModulo">mSetVelModulo</A>( velocidad: tLongitud ): cObjetoVolador; <B>override</B>; \r
97       <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.}</FONT></I> \r
98       <B>function</B> <A HREF="#cNave.mPuedeDispararLaser">mPuedeDispararLaser</A>( ov : cObjetoVolador ): boolean; \r
99       <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.}</FONT></I> \r
100       <B>function</B> <A HREF="#cNave.mPuedeDispararMisil">mPuedeDispararMisil</A>( ov : cObjetoVolador ): boolean; \r
101       <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.}</FONT></I> \r
102       <B>function</B> <A HREF="#cNave.mPuedeDispararMisDir">mPuedeDispararMisDir</A>( ov : cObjetoVolador ): boolean; \r
103       <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
104       <I><FONT COLOR="Navy">{** Método heredado que devuelve un string con el estado del Objeto. Se utiliza para depurar \r
105           y la información entregada depende del parámetro tDebugInfo.}</FONT></I> \r
106       <B>function</B> <A HREF="#cNave.mGetDebugInfo">mGetDebugInfo</A>( debugLevel: tDebugInfo = DI_MINI ): <B>string</B>; <B>override</B>; \r
107       <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
108       <I><FONT COLOR="Navy">// SERIALIZACION </FONT></I>\r
109       <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I> \r
110       <B>function</B> <A HREF="#cNave.mSerializar">mSerializar</A>: <B>string</B>; <B>override</B>; \r
111       <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto \r
112           serializado.}</FONT></I> \r
113       <B>procedure</B> <A HREF="#cNave.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>override</B>; \r
114   <B>end</B>; \r
115  \r
116 <B>implementation</B> \r
117  \r
118 <B>uses</B> \r
119   RegExpr, \r
120   ObjetoPersistente, \r
121   Sysutils; \r
122  \r
123 <I><FONT COLOR="Navy">{ cNave }</FONT></I> \r
124  \r
125 <I><FONT COLOR="Navy">{** Constructor \r
126     @param pos              Posicion inicial \r
127     @param vel              Velocidad inicial \r
128     @param dim              Dimensión (radio, en metros) \r
129     @param pot              Potencia (cantidad de daño que hace por intervalode tiempo) \r
130     @param ene              Energía (cantidad de daño que soporta antes de ser destruido) \r
131     @param misiles          Cantidad de misiles comunes \r
132     @param misilesDirigidos Cantidad de misiles dirigidos \r
133     @param velMax           Velocidad máxima que puede alcanzar (modulo) \r
134     @param retardoLaser     Ratardo del arma antes de poder volver a disparar \r
135     @param retardoMisil     Ratardo del arma antes de poder volver a disparar \r
136     @param retardoMisDir    Ratardo del arma antes de poder volver a disparar}</FONT></I> \r
137 <B>constructor</B> cNave.create(pos, vel: cVector; dim: tLongitud; pot, \r
138   ene: tEnergia; misiles: tMaxMisil; misilesDirigidos: tMaxMisilDirigido; \r
139   velMax: tLongitud; retardoLaser: tTiempo; retardoMisil: tTiempo; \r
140   retardoMisDir: tTiempo); \r
141 <B>begin</B> \r
142   <B>if</B> vel <> <B>nil</B> <B>then</B> \r
143     <B>if</B> vel.mGetModulo > velMax <B>then</B> \r
144       vel.mSetModulo( velMax ); \r
145   <B>inherited</B> create( pos, vel, dim, pot, ene ); \r
146   aMisiles := misiles; \r
147   aMisilesDirigidos := misilesDirigidos; \r
148   aVelMaxima := velMax; \r
149   aRetardoLaser  := retardoLaser; \r
150   aRetardoMisil  := retardoMisil; \r
151   aRetardoMisDir := retardoMisDir; \r
152   aRetardoLaserCont  := 0; <I><FONT COLOR="Navy">// lista para disparar </FONT></I>\r
153   aRetardoMisilCont  := 0; <I><FONT COLOR="Navy">// lista para disparar </FONT></I>\r
154   aRetardoMisDirCont := 0; <I><FONT COLOR="Navy">// lista para disparar </FONT></I>\r
155 <B>end</B>; \r
156  \r
157 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
158 <I><FONT COLOR="Navy">{** Devuelve el estado del objeto basandose en la cantidad de datos requeridos. \r
159     @return            Cadena de texto con el estado del Objeto. \r
160     @param   debugLevel Cantidad de información requerida}</FONT></I> \r
161 <B>function</B> <A NAME=cNave.mGetDebugInfo>cNave.mGetDebugInfo</A>(debugLevel: tDebugInfo): <B>string</B>; \r
162 <B>begin</B> \r
163   result := <B>inherited</B> mGetDebugInfo( debugLevel ); \r
164   <B>if</B> debugLevel > DI_MINI <B>then</B> \r
165     result := result + ' | Misiles: ' + IntToStr( aMisiles ) + \r
166               ' | Misiles Dirigidos: ' + IntToStr( aMisilesDirigidos ); \r
167 <B>end</B>; \r
168 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
169  \r
170 <I><FONT COLOR="Navy">{** Devuelve la velocidad máxima \r
171     @return Velocidad máxima (modulo)}</FONT></I> \r
172 <B>function</B> <A NAME=cNave.mGetVelMax>cNave.mGetVelMax</A>: tLongitud; \r
173 <B>begin</B> \r
174   result := aVelMaxima; \r
175 <B>end</B>; \r
176  \r
177 <I><FONT COLOR="Navy">{** Resta un misil}</FONT></I> \r
178 <B>function</B> <A NAME=cNave.mRestarMisil>cNave.mRestarMisil</A>: cNave; \r
179 <B>begin</B> \r
180   aMisiles := aMisiles - 1; \r
181   result := self; \r
182 <B>end</B>; \r
183  \r
184 <I><FONT COLOR="Navy">{** Resta un misil dirigido}</FONT></I> \r
185 <B>function</B> <A NAME=cNave.mRestarMisilDirigido>cNave.mRestarMisilDirigido</A>: cNave; \r
186 <B>begin</B> \r
187   aMisilesDirigidos := aMisilesDirigidos - 1; \r
188   result := self; \r
189 <B>end</B>; \r
190  \r
191 <I><FONT COLOR="Navy">{** Setea la velocidad máxima \r
192     @param velMax Nueva velocidad máxima (modulo)}</FONT></I> \r
193 <B>function</B> <A NAME=cNave.mSetVelMax>cNave.mSetVelMax</A>(velMax: tLongitud): cNave; \r
194 <B>begin</B> \r
195   aVelMaxima := velMax; \r
196   result := self; \r
197 <B>end</B>; \r
198  \r
199 <I><FONT COLOR="Navy">{** Chequea si todavía tiene misiles \r
200     @return <i>true</i> si tiene misiles, <i>false</i> si no}</FONT></I> \r
201 <B>function</B> <A NAME=cNave.mTieneMisil>cNave.mTieneMisil</A>: boolean; \r
202 <B>begin</B> \r
203   result := ( aMisiles > 0 ); <I><FONT COLOR="Navy">// Devuelve true si aMisiles es mayor que cero </FONT></I>\r
204 <B>end</B>; \r
205  \r
206 <I><FONT COLOR="Navy">{** Chequea si todavía tiene misiles dirigidos \r
207     @return <i>true</i> si tiene misiles dirigidos, <i>false</i> si no}</FONT></I> \r
208 <B>function</B> <A NAME=cNave.mTieneMisilDirigido>cNave.mTieneMisilDirigido</A>: boolean; \r
209 <B>begin</B> \r
210   result := ( aMisilesDirigidos > 0 ); <I><FONT COLOR="Navy">// Devuelve true si aMisilesDirigidos es mayor que cero </FONT></I>\r
211 <B>end</B>; \r
212  \r
213 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc. \r
214     @param  np Nave Propia a la que quiere disparar \r
215     @return <i>True</i> si está todo ok, <i>False</i> si no.}</FONT></I> \r
216 <B>function</B> <A NAME=cNave.mPuedeDispararLaser>cNave.mPuedeDispararLaser</A>( ov : cObjetoVolador ): boolean; \r
217 <B>begin</B> \r
218   result := false; \r
219   <B>if</B> aRetardoLaserCont <= 0 <B>then</B> <I><FONT COLOR="Navy">// Primero se fija que ya esté recargada el arma </FONT></I>\r
220     <I><FONT COLOR="Navy">// 1200 es el alcance del laser. </FONT></I>\r
221     <B>if</B> ov <> <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el ov es nil puede disparar, ni no lo es, chequea la distancia </FONT></I>\r
222       <B>if</B> mGetDistancia( ov ) < 1200 <B>then</B><I><FONT COLOR="Navy">// Si la distancia a la np es menor que el alcance </FONT></I>\r
223         result := true; \r
224     <B>end</B> <B>else</B> \r
225       result := true; \r
226 <B>end</B>; \r
227  \r
228 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc. \r
229     @param  np Nave Propia a la que quiere disparar \r
230     @return <i>True</i> si está todo ok, <i>False</i> si no.}</FONT></I> \r
231 <B>function</B> <A NAME=cNave.mPuedeDispararMisil>cNave.mPuedeDispararMisil</A>( ov : cObjetoVolador ): boolean; \r
232 <B>begin</B> \r
233   result := false; \r
234   <I><FONT COLOR="Navy">// Primero se fija que ya esté recargada el arma y que todavia tenga municiones </FONT></I>\r
235   <B>if</B> mTieneMisil <B>and</B> ( aRetardoMisilCont <= 0 ) <B>then</B> \r
236     <I><FONT COLOR="Navy">// 1500 es el alcance del misil. </FONT></I>\r
237     <B>if</B> ov <> <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el ov es nil puede disparar, ni no lo es, chequea la distancia </FONT></I>\r
238       <B>if</B> mGetDistancia( ov ) < 1500 <B>then</B><I><FONT COLOR="Navy">// Si la distancia a la np es menor que el alcance </FONT></I>\r
239         result := true; \r
240     <B>end</B> <B>else</B> \r
241       result := true; \r
242 <B>end</B>; \r
243  \r
244 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc. \r
245     @param  np Nave Propia a la que quiere disparar \r
246     @return <i>True</i> si está todo ok, <i>False</i> si no.}</FONT></I> \r
247 <B>function</B> <A NAME=cNave.mPuedeDispararMisDir>cNave.mPuedeDispararMisDir</A>( ov : cObjetoVolador ): boolean; \r
248 <B>begin</B> \r
249   result := false; \r
250   <I><FONT COLOR="Navy">// Primero se fija que ya esté recargada el arma y que todavia tenga municiones </FONT></I>\r
251   <B>if</B> mTieneMisilDirigido <B>and</B> ( aRetardoMisDirCont <= 0 ) <B>then</B> \r
252     <I><FONT COLOR="Navy">// 2000 es el alcance del misil dirigido. </FONT></I>\r
253     <B>if</B> ov <> <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el ov es nil puede disparar, ni no lo es, chequea la distancia </FONT></I>\r
254       <B>if</B> mGetDistancia( ov ) < 2000 <B>then</B><I><FONT COLOR="Navy">// Si la distancia a la np es menor que el alcance </FONT></I>\r
255         result := true; \r
256     <B>end</B> <B>else</B> \r
257       result := true; \r
258 <B>end</B>; \r
259  \r
260 <I><FONT COLOR="Navy">{** Hace que se dispare un arma \r
261     @param  ov Objetivo del disparo \r
262     @param  dT Intervalo de tiempo \r
263     @return Arma disparada (o <i>nil</i> si no se puede disparar ningún arma)}</FONT></I> \r
264 <B>function</B> <A NAME=cNave.mDisparar>cNave.mDisparar</A>( dT: tTiempo; ov : cObjetoVolador ): cArma; \r
265 <B>begin</B> \r
266   result := <B>nil</B>; <I><FONT COLOR="Navy">// devuelve nil por defecto </FONT></I>\r
267   mActualizarRetardadores( dT ); \r
268   <B>if</B> mPuedeDispararMisDir( ov ) <B>then</B> \r
269     result := mCrearMisDirDisparado( ov ) \r
270   <B>else</B> <B>if</B> mPuedeDispararMisil( ov ) <B>then</B> \r
271     result := mCrearMisilDisparado \r
272   <B>else</B> <B>if</B> mPuedeDispararLaser( ov ) <B>then</B> \r
273     result := mCrearLaserDisparado; \r
274 <B>end</B>; \r
275  \r
276 <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles que le quedan a la nave \r
277     return Cantidad de misiles que le quedan a la nave}</FONT></I> \r
278 <B>function</B> <A NAME=cNave.mGetMisiles>cNave.mGetMisiles</A>: tMaxMisil; \r
279 <B>begin</B> \r
280   result := aMisiles; \r
281 <B>end</B>; \r
282  \r
283 <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles que le quedan a la nave \r
284     return Cantidad de misiles dirigidos que le quedan a la nave}</FONT></I> \r
285 <B>function</B> <A NAME=cNave.mGetMisilesDirigidos>cNave.mGetMisilesDirigidos</A>: tMaxMisilDirigido; \r
286 <B>begin</B> \r
287   result := aMisilesDirigidos; \r
288 <B>end</B>; \r
289  \r
290 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del láser}</FONT></I> \r
291 <B>procedure</B> <A NAME=cNave.mRetardarLaser>cNave.mRetardarLaser</A>; \r
292 <B>begin</B> \r
293   aRetardoLaserCont := aRetardoLaser; \r
294 <B>end</B>; \r
295  \r
296 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil dirigido}</FONT></I> \r
297 <B>procedure</B> <A NAME=cNave.mRetardarMisDir>cNave.mRetardarMisDir</A>; \r
298 <B>begin</B> \r
299   aRetardoMisDirCont := aRetardoMisDir; \r
300 <B>end</B>; \r
301  \r
302 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil}</FONT></I> \r
303 <B>procedure</B> <A NAME=cNave.mRetardarMisil>cNave.mRetardarMisil</A>; \r
304 <B>begin</B> \r
305   aRetardoMisilCont := aRetardoMisil; \r
306 <B>end</B>; \r
307  \r
308 <I><FONT COLOR="Navy">{** Actualiza los retardadores \r
309     @param dT Intervalo de tiempo a restarles}</FONT></I> \r
310 <B>procedure</B> <A NAME=cNave.mActualizarRetardadores>cNave.mActualizarRetardadores</A>(dT: tTiempo); \r
311 <B>begin</B> \r
312   <B>if</B> aRetardoMisDirCont > 0 <B>then</B> \r
313     aRetardoMisDirCont := aRetardoMisDirCont - dT; \r
314   <B>if</B> aRetardoMisilCont > 0 <B>then</B> \r
315     aRetardoMisilCont := aRetardoMisilCont - dT; \r
316   <B>if</B> aRetardoLaserCont > 0 <B>then</B> \r
317     aRetardoLaserCont := aRetardoLaserCont - dT; \r
318 <B>end</B>; \r
319  \r
320 <I><FONT COLOR="Navy">{** Crea un láser (actualizando retardos) \r
321     @return Nuevo láser}</FONT></I> \r
322 <B>function</B> <A NAME=cNave.mCrearLaserDisparado>cNave.mCrearLaserDisparado</A>: cLaser; \r
323 <B>var</B> \r
324   pos, \r
325   vel, \r
326   vec: cVector; \r
327 <B>begin</B> \r
328     mRetardarLaser; <I><FONT COLOR="Navy">// Resetea el retardo </FONT></I>\r
329     <I><FONT COLOR="Navy">// Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de </FONT></I>\r
330     <I><FONT COLOR="Navy">// su tamaño en la direccion de i (para que no colisione con quien dispara). </FONT></I>\r
331     vec := mGetI.mMultiplicar( mGetDimension * 1.5 ); \r
332     pos := mGetPosicion.mSumar( vec ); \r
333     <I><FONT COLOR="Navy">// vec tambien me va a servir como la dirección de la velocidad porque tiene la direccion de i </FONT></I>\r
334     vel := vec; \r
335     <I><FONT COLOR="Navy">// devuelve el arma disparada </FONT></I>\r
336     result := cLaser.create( pos, vel ); \r
337     <I><FONT COLOR="Navy">// Libera memoria </FONT></I>\r
338     pos.free; \r
339     vec.free; \r
340 <B>end</B>; \r
341  \r
342 <I><FONT COLOR="Navy">{** Crea un misil dirigido (actualizando retardos y restando un misil dirigido) \r
343     @param  ov Objetivo del misil dirigido \r
344     @return Nuevo misil dirigido}</FONT></I> \r
345 <B>function</B> <A NAME=cNave.mCrearMisDirDisparado>cNave.mCrearMisDirDisparado</A>( ov : cObjetoVolador ): cMisilDirigido; \r
346 <B>var</B> \r
347   pos, \r
348   vec: cVector; \r
349 <B>begin</B> \r
350     mRestarMisilDirigido; \r
351     mRetardarMisDir; <I><FONT COLOR="Navy">// Resetea el retardo </FONT></I>\r
352     <I><FONT COLOR="Navy">// Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de </FONT></I>\r
353     <I><FONT COLOR="Navy">// su tamaño en la direccion de i (para que no colisione con quien dispara) </FONT></I>\r
354     vec := mGetI.mMultiplicar( mGetDimension * 1.5 ); \r
355     pos := mGetPosicion.mSumar( vec ); \r
356     <I><FONT COLOR="Navy">// devuelve el arma disparada </FONT></I>\r
357     result := cMisilDirigido.create( ov, pos ); \r
358     <I><FONT COLOR="Navy">// Libera memoria </FONT></I>\r
359     pos.free; \r
360     vec.free; \r
361 <B>end</B>; \r
362  \r
363 <I><FONT COLOR="Navy">{** Crea un misil dirigido (actualizando retardos y restando un misil) \r
364     @return Nuevo misil}</FONT></I> \r
365 <B>function</B> <A NAME=cNave.mCrearMisilDisparado>cNave.mCrearMisilDisparado</A>: cMisil; \r
366 <B>var</B> \r
367   pos, \r
368   vel, \r
369   vec: cVector; \r
370 <B>begin</B> \r
371     mRestarMisil;   <I><FONT COLOR="Navy">// Resta un misil </FONT></I>\r
372     mRetardarMisil; <I><FONT COLOR="Navy">// Resetea el retardo </FONT></I>\r
373     <I><FONT COLOR="Navy">// Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de </FONT></I>\r
374     <I><FONT COLOR="Navy">// su tamaño en la direccion de i (para que no colisione con quien dispara) </FONT></I>\r
375     vec := mGetI.mMultiplicar( mGetDimension * 1.5 ); \r
376     pos := mGetPosicion.mSumar( vec ); \r
377     <I><FONT COLOR="Navy">// vec tambien me va a servir como la dirección de la velocidad porque tiene la direccion de i </FONT></I>\r
378     vel := vec; \r
379     <I><FONT COLOR="Navy">// devuelve el arma disparada </FONT></I>\r
380     result := cMisil.create( pos, vel ); \r
381     <I><FONT COLOR="Navy">// Libera memoria </FONT></I>\r
382     pos.free; \r
383     vec.free \r
384 <B>end</B>; \r
385  \r
386 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto \r
387     serializado. \r
388     @param str Cadena de texto con el objeto serializado.}</FONT></I> \r
389 <B>procedure</B> <A NAME=cNave.mDesSerializar>cNave.mDesSerializar</A>(str: <B>string</B>); \r
390 <B>var</B> \r
391   r: TRegExpr; \r
392 <B>begin</B> \r
393   <B>inherited</B> mDesSerializar( str ); <I><FONT COLOR="Navy">// SIEMPRE el ID debe ser el PRIMER atributo </FONT></I>\r
394   r := TRegExpr.create; \r
395   <I><FONT COLOR="Navy">// MISILES </FONT></I>\r
396   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
397     r.Expression := '<misiles>/s*(/d+)/s*</misiles>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
398     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
399       aMisiles := StrToInt( r.Match[1] ) \r
400     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
401       <B>raise</B> ESerializacion.create( 'No se encontro la cantidad de misiles' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
402   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
403     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
404       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
405       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer la cantidad de misiles utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
406     <B>end</B>; \r
407   <B>end</B>; \r
408   <I><FONT COLOR="Navy">// MISILESDIRIGIDOS </FONT></I>\r
409   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
410     r.Expression := '<misilesdirigidos>/s*(/d+)/s*</misilesdirigidos>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
411     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
412       aMisilesDirigidos := StrToInt( r.Match[1] ) \r
413     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
414       <B>raise</B> ESerializacion.create( 'No se encontro la cantidad de misiles dirigidos' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
415   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
416     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
417       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
418       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer la cantidad de misiles dirigidos utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
419     <B>end</B>; \r
420   <B>end</B>; \r
421   <I><FONT COLOR="Navy">// VELMAXIMA </FONT></I>\r
422   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
423     r.Expression := '<velmaxima>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</velmaxima>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
424     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
425       aVelMaxima := StrToFloat( r.Match[1] ) \r
426     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
427       <B>raise</B> ESerializacion.create( 'No se encontro la velocidad maxima' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
428   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
429     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
430       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
431       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer la velocidad maxima utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
432     <B>end</B>; \r
433   <B>end</B>; \r
434   <I><FONT COLOR="Navy">// RETARDOLASER </FONT></I>\r
435   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
436     r.Expression := '<retardolaser>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardolaser>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
437     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
438       aRetardoLaser := StrToFloat( r.Match[1] ) \r
439     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
440       <B>raise</B> ESerializacion.create( 'No se encontro el retardo del laser' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
441   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
442     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
443       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
444       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el retardo del laser utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
445     <B>end</B>; \r
446   <B>end</B>; \r
447   <I><FONT COLOR="Navy">// RETARDOMISIL </FONT></I>\r
448   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
449     r.Expression := '<retardomisil>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisil>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
450     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
451       aRetardoMisil := StrToFloat( r.Match[1] ) \r
452     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
453       <B>raise</B> ESerializacion.create( 'No se encontro el retardo del misil' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
454   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
455     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
456       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
457       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el retardo del misil utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
458     <B>end</B>; \r
459   <B>end</B>; \r
460   <I><FONT COLOR="Navy">// RETARDOMISDIR </FONT></I>\r
461   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
462     r.Expression := '<retardomisdir>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisdir>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
463     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
464       aRetardoMisDir := StrToFloat( r.Match[1] ) \r
465     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
466       <B>raise</B> ESerializacion.create( 'No se encontro el retardo del misil dirigido' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
467   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
468     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
469       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
470       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el retardo del misil dirigido utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
471     <B>end</B>; \r
472   <B>end</B>; \r
473   <I><FONT COLOR="Navy">// RETARDOLASERCONT </FONT></I>\r
474   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
475     r.Expression := '<retardolasercont>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardolasercont>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
476     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
477       aRetardoLaserCont := StrToFloat( r.Match[1] ) \r
478     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
479       <B>raise</B> ESerializacion.create( 'No se encontro el contador del retardo del laser' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
480   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
481     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
482       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
483       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del laser utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
484     <B>end</B>; \r
485   <B>end</B>; \r
486   <I><FONT COLOR="Navy">// RETARDOMISIL </FONT></I>\r
487   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
488     r.Expression := '<retardomisilcont>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisilcont>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
489     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
490       aRetardoMisilCont := StrToFloat( r.Match[1] ) \r
491     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
492       <B>raise</B> ESerializacion.create( 'No se encontro el contador del retardo del misil' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
493   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
494     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
495       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
496       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del misil utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
497     <B>end</B>; \r
498   <B>end</B>; \r
499   <I><FONT COLOR="Navy">// RETARDOMISDIR </FONT></I>\r
500   <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
501     r.Expression := '<retardomisdircont>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisdircont>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
502     <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
503       aRetardoMisDirCont := StrToFloat( r.Match[1] ) \r
504     <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
505       <B>raise</B> ESerializacion.create( 'No se encontro el contador del retardo del misil dirigido' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
506   <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
507     on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
508       r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
509       <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del misil dirigido utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
510     <B>end</B>; \r
511   <B>end</B>; \r
512   r.free; \r
513 <B>end</B>; \r
514  \r
515 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado. \r
516     @return Cadena de texto con el objeto serializado.}</FONT></I> \r
517 <B>function</B> <A NAME=cNave.mSerializar>cNave.mSerializar</A>: <B>string</B>; \r
518 <B>begin</B> \r
519   result := <B>inherited</B> mSerializar + \r
520             '<misiles>' + IntToStr( aMisiles ) + '</misiles>' + \r
521             '<misilesdirigidos>' + IntToStr( aMisilesDirigidos ) + '</misilesdirigidos>' + \r
522             '<velmaxima>' + FloatToStrF( aVelMaxima, ffGeneral, 18, 0 ) + '</velmaxima>' + \r
523             '<retardolaser>' + FloatToStrF( aRetardoLaser, ffGeneral, 18, 0 ) + '</retardolaser>' + \r
524             '<retardomisil>' + FloatToStrF( aRetardoMisil, ffGeneral, 18, 0 ) + '</retardomisil>' + \r
525             '<retardomisdir>' + FloatToStrF( aRetardoMisDir, ffGeneral, 18, 0 ) + '</retardomisdir>' + \r
526             '<retardolasercont>' + FloatToStrF( aRetardoLaserCont, ffGeneral, 18, 0 ) + '</retardolasercont>' + \r
527             '<retardomisilcont>' + FloatToStrF( aRetardoMisilCont, ffGeneral, 18, 0 ) + '</retardomisilcont>' + \r
528             '<retardomisdircont>' + FloatToStrF( aRetardoMisDirCont, ffGeneral, 18, 0 ) + '</retardomisdircont>'; \r
529 <B>end</B>; \r
530  \r
531 <I><FONT COLOR="Navy">{** Método para establecer la velocidad}</FONT></I> \r
532 <B>function</B> <A NAME=cNave.mSetVelModulo>cNave.mSetVelModulo</A>(velocidad: tLongitud): cObjetoVolador; \r
533 <B>begin</B> \r
534   <B>if</B> velocidad > aVelMaxima <B>then</B> \r
535     velocidad := aVelMaxima; \r
536   result := <B>inherited</B> mSetVelModulo( velocidad ); \r
537 <B>end</B>; \r
538  \r
539 <I><FONT COLOR="Navy">{** Método para establecer el modulo de la velocidad}</FONT></I> \r
540 <B>function</B> <A NAME=cNave.mSetVelocidad>cNave.mSetVelocidad</A>(velocidad: cVector): cObjetoVolador; \r
541 <B>begin</B> \r
542   <B>if</B> velocidad.mGetModulo > aVelMaxima <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si sobrepasa el limite ... </FONT></I>\r
543     mSetVelModulo( aVelMaxima ); <I><FONT COLOR="Navy">// Se le asigna el modulo como limite </FONT></I>\r
544     mSetVelDir( velocidad );     <I><FONT COLOR="Navy">// Se le asigna la direccion </FONT></I>\r
545     result := self; \r
546   <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// Si no sobrepasa el limite ... </FONT></I>\r
547     result := <B>inherited</B> mSetVelocidad( velocidad ); <I><FONT COLOR="Navy">// Se asigna la nueva vel </FONT></I>\r
548 <B>end</B>; \r
549  \r
550 <B>end</B>. \r
551 </PRE>\r
552 </BODY>\r
553 </HTML>\r