2 <TITLE>File: navepropia.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=navepropia.pas><CENTER><H3>navepropia.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">{** Es la nave que será controlada por el jugador.<br>
\r
12 05/10/00: Se corrigió el método mAcelerar porque tenía algunos bugs cuando la velocidad llegaba a cero.
\r
13 01/12/00: Se implementan los disparon sobreescribiendo el método mDisparar de cNave y agregando algunos
\r
14 atributos (aArmaSelect, aDisparando y aLockeado) y algunos métodos (mIntentarDisparo,
\r
15 mSeleccionarArma, mSeleccionarArmaSig, mGetArmaSelect, mSetLockeado, mGetLockeado).
\r
16 Se cambiaron las dimensiones de la nave para que los disparos sean mas "jugables".
\r
17 Se cambia el orden de los argumentos de mDisparar para aprovechar los argumentos por defecto.
\r
18 Se arreglaron un par de BUGs con punteros que apuntaba a objetos destruidos (aLockeado).
\r
19 08/12/00: Se arregló una falla en el constructor que permitia crear la nave con una velocidad superior
\r
21 09/12/00: Se cambia el atributo disparando por un puntero a un arma que se disparara en el proximo turno.
\r
22 También se cambia los métodos que lo utilizan y en particular se convierte el método
\r
23 mIntentarDisparo en una función que devuelve dicho puntero para implementar la cámara en el arma.
\r
25 <B>unit</B> NavePropia;
\r
41 <I><FONT COLOR="Navy">{** Es la nave que será controlada por el jugador.
\r
42 <u>Características:</u>
\r
44 Dimensión: 15 metros
\r
45 Potencia: 5 Cantidad de daño que hace por intervalo de tiempo
\r
46 Energía: 100 Cantidad de daño que soporta antes de ser destruída
\r
47 Velocidad máxima: 0,17 metros/milisegundos (612 km/h)
\r
49 Misiles Dirigidos: 5
\r
51 cNavePropia = <B>class</B>( cNave )
\r
53 aLockeado: cObjetoVolador; <I><FONT COLOR="Navy">// Objeto Volador Lockeado </FONT></I>
\r
54 aArmaSelec: tArma; <I><FONT COLOR="Navy">// Arma seleccionada por el usuario </FONT></I>
\r
55 aDisparando: cArma; <I><FONT COLOR="Navy">// Indica si en este momento se esta disparando o no </FONT></I>
\r
56 aLockFiltro: cFiltroLock; <I><FONT COLOR="Navy">// Filtro para saber que objetos voladores se puede lockear </FONT></I>
\r
58 <I><FONT COLOR="Navy">{** Crea una nave controlada por un jugador}</FONT></I>
\r
59 <B>constructor</B> create( pos: cVector = <B>nil</B>; vel: cVector = <B>nil</B> ); overload;
\r
60 <I><FONT COLOR="Navy">{** Hace que se dispare un arma (todavía no está implementado)}</FONT></I>
\r
61 <B>function</B> <A HREF="#cNavePropia.mDisparar">mDisparar</A>( dT: tTiempo; ov : cObjetoVolador = <B>nil</B> ): cArma; <B>override</B>;
\r
62 <I><FONT COLOR="Navy">{** Obtiene el objetivo lockeado}</FONT></I>
\r
63 <B>function</B> <A HREF="#cNavePropia.mGetLockeado">mGetLockeado</A>: cObjetoVolador;
\r
64 <I><FONT COLOR="Navy">{** Setea el objetivo lockeado}</FONT></I>
\r
65 <B>procedure</B> <A HREF="#cNavePropia.mSetLockeado">mSetLockeado</A>( ov: cObjetoVolador );
\r
66 <I><FONT COLOR="Navy">{** Cambia el objetivo lockeado}</FONT></I>
\r
67 <B>procedure</B> <A HREF="#cNavePropia.mCambiarLockeado">mCambiarLockeado</A>( lEnemigos: TList );
\r
68 <I><FONT COLOR="Navy">{** Permite a la nave rotar a la izquierda sobre su eje X}</FONT></I>
\r
69 <B>procedure</B> <A HREF="#cNavePropia.mRotarIzquierda">mRotarIzquierda</A>( angulo: tAngulo );
\r
70 <I><FONT COLOR="Navy">{** Permite a la nave rotar a la derecha sobre su eje X}</FONT></I>
\r
71 <B>procedure</B> <A HREF="#cNavePropia.mRotarDerecha">mRotarDerecha</A>( angulo: tAngulo );
\r
72 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia la izquierda (sobre su eje Z)}</FONT></I>
\r
73 <B>procedure</B> <A HREF="#cNavePropia.mGirarIzquierda">mGirarIzquierda</A>( angulo: tAngulo );
\r
74 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia la derecha (sobre su eje Z)}</FONT></I>
\r
75 <B>procedure</B> <A HREF="#cNavePropia.mGirarDerecha">mGirarDerecha</A>( angulo: tAngulo );
\r
76 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia arriba (sobre su eje Y)}</FONT></I>
\r
77 <B>procedure</B> <A HREF="#cNavePropia.mGirarArriba">mGirarArriba</A>( angulo: tAngulo );
\r
78 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia abajo (sobre su eje Y)}</FONT></I>
\r
79 <B>procedure</B> <A HREF="#cNavePropia.mGirarAbajo">mGirarAbajo</A>( angulo: tAngulo );
\r
80 <I><FONT COLOR="Navy">{** Aumenta el modulo de la velocidad (sin cambiar su dirección ni
\r
81 sentido y sin sobrepasar la velocidad maxima)}</FONT></I>
\r
82 <B>procedure</B> <A HREF="#cNavePropia.mAcelerar">mAcelerar</A>( modulo: tLongitud );
\r
83 <I><FONT COLOR="Navy">{** Disminuye el modulo de la velocidad (sin cambiar su dirección ni sentido)}</FONT></I>
\r
84 <B>procedure</B> <A HREF="#cNavePropia.mDesacelerar">mDesacelerar</A>( modulo: tLongitud );
\r
85 <I><FONT COLOR="Navy">{** Intenta disparar. Si las condiciones son las correctas, el proximo turno
\r
86 saldrá el disparo, si no, no hace nada}</FONT></I>
\r
87 <B>function</B> <A HREF="#cNavePropia.mIntentarDisparo">mIntentarDisparo</A>: cArma;
\r
88 <I><FONT COLOR="Navy">{** Selecciona un arma determinada. Si tiene municiones, la selecciona, si no,
\r
89 no hace nada.}</FONT></I>
\r
90 <B>procedure</B> <A HREF="#cNavePropia.mSeleccionarArma">mSeleccionarArma</A>( a: tArma );
\r
91 <I><FONT COLOR="Navy">{** Selecciona el proximo arma con municiones}</FONT></I>
\r
92 <B>procedure</B> <A HREF="#cNavePropia.mSeleccionarArmaSig">mSeleccionarArmaSig</A>;
\r
93 <I><FONT COLOR="Navy">{** Obtiene el arma seleccionada actualmente}</FONT></I>
\r
94 <B>function</B> <A HREF="#cNavePropia.mGetArmaSelec">mGetArmaSelec</A>: tArma;
\r
95 <I><FONT COLOR="Navy">{** Obtiene un puntero a la último arma disparada}</FONT></I>
\r
96 <B>function</B> <A HREF="#cNavePropia.mGetUltimoArmaDisparado">mGetUltimoArmaDisparado</A>: cArma;
\r
97 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque se dibuja de forma distinta}</FONT></I>
\r
98 <B>function</B> <A HREF="#cNavePropia.mDibujar">mDibujar</A>: tObjetosVoladores; <B>override</B>;
\r
99 <I><FONT COLOR="Navy">// SERIALIZACION </FONT></I>
\r
100 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I>
\r
101 <B>function</B> <A HREF="#cNavePropia.mSerializar">mSerializar</A>: <B>string</B>; <B>override</B>;
\r
102 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
103 serializado.}</FONT></I>
\r
104 <B>procedure</B> <A HREF="#cNavePropia.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>override</B>;
\r
107 <B>implementation</B>
\r
111 ObjetoPersistente,
\r
112 SerializacionUtils,
\r
115 <I><FONT COLOR="Navy">{ cNavePropia }</FONT></I>
\r
117 <I><FONT COLOR="Navy">{** @param pos Posición Inicial
\r
118 @param vel Velocidad Inicial}</FONT></I>
\r
119 <B>constructor</B> cNavePropia.create(pos: cVector; vel: cVector);
\r
121 <B>if</B> vel <> <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no es nula la velocidad ... </FONT></I>
\r
122 vel.mSetModulo( 0.17 ); <I><FONT COLOR="Navy">// Setea la velocidad como la máxima </FONT></I>
\r
123 <I><FONT COLOR="Navy">// La dimensión es 15 m de radio, la potencia 5, la energía 100, tiene 10 misiles comunes, </FONT></I>
\r
124 <I><FONT COLOR="Navy">// 5 dirigidos y su velocidad maxima es 0,17 m/mseg (612 km/h) </FONT></I>
\r
125 <I><FONT COLOR="Navy">// El retardo del laser es de .5 segundos. </FONT></I>
\r
126 <B>inherited</B> create( pos, vel, 15 <I><FONT COLOR="Navy">{dim}</FONT></I>, 5 <I><FONT COLOR="Navy">{pot}</FONT></I>, 100 <I><FONT COLOR="Navy">{ene}</FONT></I>, 10 <I><FONT COLOR="Navy">{mis}</FONT></I>, 5 <I><FONT COLOR="Navy">{misdir}</FONT></I>,
\r
127 0.17 <I><FONT COLOR="Navy">{velmax}</FONT></I>, 50 <I><FONT COLOR="Navy">{retlas}</FONT></I>, 1000 <I><FONT COLOR="Navy">{retmis}</FONT></I>, 2500 <I><FONT COLOR="Navy">{retmisdir}</FONT></I> );
\r
128 aArmaSelec := OV_LASER;
\r
129 aDisparando := <B>nil</B>;
\r
130 aLockeado := <B>nil</B>;
\r
131 aLockFiltro := cFiltroLock.create( self <I><FONT COLOR="Navy">{observador}</FONT></I>, 0.8 <I><FONT COLOR="Navy">{angulo}</FONT></I>, 2000 <I><FONT COLOR="Navy">{maximo}</FONT></I> );
\r
134 <I><FONT COLOR="Navy">{** Hace que aumente el modulo de la velocidad
\r
135 @param modulo Modulo de la velocidad a sumar}</FONT></I>
\r
136 <B>procedure</B> <A NAME=cNavePropia.mAcelerar>cNavePropia.mAcelerar</A>(modulo: tLongitud);
\r
138 modulo := mGetVelModulo + modulo;
\r
139 <B>if</B> modulo <= mGetVelMax <B>then</B>
\r
140 mSetVelModulo( modulo );
\r
143 <I><FONT COLOR="Navy">{** Hace que disminuya el modulo de la velocidad
\r
144 @param modulo Modulo de la velocidad a restar}</FONT></I>
\r
145 <B>procedure</B> <A NAME=cNavePropia.mDesacelerar>cNavePropia.mDesacelerar</A>(modulo: tLongitud);
\r
147 modulo := mGetVelModulo - modulo;
\r
148 mSetVelModulo( modulo );
\r
151 <I><FONT COLOR="Navy">{** Método heredado, se sobreescribe porque se dibuja de forma distinta}</FONT></I>
\r
152 <B>function</B> <A NAME=cNavePropia.mDibujar>cNavePropia.mDibujar</A>: tObjetosVoladores;
\r
154 result := OV_NAVEPROPIA;
\r
157 <I><FONT COLOR="Navy">{** Hace que se dispare un arma
\r
158 @param ov Objetivo del disparo
\r
159 @param dT Intervalo de tiempo
\r
160 @return Arma disparada (o <i>nil</i> si no se puede disparar ningún arma)}</FONT></I>
\r
161 <B>function</B> <A NAME=cNavePropia.mDisparar>cNavePropia.mDisparar</A>( dT: tTiempo; ov : cObjetoVolador ): cArma;
\r
163 result := <B>nil</B>;
\r
164 mActualizarRetardadores( dT );
\r
165 <B>if</B> aDisparando <> <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si esta disparando ... </FONT></I>
\r
166 result := aDisparando; <I><FONT COLOR="Navy">// Se devuleve el arma disparada </FONT></I>
\r
167 aDisparando := <B>nil</B>; <I><FONT COLOR="Navy">// Deja de disparar </FONT></I>
\r
171 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia abajo (sobre su eje Y)
\r
172 @param angulo Ángulo a girar}</FONT></I>
\r
173 <B>procedure</B> <A NAME=cNavePropia.mGirarAbajo>cNavePropia.mGirarAbajo</A>(angulo: tAngulo);
\r
175 mRotarEnJ( - angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>
\r
178 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia arriba (sobre su eje Y)
\r
179 @param angulo Ángulo a girar}</FONT></I>
\r
180 <B>procedure</B> <A NAME=cNavePropia.mGirarArriba>cNavePropia.mGirarArriba</A>(angulo: tAngulo);
\r
182 mRotarEnJ( angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>
\r
185 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia la derecha (sobre su eje Z)
\r
186 @param angulo Ángulo a girar}</FONT></I>
\r
187 <B>procedure</B> <A NAME=cNavePropia.mGirarDerecha>cNavePropia.mGirarDerecha</A>(angulo: tAngulo);
\r
189 mRotarEnK( - angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>
\r
192 <I><FONT COLOR="Navy">{** Permite a la nave girar hacia la izquierda (sobre su eje Z)
\r
193 @param angulo Ángulo a girar}</FONT></I>
\r
194 <B>procedure</B> <A NAME=cNavePropia.mGirarIzquierda>cNavePropia.mGirarIzquierda</A>(angulo: tAngulo);
\r
196 mRotarEnK( angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>
\r
199 <I><FONT COLOR="Navy">{** Permite a la nave rotar hacia la derecha (sobre su eje I)
\r
200 @param angulo Ángulo a rotar}</FONT></I>
\r
201 <B>procedure</B> <A NAME=cNavePropia.mRotarDerecha>cNavePropia.mRotarDerecha</A>(angulo: tAngulo);
\r
203 mRotarEnI( angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>
\r
206 <I><FONT COLOR="Navy">{** Permite a la nave rotar hacia la izquierda (sobre su eje I)
\r
207 @param angulo Ángulo a rotar}</FONT></I>
\r
208 <B>procedure</B> <A NAME=cNavePropia.mRotarIzquierda>cNavePropia.mRotarIzquierda</A>(angulo: tAngulo);
\r
210 mRotarEnI( - angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>
\r
213 <I><FONT COLOR="Navy">{** Intenta disparar. Si las condiciones son las correctas, el proximo turno
\r
214 saldrá el disparo, si no, no hace nada
\r
215 @return Arma proximamente disparada}</FONT></I>
\r
216 <B>function</B> <A NAME=cNavePropia.mIntentarDisparo>cNavePropia.mIntentarDisparo</A>: cArma;
\r
221 result := <B>nil</B>;
\r
222 <B>if</B> aDisparando = <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no esta disparando se fija si puede hacerlo </FONT></I>
\r
223 <B>case</B> aArmaSelec <B>of</B>
\r
224 OV_LASER: <B>if</B> mPuedeDispararLaser( <B>nil</B> ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// si puede disparar... </FONT></I>
\r
225 aDisparando := mCrearLaserDisparado;
\r
226 result := aDisparando;
\r
228 OV_MISIL: <B>if</B> mPuedeDispararMisil( <B>nil</B> ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// si puede disparar... </FONT></I>
\r
229 aDisparando := mCrearMisilDisparado;
\r
230 result := aDisparando;
\r
232 OV_MISDIR: <B>begin</B>
\r
233 <B>try</B> <I><FONT COLOR="Navy">// Prueba si aLockeado no fue destruido... </FONT></I>
\r
234 ok := mPuedeDispararMisDir( aLockeado );
\r
236 on e: EAccessViolation <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el objetivo lockeado esta destruido... </FONT></I>
\r
237 aLockeado := <B>nil</B>; <I><FONT COLOR="Navy">// Lo setea a nil </FONT></I>
\r
238 ok := mPuedeDispararMisDir( aLockeado ); <I><FONT COLOR="Navy">// Se fija de nuevo si puede disparar </FONT></I>
\r
241 <B>if</B> ok <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si puede disparar ... </FONT></I>
\r
242 aDisparando := mCrearMisDirDisparado( aLockeado ); <I><FONT COLOR="Navy">// Utiliza como objetivo a aLockeado </FONT></I>
\r
243 <B>if</B> aLockeado = <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si no hay ninguno lockeado se setea la direccion </FONT></I>
\r
244 vel := mGetI; <I><FONT COLOR="Navy">// de la velocidad igual que la de la nave propia. </FONT></I>
\r
245 aDisparando.mSetVelDir( vel );
\r
248 result := aDisparando;
\r
254 <I><FONT COLOR="Navy">{** Selecciona un arma determinada. Si tiene municiones, la selecciona, si no,
\r
255 no hace nada.}</FONT></I>
\r
256 <B>procedure</B> <A NAME=cNavePropia.mSeleccionarArma>cNavePropia.mSeleccionarArma</A>(a: tArma);
\r
258 <B>case</B> a <B>of</B>
\r
262 <B>if</B> mTieneMisil <B>then</B>
\r
265 <B>if</B> mTieneMisilDirigido <B>then</B>
\r
270 <I><FONT COLOR="Navy">{** Selecciona el proximo arma con municiones}</FONT></I>
\r
271 <B>procedure</B> <A NAME=cNavePropia.mSeleccionarArmaSig>cNavePropia.mSeleccionarArmaSig</A>;
\r
273 <B>case</B> aArmaSelec <B>of</B>
\r
275 <B>if</B> mTieneMisil <B>then</B>
\r
276 aArmaSelec := OV_MISIL
\r
277 <B>else</B> <B>if</B> mTieneMisilDirigido <B>then</B>
\r
278 aArmaSelec := OV_MISDIR;
\r
280 <B>if</B> mTieneMisilDirigido <B>then</B>
\r
281 aArmaSelec := OV_MISDIR
\r
283 aArmaSelec := OV_LASER;
\r
285 aArmaSelec := OV_LASER;
\r
289 <I><FONT COLOR="Navy">{** Obtiene el arma seleccionada actualmente
\r
290 @return Arma seleccionada}</FONT></I>
\r
291 <B>function</B> <A NAME=cNavePropia.mGetArmaSelec>cNavePropia.mGetArmaSelec</A>: tArma;
\r
293 result := aArmaSelec;
\r
296 <I><FONT COLOR="Navy">{** Obtiene el objetivo lockeado
\r
297 @return Objeto volador lockeado}</FONT></I>
\r
298 <B>function</B> <A NAME=cNavePropia.mGetLockeado>cNavePropia.mGetLockeado</A>: cObjetoVolador;
\r
300 result := aLockeado;
\r
301 <B>if</B> aLockeado <> <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no es nil... </FONT></I>
\r
302 <B>try</B> <I><FONT COLOR="Navy">// Primero se fija que no esté destruido </FONT></I>
\r
305 on e: EAccessViolation <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si lo está... </FONT></I>
\r
306 aLockeado := <B>nil</B>; <I><FONT COLOR="Navy">// Lo setea a nil </FONT></I>
\r
307 result := aLockeado;
\r
312 <I><FONT COLOR="Navy">{** Setea el objetivo lockeado
\r
313 @param ov Objeto volador lockeado}</FONT></I>
\r
314 <B>procedure</B> <A NAME=cNavePropia.mSetLockeado>cNavePropia.mSetLockeado</A>(ov: cObjetoVolador);
\r
319 <I><FONT COLOR="Navy">{** Cambia el objetivo lockeado}</FONT></I>
\r
320 <B>procedure</B> <A NAME=cNavePropia.mCambiarLockeado>cNavePropia.mCambiarLockeado</A>(lEnemigos: TList);
\r
322 lFiltrados: TList;
\r
325 lFiltrados := aLockFiltro.mFiltrar( lEnemigos );
\r
326 <B>if</B> lFiltrados.Count = 0 <B>then</B>
\r
327 aLockeado := <B>nil</B>
\r
329 <B>if</B> aLockeado = <B>nil</B> <B>then</B>
\r
330 aLockeado := lFiltrados.First <I><FONT COLOR="Navy">// Asigna el primero </FONT></I>
\r
331 <B>else</B> <B>begin</B>
\r
332 i := lFiltrados.IndexOf( aLockeado );
\r
333 <B>if</B> i < 0 <B>then</B> <I><FONT COLOR="Navy">// No esta en la lista </FONT></I>
\r
334 aLockeado := lFiltrados.First <I><FONT COLOR="Navy">// Asigna el primero </FONT></I>
\r
336 <B>if</B> i = (lFiltrados.Count - 1) <B>then</B> <I><FONT COLOR="Navy">// Es el ultimo objeto de la lista </FONT></I>
\r
337 aLockeado := lFiltrados.First <I><FONT COLOR="Navy">// Asigna el primero </FONT></I>
\r
339 aLockeado := lFiltrados.Items[i+1]; <I><FONT COLOR="Navy">// Asigna el proximo </FONT></I>
\r
344 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
346 @param str Cadena de texto con el objeto serializado.}</FONT></I>
\r
347 <B>procedure</B> <A NAME=cNavePropia.mDesSerializar>cNavePropia.mDesSerializar</A>(str: <B>string</B>);
\r
351 <B>inherited</B> mDesSerializar( str ); <I><FONT COLOR="Navy">// SIEMPRE el ID debe ser el PRIMER atributo </FONT></I>
\r
352 r := TRegExpr.create;
\r
353 <I><FONT COLOR="Navy">// LOCKEADO </FONT></I>
\r
354 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
355 r.Expression := '<lockeado/s+class=([/w/d]+)/s*>/s*(.+)/s*</lockeado>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
356 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
357 <B>if</B> r.Match[1] <> '0' <B>then</B> <I><FONT COLOR="Navy">// Si tiene una clase determinada... </FONT></I>
\r
358 <B>if</B> aLockeado <> <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no es nulo </FONT></I>
\r
359 <I><FONT COLOR="Navy">// Puede caer en una EAccessViolation si esta destruido </FONT></I>
\r
360 aLockeado.mDesSerializar( r.Match[2] ) <I><FONT COLOR="Navy">// Lo deserializa </FONT></I>
\r
361 <B>else</B> <I><FONT COLOR="Navy">// si es nulo </FONT></I>
\r
362 aLockeado := restaurarObjeto( r.Match[1], r.Match[2] ) <I><FONT COLOR="Navy">// lo crea segun su clase </FONT></I>
\r
363 <B>else</B> <I><FONT COLOR="Navy">// Si no tiene una clase determinada, entonces se lo pone en nil </FONT></I>
\r
364 aLockeado := <B>nil</B>
\r
365 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
366 <B>raise</B> ESerializacion.create( 'No se encontro el objetivo lockeado' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
367 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
368 on e: ESerializacion <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si fueron de serializacion... </FONT></I>
\r
369 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
370 <B>raise</B> ESerializacion.create( ClassName + ': Error al deserializar el objetivo lockeado: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
372 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
373 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
374 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el objetivo lockeado utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
376 on e: EAccessViolation <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si el Objetivo fue destruido... </FONT></I>
\r
377 aLockeado := restaurarObjeto( r.Match[1], r.Match[2] ) <I><FONT COLOR="Navy">// lo crea segun su clase </FONT></I>
\r
380 <I><FONT COLOR="Navy">// ARMASELEC </FONT></I>
\r
381 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
382 r.Expression := '<armaselec>/s*(/d+)/s*</armaselec>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
383 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
384 aArmaSelec := tArma( StrToInt( r.Match[1] ) )
\r
385 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
386 <B>raise</B> ESerializacion.create( 'No se encontro el arma seleccionada' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
387 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
388 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
389 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
390 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el arma seleccionada utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
393 <I><FONT COLOR="Navy">// LOCKFILTRO </FONT></I>
\r
394 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
395 r.Expression := '<lockfiltro>/s*(.+)/s*</lockfiltro>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
396 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
397 <B>if</B> aLockFiltro <> <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no es nulo </FONT></I>
\r
398 aLockFiltro.mDesSerializar( r.Match[1] ) <I><FONT COLOR="Navy">// Lo deserializa </FONT></I>
\r
399 <B>else</B> <I><FONT COLOR="Navy">// si es nulo </FONT></I>
\r
400 aLockFiltro := cFiltroLock.crearDeSerializado( r.Match[1] ) <I><FONT COLOR="Navy">// lo crea </FONT></I>
\r
401 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
402 <B>raise</B> ESerializacion.create( ClassName + ': No se pudieron extraer el filtro de lockeo' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
403 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
404 on e: ESerializacion <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si fueron de serializacion... </FONT></I>
\r
405 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
406 <B>raise</B> ESerializacion.create( ClassName + ': Error al deserializar el filtro de lockeo: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
408 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
409 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
410 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el filtro de lockeo utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
413 <I><FONT COLOR="Navy">// El observador del filtro va a ser siempre la nave propia, es por esto </FONT></I>
\r
414 <I><FONT COLOR="Navy">// que debemos eliminar la copia del observador que se creo y asignarle self </FONT></I>
\r
415 aLockFiltro.mGetObservador.free;
\r
416 aLockFiltro.mSetObservador( self );
\r
420 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.
\r
421 @return Cadena de texto con el objeto serializado.}</FONT></I>
\r
422 <B>function</B> <A NAME=cNavePropia.mSerializar>cNavePropia.mSerializar</A>: <B>string</B>;
\r
425 lockeado: <B>string</B>;
\r
426 meteorito: cMeteorito;
\r
428 <I><FONT COLOR="Navy">// Si el objetivo es nil o está destruido, se setea el atributo class del </FONT></I>
\r
429 <I><FONT COLOR="Navy">// TAG objetivo como '0' y entre el TAG se indica que es nil. Si no se </FONT></I>
\r
430 <I><FONT COLOR="Navy">// setea como el nombre de la clase y su expresion serializada respectivamente </FONT></I>
\r
431 lockeado := 'nil';
\r
433 <B>if</B> aLockeado <> <B>nil</B> <B>then</B>
\r
435 lockeado := aLockeado.mSerializar;
\r
436 clase := aLockeado.ClassName;
\r
437 <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cambia la cadena de texto </FONT></I>
\r
438 on e: EAccessViolation <B>do</B> <B>begin</B>
\r
439 lockeado := 'nil';
\r
443 <I><FONT COLOR="Navy">// Hoy que modificar el observador del filtro porque de otra forma esta funcion </FONT></I>
\r
444 <I><FONT COLOR="Navy">// se volveria infinitamente recursiva, ya que cuando quiere serializar el </FONT></I>
\r
445 <I><FONT COLOR="Navy">// filtro, necesita serializar el observador quien necesita serializar el </FONT></I>
\r
446 <I><FONT COLOR="Navy">// filtro y asi ad infinitum. </FONT></I>
\r
447 meteorito := cMeteorito.create;
\r
448 aLockFiltro.mSetObservador( meteorito );
\r
449 result := <B>inherited</B> mSerializar +
\r
450 '<lockeado class=' + clase + '>' + lockeado + '</lockeado>' +
\r
451 '<armaselec>' + IntToStr( ord( aArmaSelec ) ) + '</armaselec>' +
\r
452 '<lockfiltro>' + aLockFiltro.mSerializar + '</lockfiltro>';
\r
453 <I><FONT COLOR="Navy">// Se vuelve a establecer como observador a la nave propia. </FONT></I>
\r
454 aLockFiltro.mSetObservador( self );
\r
458 <I><FONT COLOR="Navy">{** Obtiene un puntero a la último arma disparada
\r
459 @return Último arma disparado}</FONT></I>
\r
460 <B>function</B> <A NAME=cNavePropia.mGetUltimoArmaDisparado>cNavePropia.mGetUltimoArmaDisparado</A>: cArma;
\r
462 result := aDisparando;
\r
463 <B>if</B> aDisparando <> <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no es nil... </FONT></I>
\r
464 <B>try</B> <I><FONT COLOR="Navy">// Primero se fija que no esté destruido </FONT></I>
\r
465 aDisparando.mGetID;
\r
467 on e: EAccessViolation <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si lo está... </FONT></I>
\r
468 aDisparando := <B>nil</B>; <I><FONT COLOR="Navy">// Lo setea a nil </FONT></I>
\r
469 result := aDisparando;
\r