2 <TITLE>File: naveenemiga.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=naveenemiga.pas><CENTER><H3>naveenemiga.pas</H3></A><I> from <A HREF=/proyecto/doc/src-html/AlgoWars.html> Project: AlgoWars.dpr</A></I></CENTER>
\r
9 <I><FONT COLOR="Navy">{** La clase cNaveEnemiga esta pensada como una clase abtracta. En ella se encuentran
\r
10 características comunes a todas las naves enemigas.<br>
\r
13 05/10/00: Se cambio el metodo mGetRadar por el metodo mDetectado, que devuelve true
\r
14 si un objeto volador esta destro del campo de radar. De esta manera se logra
\r
15 una abstracción mayor y un manejo mas intuitivo del radar.
\r
17 <B>unit</B> NaveEnemiga;
\r
30 <I><FONT COLOR="Navy">{** La clase cNaveEnemiga esta pensada como una clase abtracta. En ella se encuentran
\r
31 características comunes a todas las naves enemigas.}</FONT></I>
\r
32 cNaveEnemiga = <B>class</B>( cNave )
\r
34 aCampoRadar: tLongitud; <I><FONT COLOR="Navy">// Area en la que detecta a la nave propia </FONT></I>
\r
36 <I><FONT COLOR="Navy">{** Modifica la velocidad de la nave en base a la nave propia}</FONT></I>
\r
37 <B>procedure</B> <A HREF="#cNaveEnemiga.mModificarVelocidad">mModificarVelocidad</A>( np: cNavePropia; modulo: tLongitud = -1 ); <B>virtual</B>;
\r
39 <I><FONT COLOR="Navy">{** Constructor}</FONT></I>
\r
40 <B>constructor</B> create( pos: cVector = <B>nil</B>; vel: cVector = <B>nil</B>; dim: tLongitud = 10;
\r
41 pot: tEnergia = 100; ene: tEnergia = 100; misiles: tMaxMisil = 0;
\r
42 misilesDirigidos: tMaxMisilDirigido = 0; velMax: tLongitud = 0.2;
\r
43 radar : tLongitud = 2500;
\r
44 retardoLaser: tTiempo = 1000; <I><FONT COLOR="Navy">{1 segundo}</FONT></I>
\r
45 retardoMisil: tTiempo = 60000; <I><FONT COLOR="Navy">{1 minuto}</FONT></I>
\r
46 retardoMisDir: tTiempo = 180000 <I><FONT COLOR="Navy">{3 minutos}</FONT></I>); overload;
\r
47 <I><FONT COLOR="Navy">{** Hace reaccionar ante la presencia de la nave propia. Tiene un comportamiento polimófico ya que cada nave
\r
48 enemiga reaccionará de forma diferente (método abstracto)}</FONT></I>
\r
49 <B>procedure</B> <A HREF="#cNaveEnemiga.mReaccionar">mReaccionar</A>( np: cNavePropia ); <B>virtual</B>; <B>abstract</B>;
\r
50 <I><FONT COLOR="Navy">{** Indica si ov esta en el campo de radar}</FONT></I>
\r
51 <B>function</B> <A HREF="#cNaveEnemiga.mDetectado">mDetectado</A>( ov: cObjetoVolador ): boolean;
\r
52 <I><FONT COLOR="Navy">{** Hace que la nave se dirija a una posicion particular}</FONT></I>
\r
53 <B>procedure</B> <A HREF="#cNaveEnemiga.mIrA">mIrA</A>( pos: cVector );
\r
54 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
55 <I><FONT COLOR="Navy">{** Método heredado que devuelve un string con el estado del Objeto. Se utiliza para depurar
\r
56 y la información entregada depende del parámetro tDebugInfo.}</FONT></I>
\r
57 <B>function</B> <A HREF="#cNaveEnemiga.mGetDebugInfo">mGetDebugInfo</A>( debugLevel: tDebugInfo = DI_MINI ): <B>string</B>; <B>override</B>;
\r
58 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
59 <I><FONT COLOR="Navy">// SERIALIZACION </FONT></I>
\r
60 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I>
\r
61 <B>function</B> <A HREF="#cNaveEnemiga.mSerializar">mSerializar</A>: <B>string</B>; <B>override</B>;
\r
62 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
63 serializado.}</FONT></I>
\r
64 <B>procedure</B> <A HREF="#cNaveEnemiga.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>override</B>;
\r
67 <B>implementation</B>
\r
74 <I><FONT COLOR="Navy">{ cNaveEnemiga }</FONT></I>
\r
76 <I><FONT COLOR="Navy">{** Constructor
\r
77 @param pos Posicion inicial
\r
78 @param vel Velocidad inicial
\r
79 @param dim Dimensión (radio, en metros)
\r
80 @param pot Potencia (cantidad de daño que hace por intervalode tiempo)
\r
81 @param ene Energía (cantidad de daño que soporta antes de ser destruido)
\r
82 @param misiles Cantidad de misiles comunes
\r
83 @param misilesDirigidos Cantidad de misiles dirigidos
\r
84 @param velMax Velocidad máxima que puede alcanzar (modulo)
\r
85 @param radar Área máxima en la que puede detectar a otras naves (radio, en metros)
\r
86 @param retardoLaser Ratardo del arma antes de poder volver a disparar
\r
87 @param retardoMisil Ratardo del arma antes de poder volver a disparar
\r
88 @param retardoMisDir Ratardo del arma antes de poder volver a disparar}</FONT></I>
\r
89 <B>constructor</B> cNaveEnemiga.create(pos, vel: cVector; dim: tLongitud; pot,
\r
90 ene: tEnergia; misiles: tMaxMisil; misilesDirigidos: tMaxMisilDirigido;
\r
91 velMax: tLongitud; radar: tLongitud; retardoLaser, retardoMisil,
\r
92 retardoMisDir: tTiempo);
\r
94 <B>inherited</B> create( pos , vel , dim , pot , ene , misiles, misilesDirigidos,
\r
95 velMax, retardoLaser, retardoMisil, retardoMisDir );
\r
96 aCampoRadar := radar;
\r
99 <I><FONT COLOR="Navy">{** Modifica la velocidad de la nave en base a la nave propia
\r
100 @param np Nave propia con la cual se calculará la dirección de la nueva velocidad
\r
101 @param modulo Nuevo módulo de la velocidad}</FONT></I>
\r
102 <B>procedure</B> <A NAME=cNaveEnemiga.mModificarVelocidad>cNaveEnemiga.mModificarVelocidad</A>( np: cNavePropia; modulo: tLongitud );
\r
104 vel, <I><FONT COLOR="Navy">// Vector temporal para hacer calculos </FONT></I>
\r
105 pos: cVector; <I><FONT COLOR="Navy">// Vector temporal para hacer calculos </FONT></I>
\r
107 <B>if</B> (modulo < 0) <B>or</B> (modulo > mGetVelMax) <B>then</B>
\r
108 modulo := mGetVelMax;
\r
109 pos := mGetPosicion;
\r
110 <I><FONT COLOR="Navy">// Crea un nuevo verctor basado en la posicion del objetivo, </FONT></I>
\r
111 <I><FONT COLOR="Navy">// Le resta la posicion propia, obteniendo la nueva direccion de la velocidad </FONT></I>
\r
112 <I><FONT COLOR="Navy">// y luego setea el modulo </FONT></I>
\r
113 vel := np.mGetPosicion.mRestar( pos );
\r
114 <I><FONT COLOR="Navy">// Modifica la velocidad basado en el vector v </FONT></I>
\r
115 mSetVelDir( vel );
\r
116 mSetVelModulo( modulo );
\r
117 vel.free; <I><FONT COLOR="Navy">// libera la memoria del vector temporal </FONT></I>
\r
118 pos.free; <I><FONT COLOR="Navy">// libera la memoria del vector temporal </FONT></I>
\r
121 <I><FONT COLOR="Navy">{** Indica si ov esta en el campo de radar
\r
122 @param ov Objeto volador a chequear si está dentro del alcance del radar}</FONT></I>
\r
123 <B>function</B> <A NAME=cNaveEnemiga.mDetectado>cNaveEnemiga.mDetectado</A>( ov: cObjetoVolador ): boolean;
\r
125 <I><FONT COLOR="Navy">// true si la distancia es menor que el campo de radar </FONT></I>
\r
126 result := ( mGetDistancia( ov ) <= aCampoRadar );
\r
129 <I><FONT COLOR="Navy">{** Hace que la nave se dirija a una posicion particular
\r
130 @param pos Vector posición del punto al cual se dirigirá la nave}</FONT></I>
\r
131 <B>procedure</B> <A NAME=cNaveEnemiga.mIrA>cNaveEnemiga.mIrA</A>(pos: cVector);
\r
133 v: cVector; <I><FONT COLOR="Navy">// Vector temporal para hacer calculos </FONT></I>
\r
134 modulo: tLongitud; <I><FONT COLOR="Navy">// Modulo actual de la velocidad </FONT></I>
\r
136 v := mGetVelocidad;
\r
137 modulo := v.mGetModulo; <I><FONT COLOR="Navy">// Obtiene el modulo actual de la velocidad </FONT></I>
\r
139 <I><FONT COLOR="Navy">// Crea un nuevo verctor basado en la posicion y e resta la posicion propia, </FONT></I>
\r
140 <I><FONT COLOR="Navy">// obteniendo la nueva direccion de la velocidad. </FONT></I>
\r
141 v := cVector.create( pos ).mRestar( mGetPosicion );
\r
142 mSetVelDir( v ); <I><FONT COLOR="Navy">// Modifica la direccion de la velocidad basado en el vector v </FONT></I>
\r
143 mSetVelModulo( modulo ); <I><FONT COLOR="Navy">// Setea el modulo igual que el de la velocidad original </FONT></I>
\r
144 v.free; <I><FONT COLOR="Navy">// libera la memoria del vector temporal </FONT></I>
\r
147 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
148 <I><FONT COLOR="Navy">{** Devuelve el estado del objeto basandose en la cantidad de datos requeridos.
\r
149 @return Cadena de texto con el estado del Objeto.
\r
150 @param debugLevel Cantidad de información requerida}</FONT></I>
\r
151 <B>function</B> <A NAME=cNaveEnemiga.mGetDebugInfo>cNaveEnemiga.mGetDebugInfo</A>(debugLevel: tDebugInfo): <B>string</B>;
\r
153 result := <B>inherited</B> mGetDebugInfo( debugLevel );
\r
154 <B>if</B> debugLevel > DI_NORMAL <B>then</B>
\r
155 result := result + ' | Campo de Radar: ' + FloatToStrF( aCampoRadar, ffNumber, 5, 5 );
\r
157 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
159 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
161 @param str Cadena de texto con el objeto serializado.}</FONT></I>
\r
162 <B>procedure</B> <A NAME=cNaveEnemiga.mDesSerializar>cNaveEnemiga.mDesSerializar</A>(str: <B>string</B>);
\r
166 <B>inherited</B> mDesSerializar( str ); <I><FONT COLOR="Navy">// SIEMPRE el ID debe ser el PRIMER atributo </FONT></I>
\r
167 r := TRegExpr.create;
\r
168 <I><FONT COLOR="Navy">// CAMPORADAR </FONT></I>
\r
169 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
170 r.Expression := '<camporadar>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</camporadar>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
171 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
172 aCampoRadar := StrToFloat( r.Match[1] )
\r
173 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
174 <B>raise</B> ESerializacion.create( 'No se encontro el campo de radar' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
175 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
176 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
177 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
178 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el campo de radar utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
184 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.
\r
185 @return Cadena de texto con el objeto serializado.}</FONT></I>
\r
186 <B>function</B> <A NAME=cNaveEnemiga.mSerializar>cNaveEnemiga.mSerializar</A>: <B>string</B>;
\r
188 result := <B>inherited</B> mSerializar +
\r
189 '<camporadar>' + FloatToStrF( aCampoRadar, ffGeneral, 18, 0 ) + '</camporadar>';
\r