1 {** Contiene una clase abstracta con elementos comunes a todas las naves.<br>
\r
4 27/11/00: Se agrega toda la parte del manejo de disparos, agregándose los métodos mPuedeDispararLaser,
\r
5 mPuedeDispararMisil, mPuedeDispararMisDir y mDisparar, además de varios atributos para manejar
\r
6 los retardos de las armas. El método mDisparar se hace virtual ya que puede ser modificado por
\r
7 las subclases para que cambie su mecanismo de disparos.
\r
8 29/11/00: Se agregan métodos para obtener la cantidad de armamento que le queda a la nave para poder ser
\r
9 mostrados (mGetMisiles y mGetMisilesDirigidos)
\r
10 01/12/00: Se modifican levemente los metodos mPuedeDispararXxxx para que permitan disparar si el puntero
\r
11 al Objeto Volador objetivo es nil.
\r
12 Se Agregan los métodos mRetardarLaser, mRetardarMisil, mRetardarMisDir que resetea el contador
\r
13 del retardo, mActualizarRetardos que resta el dT a los retardos, y mCrearLaserDisparado,
\r
14 mCrearMisilDisparado y mCrearMisDirDisparado que crea el arma correspondiente (actualizando
\r
15 retardos y todo lo que sea necesario) para que las subclases puedan escribir su propio mDisparar.
\r
16 Se cambia el orden de los argumentos de mDisparar para aprovechar los argumentos por defecto.
\r
17 08/12/00: Se sobreescribieron los métodos para establecer la velocidad y su módulo para evitar que se
\r
18 sobrepase el límite de la velocidad máxima.
\r
31 {** Clase abstracta con elementos comunes a todas las naves.}
\r
32 cNave = class( cObjetoVolador )
\r
34 aMisiles: tMaxMisil; // Cantidad de misilies comunes
\r
35 aMisilesDirigidos: tMaxMisilDirigido; // Cantidad de misiles dirigidos
\r
36 aVelMaxima: tLongitud; // Velocidad máxima de la nave
\r
37 aRetardoLaser: tTiempo; // Ratardo del arma antes de poder volver a disparar
\r
38 aRetardoMisil: tTiempo; // Ratardo del arma antes de poder volver a disparar
\r
39 aRetardoMisDir: tTiempo; // Ratardo del arma antes de poder volver a disparar
\r
40 aRetardoLaserCont: tTiempo; // Ratardo del arma antes de poder volver a disparar (contador)
\r
41 aRetardoMisilCont: tTiempo; // Ratardo del arma antes de poder volver a disparar (contador)
\r
42 aRetardoMisDirCont: tTiempo; // Ratardo del arma antes de poder volver a disparar (contador)
\r
44 {** Setea la velocidad máxima}
\r
45 function mSetVelMax( velMax: tLongitud ): cNave;
\r
47 function mRestarMisil: cNave;
\r
48 {** Resta un misil dirigido}
\r
49 function mRestarMisilDirigido: cNave;
\r
50 {** Devuelve true si todavía tiene misiles}
\r
51 function mTieneMisil: boolean;
\r
52 {** Devuelve true si todavía tiene misiles dirigidos}
\r
53 function mTieneMisilDirigido: boolean;
\r
54 {** Resetea el contador del retardo del láser}
\r
55 procedure mRetardarLaser;
\r
56 {** Resetea el contador del retardo del misil}
\r
57 procedure mRetardarMisil;
\r
58 {** Resetea el contador del retardo del misil dirigido}
\r
59 procedure mRetardarMisDir;
\r
60 {** Actualiza los retardadores}
\r
61 procedure mActualizarRetardadores( dT: tTiempo );
\r
62 {** Crea un laser (actualizando retardos y todo lo que sea necesario)}
\r
63 function mCrearLaserDisparado: cLaser;
\r
64 {** Crea un misil (actualizando retardos y todo lo que sea necesario)}
\r
65 function mCrearMisilDisparado: cMisil;
\r
66 {** Crea un misil dirigido (actualizando retardos y todo lo que sea necesario)}
\r
67 function mCrearMisDirDisparado( ov : cObjetoVolador ): cMisilDirigido;
\r
70 constructor create( pos: cVector = nil; vel: cVector = nil; dim: tLongitud = 5;
\r
71 pot: tEnergia = 1; ene: tEnergia = 100; misiles: tMaxMisil = 0;
\r
72 misilesDirigidos: tMaxMisilDirigido = 0; velMax: tLongitud = 0.2;
\r
73 retardoLaser: tTiempo = 1000; {1 segundo}
\r
74 retardoMisil: tTiempo = 60000; {1 minuto}
\r
75 retardoMisDir: tTiempo = 180000 {3 minutos}); overload;
\r
76 {** Hace que se dispare un arma (todavía no está implementado), devolviendo la nueva
\r
78 function mDisparar( dT: tTiempo; ov : cObjetoVolador = nil ): cArma; virtual;
\r
79 {** Obtiene la cantidad de Misiles que le quedan a la nave}
\r
80 function mGetMisiles: tMaxMisil;
\r
81 {** Obtiene la cantidad de Misiles Dirigidos que le quedan a la nave}
\r
82 function mGetMisilesDirigidos: tMaxMisilDirigido;
\r
83 {** Obtiene la velocidad máxima}
\r
84 function mGetVelMax: tLongitud;
\r
85 {** Método para establecer la velocidad}
\r
86 function mSetVelocidad( velocidad: cVector ): cObjetoVolador; override;
\r
87 {** Método para establecer el modulo de la velocidad}
\r
88 function mSetVelModulo( velocidad: tLongitud ): cObjetoVolador; override;
\r
89 {** Chequea que el enemigo este a distancia, que tenga municiones, etc.}
\r
90 function mPuedeDispararLaser( ov : cObjetoVolador ): boolean;
\r
91 {** Chequea que el enemigo este a distancia, que tenga municiones, etc.}
\r
92 function mPuedeDispararMisil( ov : cObjetoVolador ): boolean;
\r
93 {** Chequea que el enemigo este a distancia, que tenga municiones, etc.}
\r
94 function mPuedeDispararMisDir( ov : cObjetoVolador ): boolean;
\r
95 {$IFDEF DebugAlgoWars}
\r
96 {** Método heredado que devuelve un string con el estado del Objeto. Se utiliza para depurar
\r
97 y la información entregada depende del parámetro tDebugInfo.}
\r
98 function mGetDebugInfo( debugLevel: tDebugInfo = DI_MINI ): string; override;
\r
101 {** Devuelve una cadena de texto con el objeto serializado.}
\r
102 function mSerializar: string; override;
\r
103 {** Recrea el objeto a partir de una cadena de texto con el objeto
\r
105 procedure mDesSerializar( str: string ); override;
\r
118 @param pos Posicion inicial
\r
119 @param vel Velocidad inicial
\r
120 @param dim Dimensión (radio, en metros)
\r
121 @param pot Potencia (cantidad de daño que hace por intervalode tiempo)
\r
122 @param ene Energía (cantidad de daño que soporta antes de ser destruido)
\r
123 @param misiles Cantidad de misiles comunes
\r
124 @param misilesDirigidos Cantidad de misiles dirigidos
\r
125 @param velMax Velocidad máxima que puede alcanzar (modulo)
\r
126 @param retardoLaser Ratardo del arma antes de poder volver a disparar
\r
127 @param retardoMisil Ratardo del arma antes de poder volver a disparar
\r
128 @param retardoMisDir Ratardo del arma antes de poder volver a disparar}
\r
129 constructor cNave.create(pos, vel: cVector; dim: tLongitud; pot,
\r
130 ene: tEnergia; misiles: tMaxMisil; misilesDirigidos: tMaxMisilDirigido;
\r
131 velMax: tLongitud; retardoLaser: tTiempo; retardoMisil: tTiempo;
\r
132 retardoMisDir: tTiempo);
\r
135 if vel.mGetModulo > velMax then
\r
136 vel.mSetModulo( velMax );
\r
137 inherited create( pos, vel, dim, pot, ene );
\r
138 aMisiles := misiles;
\r
139 aMisilesDirigidos := misilesDirigidos;
\r
140 aVelMaxima := velMax;
\r
141 aRetardoLaser := retardoLaser;
\r
142 aRetardoMisil := retardoMisil;
\r
143 aRetardoMisDir := retardoMisDir;
\r
144 aRetardoLaserCont := 0; // lista para disparar
\r
145 aRetardoMisilCont := 0; // lista para disparar
\r
146 aRetardoMisDirCont := 0; // lista para disparar
\r
149 {$IFDEF DebugAlgoWars}
\r
150 {** Devuelve el estado del objeto basandose en la cantidad de datos requeridos.
\r
151 @return Cadena de texto con el estado del Objeto.
\r
152 @param debugLevel Cantidad de información requerida}
\r
153 function cNave.mGetDebugInfo(debugLevel: tDebugInfo): string;
\r
155 result := inherited mGetDebugInfo( debugLevel );
\r
156 if debugLevel > DI_MINI then
\r
157 result := result + ' | Misiles: ' + IntToStr( aMisiles ) +
\r
158 ' | Misiles Dirigidos: ' + IntToStr( aMisilesDirigidos );
\r
162 {** Devuelve la velocidad máxima
\r
163 @return Velocidad máxima (modulo)}
\r
164 function cNave.mGetVelMax: tLongitud;
\r
166 result := aVelMaxima;
\r
169 {** Resta un misil}
\r
170 function cNave.mRestarMisil: cNave;
\r
172 aMisiles := aMisiles - 1;
\r
176 {** Resta un misil dirigido}
\r
177 function cNave.mRestarMisilDirigido: cNave;
\r
179 aMisilesDirigidos := aMisilesDirigidos - 1;
\r
183 {** Setea la velocidad máxima
\r
184 @param velMax Nueva velocidad máxima (modulo)}
\r
185 function cNave.mSetVelMax(velMax: tLongitud): cNave;
\r
187 aVelMaxima := velMax;
\r
191 {** Chequea si todavía tiene misiles
\r
192 @return <i>true</i> si tiene misiles, <i>false</i> si no}
\r
193 function cNave.mTieneMisil: boolean;
\r
195 result := ( aMisiles > 0 ); // Devuelve true si aMisiles es mayor que cero
\r
198 {** Chequea si todavía tiene misiles dirigidos
\r
199 @return <i>true</i> si tiene misiles dirigidos, <i>false</i> si no}
\r
200 function cNave.mTieneMisilDirigido: boolean;
\r
202 result := ( aMisilesDirigidos > 0 ); // Devuelve true si aMisilesDirigidos es mayor que cero
\r
205 {** Chequea que el enemigo este a distancia, que tenga municiones, etc.
\r
206 @param np Nave Propia a la que quiere disparar
\r
207 @return <i>True</i> si está todo ok, <i>False</i> si no.}
\r
208 function cNave.mPuedeDispararLaser( ov : cObjetoVolador ): boolean;
\r
211 if aRetardoLaserCont <= 0 then // Primero se fija que ya esté recargada el arma
\r
212 // 1200 es el alcance del laser.
\r
213 if ov <> nil then begin // Si el ov es nil puede disparar, ni no lo es, chequea la distancia
\r
214 if mGetDistancia( ov ) < 1200 then// Si la distancia a la np es menor que el alcance
\r
220 {** Chequea que el enemigo este a distancia, que tenga municiones, etc.
\r
221 @param np Nave Propia a la que quiere disparar
\r
222 @return <i>True</i> si está todo ok, <i>False</i> si no.}
\r
223 function cNave.mPuedeDispararMisil( ov : cObjetoVolador ): boolean;
\r
226 // Primero se fija que ya esté recargada el arma y que todavia tenga municiones
\r
227 if mTieneMisil and ( aRetardoMisilCont <= 0 ) then
\r
228 // 1500 es el alcance del misil.
\r
229 if ov <> nil then begin // Si el ov es nil puede disparar, ni no lo es, chequea la distancia
\r
230 if mGetDistancia( ov ) < 1500 then// Si la distancia a la np es menor que el alcance
\r
236 {** Chequea que el enemigo este a distancia, que tenga municiones, etc.
\r
237 @param np Nave Propia a la que quiere disparar
\r
238 @return <i>True</i> si está todo ok, <i>False</i> si no.}
\r
239 function cNave.mPuedeDispararMisDir( ov : cObjetoVolador ): boolean;
\r
242 // Primero se fija que ya esté recargada el arma y que todavia tenga municiones
\r
243 if mTieneMisilDirigido and ( aRetardoMisDirCont <= 0 ) then
\r
244 // 2000 es el alcance del misil dirigido.
\r
245 if ov <> nil then begin // Si el ov es nil puede disparar, ni no lo es, chequea la distancia
\r
246 if mGetDistancia( ov ) < 2000 then// Si la distancia a la np es menor que el alcance
\r
252 {** Hace que se dispare un arma
\r
253 @param ov Objetivo del disparo
\r
254 @param dT Intervalo de tiempo
\r
255 @return Arma disparada (o <i>nil</i> si no se puede disparar ningún arma)}
\r
256 function cNave.mDisparar( dT: tTiempo; ov : cObjetoVolador ): cArma;
\r
258 result := nil; // devuelve nil por defecto
\r
259 mActualizarRetardadores( dT );
\r
260 if mPuedeDispararMisDir( ov ) then
\r
261 result := mCrearMisDirDisparado( ov )
\r
262 else if mPuedeDispararMisil( ov ) then
\r
263 result := mCrearMisilDisparado
\r
264 else if mPuedeDispararLaser( ov ) then
\r
265 result := mCrearLaserDisparado;
\r
268 {** Obtiene la cantidad de Misiles que le quedan a la nave
\r
269 return Cantidad de misiles que le quedan a la nave}
\r
270 function cNave.mGetMisiles: tMaxMisil;
\r
272 result := aMisiles;
\r
275 {** Obtiene la cantidad de Misiles que le quedan a la nave
\r
276 return Cantidad de misiles dirigidos que le quedan a la nave}
\r
277 function cNave.mGetMisilesDirigidos: tMaxMisilDirigido;
\r
279 result := aMisilesDirigidos;
\r
282 {** Resetea el contador del retardo del láser}
\r
283 procedure cNave.mRetardarLaser;
\r
285 aRetardoLaserCont := aRetardoLaser;
\r
288 {** Resetea el contador del retardo del misil dirigido}
\r
289 procedure cNave.mRetardarMisDir;
\r
291 aRetardoMisDirCont := aRetardoMisDir;
\r
294 {** Resetea el contador del retardo del misil}
\r
295 procedure cNave.mRetardarMisil;
\r
297 aRetardoMisilCont := aRetardoMisil;
\r
300 {** Actualiza los retardadores
\r
301 @param dT Intervalo de tiempo a restarles}
\r
302 procedure cNave.mActualizarRetardadores(dT: tTiempo);
\r
304 if aRetardoMisDirCont > 0 then
\r
305 aRetardoMisDirCont := aRetardoMisDirCont - dT;
\r
306 if aRetardoMisilCont > 0 then
\r
307 aRetardoMisilCont := aRetardoMisilCont - dT;
\r
308 if aRetardoLaserCont > 0 then
\r
309 aRetardoLaserCont := aRetardoLaserCont - dT;
\r
312 {** Crea un láser (actualizando retardos)
\r
313 @return Nuevo láser}
\r
314 function cNave.mCrearLaserDisparado: cLaser;
\r
320 mRetardarLaser; // Resetea el retardo
\r
321 // Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de
\r
322 // su tamaño en la direccion de i (para que no colisione con quien dispara).
\r
323 vec := mGetI.mMultiplicar( mGetDimension * 1.5 );
\r
324 pos := mGetPosicion.mSumar( vec );
\r
325 // vec tambien me va a servir como la dirección de la velocidad porque tiene la direccion de i
\r
327 // devuelve el arma disparada
\r
328 result := cLaser.create( pos, vel );
\r
334 {** Crea un misil dirigido (actualizando retardos y restando un misil dirigido)
\r
335 @param ov Objetivo del misil dirigido
\r
336 @return Nuevo misil dirigido}
\r
337 function cNave.mCrearMisDirDisparado( ov : cObjetoVolador ): cMisilDirigido;
\r
342 mRestarMisilDirigido;
\r
343 mRetardarMisDir; // Resetea el retardo
\r
344 // Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de
\r
345 // su tamaño en la direccion de i (para que no colisione con quien dispara)
\r
346 vec := mGetI.mMultiplicar( mGetDimension * 1.5 );
\r
347 pos := mGetPosicion.mSumar( vec );
\r
348 // devuelve el arma disparada
\r
349 result := cMisilDirigido.create( ov, pos );
\r
355 {** Crea un misil dirigido (actualizando retardos y restando un misil)
\r
356 @return Nuevo misil}
\r
357 function cNave.mCrearMisilDisparado: cMisil;
\r
363 mRestarMisil; // Resta un misil
\r
364 mRetardarMisil; // Resetea el retardo
\r
365 // Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de
\r
366 // su tamaño en la direccion de i (para que no colisione con quien dispara)
\r
367 vec := mGetI.mMultiplicar( mGetDimension * 1.5 );
\r
368 pos := mGetPosicion.mSumar( vec );
\r
369 // vec tambien me va a servir como la dirección de la velocidad porque tiene la direccion de i
\r
371 // devuelve el arma disparada
\r
372 result := cMisil.create( pos, vel );
\r
378 {** Recrea el objeto a partir de una cadena de texto con el objeto
\r
380 @param str Cadena de texto con el objeto serializado.}
\r
381 procedure cNave.mDesSerializar(str: string);
\r
385 inherited mDesSerializar( str ); // SIEMPRE el ID debe ser el PRIMER atributo
\r
386 r := TRegExpr.create;
\r
388 try // se fija si hay errores al extraer los datos
\r
389 r.Expression := '<misiles>\s*(\d+)\s*</misiles>'; // contruye la expresion regular a buscar
\r
390 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
391 aMisiles := StrToInt( r.Match[1] )
\r
392 else // si no encontro la experesion...
\r
393 raise ESerializacion.create( 'No se encontro la cantidad de misiles' ); // cae en una excepcion
\r
394 except // Si hubieron errores ...
\r
395 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
396 r.Free; // libera memoria
\r
397 raise ESerializacion.create( ClassName + ': Error al extraer la cantidad de misiles utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
400 // MISILESDIRIGIDOS
\r
401 try // se fija si hay errores al extraer los datos
\r
402 r.Expression := '<misilesdirigidos>\s*(\d+)\s*</misilesdirigidos>'; // contruye la expresion regular a buscar
\r
403 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
404 aMisilesDirigidos := StrToInt( r.Match[1] )
\r
405 else // si no encontro la experesion...
\r
406 raise ESerializacion.create( 'No se encontro la cantidad de misiles dirigidos' ); // cae en una excepcion
\r
407 except // Si hubieron errores ...
\r
408 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
409 r.Free; // libera memoria
\r
410 raise ESerializacion.create( ClassName + ': Error al extraer la cantidad de misiles dirigidos utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
414 try // se fija si hay errores al extraer los datos
\r
415 r.Expression := '<velmaxima>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</velmaxima>'; // contruye la expresion regular a buscar
\r
416 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
417 aVelMaxima := StrToFloat( r.Match[1] )
\r
418 else // si no encontro la experesion...
\r
419 raise ESerializacion.create( 'No se encontro la velocidad maxima' ); // cae en una excepcion
\r
420 except // Si hubieron errores ...
\r
421 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
422 r.Free; // libera memoria
\r
423 raise ESerializacion.create( ClassName + ': Error al extraer la velocidad maxima utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
427 try // se fija si hay errores al extraer los datos
\r
428 r.Expression := '<retardolaser>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</retardolaser>'; // contruye la expresion regular a buscar
\r
429 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
430 aRetardoLaser := StrToFloat( r.Match[1] )
\r
431 else // si no encontro la experesion...
\r
432 raise ESerializacion.create( 'No se encontro el retardo del laser' ); // cae en una excepcion
\r
433 except // Si hubieron errores ...
\r
434 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
435 r.Free; // libera memoria
\r
436 raise ESerializacion.create( ClassName + ': Error al extraer el retardo del laser utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
440 try // se fija si hay errores al extraer los datos
\r
441 r.Expression := '<retardomisil>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</retardomisil>'; // contruye la expresion regular a buscar
\r
442 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
443 aRetardoMisil := StrToFloat( r.Match[1] )
\r
444 else // si no encontro la experesion...
\r
445 raise ESerializacion.create( 'No se encontro el retardo del misil' ); // cae en una excepcion
\r
446 except // Si hubieron errores ...
\r
447 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
448 r.Free; // libera memoria
\r
449 raise ESerializacion.create( ClassName + ': Error al extraer el retardo del misil utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
453 try // se fija si hay errores al extraer los datos
\r
454 r.Expression := '<retardomisdir>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</retardomisdir>'; // contruye la expresion regular a buscar
\r
455 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
456 aRetardoMisDir := StrToFloat( r.Match[1] )
\r
457 else // si no encontro la experesion...
\r
458 raise ESerializacion.create( 'No se encontro el retardo del misil dirigido' ); // cae en una excepcion
\r
459 except // Si hubieron errores ...
\r
460 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
461 r.Free; // libera memoria
\r
462 raise ESerializacion.create( ClassName + ': Error al extraer el retardo del misil dirigido utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
465 // RETARDOLASERCONT
\r
466 try // se fija si hay errores al extraer los datos
\r
467 r.Expression := '<retardolasercont>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</retardolasercont>'; // contruye la expresion regular a buscar
\r
468 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
469 aRetardoLaserCont := StrToFloat( r.Match[1] )
\r
470 else // si no encontro la experesion...
\r
471 raise ESerializacion.create( 'No se encontro el contador del retardo del laser' ); // cae en una excepcion
\r
472 except // Si hubieron errores ...
\r
473 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
474 r.Free; // libera memoria
\r
475 raise ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del laser utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
479 try // se fija si hay errores al extraer los datos
\r
480 r.Expression := '<retardomisilcont>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</retardomisilcont>'; // contruye la expresion regular a buscar
\r
481 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
482 aRetardoMisilCont := StrToFloat( r.Match[1] )
\r
483 else // si no encontro la experesion...
\r
484 raise ESerializacion.create( 'No se encontro el contador del retardo del misil' ); // cae en una excepcion
\r
485 except // Si hubieron errores ...
\r
486 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
487 r.Free; // libera memoria
\r
488 raise ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del misil utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
492 try // se fija si hay errores al extraer los datos
\r
493 r.Expression := '<retardomisdircont>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</retardomisdircont>'; // contruye la expresion regular a buscar
\r
494 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
495 aRetardoMisDirCont := StrToFloat( r.Match[1] )
\r
496 else // si no encontro la experesion...
\r
497 raise ESerializacion.create( 'No se encontro el contador del retardo del misil dirigido' ); // cae en una excepcion
\r
498 except // Si hubieron errores ...
\r
499 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
500 r.Free; // libera memoria
\r
501 raise ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del misil dirigido utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
507 {** Devuelve una cadena de texto con el objeto serializado.
\r
508 @return Cadena de texto con el objeto serializado.}
\r
509 function cNave.mSerializar: string;
\r
511 result := inherited mSerializar +
\r
512 '<misiles>' + IntToStr( aMisiles ) + '</misiles>' +
\r
513 '<misilesdirigidos>' + IntToStr( aMisilesDirigidos ) + '</misilesdirigidos>' +
\r
514 '<velmaxima>' + FloatToStrF( aVelMaxima, ffGeneral, 18, 0 ) + '</velmaxima>' +
\r
515 '<retardolaser>' + FloatToStrF( aRetardoLaser, ffGeneral, 18, 0 ) + '</retardolaser>' +
\r
516 '<retardomisil>' + FloatToStrF( aRetardoMisil, ffGeneral, 18, 0 ) + '</retardomisil>' +
\r
517 '<retardomisdir>' + FloatToStrF( aRetardoMisDir, ffGeneral, 18, 0 ) + '</retardomisdir>' +
\r
518 '<retardolasercont>' + FloatToStrF( aRetardoLaserCont, ffGeneral, 18, 0 ) + '</retardolasercont>' +
\r
519 '<retardomisilcont>' + FloatToStrF( aRetardoMisilCont, ffGeneral, 18, 0 ) + '</retardomisilcont>' +
\r
520 '<retardomisdircont>' + FloatToStrF( aRetardoMisDirCont, ffGeneral, 18, 0 ) + '</retardomisdircont>';
\r
523 {** Método para establecer la velocidad}
\r
524 function cNave.mSetVelModulo(velocidad: tLongitud): cObjetoVolador;
\r
526 if velocidad > aVelMaxima then
\r
527 velocidad := aVelMaxima;
\r
528 result := inherited mSetVelModulo( velocidad );
\r
531 {** Método para establecer el modulo de la velocidad}
\r
532 function cNave.mSetVelocidad(velocidad: cVector): cObjetoVolador;
\r
534 if velocidad.mGetModulo > aVelMaxima then begin // Si sobrepasa el limite ...
\r
535 mSetVelModulo( aVelMaxima ); // Se le asigna el modulo como limite
\r
536 mSetVelDir( velocidad ); // Se le asigna la direccion
\r
538 end else // Si no sobrepasa el limite ...
\r
539 result := inherited mSetVelocidad( velocidad ); // Se asigna la nueva vel
\r