REM placka22.bas - doplněná verze
REM vytvořeny vlastní fonty pro správné zobrazování češtiny v DOSBoxu
REM oddělena DATA od zdrojového kódu - načítání ze souboru
REM přidány čtyři nové kombinace a melodie
REM hlášení ukončení při chybě načítání
REM 2010-04-10 - 2010-04-18
    

start:
  DEFINT A-Z
  SCREEN 12, 0, 0
  COLOR 15
  fonttype = 0
  ON ERROR GOTO nejsouData
  OPEN "placka.dat" FOR INPUT AS #1
  ON ERROR GOTO vadnaData
    LINE (0, 0)-(639, 239), 1, BF
    LOCATE 2, 13: PRINT " Nahrávám data! "
  DIM text$(34)
    LOCATE 4, 6: PRINT " Texty: ";
    FOR i = 0 TO 33
      PRINT ".";
      INPUT #1, text$(i)
    NEXT i
  DIM font(223, 7, 2)
    LOCATE 6, 6: PRINT " Fonty: ";
    FOR f = 0 TO 1
      FOR r = 0 TO 223
        IF r MOD 8 = 0 THEN PRINT ".";
        FOR s = 0 TO 7
          INPUT #1, font(r, s, f)
    NEXT s, r, f
  DIM m(1 TO 35)
  DIM m$(1 TO 35, 1 TO 215)
    LOCATE 8, 6: PRINT " Hudba: ";
    FOR a = 1 TO 35
      PRINT ".";
      INPUT #1, m(a)
      FOR b = 1 TO m(a)
        INPUT #1, m$(a, b)
    NEXT b, a
  DIM asm AS STRING * 54
    LOCATE 10, 5: PRINT " Driver: ";
    FOR a = 1 TO 54
      PRINT ".";
      INPUT #1, a$
      MID$(asm, a) = CHR$(VAL("&H" + a$))
    NEXT a
  DIM kombr(14)
  DIM kombs(14)
  DIM komb(14, 3, 6)
    LOCATE 12, 2: PRINT " Kombinace: ";
    FOR a = 1 TO 14
      INPUT #1, kombr(a)
      INPUT #1, kombs(a)
      FOR b = 0 TO 3
        PRINT ".";
        FOR c = 0 TO 6 STEP 2
          INPUT #1, komb(a, b, c)
    NEXT c, b, a
  DIM testr(35, 4, 3)
  DIM tests(35, 4, 3)
    LOCATE 14, 5: PRINT " Vzorky: ";
    FOR a = 1 TO 35
      PRINT ".";
      FOR b = 1 TO 4
        FOR c = 0 TO 3
          INPUT #1, testr(a, b, c)
          INPUT #1, tests(a, b, c)
    NEXT c, b, a
  CLOSE #1
  ON ERROR GOTO chybaProgramu
  DEF fns (t) = 41 - (LEN(text$(t)) \ 2)
  GOSUB uvod
  RANDOMIZE TIMER
  GOSUB mouseInit
  DATA 5,5,5,5,5,6,6,5,3,6,5,8,5,6,5,5
  DATA 6,6,6,6,3,6,6,8,3,3,5,3,3,6,8,3
  DATA 3,8,3,8,3,8,5,3,8,6,8,8,3,8,8,8

cekani1:
  a$ = ""
  WHILE a$ = ""
    a$ = INKEY$
    IF a$ = "f" OR a$ = "F" THEN
      fonttype = 1 - fonttype
      GOSUB uvod
      a$ = ""
    END IF
    GOSUB mouseStatus
    IF mb = 1 THEN a$ = "b"
  WEND
  COLOR 15
  CLS

priprava:
  RESTORE priprava
  t = 25: radek = 2: sloupec = fns(t): GOSUB text
  t = 26: radek = 3: sloupec = fns(t): GOSUB text
  t = 27: radek = 30: sloupec = fns(t): GOSUB text
  DIM p(4, 4)
  DIM c(1 TO 4)
  t = 34
  FOR a = 1 TO 4
    text$(t) = CHR$(64 + a): radek = a * 5 + 4: sloupec = 18: GOSUB text
    text$(t) = CHR$(68 + a): radek = a * 5 + 4: sloupec = 63: GOSUB text
    text$(t) = MID$(STR$(a), 2, 1): radek = 5: sloupec = a * 10 + 16: GOSUB text
    text$(t) = MID$(STR$(a + 4), 2, 1): radek = 28: sloupec = a * 10 + 16: GOSUB text
    FOR b = 1 TO 4
losovani:
      c = INT(RND * 4) + 1
      IF c(c) = 4 THEN GOTO losovani
      p(a, b) = c
      c(c) = c(c) + 1
  NEXT b, a

melodie:
REM "Anděl"-6
REM "Batalion"-8
REM "Bedna od whisky"-5
REM "Bratříčku, zavírej vrátka"-5
REM "Dokud se zpívá"-6
REM "Ej, od Buchlova"-6
REM "Holubí dům"-7
REM "Hudsonské šífy"-7
REM "Chlupatý kaktus"-7
REM "Kdyby tady byla taková panenka"-4
REM "Když mě brali za vojáka"-5
REM "Kočka na okně"-6
REM "Krajina posedlá tmou"-6
REM "Motýl"-10
REM "Náhrobní kámen"-5
REM "Něco o lásce"-10
REM "Okno mé lásky"-5
REM "Po starých zámeckých schodech"-7
REM "Pramínek vlasů"-10
REM "Pravda a lež"-9
REM "Prídi ty, šuhajko"-8
REM "Purpura"-6
REM "Santa Lucia"-7
REM "Rikatado"-7
REM "Rosa na kolejích"-9
REM "Řeka hučí"-9
REM "Třešně zrály"-7
REM "Tři kríže"-8
REM "Už se ten Tálínskej rybník nahání"-5
REM "Veď mě dál, cesto má"-8
REM "Zelené pláně"-10
REM "Náš kraj"-7
REM "Dorogoj dlinnoju"-8
REM "Stěnka Razin"-8
REM "Million alych roz"-8

paleta:
  FOR a = 1 TO 4
    READ c(a)
  NEXT a
  DATA 1,12,10,15

sipky:
  FOR a = 1 TO 4
    LINE (a * 80 + 103, 78)-(a * 80 + 143, 78)
    LINE (a * 80 + 143, 78)-(a * 80 + 123, 58)
    LINE (a * 80 + 123, 58)-(a * 80 + 103, 78)
    LINE (a * 80 + 103, 431)-(a * 80 + 143, 431)
    LINE (a * 80 + 143, 431)-(a * 80 + 123, 451)
    LINE (a * 80 + 123, 451)-(a * 80 + 103, 431)
    LINE (146, a * 80 + 35)-(146, a * 80 + 75)
    LINE (146, a * 80 + 75)-(126, a * 80 + 55)
    LINE (126, a * 80 + 55)-(146, a * 80 + 35)
    LINE (492, a * 80 + 35)-(492, a * 80 + 75)
    LINE (492, a * 80 + 75)-(512, a * 80 + 55)
    LINE (512, a * 80 + 55)-(492, a * 80 + 35)
  NEXT a

kombinace:
  FOR a = 1 TO 14
    FOR b = 0 TO 3
      FOR c = 0 TO 6 STEP 2
        LOCATE kombr(a) + b, kombs(a) + c
        COLOR komb(a, b, c)
        PRINT "██";
  NEXT c, b, a
  COLOR 15
  LINE (158, 94)-(480, 416), 14, B
  GOSUB mouseShow
  GOSUB maluj
    

klavesa:
  a$ = INKEY$
  GOSUB mouseStatus
  IF a$ = "" THEN GOTO klavesa

posun:
  IF a$ < "a" OR a$ > "h" THEN
    IF a$ < "1" OR a$ > "8" THEN
      IF a$ = CHR$(27) THEN
        GOTO konec
      ELSE
        GOTO klavesa
      END IF
    ELSE
      IF a$ > "4" THEN
        a = VAL(a$) - 4
        p(0, a) = p(4, a)
        FOR b = 4 TO 1 STEP -1
          p(b, a) = p(b - 1, a)
        NEXT b
      ELSE
        a = VAL(a$)
        FOR b = 0 TO 3
          p(b, a) = p(b + 1, a)
        NEXT b
        p(4, a) = p(0, a)
      END IF
    END IF
  ELSE
    IF a$ > "d" THEN
      a = ASC(a$) - 100
      p(a, 0) = p(a, 4)
      FOR b = 4 TO 1 STEP -1
        p(a, b) = p(a, b - 1)
      NEXT b
    ELSE
      a = ASC(a$) - 96
      FOR b = 0 TO 3
        p(a, b) = p(a, b + 1)
      NEXT b
      p(a, 4) = p(a, 0)
    END IF
  END IF

test:
  PLAY "t255o3l64cde"
  GOSUB maluj
  FOR a = 1 TO 35
    f = 1
    FOR b = 1 TO 4
      FOR c = 1 TO 3
        IF p(testr(a, b, c - 1), tests(a, b, c - 1)) <> p(testr(a, b, c), tests(a, b, c)) THEN f = 0
    NEXT c, b
    IF f THEN GOTO hudba
  NEXT a

delay:
  a$ = INKEY$
  GOSUB mouseStatus
  IF LEN(a$) THEN GOTO delay
GOTO klavesa

konec:
  LINE (160, 16)-(471, 47), 0, BF
  t = 28: radek = 2: sloupec = fns(t): GOSUB text
  t = 29: radek = 3: sloupec = fns(t): GOSUB text
  PLAY "t255o4l2c"
cekani2:
  a$ = INPUT$(1)
  IF a$ = "a" OR a$ = "A" OR a$ = CHR$(13) THEN GOTO ven
  IF a$ = "n" OR a$ = "N" OR a$ = CHR$(27) THEN
    LINE (160, 16)-(471, 47), 0, BF
    t = 25: radek = 2: sloupec = fns(t): GOSUB text
    t = 26: radek = 3: sloupec = fns(t): GOSUB text
    GOTO klavesa
  END IF
GOTO cekani2

ven:
  CLS
  t = 30: radek = 12: sloupec = fns(t): GOSUB text
  t = 31: radek = 13: sloupec = fns(t): GOSUB text
  t = 32: radek = 14: sloupec = fns(t): GOSUB text
  t = 33: radek = 15: sloupec = fns(t): GOSUB text
  t = 30: radek = 16: sloupec = fns(t): GOSUB text
  SLEEP 3
  SCREEN 0, 0, 0
SYSTEM

maluj:
  GOSUB mouseHide
  FOR a = 1 TO 4
    FOR b = 1 TO 4
      LINE (b * 80 + 80, a * 80 + 16)-(b * 80 + 158, a * 80 + 94), c(p(a, b)), BF
  NEXT b, a
  GOTO mouseShow
RETURN

hudba:
  f = 1
  GOSUB mouseHide
  FOR b = 1 TO m(a)
    IF LEN(INKEY$) THEN f = 0
    IF f THEN PLAY m$(a, b)
  NEXT b
  GOSUB mouseShow
GOTO delay

mouseInit:
  ax = 0
  GOSUB driver
RETURN

mouseShow:
  ax = 1
  GOSUB driver
RETURN

mouseHide:
  ax = 2
  GOSUB driver
RETURN

mouseStatus:
  ax = 3
  GOSUB driver
  IF mb = 1 THEN
    IF mx < 120 OR mx > 518 OR my < 56 OR my > 454 THEN RETURN
    mx = mx - 80
    my = my - 16
    r = my \ 80
    s = mx \ 80
    IF r = 0 OR r = 5 THEN
      IF s > 0 AND s < 5 THEN
        a = s
        IF r = 5 THEN a = a + 4
        a$ = RIGHT$(STR$(a), 1)
      END IF
    END IF
    IF s = 0 OR s = 5 THEN
      IF r > 0 AND r < 5 THEN
        a = r
        IF s = 5 THEN a = a + 4
        a$ = RIGHT$(CHR$(a + 96), 1)
      END IF
    END IF
  END IF
RETURN

driver:
  DEF SEG = VARSEG(asm)
  CALL Absolute(ax, mb, mx, my, VARPTR(asm))
RETURN

uvod:
  COLOR 15
  CLS
  LINE (0, 0)-(639, 479), , B
  LINE (1, 1)-(638, 478), , B
  LINE (3, 3)-(636, 476), , B
  RESTORE
  FOR a = 4 TO 28
    t = a - 4: radek = a: sloupec = 41 - LEN(text$(a - 4)) \ 2: GOSUB text
  NEXT a
  FOR a = 12 TO 15
    FOR b = 37 TO 43 STEP 2
      READ c
      LOCATE a, b - 12
      COLOR c
      PRINT "██"
      READ c
      LOCATE a, b
      COLOR c
      PRINT "██"
      READ c
      LOCATE a, b + 12
      COLOR c
      PRINT "██"
  NEXT b, a
RETURN

text:
  FOR i = 1 TO LEN(text$(t))
    znak = ASC(MID$(text$(t), i, 1))
    FOR j = 0 TO 7
      LINE (sloupec * 8 - 8 + j, radek * 16 - 16)-(sloupec * 8 - 8 + j, radek * 16 - 1), , , font(znak - 32, j, fonttype)
    NEXT j
    sloupec = sloupec + 1
    IF sloupec > 80 THEN sloupec = 1: radek = radek + 1
    IF radek > 30 THEN radek = 1
  NEXT i
RETURN

nejsouData:
  LINE (171, 159)-(451, 303), 14, BF
  LINE (175, 163)-(447, 299), 4, BF
  LOCATE 13, 31
  PRINT " Nenalezen soubor "
  LOCATE 15, 32
  PRINT ">> PLACKA.DAT <<"
  LOCATE 17, 28
  PRINT " program nelze spustit! "
GOTO ukoncit

vadnaData:
  LINE (171, 159)-(451, 303), 14, BF
  LINE (175, 163)-(447, 299), 4, BF
  LOCATE 13, 31
  PRINT " Chyba v souboru "
  LOCATE 15, 32
  PRINT ">> PLACKA.DAT <<"
  LOCATE 17, 28
  PRINT " program nelze spustit! "
GOTO ukoncit

chybaProgramu:
  LINE (171, 159)-(451, 303), 14, BF
  LINE (175, 163)-(447, 299), 4, BF
  LOCATE 14, 32
  PRINT " Chyba programu "
  LOCATE 16, 28
  PRINT " zkus ho znovu spustit! "
ukoncit:
  PLAY "t200o4l8cbcbcbl4cp1p2"
  FOR i = 0 TO 96
    time! = TIMER
    LINE (171 + i, 159 + i / 1.5)-(451 - i, 303 - i / 1.5), 0, B
    WHILE time! = TIMER: WEND
  NEXT i
  SLEEP 1
  SCREEN 0, 0, 0
SYSTEM


screenshot hry Placka