]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/modelo/ov/naves/NaveEnemiga.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / doc / src-html / modelo / ov / naves / NaveEnemiga.pas
1 <HTML><HEAD>\r
2 <TITLE>File: naveenemiga.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\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
7 <HR>\r
8 <PRE>\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
11       <i>Cambios:</i> \r
12     <PRE> \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
16     </PRE>}</FONT></I> \r
17 <B>unit</B> NaveEnemiga; \r
18  \r
19 <B>interface</B> \r
20  \r
21 <B>uses</B> \r
22   Tipos, \r
23   Vectores, \r
24   Nave, \r
25   NavePropia, \r
26   ObjetoVolador, \r
27   Armas; \r
28  \r
29 <B>type</B> \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
33     <B>private</B> \r
34       aCampoRadar: tLongitud; <I><FONT COLOR="Navy">// Area en la que detecta a la nave propia </FONT></I>\r
35     <B>protected</B> \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
38     <B>public</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
65   <B>end</B>; \r
66  \r
67 <B>implementation</B> \r
68  \r
69 <B>uses</B> \r
70   RegExpr, \r
71   ObjetoPersistente, \r
72   Sysutils; \r
73  \r
74 <I><FONT COLOR="Navy">{ cNaveEnemiga }</FONT></I> \r
75  \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
93 <B>begin</B> \r
94   <B>inherited</B> create( pos , vel , dim , pot , ene , misiles, misilesDirigidos, \r
95                     velMax, retardoLaser, retardoMisil, retardoMisDir ); \r
96   aCampoRadar := radar; \r
97 <B>end</B>; \r
98  \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
103 <B>var</B> \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
106 <B>begin</B> \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
119 <B>end</B>; \r
120  \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
124 <B>begin</B> \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
127 <B>end</B>; \r
128  \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
132 <B>var</B> \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
135 <B>begin</B> \r
136   v := mGetVelocidad; \r
137   modulo := v.mGetModulo; <I><FONT COLOR="Navy">// Obtiene el modulo actual de la velocidad </FONT></I>\r
138   v.free; \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
145 <B>end</B>; \r
146  \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
152 <B>begin</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
156 <B>end</B>; \r
157 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
158  \r
159 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto \r
160     serializado. \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
163 <B>var</B> \r
164   r: TRegExpr; \r
165 <B>begin</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
179     <B>end</B>; \r
180   <B>end</B>; \r
181   r.free; \r
182 <B>end</B>; \r
183  \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
187 <B>begin</B> \r
188   result := <B>inherited</B> mSerializar + \r
189             '<camporadar>' + FloatToStrF( aCampoRadar, ffGeneral, 18, 0 ) + '</camporadar>'; \r
190 <B>end</B>; \r
191  \r
192 <B>end</B>. \r
193 </PRE>\r
194 </BODY>\r
195 </HTML>\r