Minilop Retroware

MPAGD SHMUPKIT

Evento de inimigo - Shmupkit

2 de agosto de 2022

Os alienígenas seguem um padrão de movimento que é uma combinação de movimentos direcionais, Direção 0-15, cada uma representando um ponto de uma bússola de 16 pontos, e um número de repetições.

Os padrões são guardados numa tabela DATA no fim do evento. Cada linha da tabela de dados representa um padrão próprio do nível a que o jogador chegou.

No jogo de demonstração, os alienígenas de uma vaga de ataque são removidos quando o jogador lhes dispara ou quando saem do ecrã, mas podes alterá-lo facilmente para outros estilos de jogo.

O número de alienígenas de uma vaga de ataque e outros parâmetros são definidos em separado no evento Spawner.

Está incluído um sprite de alienígena predefinido na imagem de sprite 2; tem 16 fotogramas, cada um correspondente a um valor de direção, o que facilita garantir que é mostrado o fotograma correto consoante a direção de deslocação atual do alienígena.

Os alienígenas também podem disparar mísseis ao jogador. Como e quando o fazem é totalmente personalizável e baseia-se nas definições feitas no evento Spawner para cada vaga de ataque específica, por isso podes definir a que altura do ecrã têm de estar antes de disparar, a sua probabilidade de disparo e a que distância à esquerda e à direita do jogador é permitido um possível lançamento de míssil.

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

Tudo sobre MPAGD SHMUPKIT