Gem Drop - Source Code

GEMINTRO.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

This is the splash intro that loads first when you boot up the Gem Drop disk.

; GEMINTRO.ACT

; Gem Drop Intro
; by Bill Kendrick
; kendrick@zippy.sonoma.edu
; http://zippy.sonoma.edu/kendrick/

; Sept. 24, 1997

INCLUDE "GEMRT.ACT"


Byte Array Buf(19200)
Byte TIMER=20


PROC CIO=$E456(BYTE areg,xreg)

CARD FUNC Burst(BYTE chan,mode,
                CARD addr,buflen)

  TYPE IOCB=[BYTE id,num,cmd,stat
             CARD badr,padr,blen
             BYTE a1,a2,a3,a4,a5,a6]

  IOCB POINTER iptr

  chan==&$07
  iptr=$340+(chan LSH 4)
  iptr.cmd=mode
  iptr.blen=buflen
  iptr.badr=addr
  CIO(0,chan LSH 4)
RETURN(iptr.blen)

CARD FUNC BGet(BYTE chan CARD addr,len)

  CARD temp

  temp=Burst(chan,7,addr,len)
RETURN (temp)



Proc Load(Byte Which)
  Char Array File(20)

  SCopy(File,"D:x.GR7")
  File(3)=Which+'A

  Close(1)
  Open(1,File,4,0)
  BGet(1,Buf+Which*3840,3840)
  Close(1)

  TIMER=0
  Do Until TIMER>=20 Od
Return

Proc Display()
  Card SC=88
  Byte I

  Graphics(23)
  Poke(708,4)
  Poke(709,8)
  Poke(710,14)

  For I=0 To 4 Do
    MoveBlock(SC,Buf+I*3840,3840)
    TIMER=0
    Do 
    Until TIMER>=10 Od
  Od

  For I=0 To 15 Do
    Sound(0,I*5,0,I/2)
  Od


  For I=0 To 60 Do
    Sound(0,200,0,15-I/4)
    TIMER=0
    Do Until TIMER>=2 Od
  Od
Return

Proc Setup()
  Graphics(0)
  PokeC(82,9984)
  PokeC(709,0)
  Poke(65,0)
  Poke(752,1)
  Put('↰)
Return

Proc Write(Char Array Text)
  byte I

  For I=0 To 150 Do
    Poke(709,15-I/10)
  Od
  Put('↰)
  Position(20-Text(0)/2,12)
  PrintE(Text)
  For I=0 To 150 Do
    Poke(709,I/10)
  Od
Return

Proc Main()
  Byte KEY=764

  Setup()

  Write("New Breed Software")
  Load(0)

  Write("proudly presents")
  Load(1)

  Write("a challenging new puzzle game")
  Load(2)

  Write("")
  Load(3)

  Write("Gem Drop")
  Load(4)

  Display()

  TIMER=0
  KEY=255
  Do
  Until KEY<255 OR TIMER>=250 OD
  KEY=255
Return

GEMINC.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

The first half of the game code. (Too large to fit in the Action! editor and compile it all!)

; GEMINC.ACT

; Gem Drop
; by Bill Kendrick
; kendrick@zippy.sonoma.edu
; http://zippy.sonoma.edu/kendrick/

; August 17, 1997 - Sept. 24, 1997


DEFINE NO="0"
DEFINE YES="1"
DEFINE ATARI="0"
DEFINE SEGA="1"
DEFINE BOMB="5"
DEFINE WILDCARD="6"
DEFINE CLOCK="7"
DEFINE SCORE="0"
DEFINE EXPLOSION="1"

Byte Array Blocks(110),MemBuf(4096),
   KillsX(100),KillsY(100),ExY(4)
Card Array ScrVals(15)
Byte KEY=764,CONSOL=53279,
   STICK0=632,STRIG0=644,
   COLPF4=712,PADDL0=624,RTCLOCK=20,
   AUDF0=53760,AUDC0=53761
Byte Level,Controller,Gameover,Frozen,
   Carrying,HowMany,LevelDone,
   FLIP,CHAddr,CIO_status,NumKills,
   WhichPM,ExAnim0,ExAnim1,ExAnim2,
   ExAnim3,TOGL,KillScore,Lines,
   Max_Level,FirstRound,LinesNeeded,
   Happy,ScrH,HiScrH
Card SC=88
Card OLDVEC,CH,PMG,DL,Scr,HiScr


Char Func CIO=*(Byte dev, Card addr, size, Byte cmd, aux1, aux2)
[$29$F$85$A0$86$A1$A$A$A$A$AA$A5$A5
$9D$342$A5$A3$9D$348$A5$A4$9D$349
$A5$A6$F0$8$9D$34A$A5$A7$9D$34B$98
$9D$345$A5$A1$9D$344$20$E456
$8C CIO_status $C0$88$D0$6$98$A4$A0
$99 EOF $A085$60]

Card Func ReadBlock=*(Byte dev, Card addr, size)
[$48$A9$7$85$A5$A9$0$85$A6$A5$A3$5$A4
$D0$6$85$A0$85$A1$68$60$68$20 CIO
$BD$348$85$A0$BD$349$85$A1$60]


Proc Quiet()
 Sound(0,0,0,0)
 Sound(1,0,0,0)
 Sound(2,0,0,0)
 Sound(3,0,0,0)
Return


Proc Setup()
 Int I
 Byte C

 CH=(MemBuf/1024)+1 
 CH=CH*1024
 CHAddr=CH/256

 Level=1
 Controller=0
 If PADDL0=1 Then
  Controller=1
 Fi
 Poke(53775,3)
 Poke(53768,0)
 Quiet()

 Close(1)

 Open(1,"D:GEMDROP1.FNT",4,0)
 ReadBlock(1,CH,1024)
 Close(1)

 Open(1,"D:GEMDROP2.FNT",4,0)
 ReadBlock(1,CH+1024,1024)
 Close(1)

 PMG=CH+2048
 Zero(PMG,1024)
 Poke(53277,3)
 Zero(53248,13)
 Poke(54279,PMG/256) 
 PokeC(704,0)
 PokeC(706,0)

 For I=0 To 3 Do
  ExY(I)=0
 Od

 TOGL=0

 Close(1)
 Open(1,"D:GEMDROP.DAT",4,0)
 Max_Level=InputBD(1)
 HiScr=InputCD(1)
 HiScrH=InputBD(1)
 Close(1)

 ScrVals(0)=0
 ScrVals(1)=0
 ScrVals(2)=0 
 ScrVals(3)=1
 ScrVals(4)=2
 ScrVals(5)=5
 ScrVals(6)=10
 ScrVals(7)=15
 ScrVals(8)=20
 ScrVals(9)=25
 ScrVals(10)=30
 ScrVals(11)=50
 ScrVals(12)=100
 ScrVals(13)=100
 ScrVals(14)=100
Return


Proc VBLANKD()
 Byte Pointer Q
 Byte I,CHBAS=756,
    PMCOLR0=704,PMCOLR1=705,
    PMCOLR2=706,PMCOLR3=707,
    PMX0=53248,PMX1=53249,
    PMX2=53250,PMX3=53251

 FLIP=4-FLIP
 CHBAS=CHAddr+FLIP 

 TOGL=TOGL+1
 If TOGL=4 Then
  TOGL=0
  If ExAnim0>0 Then
   PMCOLR0=ExAnim0
   ExAnim0=ExAnim0-1
  Else
   PMX0=0
  Fi   

  If ExAnim1>0 Then
   PMCOLR1=ExAnim1
   ExAnim1=ExAnim1-1
  Else
   PMX1=0
  Fi   

  If ExAnim2>0 Then
   PMCOLR2=ExAnim2
   ExAnim2=ExAnim2-1
  Else
   PMX2=0
  Fi   

  If ExAnim3>0 Then
   PMCOLR3=ExAnim3
   ExAnim3=ExAnim3-1
  Else
   PMX3=0
  Fi   
 Fi   
[$6C OLDVEC]


Proc SETVBV(Byte Which,Card Addr)
 Card Pointer Temp
 Byte V

 Temp=$216+(Which LSH 1)
 V=RTCLOCK+1
 While V<>RTCLOCK Do oD
 Temp^=Addr

 FLIP=0
Return


Proc DrawScr(Card Addr, Card Scr, Byte ScrH)
 Byte V,I,J
 Card Z,SS

 SS=ScrH
 Z=10

 For I=0 To 1 Do
  V=SS/Z
  Poke(Addr+I,96+V)

  For J=1 To V Do
   SS=SS-Z
  Od

  Z=Z/10
 Od

 SS=Scr
 Z=1000

 For I=0 To 3 Do
  V=SS/Z
  Poke(Addr+I+2,96+V)

  For J=1 To V Do
   SS=SS-Z
  Od

  Z=Z/10
 Od
Return


Proc Draw2Digits(Card Addr, Byte Num)
 Byte Z,N
 Int I

 Z=10 
 N=Num

 For I=0 To 1 Do
  Poke(Addr+I,(N/Z)+96)
  N=N-((N/Z)*Z)
  Z=Z/10
 Od
Return


Byte Func RandBlock()
 Byte I

 If Level<15 Then
  I=Rand(4)+1
 Else
  I=Rand(4)+1
  If Rand(20)<10 Then
   I=Rand(4)+8
  Fi
 Fi

 If Rand(40)<1 Then
  I=4+Rand(4)
 Fi
Return(I)


Proc Pause()
 Int Z

 For Z=0 To 5 Do
 Od
Return


Proc DrawGameScreen()
 Byte A,CHBAS=756
 Card VVBLKD=$224

 Graphics(0) 
 Poke(559,46)
 DL=PeekC(560)+4
 For A=2 To 24 Do
  Poke(DL+A,4)
 Od
 Poke(DL-1,68)

 CHBAS=CHAddr

 Poke(708,74)
 Poke(709,206)
 Poke(710,138)
 Poke(711,30)

 OLDVEC=VVBLKD
 SETVBV(7,VBLANKD)

 MoveBlock(SC+2,"QRSTU"+1,5)
 SetBlock(SC+41,7,'♦)

 MoveBlock(SC+31,"VWXVQRSTU"+1,9)
 SetBlock(SC+72,7,'♦)
 DrawScr(SC+72,HiScr,HiScrH)

 MoveBlock(SC+122,"YW[UQ"+1,5)

 MoveBlock(SC+153,"YUZUY"+1,5)
Return


Proc DrawBlock(Byte X, Y)
 Card Loc,V
 Byte C

 Loc=SC+Y*80+10+(X LSH 1)
 C=Blocks(Y*10+X)

 If C=0 Then
  PokeC(Loc,0)
  PokeC(Loc+40,0)
 Else
  V=(C LSH 2)-2
  V=V+((C LSH 2)-1)*256
  PokeC(Loc,V)

  V=C LSH 2
  V=V+((C LSH 2)+1)*256
  PokeC(Loc+40,V)
 Fi
Return


Byte Func Title()
 Byte Quit,Ok,CHBAS=756,HIGH,LOW
 Card SC=88

 Graphics(18)
 CHBAS=ChAddr+6
 MoveBlock(SC+6,"AB┛♥┫EF╲"+1,8)
 MoveBlock(SC+87,"HIJ♥◀▶"+1,6)
 MoveBlock(SC+127,"KLM"+1,3)
 Poke(SC+132,'O-Controller)
 HIGH=Level/10
 LOW=Level-HIGH*10
 MoveBlock(CH+2032,CH+1408+(HIGH LSH 3),8)
 MoveBlock(CH+2040,CH+1408+(LOW LSH 3),8)


 Quit=NO
 Ok=NO

 KEY=255
 Do Until CONSOL=7 And STRIG0=1 Od

 Do
  If KEY=28 Then
   Ok=YES
   Quit=YES
  Fi
  If CONSOL=5 Then 
   Level=Level+1
   If Level>Max_Level Then Level=1 Fi
   HIGH=Level/10
   LOW=Level-HIGH*10
   MoveBlock(CH+2032,CH+1408+(HIGH LSH 3),8)
   MoveBlock(CH+2040,CH+1408+(LOW LSH 3),8)
   RTCLOCK=0
   Do Until CONSOL=7 Or RTCLOCK=20 Od
  ElseIf CONSOL=3 Then 
   Controller=1-Controller
   Poke(SC+132,'O-Controller)
   Do Until CONSOL=7 Or RTCLOCK=20 Od
  ElseIf CONSOL=6 Or STRIG0=0 Then
   Ok=YES
  Fi
 Until Ok=YES Od

 KEY=255
 Do Until CONSOL=7 And STRIG0=1 Od
Return(Quit)


Proc InitLevel()
 Byte X,Y,YY

 For Y=0 To 10 Do
  For X=0 To 9 Do
   Blocks(Y*10+X)=0
  Od
 Od

 YY=Level
 If Level>14 Then
  YY=YY-9
 Fi
 If YY>9 Then YY=9 Fi
 For Y=0 To YY Do
  For X=0 To 9 Do
   Blocks(Y*10+X)=RandBlock()
  Od
 Od

 For Y=0 To 10 Do
  For X=0 To 9 Do
   DrawBlock(X,Y)
  Od
 Od

 LevelDone=NO

 Carrying=0
 HowMany=0
 Frozen=0
 FirstRound=0
 If YY<6 Then
  Happy=YES
 Else
  Happy=NO
 Fi

 WhichPM=0
 Zero(53248,4)

 Lines=0
 LinesNeeded=(Level*3)+2

 Draw2Digits(SC+164,Lines)
 Draw2Digits(SC+204,LinesNeeded)
 Draw2Digits(SC+195,Level)
Return


Proc EraseYou(Byte X)
 Zero(SC+888+(X LSH 1),6)
 Zero(SC+928+(X LSH 1),6)
Return


Proc DrawYou(Byte X)
 Card Loc,V1,V2

 Loc=SC+890+(X LSH 1)

 If HowMany<3 Then
  If Happy=YES Then
   PokeC(Loc,27498) ; 106,107
   PokeC(Loc+40,28012) ; 108,109
  Else
   PokeC(Loc,30582) ; 118,119
   PokeC(Loc+40,31096) ; 120,121
  Fi
 Fi

 If Carrying<>0 Then
  V1=(Carrying LSH 2)-2
  V1=V1+((Carrying LSH 2)-1)*256

  V2=Carrying*4
  V2=V2+((Carrying LSH 2)+1)*256

  PokeC(Loc+2,V1)
  PokeC(Loc+42,V2)

  If HowMany>=2 Then    
   PokeC(Loc-2,V1)
   PokeC(Loc+38,V2)

   If HowMany>=3 Then
    PokeC(Loc,V1)
    PokeC(Loc+40,V2)
   Fi
  Fi
 Fi
Return


Proc AddKill(Byte X,Y)
 KillsX(NumKills)=X
 KillsY(NumKills)=Y

 NumKills=NumKills+1
 If NumKills>=100 Then
  NumKills=99
 Fi

 KillScore=KillScore+1
 If KillScore>13 Then
  KillScore=13
 Fi
Return


Proc ExplodeBlock(Byte X,Y,Typ)
 WhichPM=WhichPM+1
 If WhichPM=4 Then WhichPM=0 Fi
 Zero(PMG+512+WhichPM*128+ExY(WhichPM),8)
 Poke(53248+WhichPM,48+(X+5) LSH 3)
 If WhichPM=0 Then
  ExAnim0=15
 ElseIf WhichPM=1 Then
  ExAnim1=15
 ElseIf WhichPM=2 Then
  ExAnim2=15
 ElseIf WhichPM=3 Then
  ExAnim3=15
 Fi
 ExY(WhichPM)=16+(Y LSH 3)

 If Typ<>EXPLOSION Then
  MoveBlock(PMG+512+WhichPM*128+ExY(WhichPM),CH+504+(KillScore LSH 3),8)
 Else
  MoveBlock(PMG+512+WhichPM*128+ExY(WhichPM),CH+616,8)
 Fi
Return


Byte Func Same(Byte A,B)
 Byte Match

 Match=NO
 If A=B Or (A>4 And A<8) Or B=WILDCARD Then
  Match=YES
 Fi
Return(Match)


Proc KillBlock(Byte X,Y)
 Byte B,C

 C=Blocks(Y*10+X)

 If C<>0 Then
  Blocks(Y*10+X)=0
  DrawBlock(X,Y)
  ExplodeBlock(X,Y,SCORE)

  For B=0 To 100 Do
   Sound(0,KillScore*20,B,10)
  Od
  AUDF0=0
  AUDC0=0

  If C=BOMB Then
   If Y>0 Then
    Blocks((Y-1)*10+X)=0
    DrawBlock(X,Y-1)
    ExplodeBlock(X,Y-1,EXPLOSION)
   Fi

   If Y<10 Then
    Blocks((Y+1)*10+X)=0
    DrawBlock(X,Y+1)
    ExplodeBlock(X,Y+1,EXPLOSION)
   Fi

   If X>0 Then
    Blocks(Y*10+X-1)=0
    DrawBlock(X-1,Y)
    ExplodeBlock(X-1,Y,EXPLOSION)
   Fi

   If X<9 Then
    Blocks(Y*10+X+1)=0
    DrawBlock(X+1,Y)
    ExplodeBlock(X+1,Y,EXPLOSION)
   Fi
  ElseIf C=CLOCK Then
   Frozen=255
  Fi

  If Y>0 Then
   If Same(Blocks((Y-1)*10+X),C)=YES Then
    AddKill(X,Y-1)
   Fi
  Fi

  If Y<10 Then
   If Same(Blocks((Y+1)*10+X),C)=YES Then
    AddKill(X,Y+1)
   Fi
  Fi

  If X>0 Then
   If Same(Blocks(Y*10+X-1),C)=YES Then
    AddKill(X-1,Y)
   Fi
  Fi

  If X<9 Then
   If Same(Blocks(Y*10+X+1),C)=YES Then
    AddKill(X+1,Y)
   Fi
  Fi
 Fi
Return


Proc Honk()
 Byte B

 Sound(0,50,12,10)
 COLPF4=72 
 For B=0 To 200 Do
  Pause()
 Od
 COLPF4=0
 AUDF0=0
 AUDC0=0
Return


Proc Throw(Byte X)
 Int LastY
 Byte Y,C,Last,NextLast,B,YTop,YBot,
    KX,KY,Ok,DoIt

 If Carrying=0 Then
 Else
  Last=0
  NextLast=0
  LastY=-1
  For Y=0 To 10 Do
   C=Blocks(Y*10+X)
   If C<>0 Then
    NextLast=Last
    Last=C
    LastY=Y
   Fi
  Od

  Ok=NO
  If Same(Last,Carrying)=YES Then
   If (Same(NextLast,Carrying)=YES Or HowMany>1) Then
    Ok=YES
   Fi
  Fi

  DoIt=YES

  YBot=LastY+1+HowMany-1
  If YBot>10 Then
   DoIt=NO
   YBot=10
   If Ok=YES Or HowMany>2 Then
    DoIt=YES
   Fi
  Fi

  If DoIt=YES Then
   For B=0 To 200 Do
    Sound(0,200-B,10,10)
    Pause()
   Od
   AUDF0=0
   AUDC0=0

   For Y=LastY+1 To YBot Do
    Blocks(Y*10+X)=Carrying
    DrawBlock(X,Y)
   Od

   Ok=NO

   If Same(Last,Carrying)=YES Then
    If (Same(NextLast,Carrying)=YES Or HowMany>1) Then
     Ok=YES
    Fi
   Fi

   If (HowMany>2) Then
    Ok=YES
   Fi

   If Ok=YES Then
    YTop=0
    For Y=0 To YBot Do
     If Blocks(Y*10+X)<>Carrying Then
      YTop=Y+1
     Fi
    Od

    NumKills=0
    KillScore=0
    AddKill(X,YBot)

    Lines=Lines+1

    Draw2Digits(SC+164,Lines)

    B=0
    Do
     KX=KillsX(B)
     KY=KillsY(B)
     KillBlock(KX,KY)

     B=B+1
    Until B>=NumKills Od

    Scr=Scr+ScrVals(KillScore)
    If Scr>=10000 Then
     Scr=Scr-10000
     ScrH=ScrH+1
    Fi

    DrawScr(SC+41,Scr,ScrH)

    If Scr>=HiScr Or ScrH>HiScrH Then
     HiScr=Scr
     HiScrH=ScrH
     DrawScr(SC+72,Scr,ScrH)
    Fi
   Fi

   Carrying=0
   HowMany=0
  Else
   Honk()
  Fi
 Fi

 If Lines>=LinesNeeded Then
  LevelDone=YES
 Fi
Return


Proc Grab(Byte X)
 Byte Y,C,Last,LastY,B,Ok

 Last=0
 LastY=0

 For Y=0 To 10 Do
  C=Blocks(Y*10+X)
  If C<>0 Then
   Last=C
   LastY=Y
  Fi
 Od

 If Last=0 Or (Last>4 And Last<8) Then
  Honk()
 Else
  If Last<>Carrying And Carrying<>0 Then
   Honk()
  Else
   Carrying=Last
   Blocks(LastY*10+X)=0
   DrawBlock(X,LastY)
   HowMany=HowMany+1

   Do
    Ok=0
    LastY=LastY-1
    If LastY>=0 Then
     If Blocks(LastY*10+X)=Last Then
      Blocks(LastY*10+X)=0
      DrawBlock(X,LastY)
      Ok=1
      HowMany=HowMany+1
     Fi
    Fi
   Until Ok=0 Od
  Fi

  For B=0 To 200 Do
   Sound(0,B,10,10)
   Pause()
  Od
  AUDF0=0
  AUDC0=0
 Fi
Return


Proc AddMore()
 Byte X,Y,Y1

 For X=0 To 9 Do
  If Blocks(10*10+X)<>0 Then
   GameOver=YES
  Fi 
 Od
 
 If Gameover=NO Then
  For Y=0 To 9 Do ; Stupid Action!
   Y1=10-Y

   For X=0 To 9 Do
    Blocks(Y1*10+X)=Blocks((Y1-1)*10+X)
    DrawBlock(X,Y1)
   Od
  Od

  For X=0 To 9 Do
   Blocks(0*10+X)=RandBlock()
   DrawBlock(X,0)
  Od
 Fi
Return

GEMDROP.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

The latter half of the game code.

; GEMDROP.ACT

; Gem Drop
; by Bill Kendrick
; kendrick@zippy.sonoma.edu
; http://zippy.sonoma.edu/kendrick/

; August 17, 1997 - Sept. 24, 1997

INCLUDE "GEMRT.ACT"
INCLUDE "GEMINC.ACT"

Proc CheckHappy()
 Byte X,Y

 Happy=YES
 For Y=8 To 10 Do
  For X=0 To 9 Do
   If Blocks(Y*10+X)<>0 Then
    Happy=NO
   Fi
  Od
 Od
Return


Proc LevelEndFX(Byte YourX)
 Byte X,Y,B,Togl
 Card Loc

 Loc=SC+890+(YourX LSH 1)
 Togl=0

 For Y=0 To 10 Do
  For X=0 To 9 Do
   Blocks(Y*10+X)=0
   DrawBlock(X,Y)
  Od 
  For X=0 To 9 Do
   If Rand(10)<2 Then
    ExplodeBlock(X,Y,EXPLOSION)
   Fi
  Od
  For B=0 To 150 Do
   Pause()
   Pause()
   Pause()
   Sound(0,B,0,15-B/10)
  Od

  Togl=1-Togl
  If Togl=0 Then
   PokeC(Loc,28526) ; 110,111
   PokeC(Loc+40,29040) ; 112,113
  Else
   PokeC(Loc,29554) ; 114,115
   PokeC(Loc+40,30068) ; 116,117
  Fi

  Pause()
  Pause()
 Od
Return


Proc Level15FX()
 Byte X,I,T

 Zero(53248,4)
 Zero(PMG,1024)
 Pause()
 MoveBlock(PMG+512+000+16+40,57344+('U-32)*8,8)
 MoveBlock(PMG+512+128+16+40,57344+('H-32)*8,8)
 MoveBlock(PMG+512+256+16+40,57344+('O-32)*8,8)
 MoveBlock(PMG+512+384+16+40,57344+('H-32)*8,8)

 T=0
 For X=0 To 230 Do
  Poke(53248,250-X)
  Poke(53249,250-X+8)
  Poke(53250,250-X+24)
  Poke(53251,250-X+32)
  For I=0 To 50 Do
   Pause()
  Od
  SetBlock(704,4,15)
  Sound(0,X,4,T)
  If (X MOD 10)=0 Then
   Poke(712,T)
   T=15-T
  Fi
 Od
 Poke(712,0)
 Sound(0,0,0,0)
 Zero(PMG,1024)
Return


Proc Play()
 Byte X,S,K,OX,A,B,FrozCount,
  HappyTest,Fire,SegaFire,Activity,
  OAct
 Int Clicks
 Card Q,Loc

 DrawGameScreen()
 InitLevel()
 Clicks=0
 X=5
 Gameover=NO
 OAct=0 
 FrozCount=0
 Scr=0
 ScrH=0

 DrawYou(X)

 Do
  S=STICK0
  Fire=STRIG0
  If PADDL0=228 And Controller=SEGA Then SegaFire=0
  Else SegaFire=1
  Fi

  If (S<>15 Or Fire=0 Or SegaFire=0) Then
   OAct=1
   If OAct=1 And RTCLOCK<8 Then
    S=15
    Fire=1
    SegaFire=1
   Else
    RTCLOCK=0
   Fi
  Else
   OAct=0
   RTCLOCK=10
  Fi
  
  K=KEY
  KEY=255

  If S=7 Then K=7
  ElseIf S=11 Then K=6
  ElseIf S=14 Or SegaFire=0 Then K=14
  ElseIf S=13 Or Fire=0 Then K=15
  Fi

  OX=X

  If K=28 Or CONSOL<7 Then
   Gameover=YES
  ElseIf K=7 Then
   X=X+1
   If X>9 Then X=0 Fi
  ElseIf K=6 Then
   If X>0 Then
    X=X-1
   Else
    X=9
   Fi
  ElseIf K=14 Then
   Throw(X)
   EraseYou(X)
   DrawYou(X)
  ElseIf K=15 Then
   Grab(X)
   EraseYou(X)
   DrawYou(X)
  ElseIf K=33 Then
   Poke(708,2)
   Poke(709,4)
   Poke(710,6)
   Poke(711,8)
   KEY=255
   Do Until KEY=33 Or KEY=28 Or CONSOL<7 Od
   If KEY<>33 Then
    Gameover=YES
   Fi
   KEY=255
   Poke(708,74)
   Poke(709,206)
   Poke(710,138)
   Poke(711,30)
  Fi

  If OX<>X Then
   EraseYou(OX)
   DrawYou(X)
  Fi

  If Frozen=0 Then
   HappyTest=HappyTest+1
   If HappyTest>=100 Then
    HappyTest=0
    CheckHappy()
    DrawYou(X)
   Fi

   Clicks=Clicks+1

   If Level<15 Then Q=Level*125
   Else Q=(Level-10)*100
   Fi
 
   If Clicks>4500-Q And FirstRound=1 Then
    Poke(DL-2,96+(16*(Clicks MOD 2)))
    Sound(0,100,0,8*(Clicks MOD 2))
   Fi

   If Clicks>4800-Q Then
    If FirstRound=1 Then
     Sound(0,0,0,0)
     Poke(DL-2,112)
     Clicks=0
     AddMore()
    Else
     FirstRound=1
     Clicks=0
    Fi
   Fi
  Else
   Happy=YES

   FrozCount=FrozCount+1

   If FrozCount=60 Then
    FrozCount=0
    Frozen=Frozen-1
    If (Frozen MOD 10)=0 Then
     For B=0 To 15 Do
      Sound(0,(Frozen MOD 20)*10+50,10,15-B)
     Od
    Fi
   Fi
  Fi

  If LevelDone=YES Then
   LevelEndFX(X)

   Level=Level+1
   If Level>20 Then
    Level=20
   Fi
   If Level>Max_Level Then
    Max_Level=Level
   Fi

   If Level=15 Then
     Level15FX()
   Fi

   InitLevel()
   Clicks=0
  Fi
 Until Gameover=YES Od

 Zero(53248,13)

 Quiet()

 Loc=SC+880+10+(X LSH 1)

 PokeC(Loc,30582) ; 118,119
 PokeC(Loc+40,31096) ; 120,121

 For A=0 To 254 Do
  Sound(0,A,10,15)
  SetBlock(SC+(A/12)*40+10,20,'\)
  Pause()
  Pause()
  Pause()
  Pause()
 Od

 MoveBlock(SC+131,"]]]\]]]\]]]]]\]]]\"+1,18)
 MoveBlock(SC+171,"]♥♥♥]♥]♥]♥]♥]♥]♥♥♥"+1,18)
 MoveBlock(SC+211,"]♥]\]]]♥]♥]♥]♥]]\\"+1,18)
 MoveBlock(SC+251,"]♥]♥]♥]♥]♥\♥]♥]♥♥\"+1,18)
 MoveBlock(SC+291,"]]]♥]♥]♥]♥\\]♥]]]\"+1,18)
 MoveBlock(SC+331,"\♥♥♥\♥\♥\♥\\\♥\♥♥♥"+1,18)

 MoveBlock(SC+413,"]]]\]\]\]]]\]]]\"+1,16)
 MoveBlock(SC+453,"]♥]♥]♥]♥]♥♥♥]♥]♥"+1,16)
 MoveBlock(SC+493,"]♥]♥]♥]♥]]\\]]\♥"+1,16)
 MoveBlock(SC+533,"]♥]♥\]\♥]♥♥\]♥]\"+1,16)
 MoveBlock(SC+573,"]]]♥\]♥\]]]\]♥]♥"+1,16)
 MoveBlock(SC+613,"\♥♥♥\\♥\\♥♥♥\♥\♥"+1,16)

 Quiet()

 KEY=255
 Do Until CONSOL=7 And STRIG0=1 Od

 Do
 Until KEY<255 Or CONSOL<7 Or STRIG0=0 Od

 KEY=255
 Do Until CONSOL=7 And STRIG0=1 Od

 SETVBV(7,OLDVEC)

 Quiet()
Return


Proc QuitApp()
 Graphics(0)
 Quiet()
 PutE()
 PrintE("Thanks for playing ◢GEMDrop◣")
 PrintE("Please visit NBS's website!")
 PrintE("http://zippy.sonoma.edu/kendrick/nbs/")
Return


Proc Main()
 Byte Quit

 Setup()
 Do
  Quit=Title()
  If Quit=NO Then
   Play()
   Graphics(0)
   Poke(559,0)
   Close(1)
   Open(1,"D:GEMDROP.DAT",8,0)
   PrintBDE(1,Max_Level)
   PrintCDE(1,HiScr)
   PrintBDE(1,HiScrH)
   Close(1)
  Fi
 Until Quit=YES Od
 QuitApp()
Return

GEMRT.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

These are "runtime" libraries; things that must be compiled into the game to allow it to run without an Action! programming cartridge installed. (It consists of just the parts of a runtime needed for Gem Drop to run — it appears to be Jeff Reister's PD Runtime package for the Action! 8 bit language, which can be found in the "Code" section of Eric Parent ("Joyful Coder")'s Action! website.)

; GEMRT.ACT
; ACTION! RUNTIME LIBRARY
; FOR GEMDROP

PROC _CPYPRM=*()
SET $4EE = _CPYPRM
[$85$A0$86$A1$84$A2$18$68$85$84$69$03
$A8$68$85$85$69$00$48$98$48$A0$01$B1
$84$85$82$C8$B1$84$85$83$C8$B1$84$A8
$B9$A0$00$91$82$88$10$F8$60]

PROC _CHGSGN=*()
[$85$C0$86$C1$38$A9$00$E5$C0$48$A9$00
$E5$C1$AA$68$60]

PROC _FIXSGN=*()
[$86$C2$E0$00$10$03$20 _CHGSGN $85$82
$86$83$A5$85$45$C2$85$C2$A6$85$10$09
$A5$84$20 _CHGSGN $85$84$86$85$60]

PROC _FIXRES=*()
[$A5$86$A6$87$A4$C2$10$03$4C _CHGSGN
$60]

PROC _MUL=*()
SET $4E8 = _MUL
[$20 _FIXSGN $A9$00$85$86$85$87$A5$82
$D0$04$A5$83$F0$22$A5$84$D0$04$A5$85
$F0$1A$46$85$66$84$90$0D$18$A5$86$65
$82$85$86$A5$87$65$83$85$87$06$82$26
$83$38$B0$D6$4C _FIXRES]

PROC _DIV=*()
SET $4EA = _DIV
[$20 _FIXSGN $A9$00$85$86$85$87$85$C1
$A9$01$85$C0$A5$82$D0$04$A5$83$F0$5F
$A5$84$D0$04$A5$85$F0$57$A5$82$C5$84
$A5$83$E5$85$90$0F$A5$C1$30$0B$06$84
$26$85$06$C0$26$C1$38$B0$E7$A5$C0$D0
$04$A5$C1$F0$36$A5$82$D0$04$A5$83$F0
$2E$A5$82$C5$84$A5$83$E5$85$90$19$38
$A5$82$E5$84$85$82$A5$83$E5$85$85$83
$A5$86$05$C0$85$86$A5$87$05$C1$85$87
$46$85$66$84$46$C1$66$C0$38$B0$C2$4C
_FIXRES]

PROC _MODOP=*()
SET $4EC = _MODOP
[$20 _DIV $A5$82$A6$83$60]

;PROC _RSHOP=*()
;SET $4E6 = _RSHOP
;[$A4$84$F0$0A$86$86$46$86$6A$88$D0$FA
;$A6$86$60]

PROC _LSHOP=*()
SET $4E4 = _LSHOP
[$A4$84$F0$0A$86$86$0A$26$86$88$D0$FA
$A6$86$60]

PROC _ERROU=*()
[$A9$70$AA$A9$0C$9D$42$03$20$56$E4$8A
$38$E9$10$D0$F1$6C$0A$00]

PROC _ERRVEC=*()
[_ERROU]

PROC _DEVIC=*()
[$00]

MODULE
CARD Error=_ERRVEC
BYTE device=_DEVIC

PROC _GOCIO=*()
[$20$56$E4$10$1A$C0$88$F0$06$68$68$98
$6C _ERRVEC $48$8A$48$4A$4A$4A$4A$AA
$A9$01$9D$C0$05$68$AA$68$60]

PROC _LODCHN=*()
[$C9$08$90$07$68$68$A9$86$6C _ERRVEC
$0A$0A$0A$0A$AA$60]

PROC _STONAM=*()
[$18$69$01$9D$44$03$98$69$00$9D$45$03
$60]

PROC _SHFTR=*()
[$48$8A$A8$68$AA$AD _DEVIC $60]

;PROC _CLREOL=*()
;[$48$A9$00$85$A5$68$60]

PROC _SETEOL=*()
[$48$A9$01$85$A5$68$60]

PROC _PRECON=*()
[$8A$48$98$AA$68$A0$03$84$A3$A0$FD$60]

PROC _DOPRNT=*()
[$86$A3$84$A4$20 _LODCHN $A9$00$9D$49
$03$A8$B1$A3$F0$1A$9D$48$03$18$A5$A3
$69$01$9D$44$03$A5$A4$69$00$9D$45$03
$A9$0B$9D$42$03$20 _GOCIO $A5$A5$F0
$12$A9$00$9D$48$03$9D$49$03$A9$0B$9D
$42$03$A9$9B$20 _GOCIO $60]

PROC StrC=*(CARD c, s)
[$85$D4$86$D5$84$A2$20$AA$D9$20$E6$D8
$A0$00$B1$F3$30$06$C8$91$A2$38$B0$F6
$29$7F$C8$91$A2$98$A0$00$91$A2$60]

;PROC StrB=*(BYTE b CARD s)
;[$84$A3$48$8A$A8$A2$00$68$4C StrC]

;PROC StrI=*(INT i CARD s)
;[$E0$00$30$03$4C StrC   $49$FF$85$A2
;$8A$49$FF$AA$E6$A2$D0$01$E8$A5$A2$20
;StrC $A0$00$18$B1$A2$69$01$91$A2$A8
;$88$B1$A2$C8$91$A2$88$88$D0$F7$C8$A9
;$2D$91$A2$60]

PROC _DOPRNC=*()
[$48$20 _PRECON $20 StrC $68$A2$FD$A0
$03$4C _DOPRNT]

;PROC DOPRNI=*()
;[$48$20 _PRECON $20 StrI $68$A2$FD$A0
;$03$4C _DOPRNT]

;PROC PrintCD=*(BYTE d CARD c)
;[$20 _CLREOL $4C _DOPRNC]

;PROC PrintC=*(CARD c)
;[$20 _SHFTR $4C PrintCD]

PROC PrintCDE=*(BYTE d CARD c)
[$20 _SETEOL $4C _DOPRNC]

;PROC PrintCE=*(CARD c)
;[$20 _SHFTR $4C PrintCDE]

;PROC PrintBD=*(BYTE d, b)
;[$A0$00$4C PrintCD]

;PROC PrintB=*(BYTE b)
;[$20 _SHFTR $4C PrintBD]

PROC PrintBDE=*(BYTE d, b)
[$A0$00$4C PrintCDE]

;PROC PrintBE=*(BYTE b)
;[$20 _SHFTR $4C PrintBDE]

;PROC PrintID=*(BYTE d INT i)
;[$20 _CLREOL $4C _DOPRNI]

;PROC PrintI=*(INT i)
;[$20 _SHFTR $4C PrintID]

;PROC PrintIDE=*(BYTE d INT i)
;[$20 _SETEOL $4C _DOPRNI]

;PROC PrintIE=*(INT i)
;[$20 _SHFTR $4C PrintIDE]

;PROC PrintD=*(BYTE d CARD s)
;[$20 _CLREOL $4C _DOPRNT]

;PROC Print=*(CARD s)
;[$20 _SHFTR $4C PrintD]

PROC PrintDE=*(BYTE d CARD s)
[$20 _SETEOL $4C _DOPRNT]

PROC PrintE=*(CARD s)
[$20 _SHFTR $4C PrintDE]

;PROC _HEXSTR=*()
;[$85$84$86$85$A9$FD$85$A2$A9$03$85$A3
;$A0$00$A9$05$91$A2$C8$A9$24$91$A2$A9
;$00$A2$04$06$84$26$85$2A$CA$D0$F8$69
;$30$C9$3A$90$02$69$06$C8$91$A2$C0$05
;$D0$E5$60]

;PROC PrintF=*(CARD s,a,b,c,d,e,f,g)
;[$85$82$86$83$84$A2$AD _DEVIC $0A$0A
;$0A$0A$85$C1$A0$00$84$87$84$C0$B1$82
;$F0$4C$85$86$E6$C0$F0$46$A4$C0$C4$86
;$F0$02$B0$3E$B1$82$C9$25$D0$3E$E6$C0
;$C8$C4$86$F0$02$B0$35$B1$82$C9$25$F0
;$2F$C9$45$F0$29$A8$A6$87$E0$0E$B0$D4
;$B5$A2$48$B5$A3$E8$E8$86$87$AA$68$C0
;$43$F0$15$C0$49$F0$34$C0$48$F0$3C$C0
;$53$F0$3F$38$B0$1D$60$38$B0$B2$A9$9B
;$A8$A6$C1$A9$00$9D$48$03$9D$49$03$A9
;$0B$9D$42$03$98$20 _GOCIO $38$B0$E4
;$A0$03$84$A3$A0$FD$20 StrC $38$B0$0F
;$A0$03$84$A3$A0$FD$20 StrI $38$B0$03
;$20 _HEXSTR $A9$FD$A2$03$85$84$86$85
;$A6$C1$A9$00$9D$49$03$A8$B1$84$F0$B5
;$9D$48$03$18$A5$84$69$01$9D$44$03$A5
;$85$69$00$9D$45$03$A9$0B$9D$42$03$20
;_GOCIO $38$B0$98]

PROC PutD=*(BYTE d, c)
[$86$A0$20 _LODCHN $A9$00$9D$48$03$9D
$49$03$A9$0B$9D$42$03$A5$A0$20 _GOCIO
$60]

;PROC PutDE=*(BYTE d)
;[$A2$9B$4C PutD]

PROC Put=*(BYTE c)
[$AA$AD _DEVIC $4C PutD]

PROC PutE=*()
[$A9$9B$4C Put]

;BYTE FUNC ValB=*(CARD a)
CARD FUNC ValC=*(CARD a)
;INT FUNC ValI=*(CARD a)
[$85$A2$86$A3$A9$00$85$A0$85$A1$85$A5
$A8$B1$A2$85$A4$C8$B1$A2$C9$20$F0$F9
$C9$2D$D0$0B$C6$A5$C8$C4$A4$F0$02$B0
$31$B1$A2$38$E9$30$90$2A$C9$0A$B0$26
$48$06$A0$26$A1$A5$A0$A6$A1$0A$26$A1
$0A$26$A1$18$65$A0$85$A0$8A$65$A1$85
$A1$18$68$65$A0$85$A0$90$CD$E6$A1$38
$B0$C8$A5$A5$F0$0D$38$A9$00$E5$A0$85
$A0$A9$00$E5$A1$85$A1$60]

PROC _DOINPT=*()
[$86$A4$84$A5$20 _LODCHN $18$A5$A4$69
$01$9D$44$03$A5$A5$69$00$9D$45$03$A5
$A3$F0$18$9D$48$03$A9$00$9D$49$03$A9
$05$9D$42$03$20 _GOCIO $BD$48$03$F0
$03$38$E9$01$A0$00$91$A4$A5$A6$F0$07
$A5$A4$A6$A5$4C ValC $60]

BYTE FUNC InputBD=*(BYTE d)
CARD FUNC InputCD=*(BYTE d)
;INT FUNC InputID=*(BYTE d)
[$48$A9$78$85$A3$A9$01$85$A6$68$A2$FD
$A0$03$4C _DOINPT]

;BYTE FUNC InputB=*()
;CARD FUNC InputC=*()
;INT FUNC InputI=*()
;[$AD _DEVIC$4C InputCD]

;PROC InputMD=*(BYTE d CARD s BYTE l)
;[$48$A9$00$85$A6$68$4C _DOINPT]

;PROC InputSD=*(BYTE d CARD s)
;[$48$A9$FF$85$A3$68$4C InputMD]

;PROC InputS=*(CARD s)
;[$20 _SHFTR $4C InputSD]

;CHAR FUNC GetD=*(BYTE d)
;[$20 _LODCHN $A9$00$9D$48$03
;$9D$49$03$A9$07$9D$42$03$20 _GOCIO
;$85$A0$60]

PROC Open=*(BYTE d CARD s BYTE m, a)
[$86$A1$20 _LODCHN $A5$A1$20
 _STONAM $A5$A3$9D$4A$03$A5$A4$9D$4B
$03$A9$03$9D$42$03$20 _GOCIO $8A$4A
$4A$4A$4A$AA$A9$00$9D$C0$05$60]

PROC Close=*(BYTE d)
[$20 _LODCHN $A9$0C$9D$42$03$20
_GOCIO $60]

;PROC XIO=*(BYTE d,z,c,a1,a2 CARD s)
;[$20 _LODCHN $98$9D$42$03$A5$A3$9D$4A
;$03$A5$A4$9D$4B$03$A5$A5$A4$A6$20
;_STONAM $20 _GOCIO $60]

;PROC Note=*(BYTE d CARD s, o)
;[$86$A1$84$A2$20 _LODCHN $A9$26$9D$42
;$03$20 _GOCIO $A0$00$BD$4C$03$91$A1
;$BD$4E$03$91$A3$BD$4D$03$C8$91$A1$60]

;PROC Point=*(BYTE d CARD s BYTE o)
;[$86$A1$20 _LODCHN $A5$A1$9D$4C$03$98
;$9D$4D$03$A5$A3$9D$4E$03$A9$25$9D$42
;$03$20 _GOCIO $60]

PROC Graphics=*(BYTE m)
[$48$A2$60$A9$0C$9D$42$03$20$56$E4$68
$9D$4B$03$49$10$09$0C$9D$4A$03$A9$53
$85$A0$A9$3A$85$A1$A9$A0$9D$44$03$A9
$00$9D$45$03$A9$03$9D$42$03$20 _GOCIO
$60]

;PROC SetColor=*(BYTE r, h, l)
;[$C9$05$B0$13$85$A0$8A$0A$0A$0A$0A$85
;$A1$98$29$0F$05$A1$A6$A0$9D$C4$02$60]

PROC Position=*(CARD x BYTE y)
[$85$55$86$56$84$54$60]

;PROC Plot=*(CARD x BYTE y)
;[$20 Position $A9$06$AE$FD$02$4C
;PutD]

;PROC DrawTo=*(CARD x BYTE y)
;[$20 Position $A2$60$A9$11
;$9D$42$03$AD$FB$02$8D$FD$02$20 _GOCIO
;$60]

;PROC Fill=*(CARD x BYTE y)
;[$20 Position $A2$60$A9$12
;$9D$42$03$AD$FB$02$8D$FD$02$20 _GOCIO
;$60]

;BYTE FUNC Locate=*(CARD x BYTE y)
;[$20 Position $A9$06$4C GetD]

PROC Sound=*(BYTE c, p, d, v)
[$C9$04$B0$25$86$A1$0A$AA$A9$00$8D$08
$D2$A9$03$8D$0F$D2$A5$A3$29$0F$85$A3
$98$29$0E$0A$0A$0A$0A$05$A3$9D$01$D2
$A5$A1$9D$00$D2$60]

;PROC SndRst=*()
;[$A9$00$A2$07$9D$00$D2$CA$10$FA$60]

;BYTE FUNC Paddle=*(BYTE p)
;[$29$07$AA$BD$70$02$85$A0$60]

;BYTE FUNC PTrig=*(BYTE p)
;[$29$07$AA$BD$7C$02$85$A0$60]

;BYTE FUNC Stick=*(BYTE p)
;[$29$03$AA$BD$78$02$85$A0$60]

;BYTE FUNC STrig=*(BYTE p)
;[$29$03$AA$BD$84$02$85$A0$60]

;INT FUNC SCompare=*(CARD s1, s2)
;[$85$A4$86$A5$84$A2$A0$00$84$A0$84$A1
;$B1$A4$85$A6$B1$A2$85$A7$C4$A6$F0$15
;$C4$A7$F0$11$C8$B1$A4$D1$A2$F0$F1$90
;$03$E6$A0$60$C6$A0$C6$A1$60$A5$A6$C5
;$A7$F0$F9$B0$F0$90$F1]

PROC SCopy=*(CARD d, s)
[$85$A0$86$A1$84$A2$A0$00$B1$A2$A8$B1
$A2$91$A0$C0$00$F0$04$88$38$B0$F4$60]

;PROC SCopyS=*(CARD d, s BYTE b, e)
;[$85$A0$86$A1$84$A2$A0$00$84$A6$B1$A2
;$C5$A5$B0$02$85$A5$A5$A4$F0$15$C5$A5
;$F0$02$B0$0F$A4$A4$E6$A4$B1$A2$E6$A6
;$A4$A6$91$A0$38$B0$E7$A5$A6$A0$00$91
;$A0$60]

;PROC SAssign=*(CARD d, s BYTE b, e)
;[$85$A0$86$A1$84$A2$A5$A4$F0$3B$C5$A5
;$F0$02$B0$35$85$A7$C6$A7$A0$00$84$A8
;$B1$A0$85$A9$B1$A2$85$AA$A5$A7$C5$A5
;$B0$15$A5$A8$C5$AA$B0$0F$E6$A8$A4$A8
;$B1$A2$E6$A7$A4$A7$91$A0$38$B0$E5$A5
;$A7$C5$A9$90$04$A0$00$91$A0$60]

BYTE FUNC Rand=*(BYTE r)
[$85$A2$C6$A2$A9$01$C5$A2$B0$05$38$2A
$38$B0$F7$85$A3$AD$0A$D2$25$A3$C5$A2
$F0$04$90$02$B0$F3$85$A0$60]

PROC Poke=*(CARD a BYTE v)
[$85$A0$86$A1$98$A0$00$91$A0$60]

PROC PokeC=*(CARD a, v)
[$20 Poke $C8$A5$A3$91$A0$60]

;BYTE FUNC Peek=*(CARD a)
CARD FUNC PeekC=*(CARD a)
[$85$A2$86$A3$A0$00$B1$A2$85$A0$C8$B1
$A2$85$A1$60]

PROC SetBlock=*(CARD a, l, v)
[$85$A0$86$A1$84$A2$A0$00$A5$A2$D0$04
$A5$A3$F0$16$A5$A4$91$A0$C8$D0$02$E6
$A1$C6$A2$A5$A2$C9$FF$D0$E7$C6$A3$38
$B0$E2$60]

PROC Zero=*(CARD a, l)
[$48$A9$00$85$A4$68$4C SetBlock]

PROC MoveBlock=*(CARD d, s, l)
[133 160 134 161 132 162 160   0 166
 165 240  14 177 162 145 160 200 208
 249 230 163 230 161 202 208 242 166
 164 240   8 177 162 145 160 200 202
 208 248  96]

MODULE

← Back to Gem Drop docs