Minilop Retroware

MPAGD SHMUPKIT

Evento de enemigo - Shmupkit

2 de agosto de 2022

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

Todo sobre MPAGD SHMUPKIT