1 {** La clase cNaveEnemiga esta pensada como una clase abtracta. En ella se encuentran
\r
2 características comunes a todas las naves enemigas.<br>
\r
5 05/10/00: Se cambio el metodo mGetRadar por el metodo mDetectado, que devuelve true
\r
6 si un objeto volador esta destro del campo de radar. De esta manera se logra
\r
7 una abstracción mayor y un manejo mas intuitivo del radar.
\r
22 {** La clase cNaveEnemiga esta pensada como una clase abtracta. En ella se encuentran
\r
23 características comunes a todas las naves enemigas.}
\r
24 cNaveEnemiga = class( cNave )
\r
26 aCampoRadar: tLongitud; // Area en la que detecta a la nave propia
\r
28 {** Modifica la velocidad de la nave en base a la nave propia}
\r
29 procedure mModificarVelocidad( np: cNavePropia; modulo: tLongitud = -1 ); virtual;
\r
32 constructor create( pos: cVector = nil; vel: cVector = nil; dim: tLongitud = 10;
\r
33 pot: tEnergia = 100; ene: tEnergia = 100; misiles: tMaxMisil = 0;
\r
34 misilesDirigidos: tMaxMisilDirigido = 0; velMax: tLongitud = 0.2;
\r
35 radar : tLongitud = 2500;
\r
36 retardoLaser: tTiempo = 1000; {1 segundo}
\r
37 retardoMisil: tTiempo = 60000; {1 minuto}
\r
38 retardoMisDir: tTiempo = 180000 {3 minutos}); overload;
\r
39 {** Hace reaccionar ante la presencia de la nave propia. Tiene un comportamiento polimófico ya que cada nave
\r
40 enemiga reaccionará de forma diferente (método abstracto)}
\r
41 procedure mReaccionar( np: cNavePropia ); virtual; abstract;
\r
42 {** Indica si ov esta en el campo de radar}
\r
43 function mDetectado( ov: cObjetoVolador ): boolean;
\r
44 {** Hace que la nave se dirija a una posicion particular}
\r
45 procedure mIrA( pos: cVector );
\r
46 {$IFDEF DebugAlgoWars}
\r
47 {** Método heredado que devuelve un string con el estado del Objeto. Se utiliza para depurar
\r
48 y la información entregada depende del parámetro tDebugInfo.}
\r
49 function mGetDebugInfo( debugLevel: tDebugInfo = DI_MINI ): string; override;
\r
52 {** Devuelve una cadena de texto con el objeto serializado.}
\r
53 function mSerializar: string; override;
\r
54 {** Recrea el objeto a partir de una cadena de texto con el objeto
\r
56 procedure mDesSerializar( str: string ); override;
\r
69 @param pos Posicion inicial
\r
70 @param vel Velocidad inicial
\r
71 @param dim Dimensión (radio, en metros)
\r
72 @param pot Potencia (cantidad de daño que hace por intervalode tiempo)
\r
73 @param ene Energía (cantidad de daño que soporta antes de ser destruido)
\r
74 @param misiles Cantidad de misiles comunes
\r
75 @param misilesDirigidos Cantidad de misiles dirigidos
\r
76 @param velMax Velocidad máxima que puede alcanzar (modulo)
\r
77 @param radar Área máxima en la que puede detectar a otras naves (radio, en metros)
\r
78 @param retardoLaser Ratardo del arma antes de poder volver a disparar
\r
79 @param retardoMisil Ratardo del arma antes de poder volver a disparar
\r
80 @param retardoMisDir Ratardo del arma antes de poder volver a disparar}
\r
81 constructor cNaveEnemiga.create(pos, vel: cVector; dim: tLongitud; pot,
\r
82 ene: tEnergia; misiles: tMaxMisil; misilesDirigidos: tMaxMisilDirigido;
\r
83 velMax: tLongitud; radar: tLongitud; retardoLaser, retardoMisil,
\r
84 retardoMisDir: tTiempo);
\r
86 inherited create( pos , vel , dim , pot , ene , misiles, misilesDirigidos,
\r
87 velMax, retardoLaser, retardoMisil, retardoMisDir );
\r
88 aCampoRadar := radar;
\r
91 {** Modifica la velocidad de la nave en base a la nave propia
\r
92 @param np Nave propia con la cual se calculará la dirección de la nueva velocidad
\r
93 @param modulo Nuevo módulo de la velocidad}
\r
94 procedure cNaveEnemiga.mModificarVelocidad( np: cNavePropia; modulo: tLongitud );
\r
96 vel, // Vector temporal para hacer calculos
\r
97 pos: cVector; // Vector temporal para hacer calculos
\r
99 if (modulo < 0) or (modulo > mGetVelMax) then
\r
100 modulo := mGetVelMax;
\r
101 pos := mGetPosicion;
\r
102 // Crea un nuevo verctor basado en la posicion del objetivo,
\r
103 // Le resta la posicion propia, obteniendo la nueva direccion de la velocidad
\r
104 // y luego setea el modulo
\r
105 vel := np.mGetPosicion.mRestar( pos );
\r
106 // Modifica la velocidad basado en el vector v
\r
108 mSetVelModulo( modulo );
\r
109 vel.free; // libera la memoria del vector temporal
\r
110 pos.free; // libera la memoria del vector temporal
\r
113 {** Indica si ov esta en el campo de radar
\r
114 @param ov Objeto volador a chequear si está dentro del alcance del radar}
\r
115 function cNaveEnemiga.mDetectado( ov: cObjetoVolador ): boolean;
\r
117 // true si la distancia es menor que el campo de radar
\r
118 result := ( mGetDistancia( ov ) <= aCampoRadar );
\r
121 {** Hace que la nave se dirija a una posicion particular
\r
122 @param pos Vector posición del punto al cual se dirigirá la nave}
\r
123 procedure cNaveEnemiga.mIrA(pos: cVector);
\r
125 v: cVector; // Vector temporal para hacer calculos
\r
126 modulo: tLongitud; // Modulo actual de la velocidad
\r
128 v := mGetVelocidad;
\r
129 modulo := v.mGetModulo; // Obtiene el modulo actual de la velocidad
\r
131 // Crea un nuevo verctor basado en la posicion y e resta la posicion propia,
\r
132 // obteniendo la nueva direccion de la velocidad.
\r
133 v := cVector.create( pos ).mRestar( mGetPosicion );
\r
134 mSetVelDir( v ); // Modifica la direccion de la velocidad basado en el vector v
\r
135 mSetVelModulo( modulo ); // Setea el modulo igual que el de la velocidad original
\r
136 v.free; // libera la memoria del vector temporal
\r
139 {$IFDEF DebugAlgoWars}
\r
140 {** Devuelve el estado del objeto basandose en la cantidad de datos requeridos.
\r
141 @return Cadena de texto con el estado del Objeto.
\r
142 @param debugLevel Cantidad de información requerida}
\r
143 function cNaveEnemiga.mGetDebugInfo(debugLevel: tDebugInfo): string;
\r
145 result := inherited mGetDebugInfo( debugLevel );
\r
146 if debugLevel > DI_NORMAL then
\r
147 result := result + ' | Campo de Radar: ' + FloatToStrF( aCampoRadar, ffNumber, 5, 5 );
\r
151 {** Recrea el objeto a partir de una cadena de texto con el objeto
\r
153 @param str Cadena de texto con el objeto serializado.}
\r
154 procedure cNaveEnemiga.mDesSerializar(str: string);
\r
158 inherited mDesSerializar( str ); // SIEMPRE el ID debe ser el PRIMER atributo
\r
159 r := TRegExpr.create;
\r
161 try // se fija si hay errores al extraer los datos
\r
162 r.Expression := '<camporadar>\s*([+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?)\s*</camporadar>'; // contruye la expresion regular a buscar
\r
163 if r.Exec ( str ) then // Ejecuta la expresion. Si la encuentra...
\r
164 aCampoRadar := StrToFloat( r.Match[1] )
\r
165 else // si no encontro la experesion...
\r
166 raise ESerializacion.create( 'No se encontro el campo de radar' ); // cae en una excepcion
\r
167 except // Si hubieron errores ...
\r
168 on e: ERegExpr do begin // si fueron de expresiones regulares...
\r
169 r.Free; // libera memoria
\r
170 raise ESerializacion.create( ClassName + ': Error al extraer el campo de radar utilizando expresiones regulares: ' + e.Message ); // cae en una excepcion
\r
176 {** Devuelve una cadena de texto con el objeto serializado.
\r
177 @return Cadena de texto con el objeto serializado.}
\r
178 function cNaveEnemiga.mSerializar: string;
\r
180 result := inherited mSerializar +
\r
181 '<camporadar>' + FloatToStrF( aCampoRadar, ffGeneral, 18, 0 ) + '</camporadar>';
\r