' LOWRES OLYMPICS: 100 METRE SPRINT
' COPYRIGHT (C) 2019 NAT PRYCE
' LICENSE: CC BY-NC-SA 4.0


'==========================================
' CENTERED TEXT

DIM GLOBAL TITLE_LINE_OFFSETS(16)


SUB TITLE_INIT
  SPRITE OFF
  CLS
  FOR I = 0 TO 16
    TITLE_LINE_OFFSETS(I) = 0
  NEXT I
  
  ON RASTER CALL TITLE_CENTER_LINES
END SUB


SUB TITLE_CENTER_LINES
  L = RASTER/8
  SCROLL 0, TITLE_LINE_OFFSETS(L), 0
END SUB


SUB TITLE_END
  ON RASTER OFF
END SUB


SUB CTEXT(Y, L$)
  BG 0
  TEXT 0, Y, L$
  TITLE_LINE_OFFSETS(Y) = -(20-LEN(L$))*4
END SUB


SUB CLT(Y)
  BG 0
  BG FILL 0, Y TO 19, Y CHAR 0
  TITLE_LINE_OFFSETS(Y) = 0
END SUB


'==========================================
' RUNNERS

' 0 = OFF
' 1 = HUMAN PLAYER
' 2 = AI EASY
' 3 = AI MEDIUM
' 4 = AI HARD

DIM GLOBAL CONTROL(3)
CONTROL(0) = 1
CONTROL(1) = 2
CONTROL(2) = 2
CONTROL(3) = 1

DIM GLOBAL PAD(3)
PAD(0) = 0
PAD(1) = 0
PAD(2) = 1
PAD(3) = 1

DIM GLOBAL BTN(3)
BTN(0) = 1
BTN(1) = 0
BTN(2) = 0
BTN(3) = 1

DIM GLOBAL PAD$(1)
PAD$(0) = "LEFT"
PAD$(1) = "RIGHT"

DIM GLOBAL BTN$(2)
BTN$(0) = "A"
BTN$(1) = "B"

GLOBAL MAX_DISTANCE
MAX_DISTANCE = 108


SUB SHOW_OPTIONS(FOCUS)
  FOR P = 0 TO 3
    Y = 6 + 2*P
    CALL SHOW_CONTROL(1, Y, P, FOCUS)
  NEXT P
  
  CALL HIGHLIGHT(FOCUS, 4)
  CALL CTEXT(14, "START RACE")
END SUB


SUB HIGHLIGHT(FOCUS, N)
  IF FOCUS = N THEN
    ATTR (6)
  ELSE
    ATTR (7)
  END IF
END SUB


SUB SHOW_CONTROL(X, Y, P, FOCUS)
  OPT = CONTROL(P)
  
  IF OPT = 0 THEN
    OPT$ = "NOT RACING"
  ELSE IF OPT = 1 THEN
    PN = PAD(P)
    BN = BTN(P)
    OPT$ = "PLAYER: "+PAD$(PN)+", " + BTN$(BN)
  ELSE IF OPT = 2 THEN
    OPT$ = "A.I. (EASY)"
  ELSE IF OPT = 3 THEN
    OPT$ = "A.I. (MEDIUM)"
  ELSE
    OPT$ = "A.I. (HARD)"
  END IF
  
  BG FILL X, Y TO 19, Y CHAR 0
  ATTR (1+P)
  IF FOCUS = P THEN
    CELL X, Y, 16 + (TIMER / 20) MOD 2
  ELSE
    CELL X, Y, 18
  END IF
  CALL HIGHLIGHT(FOCUS, P)
  TEXT X+2, Y, OPT$
END SUB


SUB TITLE_SCREEN(INITIAL_FOCUS)
  SPRITE OFF
  CLS
  
  BG 1
  ATTR (0,0,0,0)
  BG FILL 0,0 TO 19,15 CHAR 0
  
  BG 0
  
  ATTR (6)
  CALL CTEXT(1, "LOWRES SPORTS")
  CALL CTEXT(3, "100M SPRINT")
  
  FOCUS = INITIAL_FOCUS
  
  REPEAT
    ENDLOOP = 0
    
    FOR I = 0 TO 1
      MV = UP TAP(I) - DOWN TAP(I)
      FOCUS = (FOCUS + MV + 5) MOD 5
      
      IF FOCUS < 4 THEN
        IF BUTTON TAP(I) THEN
          D = 1
        ELSE IF RIGHT TAP(I) THEN
          D = 1
        ELSE IF LEFT TAP(I) THEN
          D = -1
        ELSE
          D = 0
        END IF
        
        C = CONTROL(FOCUS)
        CONTROL(FOCUS) = (5 + C + D) MOD 5
      ELSE
        IF BUTTON TAP(I) THEN
          ENDLOOP = 1
        END IF
      END IF
    NEXT I
    CALL SHOW_OPTIONS(FOCUS)
    
    WAIT VBL
  UNTIL ENDLOOP
END SUB


SUB RACE
  CLS
  CALL CLT(3)
  BG 1
  BG SOURCE ROM(3)
  BG COPY 0, 0, 20, 16 TO 0, 0  
  
  RUNNERS = 0
  FOR P = 0 TO 3
    IF CONTROL(P) THEN RUNNERS = RUNNERS+1
  NEXT P
  
  DIM D(3)
  DIM SCORE(3)
  
  CALL INIT_RACE(D())
  CALL COUNTDOWN

  DONE = 0
  
  REPEAT
    FOR P = 0 TO 3
      IF CONTROL(P) THEN
        CALL MOVE(P, D(P), SCORE(P), DONE)
      END IF
    NEXT P
    
    WAIT VBL
  UNTIL DONE = RUNNERS
  
  CALL RACE_OVER(SCORE())
END SUB


SUB INIT_RACE(D())
  RANDOMIZE TIMER
  
  FOR P = 0 TO 3
    D(P) = MAX_DISTANCE
    
    IF CONTROL(P) = 0 THEN
      SPRITE OFF P
    ELSE
      X = 40 + 24*P
      Y = D(P)+8
    
      SPRITE.A P, (1+P)
      SPRITE P, X, Y, 21
    END IF
  NEXT P
END SUB


SUB MOVE(P, D, SCORE, DONE)
  C = CONTROL(P)
  
  IF D = 0 THEN
    IF SCORE = 1 THEN
      SPRITE P, , , 18 + (TIMER/30) MOD 2
    ELSE
      SPRITE P, , , 18
    END IF
    
  ELSE 
    IF C = 1 THEN
      MV = BUTTON TAP(PAD(P), BTN(P))
    ELSE
      MV = RND < C/40
    END IF
    
    D = MAX(0, D + 3*MV)
    SPRITE P, , D+8, 16 + D MOD 2
    
    IF D = 0 THEN
      DONE = DONE + 1
      SCORE = DONE
      
      BG 0
      TEXT 5+3*P, 3, STR$(SCORE)
    END IF
  END IF
END SUB


SUB COUNTDOWN
  Y = 7
  CALL CTEXT(Y, "ON YOUR MARKS")
  WAIT 60
  CALL CLT(Y)
  CALL CTEXT(Y, "GET SET")
  WAIT 60
  CALL CLT(Y)
  
  PLAY 0, 36, 15 SOUND 1
END SUB


SUB RACE_OVER(SCORE())
  CALL CTEXT(7, "RACE OVER")
  
  START_T = TIMER
  REPEAT
    FOR P = 0 TO 3
      IF CONTROL(P) THEN
        CALL MOVE(P, 0, SCORE(P), -1)
      END IF
    NEXT P
    WAIT VBL
    
    T = TIMER - START_T
    CLICKED = BUTTON TAP(0) OR BUTTON TAP(1)
    
    IF T = 120 THEN
      CALL CTEXT(9, "PRESS ANY BUTTON")
    END IF
    
  UNTIL T > 120 AND CLICKED
END SUB
 


GAMEPAD 2

CALL TITLE_INIT
CALL TITLE_SCREEN(0)
DO
  CALL RACE
  
  ' ENSURE TAP AT END OF RACE DOES NOT ALSO
  ' ACTION THE INITIAL MENU ITEM IN THE 
  ' TITLE SCREEN
  WAIT VBL
  
  CALL TITLE_SCREEN(4)
LOOP




#1:MAIN PALETTES
083F2510003A300300101F220038003F
00103C08003F2A15003F0400002A1500

#2:MAIN CHARACTERS
00000000000000000000000000000000
0000000000000000FFFFFFFFFFFFFFFF
00000000000000AAFFFFFFFFFFFFFF55
00800080008000AAFF7FFF7FFF7FFF55
01000100010001AAFEFFFEFFFEFFFE55
0080008000800080FF7FFF7FFF7FFF7F
0100010001000100FEFFFEFFFEFFFEFF
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
181800243818080000003C1818001008
181800241C18100000003C1818000810
181800243C18180000003C1818000018
5A5A00001818180000003C1818000018
185A00001824000000003C1818004200
001800243C10100000003C1818080010
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
030C1020404080800000000000000000
7E818181818181810001010101010101
C0000000020201010030080402020101
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
7F8080808080807F000000000000007F
00001824241800000000182020000000
FE010101010101FE00010101010101FE
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
8080000000000C030000404020100C03
818181818181817E010101010101017E
01010202040830C001010202040830C0
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
183C3C3C3C183C181824242424182418
6CFEFE7E240000006C92925A24000000
247EFF7E7EFF7E24245A815A5A815A24
083E7F7E3F7F3E080836414631413608
62F7FE7C3E7FEF4662959A742E59A946
1C3E7E7EFFFE7F3A1C224A46919A453A
183C3C78300000001824244830000000
0C1E3C78783C1E0C0C1224484824120C
30783C1E1E3C78303048241212244830
00247E7EFF7E7E2400245A6681665A24
00183C7EFF7E3C180018246681662418
000000183C3C78300000001824244830
0000007EFF7E00000000007E817E0000
00000000183C3C180000000018242418
060F1E3C78F0E040060912244890A040
3C7EFFFFFFFF7E3C3C4299918999423C
183C7C3C3C7EFF7E182444242466817E
3C7EFF7E3C7EFF7E3C429972244E817E
3C7EFF7E6FFF7E3C3C4299726999423C
66FFFFFF7F0F0F066699998179090906
7EFFFEFE7F7FFE7C7E819E827979827C
1C3E7CFEFFFF7E3C1C224C829999423C
7EFF7F1E3C7878307E81791224484830
3C7EFF7EFFFF7E3C3C4299429999423C
3C7EFF7F7FFF7E3C3C4299417999423C
0000183C183C18000000182418241800
0000183C183C78300000182418244830
000C1E3C783C1E0C000C12244824120C
00007EFF7EFF7E0000007E817E817E00
0030783C1E3C78300030482412244830
3C7EFF7E3C183C183C42997224182418
3C7EFFFFFFFE7E3C3C429991919E423C
183C7EFFFFFFFF661824429981999966
7CFEFFFEFFFFFE7C7C8299829999827C
3C7EFFF6F6FF7E3C3C4299969699423C
78FCFEFFFFFEFC787884929999928478
7EFFFEFCF8FEFF7E7E819E84989E817E
7EFFFEFCF8F0F0607E819E8498909060
3C7EFEFFFFFF7E3C3C429E919999423C
66FFFFFFFFFFFF666699998199999966
3C7E3C3C3C3C7E3C3C4224242424423C
1E3F1F0F6FFF7E3C1E2119096999423C
66FFFEFCFCFEFF666699928484929966
60F0F0F0F0FEFF7E60909090909E817E
42E7FFFFFFFFFF6642A5998181999966
66FFFFFFFFFFFF666699898191999966
3C7EFFFFFFFF7E3C3C4299999999423C
7CFEFFFEFCF0F0607C8299829C909060
3C7EFFFFFFFE7F3E3C4299999592413E
7CFEFFFEFCFEFF667C82998284929966
3E7FFE7E3F7FFE7C3E419E423979827C
7EFF7E3C3C3C3C187E81662424242418
66FFFFFFFFFF7E3C669999999999423C
66FFFFFFFF7E3C186699999999422418
66FFFFFFFFFFE742669999818199A542
66FF7E3C7EFFFF666699422442999966
66FFFF7E3C3C3C186699994224242418
7EFF7E3C78FEFF7E7E817224489E817E
3C7E7C78787C7E3C3C424C48484C423C
60F0783C1E0F07026090482412090502
3C7E3E1E1E3E7E3C3C4232121232423C
183C7EFF660000001824429966000000
00000000007EFF7E00000000007E817E

#3:MAIN BG
00001410000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000100020002000200020002000200
02000200020002000200020001000000
00000000000000000000060005000100
06000500010006000500010006000500
01000600050000000000000000000000
00000600050001000600050001000600
05000100060005000100060005000000
00000000000000000000060005000100
06000500010006000500010006000500
01000600050000000000000000000000
00000600050001000600050001000600
05000100060005000100060005000000
00000000000000000000060005000100
06000500010006000500010006000500
01000600050000000000000000000000
00000600050001000600050001000600
05000100060005000100060005000000
00000000000000000000060005000100
06000500010006000500010006000500
01000600050000000000000000000000
00000600050001000600050001000600
05000100060005000100060005000000
00000000000000000000060005000100
06000500010006000500010006000500
01000600050000000000000000000000
00000600050001000600050001000600
05000100060005000100060005000000
00000000000000000000060005000100
06000500010006000500010006000500
01000600050000000000000000000000
00000600050001000600050001000600
05000100060005000100060005000000
00000000000000000000060003000200
04000300020004000300020004000300
02000400050000000000000000000000
00000100010001000100010001000100
01000100010001000100010001000000
00000000

#15:MAIN SOUND
3800303A000450007801008F003A0000
78010481003A00002800303019FE0000
38002020000000003800505000000000
0800000F000000000800000F00000000
0800000F000000000800000F00000000
0800000F000000000800000F00000000
0800000F000000000800000F00000000
0800000F000000000800000F00000000

