snooow.bas

Denna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.


DECLARE SUB InitSnow ()
DECLARE SUB PrepScreen ()
DECLARE SUB MakePlog ()
DECLARE SUB StopSnow ()
DECLARE SUB Ploga ()

Max = 100:  sts = 0

DIM sx(Max), sy(Max)
DIM plog%(1 TO 594)

RANDOMIZE TIMER
SCREEN 12
MakePlog
PrepScreen
InitSnow
ON TIMER(180) GOSUB StopS
TIMER ON
WHILE INKEY$ = ""
  IF sts > 0 THEN sts = sts + 1
  IF sts > 210 THEN Ploga
  FOR x = 0 TO Max - 1
    IF sy(x) > 0 THEN
      PSET (sx(x) + 150, sy(x) + 100), 0
      sy(x) = sy(x) + 1
      T = INT(RND * 3) - 1
      IF (T <> 0) AND (POINT(sx(x) + T + 150, sy(x) + 100) = 0) THEN sx(x) = sx(x) + T
      pt = POINT(sx(x) + 150, sy(x) + 1 + 100)
      IF ((pt <> 0) AND (POINT(sx(x) + 150, sy(x) + 2 + 100) <> 0)) OR (pt > 0 AND pt < 15) THEN
        IF POINT(sx(x) + 151, sy(x) + 101) = 0 THEN
          sx(x) = sx(x) + 1
        ELSE
          IF POINT(sx(x) + 149, sy(x) + 101) = 0 THEN
            sx(x) = sx(x) - 1
          ELSE
            PSET (sx(x) + 150, sy(x) + 100), 15
            IF sts = 0 THEN
              sy(x) = 1
            ELSE
              sy(x) = -1
            END IF
            sx(x) = RND * 320
          END IF
        END IF
      END IF
      PSET (sx(x) + 150, sy(x) + 100), 15
    END IF
  NEXT
WEND
END

StopS:
  StopSnow
  RETURN

DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,12,12,12,12,12,12,12,12,12,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,01,12,12,12,01,01,09,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,01,09,12,12,01,01,09,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,00,00,00,00,00,00,01,01,09,12,12,01,09,09,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,00,00,00,00,00,00,09,09,12,12,12,12,12,12,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,00,00,00,00,00,00,12,12,12,12,12,12,12,12,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,00,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,12,12,04,04,04,04,04,04,04,04,12,12,12,12,12,04,04,12,12,12,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,07,12,12,12,12,12,12,12,12,12,12,12,12,12,04,12,12,12,12,12,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,07,12,04,04,04,04,04,04,04,04,12,12,12,04,12,08,08,08,08,08,12,12,00,00
DATA 00,00,00,00,00,00,00,00,00,07,08,12,12,12,12,12,12,12,12,12,12,04,12,08,08,08,08,08,08,08,12,12,00
DATA 00,00,00,00,08,08,08,08,08,08,08,12,12,12,12,12,12,12,12,12,04,12,08,08,08,08,08,08,08,08,08,12,00
DATA 00,00,00,00,08,08,08,08,08,08,12,12,12,12,12,12,12,12,12,12,04,12,08,08,08,08,12,08,08,08,08,12,00
DATA 00,00,00,08,08,08,08,08,08,08,12,12,08,08,08,12,12,12,12,12,12,12,08,08,08,12,00,12,08,08,08,12,00
DATA 00,00,08,08,08,08,08,08,08,08,00,08,08,08,08,08,00,00,00,00,00,00,08,08,08,08,12,08,08,08,08,00,00
DATA 00,00,08,08,08,08,08,08,08,08,00,08,08,12,08,08,00,00,00,00,00,00,08,08,08,08,08,08,08,08,08,00,00
DATA 00,08,08,08,08,08,08,08,08,00,00,08,08,08,08,08,00,00,00,00,00,00,00,08,08,08,08,08,08,08,00,00,00
DATA 08,08,08,08,08,08,08,08,08,00,00,00,08,08,08,00,00,00,00,00,00,00,00,00,08,08,08,08,08,00,00,00,00

SUB InitSnow
  SHARED sx(), sy(), Max
  FOR x = 0 TO Max - 1
    sx(x) = RND * 320
    sy(x) = RND * -195
  NEXT
  FOR trs = 1 TO 200
    FOR x = 0 TO Max - 1
      IF sy(x) > 0 THEN PSET (sx(x) + 150, sy(x) + 100), 0
      sy(x) = sy(x) + 1
      T = 0
      IF sy(x) > 0 THEN T = INT(RND * 3) - 1
      IF (T <> 0) AND (POINT(sx(x) + T + 150, sy(x) + 100) = 0) THEN sx(x) = sx(x) + T
      pt = POINT(sx(x) + 150, sy(x) + 1 + 100)
      IF sy(x) > 0 THEN
        IF ((pt <> 0) AND (POINT(sx(x) + 150, sy(x) + 2 + 100) <> 0)) OR (pt > 0 AND pt < 15) THEN
          IF POINT(sx(x) + 151, sy(x) + 101) = 0 THEN
            sx(x) = sx(x) + 1
          ELSE
            IF POINT(sx(x) + 149, sy(x) + 101) = 0 THEN
              sx(x) = sx(x) - 1
            ELSE
              PSET (sx(x) + 150, sy(x) + 100), 15
              IF sts = 0 THEN
                sy(x) = 1
              ELSE
                sy(x) = -1
              END IF
              sx(x) = RND * 320
            END IF
          END IF
        END IF
      END IF
      IF sy(x) > 0 THEN PSET (sx(x) + 150, sy(x) + 100), 15
    NEXT
  NEXT
END SUB

SUB MakePlog
  SHARED plog%()

  FOR y = 1 TO 18
    FOR x = 1 TO 33
      READ a
      PSET (x, y), a
    NEXT
  NEXT
  GET (1, 1)-(33, 18), plog%
  CLS
END SUB

SUB Ploga
  SHARED plog%(), sts
  wq = 500: sts = 0
  FOR px = 606 TO 580 STEP -1
    PUT (px, 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  FOR px = 0 TO 90
    LINE (321 + 150, 170 + 100)-(321 + 150 + SIN((px - 1) * 3.14159 / 180) * 30, 170 + 100 + COS((px - 1) * 3.14159 / 180) * 30), 0
    LINE (321 + 150, 170 + 100)-(321 + 150 + SIN(px * 3.14159 / 180) * 30, 170 + 100 + COS(px * 3.14159 / 180) * 30), 15
    PUT (580 - px, 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  FOR px = 490 TO 430 STEP -1
    PUT (px, 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  FOR px = 90 TO 0 STEP -1
    LINE (321 + 150, 170 + 100)-(321 + 150 + SIN((px + 1) * 3.14159 / 180) * 30, 170 + 100 + COS((px + 1) * 3.14159 / 180) * 30), 0
    LINE (321 + 150, 170 + 100)-(321 + 150 + SIN(px * 3.14159 / 180) * 30, 170 + 100 + COS(px * 3.14159 / 180) * 30), 15
    PUT (339 + px, 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  FOR px = 339 TO 240 STEP -1
    PUT (px, 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  FOR px = 360 TO 270 STEP -1
    LINE (-1 + 150, 170 + 100)-(-1 + 150 + SIN((px + 1) * 3.14159 / 180) * 30, 170 + 100 + COS((px + 1) * 3.14159 / 180) * 30), 0
    LINE (-1 + 150, 170 + 100)-(-1 + 150 + SIN(px * 3.14159 / 180) * 30, 170 + 100 + COS(px * 3.14159 / 180) * 30), 15
    PUT (150 + (px - 270), 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  FOR px = 150 TO 95 STEP -1
    PUT (px, 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  FOR px = 270 TO 360
    LINE (-1 + 150, 170 + 100)-(-1 + 150 + SIN((px - 1) * 3.14159 / 180) * 30, 170 + 100 + COS((px - 1) * 3.14159 / 180) * 30), 0
    LINE (-1 + 150, 170 + 100)-(-1 + 150 + SIN(px * 3.14159 / 180) * 30, 170 + 100 + COS(px * 3.14159 / 180) * 30), 15
    PUT (95 - (px - 269), 282), plog%, PSET
    FOR pq = 1 TO wq
    NEXT
  NEXT
  LINE (0, 280)-(50, 300), 0, BF
  LINE (149, 99)-(471, 300), 15, B
  LINE (150, 301)-(470, 301), 15
  InitSnow
  TIMER ON
END SUB

SUB PrepScreen
  LOCATE 12, 35
  COLOR 12
  PRINT "God Jul!"
  FOR x = 270 TO 335
    FOR y = 175 TO 190
    REM IF POINT(x + 1, y) = 12 AND POINT(x, y) = 0 THEN PSET (x, y), 1
      IF POINT(x - 1, y) = 12 AND POINT(x, y) = 0 THEN PSET (x, y), 1
    REM IF POINT(x, y + 1) = 12 AND POINT(x, y) = 0 THEN PSET (x, y), 1
      IF POINT(x, y - 1) = 12 AND POINT(x, y) = 0 THEN PSET (x, y), 1
    NEXT
  NEXT
  LINE (149, 99)-(471, 300), 15, B
  LINE (150, 301)-(470, 301), 15
END SUB

SUB StopSnow
  SHARED sts
  TIMER OFF
  sts = 1
END SUB