Los alienígenas siguen un patrón de movimiento que es una combinación de movimientos direccionales, Dirección 0-15, cada una representando un punto de una brújula de 16 puntos, y un número de repeticiones.
Los patrones se guardan en una tabla DATA al final del evento. Cada fila de la tabla de datos representa un patrón propio del nivel al que ha llegado el jugador.
En el juego de demostración, los alienígenas de una oleada de ataque desaparecen cuando el jugador les dispara o cuando salen de la pantalla, pero podrías cambiarlo fácilmente para otros estilos de juego.
El número de alienígenas de una oleada de ataque y otros parámetros se definen por separado en el evento Spawner.
Se incluye un sprite de alienígena por defecto en la imagen de sprite 2; tiene 16 fotogramas, cada uno correspondiente a un valor de dirección, lo que facilita asegurarse de que se muestra el fotograma correcto según la dirección de avance actual del alienígena.
Los alienígenas también pueden disparar misiles al jugador. Cómo y cuándo lo hacen es totalmente personalizable y se basa en los ajustes definidos en el evento Spawner para cada oleada de ataque concreta, así que puedes fijar a qué altura de la pantalla tienen que estar antes de disparar, su probabilidad de disparo y a qué distancia a la izquierda y a la derecha del jugador se permite un posible lanzamiento de misil.
EVENT SPRITETYPE5 ;======= ENEMIES ============ ;==================================== ; ; VARIABLES ; ======================================================= ; DIRECTION - CURRENT DIRECTION OF TRAVEL,( 254= OUT OF BOUNDS, 255= EXPLODE) ; SETTINGA - STATUS (0= INITIALISE, 1=GET DIRECTION & REPS, 2=MOVE) ; SETTINGB - # REPETITIONS OF CURRENT DIRECTION ; AIRBORNE - CHANCE OF FIRING WEAPON (0 = NO, 1 = YES) ; JUMPSPEED - availabe for use in your game ; ======================================================== SPRITEINK C ; colour the alien with C value IF SETTINGA = 0 ; Alien first appears RESTORE ; Restore the data table LET RND = L ; Store the Level number in RND ADD 50 TO RND ; and increase it by 50 WHILE DIRECTION <> RND ; While DIRECTION doesnt = RND READ DIRECTION ; Read value from DATA table READ SETTINGB ; Also read second value ENDWHILE ; Keep going until we find the value in RND LET SETTINGA = 1 ; When we find it change SA to 1 ENDIF IF SETTINGA = 1 ; ready to get direction & reptitions READ DIRECTION ; read the next movement into DIRECTION READ SETTINGB ; read the repetitions into SettingB LET SETTINGA = 2 ; ready to do the movement IF IMAGE 2 ; is this image 2? LET FRAME = DIRECTION ; yes, set the frame to the same as direction ENDIF ENDIF ; COLLISIONS ; ============================== IF COLLISION 1 ; if hit by a player torpedo OTHER ; switch to torpedo LET DIRECTION = 99 ; run the explosion ENDSPRITE ; return to this Alien LET DIRECTION = 255 ; request alien explosion ENDIF IF COLLISION 0 ; if enemy and player collide OTHER ; switch to the player LET DIRECTION = 99 ; trigger the player explosion ENDSPRITE ; return to this sprite LET DIRECTION = 255 ; request alien explosion ENDIF ; EXPLODE THE ALIEN ; ======================= IF DIRECTION = 255 ; Alien explosion requested LET TYPE = 6 ; switch it to the explosion type LET IMAGE = 4 ; and the explosion image LET FRAME = 0 ; reset it to first frame LET DIRECTION = 0 ; this is an alen exploding ENDIF ; MOVEMENT ; ==================== IF DIRECTION = 0 ; Move N SPRITEUP SPRITEUP ENDIF IF DIRECTION = 1 ; Move NNE SPRITERIGHT SPRITEUP SPRITEUP ENDIF IF DIRECTION = 2 ; Move NE SPRITERIGHT SPRITERIGHT SPRITEUP SPRITEUP ENDIF IF DIRECTION = 3 ; Move ENE SPRITERIGHT SPRITERIGHT SPRITEUP ENDIF IF DIRECTION = 4 ; Move E SPRITERIGHT SPRITERIGHT ENDIF IF DIRECTION = 5 ; Move ESE SPRITERIGHT SPRITERIGHT SPRITEDOWN ENDIF IF DIRECTION = 6 ; MOVE SE SPRITERIGHT SPRITERIGHT SPRITEDOWN SPRITEDOWN ENDIF IF DIRECTION = 7 ; MOVE SSE SPRITEDOWN SPRITEDOWN SPRITERIGHT ENDIF IF DIRECTION = 8 ; MOVE S SPRITEDOWN SPRITEDOWN ENDIF IF DIRECTION = 9 ; MOVE SSW SPRITEDOWN SPRITEDOWN SPRITELEFT ENDIF IF DIRECTION = 10 ; MOVE SW SPRITEDOWN SPRITEDOWN SPRITELEFT SPRITELEFT ENDIF IF DIRECTION = 11 ; MOVE WSW SPRITEDOWN SPRITELEFT SPRITELEFT ENDIF IF DIRECTION = 12 ; MOVE W SPRITELEFT SPRITELEFT ENDIF IF DIRECTION = 13 ; MOVE WNW SPRITELEFT SPRITELEFT SPRITEUP ENDIF IF DIRECTION = 14 ; MOVE NW SPRITELEFT SPRITELEFT SPRITEUP SPRITEUP ENDIF IF DIRECTION = 15 ; MOVE NNW SPRITELEFT SPRITEUP SPRITEUP ENDIF ; BOUNDARY CHECKING ; =================== IF X <= LEFTEDGE ; if alien reaches the left edge LET DIRECTION = 254 ; enemy is out of bounds ENDIF IF X >= RIGHTEDGE ; if alien reaches the right edge LET DIRECTION = 254 ; enemy is out of bounds ENDIF IF Y >= BOTTOMEDGE ; if alien reaches the right edge LET DIRECTION = 254 ; enemy is out of bounds ENDIF IF DIRECTION =254 ; is enemy out of bounds? REMOVE ; remove it SUBTRACT 1 FROM S ; decrement the sprite counter SUBTRACT 1 FROM F ; decrement the alien counter ENDIF ; CHECK IF ALIEN CAN RELEASE WEAPON ; ================================= IF Y < Q ; is alien above minimum height for releasing missiles? IF W > 0 ; yes, can alien release missiles? IF X < M ; yes, is Alien to the right of player? SUBTRACT X FROM M ; yes, how far to the right of player? IF M <= I ; I or less pixels? LET AIRBORNE = 1 ; run the chance of firing routine ENDIF ADD X TO M ; reset M ELSE IF M < X ; is alien to the left of player? SUBTRACT M FROM X ; yes, how far to the left IF X < = I ; I pixels or less? LET AIRBORNE = 1; yes, run the chance of firing routine ENDIF ADD M TO X ; reset X ELSE ; enemy must be directly above player LET AIRBORNE = 1 ; run the chance of firing routine ENDIF ENDIF ENDIF ENDIF ; CHANCE OF FIRING ; ==================== IF AIRBORNE = 1 ; Chance of firing routine IF S < 9 ; are there 8 or less sprites on screen? GETRANDOM H ; yes, get a random number from 0 to the aliens missile probability # IF RND = 1 ; is it 1? LET RND = DIRECTION ; yes, store aliens direction in RND SPAWN 3 6 ; spawn a missile SPAWNED ; switch to the spawned missile LET DIRECTION = RND ; set its direction to RND ENDSPRITE ; switch back to this alien ENDIF ENDIF LET AIRBORNE = 0 ; end the chance of firing routine ENDIF ; REPETITIONS CHECK ; ====================== SUBTRACT 1 FROM SETTINGB ; decrement repetitions remaining IF SETTINGB = 0 ; has alien moved all repetitions? LET SETTINGA = 1 ; get the next direction & # of repetitions ENDIF ; MOVEMENT PATTERNS ; ======================== DATA 51 0 8 20 7 8 6 8 5 8 4 16 DATA 52 0 8 20 9 8 10 8 11 8 12 16 DATA 53 0 12 48 11 2 10 2 9 2 8 2 7 2 6 2 5 2 4 40 5 2 6 2 7 2 8 2 9 2 10 40 DATA 54 0 4 48 5 2 6 2 7 2 8 2 9 2 10 2 11 2 12 40 11 2 10 2 9 2 8 2 7 2 6 40 DATA 55 0 13 26 14 4 15 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 10 40 DATA 56 0 3 26 1 4 0 4 15 4 14 4 13 4 12 4 11 4 10 4 9 4 8 4 7 4 6 40 DATA 57 0 8 16 7 4 6 4 5 4 4 4 3 4 2 4 1 4 0 4 15 4 14 4 13 4 12 4 11 4 10 4 9 4 8 4 7 4 6 4 5 4 4 60 DATA 58 0 8 16 9 4 10 4 11 4 12 4 13 4 14 4 15 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 10 4 11 2 12 60 DATA 59 0 8 16 9 4 10 4 11 4 12 4 13 4 14 4 15 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 10 4 11 2 12 60 DATA 60 0 4 20 13 4 14 4 15 4 0 8 1 4 2 4 3 4 4 4 8 8 7 2 6 2 5 2 4 40 DATA 61 0 5 2 6 2 7 2 8 2 9 2 10 2 11 2 12 2 11 3 10 3 9 3 8 3 7 3 6 3 5 4 6 4 7 4 8 4 9 4 10 4 DATA 62 0 8 3 4 16 9 24 4 40
DATA 59 0 8 16 9 4 10 4 11 4 12 4 13 4 14 4 15 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 10 4 11 2 12 60
DATA 60 0 4 20 13 4 14 4 15 4 0 8 1 4 2 4 3 4 4 4 8 8 7 2 6 2 5 2 4 40
DATA 61 0 5 2 6 2 7 2 8 2 9 2 10 2 11 2 12 2 11 3 10 3 9 3 8 3 7 3 6 3 5 4 6 4 7 4 8 4 9 4 10 4
DATA 62 0 8 3 4 16 9 24 4 40
