]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/modelo/ov/naves/NavePropia.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / doc / src-html / modelo / ov / naves / NavePropia.pas
1 <HTML><HEAD>\r
2 <TITLE>File: navepropia.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\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
7 <HR>\r
8 <PRE>\r
9 <I><FONT COLOR="Navy">{** Es la nave que será controlada por el jugador.<br> \r
10     <i>Cambios:</i> \r
11     <PRE> \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
20               a la máxima. \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
24     </PRE>}</FONT></I> \r
25 <B>unit</B> NavePropia; \r
26  \r
27 <B>interface</B> \r
28  \r
29 <B>uses</B> \r
30   Tipos, \r
31   Vectores, \r
32   Nave, \r
33   ObjetoVolador, \r
34   Meteorito, \r
35   Coordenadas, \r
36   Classes, \r
37   Filtros, \r
38   Armas; \r
39  \r
40 <B>type</B> \r
41   <I><FONT COLOR="Navy">{** Es la nave que será controlada por el jugador. \r
42       <u>Características:</u> \r
43       <PRE> \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
48       Misiles:              10 \r
49       Misiles Dirigidos:    5 \r
50       </PRE>}</FONT></I> \r
51   cNavePropia = <B>class</B>( cNave ) \r
52     <B>private</B> \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
57     <B>public</B> \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
105   <B>end</B>; \r
106  \r
107 <B>implementation</B> \r
108  \r
109 <B>uses</B> \r
110   RegExpr, \r
111   ObjetoPersistente, \r
112   SerializacionUtils, \r
113   Sysutils; \r
114  \r
115 <I><FONT COLOR="Navy">{ cNavePropia }</FONT></I> \r
116  \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
120 <B>begin</B> \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
132 <B>end</B>; \r
133  \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
137 <B>begin</B> \r
138   modulo := mGetVelModulo + modulo; \r
139   <B>if</B> modulo <= mGetVelMax <B>then</B> \r
140     mSetVelModulo( modulo ); \r
141 <B>end</B>; \r
142  \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
146 <B>begin</B> \r
147   modulo := mGetVelModulo - modulo; \r
148   mSetVelModulo( modulo ); \r
149 <B>end</B>; \r
150  \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
153 <B>begin</B> \r
154   result := OV_NAVEPROPIA; \r
155 <B>end</B>; \r
156  \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
162 <B>begin</B> \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
168   <B>end</B>; \r
169 <B>end</B>; \r
170  \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
174 <B>begin</B> \r
175   mRotarEnJ( - angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>\r
176 <B>end</B>; \r
177  \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
181 <B>begin</B> \r
182   mRotarEnJ( angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>\r
183 <B>end</B>; \r
184  \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
188 <B>begin</B> \r
189   mRotarEnK( - angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>\r
190 <B>end</B>; \r
191  \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
195 <B>begin</B> \r
196   mRotarEnK( angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>\r
197 <B>end</B>; \r
198  \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
202 <B>begin</B> \r
203   mRotarEnI( angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>\r
204 <B>end</B>; \r
205  \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
209 <B>begin</B> \r
210   mRotarEnI( - angulo ); <I><FONT COLOR="Navy">// Rota el sistema de coordenadas </FONT></I>\r
211 <B>end</B>; \r
212  \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
217 <B>var</B> \r
218   vel:     cVector; \r
219   ok:      boolean; \r
220 <B>begin</B> \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
227                 <B>end</B>; \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
231                 <B>end</B>; \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
235                   <B>except</B> \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
239                     <B>end</B>; \r
240                   <B>end</B>; \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
246                       vel.free; \r
247                     <B>end</B>; \r
248                     result := aDisparando; \r
249                   <B>end</B>; \r
250                  <B>end</B>; \r
251     <B>end</B>; \r
252 <B>end</B>; \r
253  \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
257 <B>begin</B> \r
258   <B>case</B> a <B>of</B> \r
259     OV_LASER: \r
260       aArmaSelec := a; \r
261     OV_MISIL: \r
262       <B>if</B> mTieneMisil <B>then</B> \r
263         aArmaSelec := a; \r
264     OV_MISDIR: \r
265       <B>if</B> mTieneMisilDirigido <B>then</B> \r
266         aArmaSelec := a; \r
267   <B>end</B>; \r
268 <B>end</B>; \r
269  \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
272 <B>begin</B> \r
273   <B>case</B> aArmaSelec <B>of</B> \r
274     OV_LASER: \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
279     OV_MISIL: \r
280       <B>if</B> mTieneMisilDirigido <B>then</B> \r
281         aArmaSelec := OV_MISDIR \r
282       <B>else</B> \r
283         aArmaSelec := OV_LASER; \r
284     OV_MISDIR: \r
285       aArmaSelec := OV_LASER; \r
286   <B>end</B>; \r
287 <B>end</B>; \r
288  \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
292 <B>begin</B> \r
293   result := aArmaSelec; \r
294 <B>end</B>; \r
295  \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
299 <B>begin</B> \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
303       aLockeado.mGetID; \r
304     <B>except</B> \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
308       <B>end</B>; \r
309     <B>end</B>; \r
310 <B>end</B>; \r
311  \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
315 <B>begin</B> \r
316   aLockeado := ov; \r
317 <B>end</B>; \r
318  \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
321 <B>var</B> \r
322   lFiltrados: TList; \r
323   i: integer; \r
324 <B>begin</B> \r
325   lFiltrados := aLockFiltro.mFiltrar( lEnemigos ); \r
326   <B>if</B> lFiltrados.Count = 0 <B>then</B> \r
327     aLockeado := <B>nil</B> \r
328   <B>else</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
335       <B>else</B> \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
338         <B>else</B> \r
339           aLockeado := lFiltrados.Items[i+1]; <I><FONT COLOR="Navy">// Asigna el proximo </FONT></I>\r
340     <B>end</B>; \r
341   lFiltrados.free; \r
342 <B>end</B>; \r
343  \r
344 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto \r
345     serializado. \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
348 <B>var</B> \r
349   r: TRegExpr; \r
350 <B>begin</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
371     <B>end</B>; \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
375     <B>end</B>; \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
378     <B>end</B>; \r
379   <B>end</B>; \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
391     <B>end</B>; \r
392   <B>end</B>; \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
407     <B>end</B>; \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
411     <B>end</B>; \r
412   <B>end</B>; \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
417   r.free; \r
418 <B>end</B>; \r
419  \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
423 <B>var</B> \r
424   clase, \r
425   lockeado:  <B>string</B>; \r
426   meteorito: cMeteorito; \r
427 <B>begin</B> \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
432   clase    := '0'; \r
433   <B>if</B> aLockeado <> <B>nil</B> <B>then</B> \r
434     <B>try</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
440         clase    := '0'; \r
441       <B>end</B>; \r
442     <B>end</B>; \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
455   meteorito.free; \r
456 <B>end</B>; \r
457  \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
461 <B>begin</B> \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
466     <B>except</B> \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
470       <B>end</B>; \r
471     <B>end</B>; \r
472 <B>end</B>; \r
473  \r
474 <B>end</B>. \r
475 </PRE>\r
476 </BODY>\r
477 </HTML>\r