A downloadable game

ORIGM

Softby Renato Murta de Rezende
renatomdr@gmail.com

To play:
use the arrow keys:

left and right to move the ship horizontally

up and down to select the color of the laser

use the space bar to shoot


list 
1 BLOAD"x.b",R:DEFINTA-Z:Y=RND(-TIME):COLOR8,1,1:SCREEN1,1,0:WIDTH28:KEYOFF:CLS:FORT=0TO5:B=200+T*8:VPOKEBASE(5)+574+(T*32),B:FORY=0TO7:VPOKEBASE(7)+B*8+Y,SGN(YMOD7)*126:NEXTY,T:FORY=0TO13:READI:SOUNDY,I:NEXT:FORY=1TO22:LOCATERND(1)*29,23:PRINT"ø":NEXT
2 FORP=0TO6:READH,V$:FORT=1TOLEN(V$)STEP2:VPOKEH,VAL("&H"+MID$(V$,T,2)):H=H+1:NEXTT,P:COLOR=RESTORE:_TURBOON:DIMA(9),S(9),D(9),F(9),G(9),H(9),J(9):R#=0:DATA0,0,0,1,0,0,31,220,0,0,0,255,50,0,8228,07020707000570067000670071,8217,213141516171E1
3 LOCATE12,11:PRINT"ORIGM":FORN=0TO1:N=ABS(STRIG(0)):NEXTN:V#=0:LOCATE0,0:PRINTV#;"        ":LOCATE20,0:PRINTR#;:FORN=19TO31:PUTSPRITEN,(0,-17),0,0:A(NMOD10)=0:NEXTN:Q=124:W=5:I=100:O=0:P=0:R=0:Z=0:VPOKE6913,Q:VPOKE6914,1:VPOKE6916,173:FORN=0TO1:TIME=0
4 N=0:E=STICK(0):Q=Q+(-(E>1ANDE<5ANDQ<222)+(E>5ANDE<9ANDQ>16))*3:VPOKE6913,Q:E$=INKEY$:A$=CHR$(30):B$=CHR$(31):W=(W+6+(E$=A$)-(E$=B$))MOD6:VPOKE6916,133+(W*8):I=(I+1)MOD(120\(P+1)):IFE$=A$ORE$=B$THENSOUND0,255:SOUND8,15:AA=1ELSEIFAA=1THENSOUND8,0:AA=0
5 IFSTRIG(0)ANDR=0THENR=1:T=Q:Y=183:U=W+2:GOTO5ELSEIFR>0THENY=Y-24:IFY<0THENR=0:PUTSPRITE19,(0,-17):PUTSPRITE18,(0,-17):SOUND8,0ELSEPUTSPRITE19,(T,Y-16),U,3:PUTSPRITE18,(T,Y),U,3:SOUND0,255-(Y+24):SOUND8,(Y+24)\13:DATA6912,AF7C010FADEC060F
6 E=PEEK(&HF3E7)AND32:BB=0:FORL=0TO9:A=A(L):S=S(L):D=D(L):F=F(L):G=G(L):H=H(L):J=J(L):BL=31-L:B=6914+BL*4:S=S+G:VS=P+1:IFI=0ANDA=0THENI=1:A=1:S=RND(1)*200+20:D=80:F=S:G=0:O=(O+1)MOD(2+P):P=P-(O=0):J=PMOD6+2:H=(P*2)+1:IFP>29THENP=30:J=RND(1)*6+2
7 IFA=1THEND=D+H:K=D/10:PUTSPRITEBL,(S,K),J,2:IFK>192THENA=0ELSEIFEANDR=1ANDABS(S-T)<8ANDABS(K-Y)<32ANDU=JTHENA=2:VPOKEB,5:SOUND13,0:SOUND10,16:LOCATE(S-16)\8,K\8:PRINTVSELSEIFS=FTHENF=RND(1)*200+20:G=SGN(F-S)ELSEELSEIFA=2THENA=0:VPOKEB,0:V#=V#+VS
8 IFEANDA=1ANDABS(S-Q)<12ANDK\8=21THENN=1ELSEIFK<64ANDZ=0ANDA=1THENZ=1:X=S*10:C=K:VV=(Q*10-X)\((175-C)\3):SOUND2,255:SOUND9,15ELSEIFEANDZ=1ANDABS(Q-(X\10))<8ANDC\8=22THENN=1ELSEIFA=1ANDK>BBTHENBB=K:DATA14344,1010382844FEFE28000000384454FE38101010101010
9 A(L)=A:S(L)=S:D(L)=D:F(L)=F:G(L)=G:H(L)=H:J(L)=J:NEXTL:SOUND2,RND(1)*255:SOUND9,(BB+16)/13:LOCATE0,1:PRINTCHR$(27)+"L":LOCATERND(1)*29,1:PRINT"ø";:IFZ=1THENX=X+VV:C=C+3:PUTSPRITE20,(X\10,C),RND(1)*13+2,4:IFC>192THENZ=0:DATA1984,0000103810000000
10 LOCATE0,0:PRINTV#;:FORL=0TO3:L=TIME:NEXTL,N:SOUND8,0:SOUND9,0:SOUND12,200:SOUND13,1:SOUND10,16:VPOKE6914,5:TIME=0:FORN=0TO300:N=TIME:NEXTN:SOUND12,50:IFV#>R#THENR#=V#:GOTO3ELSE3:DATA14366,10100000103810000000105438FE385410007E42C3C3427E0000,8198,A1A1


( Description translated by Google Translate )

Note: this game was produced in basic to run under the Xbasic interpreter

machine: MSX2 or higher

1-------------------------------------
BLOAD"x.b",R   //  loads the Xbasic interpreter (only necessary for performance, the program works without this feature, to eliminate Xbasic just delete this command and the _TURBOON command on line 2

DEFINTA-Z  //  sets all numeric variables to integer type

Y=RND(-TIME)  //   defines the Randon seed by the computer clock

COLOR8,1,1  //   sets the color red for text and black for the screen

SCREEN1,1,0  //   define graphic text mode

WIDTH28  //  defines 28 columns of text

KEYOFF  //  clears the display of the function keys

CLS  //  clean the screen

FORT=0TO5  //  matches 6 characters for laser selection interface

B=200+T*8  //  defines the character in the ASCII table

VPOKEBASE(5)+574+(T*32),B  //  prints the character at the screen position

FORY=0TO7  //  matches the 8bytes of the character graph

VPOKEBASE(7)+B*8+Y,SGN(YMOD7)*126  //  changes the character graph

NEXTY,T  //  closes the graphic layout of the laser selection interface

FORY=0TO13:READI:SOUNDY,I:NEXTY  //  configure the 3 audio channels

FORY=1TO22  //  corresponds to the initial stars of the starfield

LOCATERND(1)*29,23  //  draw position for printing on line 23

PRINT"ø"  //  prints star character

NEXTY  fecha estrelas iniciais  //  

2-------------------------------------  //  

FORP=0TO6  //  corresponds to sequences of bytes to be inserted in the VRAM

READH,V$  //   loads Vram and String start address with Hex string

FORT=1TOLEN(V$)STEP2  //   counts the length of the hex string string jumping in 2

VPOKEH,VAL("&H"+MID$(V$,T,2))  //  prints in hex the hex value identified in the string fragment at address H

H=H+1  //  update address to next byte

NEXTT,P  //  completes reading the string and starts a new sequence

COLOR=RESTORE  //  activates the rgb change of the color palette (The only justification for using MSX2 or> is the change of the palette)

_TURBOON  //   activates the Xbasic interpreter (this command only exists in the ORIGM_X.BAS version because MSXbasic does not recognize it)

DIMA(9),S(9),D(9),F(9),G(9),H(9),J(9)  //  prepares the matrix variables used in the UFOS algorithm

R#=0  //  variable for the Record

DATA0,0,0,1,0,0,31,220,0,0,0,255,50,0,8228,07020707000570067000670071,8217,213141516171E1  //  audio channel values , palette configuration and character colors

3-------------------------------------  //  

LOCATE12,11  //  position for printing the title on the screen

PRINT"ORIGM"  //  prints the game title

FORN=0TO1  //  counter N from 0 to 1

N=ABS(STRIG(0))  //   value of N is defined by the state of the keyboard fire button (Space)

NEXTN  //  keep loop until N = 1

V#=0  //  variable for the Score

LOCATE0,0  //  position to print the score

PRINTV#;"        "  //  prints score and sequence of spaces to delete the previous score

LOCATE20,0  //  record printing position

PRINTR#;  //  prints record

FORN=19TO31  //  corresponds to theUFOand shot sprite layers

PUTSPRITEN,(0,-17),0,0  //  reposition the sprites off the screen

A(NMOD10)=0  //  reset ufos states to inactive

NEXTN  //  

Q=124  //  player X position

W=5  //  selected laser

I=100  // UFOspam time

O=0 // amount ofUFOper wave

P=0 // wave counter

R=0  //  laser status

Z=0  // UFOshot status

VPOKE6913,Q  //  position the player

VPOKE6914,1  //  adjust the player sprite

VPOKE6916,173  //  position the laser selector

FORN=0TO1  //   starts gameplay loop

TIME=0  //  starts computer clock counter

4-------------------------------------  //  
N=0  //  keep gameplay loop

E=STICK(0)  //  reading the keyboard joystick status (arrows)

Q=Q+(-(E>1ANDE<5ANDQ<222)+(E>5ANDE<9ANDQ>16))*3  //  calculates player movement

VPOKE6913,Q  //  updates the position of the player

E$=INKEY$  //  keyboard reading

A$=CHR$(30)  //  character corresponding to the up arrow

B$=CHR$(31)  //  character corresponding to the down arrow

W=(W+6+(E$=A$)-(E$=B$))MOD6  //  calculates laser selection

VPOKE6916,133+(W*8)  //  updates the position of the laser selection

I=(I+1)MOD(120\(P+1))  //   ufos spam counter

IFE$=A$ORE$=B$THEN  //   checks whether the up or down keys have been pressed
 SOUND0,255  //  sets frequency on channel A
 SOUND8,15  //  sets volume on channel A
 AA=1  //  active beep status
 ELSE
 IFAA=1THEN  //   if active beep status
  SOUND8,0  //   cancels volume of channel A
  AA=0  //   beep status inactive

5-------------------------------------  //  
IFSTRIG(0)ANDR=0THEN  //  checks if keyboard shot was pressed and laser status is inactive
 R=1  //   active laser status
 T=Q  //   set laser X position
 Y=183  //  set laser Y position
 U=W+2  //  set laser color
 GOTO5  //  execute line 5 again
 ELSE
 IFR>0THEN  //   if active laser status
  Y=Y-24  //   moves the laser up
  IFY<0THEN  //   if the laser's Y position is less than 0
   R=0  //  laser status inactive
   PUTSPRITE19,(0,-17)  //  erases laser sprite1
   PUTSPRITE18,(0,-17)  //  erases laser sprite2
   SOUND8,0  //  cancels volume of channel A
   ELSE
   PUTSPRITE19,(T,Y-16),U,3  //  prints laser sprite1 
   PUTSPRITE18,(T,Y),U,3  //  prints laser sprite2
   SOUND0,255-(Y+24)  //  sets frequency on channel A
   SOUND8,(y+24)\13  //  sets volume on channel A

DATA6912,AF7C010FADEC060F,8217,213141516171E1  //  sprites attributes values ??and character colors

6-------------------------------------  //  
E=PEEK(&HF3E7)AND32  //  checks if there was a collision between sprites

BB=0  //  B channel volume regulator
   //  
FORL=0TO9  //   UFOS controller loop

A=A(L):S=S(L):D=D(L):F=F(L):G=G(L):H=H(L):J=J(L)  //  transfer of values ??from ufos matrix variables to simple variables

 // description of variables 
A: status

S: X position

D: Y position

F: position X destination

G: increment of X

H: increasing Y

J: color

BL=31-L  // UFOsprite layer calculation

B=6914+BL*4  //  calculation of the position in the VRAM of the sprite attributes

S=S+G  //  movement X (S) ofUFOby increment G

VS=P+1  // UFOScore Value

IFI=0ANDA=0THEN  //   checks if the spawn time and if theUFOis inactive if yes, starts an ufo
 I=1  //  increment spawn counter to not create more than one ufo
 A=1  //  activeUFOstatus
 S=RND(1)*200+20  //  set random X position
 D=80  //  define Y position
 F=S  //  equals target X position with current X position
 G=0  //  neutralizes the increment of movement in X
 O=(O+1)MOD(2+P)  // UFOquantity counter per wave
 P=P-(O=0)  //  wave counter
 J=PMOD6+2  //  define the color of theUFOby the wave
 H=(P*2)+1  //  sets theUFOY movement increment (2 can regulate game difficulty)
 IFP>29THEN  //  define the final wave
  P=30  //  keeps the final wave eternal
  J=RND(1)*6+2  //   makes eachUFOof the final wave a different color

7-------------------------------------  //  
IFA=1THEN  //  checksUFOactive status
 D=D+H  // UFOY movement
 K=D/10  // UFOu position on the screen
 PUTSPRITEBL,(S,K),J,2  //  printsUFOsprite
 IFK>192THEN  //   checks if theUFOcame out from under the screen
  A=0  //  disablesUFOstatus
  ELSE
 IFEANDR=1ANDABS(S-T)<8ANDABS(K-Y)<32ANDU=JTHEN verifica se houve colisão de sprite, status ativo do laser, e se oUFOestá dentro da área de colisão com o laser  //  
  A=2  //  explodingUFOstatus
  VPOKEB,5  //   explodingUFOsprite
  SOUND13,0  //  sets sound effect envelope
  SOUND10,16  //  triggers sound effect on channel C (set for noise on line1)
  LOCATE(S-16)\8,K\8  //  calculates position on the screen to print theUFOScore value
  PRINTVS  //  printsUFOScore value
  ELSE
 IFS=FTHEN  //   checks whether the current X position of theUFOis equal to the target X position
  F=RND(1)*200+20  //  draw new position X destination
  G=SGN(F-S)  //  calculates the increment for movement in X
  ELSE
 ELSE
 IFA=2THEN  //  checkUFOstatus in explosion
 A=0  // UFOstatus inactive
 VPOKEB,0  // UFOsprite graphic is erased
 V#=V#+VS  //  score is added to theUFOscore value
   //  

8-------------------------------------  //  
IFEANDA=1ANDABS(S-Q)<12ANDK\8=21THEN  //  checks if there was a sprite collision,UFOactive status, and if theUFOis within the collision area with the player
 N=1  //  ends the gameplay loop
 ELSE
IFK<64ANDZ=0ANDA=1THEN  //  checksUFOY position on top of third of screen,UFOshot off status,UFOactive status
 Z=1  //  activeUFOshooting status
 X=S*10  //  sets X position of theUFOshot
 C=K  //  sets Y position of the shot
 VV=(Q*10-X)\((175-C)\3)  //  calculates X increment to move theUFOshot
 SOUND2,255  //  sets frequency on channel B
 SOUND9,15  //  sets volume on channel B
 ELSE
IFEANDZ=1ANDABS(Q-(X\10))<8ANDC\8=22THEN  //  checks if there was a sprite collision, activeUFOshot status, and if theUFOshot is within the collision area with the player
 N=1  //  ends the gameplay loop
 ELSE
IFA=1ANDK>BBTHEN  //  checks ufo's active status and whether ufo's Y position is greater than channel B's volume regulator
 BB=K  //  volume regulator of channel B equalsUFOposition Y

DATA14344,1010382844FEFE28000000384454FE38101010101010  //  graphic values ??of the sprites
   //  

9-------------------------------------  //  
A(L)=A:S(L)=S:D(L)=D:F(L)=F:G(L)=G:H(L)=H:J(L)=J  //  transfer of values ??from simple variables to variables in the ufos matrix

NEXTL  //  ends UFOS controller loop

SOUND2,RND(1)*255  //  sets random frequency on channel B

SOUND9,(BB+16)\13  //  sets volume on channel B

LOCATE0,1  //  sets print position on line 1

PRINTCHR$(27)+"L"  //  insert line in line1

LOCATERND(1)*29,1  //  sets random column printing on row1

PRINT"ø";  //  prints star character

IFZ=1THEN  //   checks activeUFOshooting status
 X=X+VV  //  updates X move fromUFOshot
 C=C+3  //  updates Y move fromUFOshot
 PUTSPRITE20,(X\10,C),RND(1)*13+2,4  //  printsUFOshot sprite with random color
 IFC>192THEN  //   checks if theUFOshot went under the screen
  Z=0  // UFOshot inactive status

DATA1984,0000103810000000  //   star character chart values

10------------------------------------  //  

LOCATE0,0  //  sets print position on the screen

PRINTV#;  //  print score

FORL=0TO3  //  loop to adjust the framerate

L=TIME  //  framerate adjustment

NEXTL,N  //  ends the framerate and gameplay loops

SOUND8,0  //  mutes channel A

SOUND9,0  //  mutes channel B

SOUND12,200  //  increases the duration of the audio effect

SOUND13,1  //  sets the audio effect

SOUND10,16  //  triggers the audio effect on channel C

VPOKE6914,5  //  changes the player's graphic to explosion

TIME=0  //  reset computer clock count

FORN=0TO300  //  10 second pause loop

N=TIME  //  waiting 10 seconds

NEXTN  //  end loop pause

SOUND12,50  //  returns the duration of the audio effect to the normal game

IFV#>R#THEN  //   checks if Score was higher than Record
 R#=V#  //  Record equals Score
 GOTO3  //   go to line 3
 ELSE3  //   go to line 3

DATA14366,10100000103810000000105438FE385410007E42C3C3427E0000,8198,A1A1  //  graphic values ??of sprites and yellow color for number characters

( Descrição original em Português )

Nota: este jogo foi produzido em basic para rodar sob o interpretador Xbasic
maquina: MSX2 ou superior

para jogar
use as setas do teclado: 
esquerda e direita para mover a nave na horizontal
cima em abaixo para selecionar a cor do laser
use a barra de espaço para atirar

1-------------------------------------
BLOAD"x.b",R   //  carrega o interpretador Xbasic (só necessário para performance, o programa funciona sem esse recurso, para eliminar o Xbasic basta deletar esse comando e o comando _TURBOON na linha 2

DEFINTA-Z  //  define todas as variáveis numéricas para tipo inteiro

Y=RND(-TIME)  //   define a semente do Randon pelo clock do computador

COLOR8,1,1  //   define a cor vermelha para texto e preto para a tela

SCREEN1,1,0  //   define modo de texto gráfico

WIDTH28  //  define 28 colunas de texto

KEYOFF  //  apaga o mostrador das teclas de função

CLS  //  apaga a tela

FORT=0TO5  //  corresponde aos 6 caracteres para interface de seleção do laser

B=200+T*8  //  define o caractere na tabela ASCII 

VPOKEBASE(5)+574+(T*32),B  //  imprime o caractere na posição da tela

FORY=0TO7  //  corresponde aos 8bytes do gráfico do caractere

VPOKEBASE(7)+B*8+Y,SGN(YMOD7)*126  //  altera o gráfico do caractere

NEXTY,T  //  encerra o layout gráfico da interface de seleção do laser

FORY=0TO13:READI:SOUNDY,I:NEXTY  //  configura os 3 canais de áudio

FORY=1TO22  //  corresponde às estrelas iniciais do starfield 

LOCATERND(1)*29,23  //  sorteia posição para impressão na linha 23

PRINT"ø"  //  imprime caractere de estrela

NEXTY  fecha estrelas iniciais  //  

2-------------------------------------  //  

FORP=0TO6  //  corresponde a sequencias de bytes a serem inseridos na VRAM

READH,V$  //   carrega endereço inicial da Vram e String com sequência de Hexa

FORT=1TOLEN(V$)STEP2  //   conta o comprimento da string de sequência de hexa pulando em 2 

VPOKEH,VAL("&H"+MID$(V$,T,2))  //  imprime na vram o valor hexa identificado no fragmento da string no endereço H

H=H+1  //  atualiza endereço para próximo byte

NEXTT,P  //  completa a leitura da string e inicia nova sequencia

COLOR=RESTORE  //  ativa a mudança de rgb da paleta de cores (A única justificativa pra usar o MSX2 ou > é a alteração da paleta)

_TURBOON  //   ativa o interpretador Xbasic (este comando só existe na versão ORIGM_X.BAS pois o MSXbasic não o reconhece)

DIMA(9),S(9),D(9),F(9),G(9),H(9),J(9)  //  prepara as variáveis de matriz utilizadas no algoritmo dos UFOS

R#=0  //  variável para o Recorde

DATA0,0,0,1,0,0,31,220,0,0,0,255,50,0,8228,07020707000570067000670071,8217,213141516171E1  //  valores dos canais de áudio, configuração da paleta e cores dos caracteres

3-------------------------------------  //  

LOCATE12,11  //  posição para impressão do título na tela

PRINT"ORIGM"  //  imprime o título do jogo

FORN=0TO1  //  contador N de 0 a 1

N=ABS(STRIG(0))  //   valor de N é definido pelo estado do botão de tiro do teclado (Space)

NEXTN  //  mantem o loop até N=1

V#=0  //  variável para o Score

LOCATE0,0  //  posição para impressão do score

PRINTV#;"        "  //  imprime score e sequencia de espaços para apagar o score anterior

LOCATE20,0  //  posição para impressão do recorde

PRINTR#;  //  imprime recorde

FORN=19TO31  //  corresponde às camadas de sprites dos ufos e tiros

PUTSPRITEN,(0,-17),0,0  //  reposiciona os sprites para fora da tela

A(NMOD10)=0  //  zera os estados dos ufos para inativos

NEXTN  //  

Q=124  //  posição X do player

W=5  //  laser selecionado

I=100  //  tempo de spam do ufo

O=0  //  quantidade deUFOpor onda

P=0  // contador de ondas 

R=0  //  status do laser

Z=0  //  status do tiro do ufo

VPOKE6913,Q  //  posiciona o player

VPOKE6914,1  //  ajusta o sprite do player

VPOKE6916,173  //  posiciona o seletor do laser

FORN=0TO1  //   inicia loop do gameplay

TIME=0  //  inicia contador do clock do computador

4-------------------------------------  //  
N=0  //  mantem loop do gameplay

E=STICK(0)  //  leitura do estado do joystick do teclado (setas)

Q=Q+(-(E>1ANDE<5ANDQ<222)+(E>5ANDE<9ANDQ>16))*3  //  calcula movimento do player

VPOKE6913,Q  //  atualiza a posição do player

E$=INKEY$  //  leitura do teclado

A$=CHR$(30)  //  caractere correspondente à seta pra cima

B$=CHR$(31)  //  caractere correspondente à seta pra baixo

W=(W+6+(E$=A$)-(E$=B$))MOD6  //  calcula seleção de laser

VPOKE6916,133+(W*8)  //  atualiza a posição da seleção do laser

I=(I+1)MOD(120\(P+1))  //   contador de spam dos ufos

IFE$=A$ORE$=B$THEN  //   verifica se as teclas cima ou baixo foram pressionadas 
 SOUND0,255  //  define frequência no canal A
 SOUND8,15  //  define volume no canal A
 AA=1  //  status de beep ativo
 ELSE
 IFAA=1THEN  //   se status de beep ativo
  SOUND8,0  //   cancela volume do canal A
  AA=0  //   status de beep inativo

5-------------------------------------  //  
IFSTRIG(0)ANDR=0THEN  //  verifica se tiro do teclado foi pressionado e status do laser é inativo
 R=1  //   status do laser ativo 
 T=Q  //   define posição X do laser
 Y=183  //  define posição Y do laser
 U=W+2  //  define cor do laser
 GOTO5  //  volta a executar a linha 5
 ELSE
 IFR>0THEN  //   se status do laser ativo
  Y=Y-24  //   movimenta o laser para cima
  IFY<0THEN  //   se posição Y do laser for menor que 0 
   R=0  //  status do laser desativo
   PUTSPRITE19,(0,-17)  //  apaga sprite1 do laser
   PUTSPRITE18,(0,-17)  //  apaga sprite2 do laser
   SOUND8,0  //  cancela volume do canal A
   ELSE
   PUTSPRITE19,(T,Y-16),U,3  //  imprime sprite1 to laser
   PUTSPRITE18,(T,Y),U,3  //  imprime sprite2 to laser
   SOUND0,255-(Y+24)  //  define frequência no canal A
   SOUND8,(y+24)\13  //  define volume no canal A

DATA6912,AF7C010FADEC060F  //  valores atributos dos sprites 

6-------------------------------------  //  
E=PEEK(&HF3E7)AND32  //  verifica se houve colisão entre sprites

BB=0  //  regulador de volume do canal B
   //  
FORL=0TO9  //   loop controlador dos UFOS

A=A(L):S=S(L):D=D(L):F=F(L):G=G(L):H=H(L):J=J(L)  //  transferência de valores das variáveis de matriz dos ufos para variáveis simples

 // descrição das variáveis  //  
A,status  //  
S,posição X  //  
D,posição Y  //  
F,posição X destino  //  
G,incremento de X  //  
H,incremendo de Y  //  
J,cor  //  

BL=31-L  //  cálculo do layer do sprite do ufo

B=6914+BL*4  //  cálculo da posição na VRAM dos atributos do sprite

S=S+G  //  movimento X (S) doUFOpelo incremento G

VS=P+1  //  Valor de Score do UFO

IFI=0ANDA=0THEN  //   verifica se o tempo de spawn e se oUFOestá inativo caso sim, inicia um ufo
 I=1  //  incrementa contador de spawn para não criar mais de umUFO
 A=1  //  status doUFOativo
 S=RND(1)*200+20  //  define posição X aleatória
 D=80  //  define posição Y
 F=S  //  iguala posição X destino com posição X atual
 G=0  //  neutraliza o incremento de movimentação em X
 O=(O+1)MOD(2+P)  //  contador de quantidade deUFOpor onda
 P=P-(O=0)  //  contador de ondas
 J=PMOD6+2  //  define a cor doUFOpela onda
 H=(P*2)+1  //  define o incremento de movimento Y doUFO(o 2 pode regular dificuldade do jogo)
 IFP>29THEN  //  define a onda final 
  P=30  //  mantem a onda final eterna
  J=RND(1)*6+2  //   faz cadaUFOda onda final com uma cor diferente 

7-------------------------------------  //  
IFA=1THEN  //  verifica status ativo do ufo
 D=D+H  //  movimento Y do ufo
 K=D/10  //  posição Y doUFOna tela
 PUTSPRITEBL,(S,K),J,2  //  imprime sprite do ufo
 IFK>192THEN  //   verifica se oUFOsaiu por baixo da tela
  A=0  //  desativa o status doUFO
  ELSE
 IFEANDR=1ANDABS(S-T)<8ANDABS(K-Y)<32ANDU=JTHEN verifica se houve colisão de sprite, status ativo do laser, e se oUFOestá dentro da área de colisão com o laser  //  
  A=2  //  status doUFOem explosão 
  VPOKEB,5  //   sprite doUFOem explosão
  SOUND13,0  //  define envelope de efeito sonoro
  SOUND10,16  //  dispara efeito sonoro no canal C (definido para ruídos na linha1)
  LOCATE(S-16)\8,K\8  //  calcula posição na tela para impressão do valor de Score do UFO
  PRINTVS  //  imprime valor de Score do UFO
  ELSE
 IFS=FTHEN  //   verifica se a posição X atual doUFOé igual à posição X destino
  F=RND(1)*200+20  //  sorteia nova posição X destino
  G=SGN(F-S)  //  calcula o incremento para movimento em X 
  ELSE
 ELSE
 IFA=2THEN  //  verifica status doUFOem explosão
 A=0  //  status doUFOinativo
 VPOKEB,0  //  gráfico do sprite doUFOé apagado 
 V#=V#+VS  //  score é somado pelo valor de Score do UFO
   //  

8-------------------------------------  //  
IFEANDA=1ANDABS(S-Q)<12ANDK\8=21THEN  //  verifica se houve colisão de sprite, status ativo do ufo, e se oUFOestá dentro da área de colisão com o player
 N=1  //  encerra o loop gameplay
 ELSE
IFK<64ANDZ=0ANDA=1THEN  //  verifica posição Y doUFOem um terço de cima da tela, status desativado do tiro do ufo, status ativo do ufo
 Z=1  //  status do tiro doUFOativo
 X=S*10  //  define posição X do tiro do ufo
 C=K  //  define posição Y do tiro
 VV=(Q*10-X)\((175-C)\3)  //  calcula incremento de X para movimentar o tiro do ufo
 SOUND2,255  //  define frequencia no canal B
 SOUND9,15  //  define volume no canal B
 ELSE
IFEANDZ=1ANDABS(Q-(X\10))<8ANDC\8=22THEN  //  verifica se houve colisão de sprite, status ativo do tiro do ufo, e se o tiro doUFOestá dentro da área de colisão com o player
 N=1  //  encerra o loop gameplay
 ELSE
IFA=1ANDK>BBTHEN  //  verifica status ativo doUFOe se posição Y doUFOé maior que o regulador de volume do canal B  
 BB=K  //  regulador de volume do canal B se iguala à posição Y do ufo

DATA14344,1010382844FEFE28000000384454FE38101010101010  //  valores gráficos dos sprites
   //  

9-------------------------------------  //  
A(L)=A:S(L)=S:D(L)=D:F(L)=F:G(L)=G:H(L)=H:J(L)=J  //  transferência dos valores de variáveis simples para variáveis na matriz dos ufos

NEXTL  //  encerra loop controlador dos UFOS

SOUND2,RND(1)*255  //  define frequência aleatória no canal B

SOUND9,(BB+16)\13  //  define volume no canal B

LOCATE0,1  //  define posição de impressão na linha 1

PRINTCHR$(27)+"L"  //  insere linha na linha1

LOCATERND(1)*29,1  //  define impressão em coluna aleatória na linha1

PRINT"ø";  //  imprime caractere de estrela

IFZ=1THEN  //   verifica status ativo do tiro do ufo
 X=X+VV  //  atualiza movimento X do tiro do ufo
 C=C+3  //  atualiza movimento Y do tiro do ufo
 PUTSPRITE20,(X\10,C),RND(1)*13+2,4  //  imprime sprite do tiro doUFOcom cor aleatória
 IFC>192THEN  //   verifica se o tiro doUFOsaiu por baixo da tela
  Z=0  //  status inativo do tiro doUFO

DATA1984,0000103810000000  //   valores do gráfico do caractere estrela

10------------------------------------  //  

LOCATE0,0  //  define posição de impressão na tela

PRINTV#;  //  imprime score

FORL=0TO3  //  loop para regular o framerate

L=TIME  //  regulagem de framerate

NEXTL,N  //  encerra os loops de framerate e gameplay

SOUND8,0  //  silencia o canal A

SOUND9,0  //  silencia o canal B

SOUND12,200  //  aumenta a duração do efeito de áudio

SOUND13,1  //  define o efeito de áudio

SOUND10,16  //  dispara o efeito de áudio no canal C

VPOKE6914,5  //  altera o gráfico do player para explosão

TIME=0  //  zera contagem do clock do computador

FORN=0TO300  //  loop pausa de 10 segundos

N=TIME  //  esperando 10 segundos

NEXTN  //  encerra loop pausa

SOUND12,50  //  volta a duração do efeito de áudio para o normal do jogo

IFV#>R#THEN  //   verifica se Score foi maior que Recorde
 R#=V#  //  Recorde iguala a Score
 GOTO3  //   vai para a linha 3
 ELSE3  //   vai para a linha 3

DATA14366,10100000103810000000105438FE385410007E42C3C3427E0000,8198,A1A1  //  valores gráficos de sprites e cor amarela para os caracteres de números


Download

Download
ORIGM.dsk 720 kB
Download
ORIGM_.TXT 25 kB

Leave a comment

Log in with itch.io to leave a comment.