]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - src/modelo/ov/naves/NaveEnemiga.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / src / modelo / ov / naves / NaveEnemiga.pas
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
3       <i>Cambios:</i>\r
4     <PRE>\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
8     </PRE>}\r
9 unit NaveEnemiga;\r
10 \r
11 interface\r
12 \r
13 uses\r
14   Tipos,\r
15   Vectores,\r
16   Nave,\r
17   NavePropia,\r
18   ObjetoVolador,\r
19   Armas;\r
20 \r
21 type\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
25     private\r
26       aCampoRadar: tLongitud; // Area en la que detecta a la nave propia\r
27     protected\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
30     public\r
31       {** Constructor}\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
50       {$ENDIF}\r
51       // SERIALIZACION\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
55           serializado.}\r
56       procedure mDesSerializar( str: string ); override;\r
57   end;\r
58 \r
59 implementation\r
60 \r
61 uses\r
62   RegExpr,\r
63   ObjetoPersistente,\r
64   Sysutils;\r
65 \r
66 { cNaveEnemiga }\r
67 \r
68 {** Constructor\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
85 begin\r
86   inherited create( pos , vel , dim , pot , ene , misiles, misilesDirigidos,\r
87                     velMax, retardoLaser, retardoMisil, retardoMisDir );\r
88   aCampoRadar := radar;\r
89 end;\r
90 \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
95 var\r
96   vel,        // Vector temporal para hacer calculos\r
97   pos: cVector; // Vector temporal para hacer calculos\r
98 begin\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
107   mSetVelDir( vel );\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
111 end;\r
112 \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
116 begin\r
117   // true si la distancia es menor que el campo de radar\r
118   result := ( mGetDistancia( ov ) <= aCampoRadar );\r
119 end;\r
120 \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
124 var\r
125   v: cVector;        // Vector temporal para hacer calculos\r
126   modulo: tLongitud; // Modulo actual de la velocidad\r
127 begin\r
128   v := mGetVelocidad;\r
129   modulo := v.mGetModulo; // Obtiene el modulo actual de la velocidad\r
130   v.free;\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
137 end;\r
138 \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
144 begin\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
148 end;\r
149 {$ENDIF}\r
150 \r
151 {** Recrea el objeto a partir de una cadena de texto con el objeto\r
152     serializado.\r
153     @param str Cadena de texto con el objeto serializado.}\r
154 procedure cNaveEnemiga.mDesSerializar(str: string);\r
155 var\r
156   r: TRegExpr;\r
157 begin\r
158   inherited mDesSerializar( str ); // SIEMPRE el ID debe ser el PRIMER atributo\r
159   r := TRegExpr.create;\r
160   // CAMPORADAR\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
171     end;\r
172   end;\r
173   r.free;\r
174 end;\r
175 \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
179 begin\r
180   result := inherited mSerializar +\r
181             '<camporadar>' + FloatToStrF( aCampoRadar, ffGeneral, 18, 0 ) + '</camporadar>';\r
182 end;\r
183 \r
184 end.\r