/*
  Zkusebni program pro efekt snih v AA-lib
  Pro int21h napsal BOby (<)2006
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <aalib.h>
#include <math.h>

#define VLOCEK 255

typedef struct {
	int x,y,z;
} flake_t;

void res(aa_context *scr) {
	aa_resize(scr);
}

int main(int argc, char **argv) {
	aa_context *scr; 
	if (!aa_parseoptions(NULL,NULL,&argc,argv) || argc!=1) {
		printf("%s\nUssage:\n%s",argv[0],aa_help);
		exit(2);
	}
	scr=aa_autoinit(&aa_defparams); /*Inicializace obrazovky*/
	if (scr==NULL) {
		fprintf(stderr,"Auto-initialization failed.Try -driver <dr>\n");
        	exit(3);
	}
	srand(time(NULL));
	aa_autoinitkbd(scr,AA_SENDRELEASE);/*Ovladac klavesnice */
	aa_hidecursor(scr);
	flake_t flake[VLOCEK];
	aa_resizehandler(scr,res); /* Hlida zmeny rozliseni okna */
	int i=0;
	for (i=0;i<VLOCEK;i++) {
		flake[i].x=(rand()%aa_imgwidth(scr))+1;
		flake[i].y=(rand()%aa_imgheight(scr))+1;
		flake[i].z=(rand()%80)+50;
	}
	while (!aa_getkey(scr,0)) {
		for (i=0;i<VLOCEK;i++) {
			aa_putpixel(scr,flake[i].x,flake[i].y,0);/*Erase*/
			flake[i].y+=(int) (flake[i].z/200)+1;
			flake[i].x+=(rand()%3);
			flake[i].x-=(rand()%3);
			if ((flake[i].x>0) && (flake[i].x<aa_imgwidth(scr)) &&
			    (flake[i].y>0) && (flake[i].y<aa_imgheight(scr))) {
				aa_putpixel(scr,flake[i].x,flake[i].y,flake[i].z);
			} else {
				flake[i].y=1;
			}
		}
		aa_render(scr,&aa_defrenderparams,0, 0,/*Vyrendruje buffer*/
				aa_scrwidth(scr),
				aa_scrheight(scr));
		aa_flush(scr);/*Prohodi virtual screen na obrazovku */
	}
	aa_close(scr);
	return 0;
}
