{*
 Ukazkovy program pro efekt snih
 Resen pres simulaci 3D
 Pro int21h napsal BOby (<)2006
*}
program snih;

uses crt;

const COUNT=255;
      SPEED=5; {5 je default}

type Tflake = record
      x,y:word;
      z:byte;
     end;

var flake:array[0..COUNT] of TFlake;
    i:byte;
    step:byte;

{* Procedury pro praci s modem $13 *}
{*    Muzete nahradit vlastnimi    *}
procedure InitGraph;assembler;
asm
 mov ax,0013h {00=funkce na zmenu modu;13h=320x200x256}
 int 10h
end;
procedure CloseGraph;assembler;
asm
 mov ax,0003h {03h=80x25x16}
 int 10h
end;
procedure setcolor(i,r,g,b:byte);
begin
 {Nastaveni barvy pres port.
  Je to rychlejsi nez pres preruseni}
 port[$3c8]:=i;
 port[$3c9]:=r;
 port[$3c9]:=g;
 port[$3c9]:=b;
end;
procedure putpixel(x,y:word;c:byte);
begin
 {Zapis barvu do obrazove pameti. Proste putpixel}
 mem[$a000:x+y*320]:=c; { $a000=Video pamet pro mod $13}
end;

Begin
 Randomize;
 InitGraph;
 for i:=1 to 100 do {Nejakou sedou paletu (ale ne uplne tmavou)}
  setcolor(i,i,i,i);
 for i:=1 to COUNT do {Nahazi vlocky na nahodne pozice}
  begin
   flake[i].x:=random(318)+1;
   flake[i].y:=random(198)+1;
   flake[i].z:=random(100);
  end;
 repeat
  for i:=1 to COUNT do
   begin
    putpixel(flake[i].x,flake[i].y,0);
    flake[i].y:=flake[i].y+(flake[i].z div 50)+1;
    flake[i].x:=flake[i].x+random(3);
    flake[i].x:=flake[i].x-random(3);
    if ((flake[i].x>0) and (flake[i].x<320) and (flake[i].y>0) and (flake[i].y<200)) then
     putpixel(flake[i].x,flake[i].y,flake[i].z)
    else
     flake[i].y:=1;
    end;
  delay(40);
 until keypressed;
 readkey;
 CloseGraph;
End.
