/*
 * snake.h
 *
 *  Created on: 18-12-2012
 *      Author: Mirosław Kardaś
 */

#ifndef SNAKE_H_
#define SNAKE_H_

//************* DOMYŚLNA ILOŚĆ GRACZY ******************
#define SNAKE_CNT 1

//------------------- definicje preprocesora
#define CUR_UP 32
#define CUR_DOWN 33
#define CUR_LEFT 17
#define CUR_RIGHT 16

#define CUR1_UP 2
#define CUR1_DOWN 5
#define CUR1_LEFT 4
#define CUR1_RIGHT 6

#define MENU 36
#define KEY_OK 59



typedef struct {
	int8_t max_score;
	uint8_t speed;
	uint8_t users_cnt;
} TCFG;


//------------------- definicje typów
typedef struct {
	uint8_t speed;							// szybkość grania
	int8_t punkty;							// ilość zdobytych punktów gracza (węża)
	char face;								// wygląd węża
	uint8_t keys[4];						// kody klawiszy kursorów IR left,right,up,down
	uint8_t direction;						// kierunek pełzania węża
	uint8_t body_len;						// długość ciała węża
	uint8_t head;							// pozycja głowy węża w buforze
	uint16_t byx[64];						// bufor pozycji (Y,X) ciała węża (każdego segmentu)
	void (*draw_snake_fun)(void * tsn);		// wskaźnik do funkcji rysującej węża
} TSNAKE;									// nazwa nowego typu węża TSNAKE


inline int8_t get_y( uint16_t yx ) {
	return (int8_t)(yx>>8);
}

inline int8_t get_x( uint16_t yx ) {
	return (int8_t)yx;
}

enum {left, right, down, up};				// typ wyliczeniowy - kierunki/kursory/klawisze

enum {min=20, mid=30, max=40};

//------------------- deklaracje zmiennych globalnych
extern uint8_t restart;						// restart gry
extern int8_t snake_cnt;					// iloć węży w grze

extern TCFG ram_cfg;


//------------------- deklaracje funkcji dostępnych na zewnątrz biblioteki SNAKE
void snake_init( uint8_t cnt );					// inicjalizacja węży


void draw_snake(TSNAKE * tsn);

TSNAKE * snakes( int8_t n );

void register_start_screen_callback( void (*callback)(uint8_t usr_cnt) );
void register_end_screen_callback( void (*callback)(uint8_t usr_cnt) );


void check_and_load_defaults( void );
void load_defaults( void );
void copy_ram_to_eem( void );


#endif /* SNAKE_H_ */
