diff options
author | Przemyslaw <prymula76@outlook.com> | 2024-04-01 08:55:31 +0200 |
---|---|---|
committer | Przemyslaw <prymula76@outlook.com> | 2024-04-01 08:55:31 +0200 |
commit | 89656e1787faf956c3c122693edc7bb00b1908a3 (patch) | |
tree | f5c44a154b7e667343f3be20f41e4282aed1af9b /src/main.c |
Init
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 652 |
1 files changed, 652 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..861c2fb --- /dev/null +++ b/src/main.c @@ -0,0 +1,652 @@ +/*
+ * Trix - klikanie po klockach
+ * Przemysław R. Pietraszczyk
+ *
+ * paźdżiernik 2006 r.
+ *
+ * licencja: Public Domain
+ */
+#include <sys/stat.h> // mkdir
+#include "trix.h"
+
+
+
+SDL_Window *window = NULL;
+
+
+void options (void);
+void about (void);
+void hiscores(void);
+int menu();
+
+void start_game(void);
+
+SDL_Rect set_rect(int x, int y, int w, int h)
+{
+ SDL_Rect rect;
+ rect.x = x;
+ rect.y = y;
+ rect.w = w;
+ rect.h = h;
+ return rect;
+}
+
+Uint32 getpixel(SDL_Surface *surface, int x, int y)
+{
+ int bpp = surface->format->BytesPerPixel;
+ /* Here p is the address to the pixel we want to retrieve */
+ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
+
+ switch(bpp) {
+ case 1:
+ return *p;
+ case 2:
+ return *(Uint16 *)p;
+ case 3:
+ if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
+ return p[0] << 16 | p[1] << 8 | p[2];
+ else
+ return p[0] | p[1] << 8 | p[2] << 16;
+ case 4:
+ return *(Uint32 *)p;
+ default:
+ return 0;
+ }
+}
+
+void putpixel(SDL_Surface *surface, int x, int y, Uint8 R, Uint8 G, Uint8 B)
+{
+ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x *
+ surface->format->BytesPerPixel;
+ if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
+ {
+ p[0] = R;
+ p[1] = G;
+ p[2] = B;
+ }
+ else
+ {
+ p[0] = B;
+ p[1] = G;
+ p[2] = R;
+ }
+}
+
+void create_net (void) {
+
+ SDL_Rect destrect;
+ int i, j;
+
+ net = SDL_CreateRGBSurface(SDL_SWSURFACE,screen->w,screen->h,16,0,0,0,0);
+
+ destrect = set_rect(0, 0, net->w, net->h);
+ SDL_FillRect(net,&destrect, SDL_MapRGB(net->format,255,255,255));
+
+ SDL_SetColorKey(net,SDL_TRUE,getpixel(net,0,0));
+
+ /* tworzy kolumny */
+ for (i=20; i<460; i+=20)
+ for (j=40; j<560; j += 3)
+ putpixel(net, i, j, 175, 175, 175);
+
+ /* tworzy wiersze */
+ for (j=40; j<560; j+=20)
+ for (i=0; i<460; i += 3)
+ putpixel(net, i, j, 175, 175, 175);
+
+
+}
+
+/* drukuje informacje */
+void print_inscription(char * buffor, int desx, int desy) {
+
+ SDL_Rect srcrect, destrect;
+ SDL_Color bgcolor;
+ SDL_Color fgcolor;
+ SDL_Surface * image;
+
+ fgcolor.r = 255;
+ fgcolor.b = 255;
+ fgcolor.g = 255;
+ bgcolor.r = 0;
+ bgcolor.g = 0;
+ bgcolor.b = 0;
+
+ //image = TTF_RenderUTF8_Shaded(font,buffor,fgcolor, bgcolor);
+ image = TTF_RenderText_Solid(font, buffor, fgcolor);
+
+ SDL_SetColorKey(image,SDL_TRUE,getpixel(image,0,0));
+
+ destrect = set_rect(desx, desy, image->w, image->h);
+ srcrect = set_rect(0,0,image->w, image->h);
+ SDL_BlitSurface(image,&srcrect,screen,&destrect);
+ SDL_FreeSurface(image);
+
+}
+
+
+void draw_text (int x, int y, SDL_Surface * image) {
+
+ SDL_Rect srcrect, destrect;
+
+ //SDL_SetColorKey(image,SDL_TRUE,getpixel(image,0,0));
+
+ destrect = set_rect(x, y, image->w, image->h);
+ srcrect = set_rect(0,0,image->w, image->h);
+ SDL_BlitSurface(image,&srcrect,screen,&destrect);
+// SDL_UpdateRect(screen, x, y, image->w, image->h);
+}
+
+SDL_Surface * prepare_text(int r, int b, int g, char *buffer) {
+
+// SDL_Rect srcrect, destrect;
+ SDL_Surface* image;
+ SDL_Color bgcolor;
+ SDL_Color fgcolor;
+
+ fgcolor.r = r;
+ fgcolor.b = b;
+ fgcolor.g = g;
+ bgcolor.r = 0;
+ bgcolor.g = 0;
+ bgcolor.b = 0;
+
+ return TTF_RenderText_Solid(font, buffer, fgcolor);
+ //return TTF_RenderUTF8_Shaded(font,buffer,fgcolor, bgcolor);
+}
+
+void load_banner() {
+
+ banner=IMG_ReadXPMFromArray(banner_xpm);
+ printf("banner: %p\n", banner);
+
+ if(!banner) {
+ printf("IMG_ReadXPMFromArray: %s\n", IMG_GetError());
+ exit(1);
+ }
+}
+
+
+/* odczytuje plik z wynikami i umieszcza dane w strukturze */
+void load_hiscores_from_file(void) {
+
+ FILE *fp;
+ int j;
+
+ if((fp = fopen(hifile,"r")) == NULL) {
+ printf("\nCannot read from file %s\n", hifile);
+ //exit (1);
+ }
+ else {
+ for (j = 0; j < 5; ++j)
+ fscanf(fp,"%s %d", &tab_hiscores[j].name, &tab_hiscores[j].score);
+ fclose(fp);
+ }
+}
+
+void save_hiscores_to_file (void) {
+
+ FILE *fp;
+ int j;
+
+ if((fp = fopen(hifile,"w")) == NULL) {
+ printf("\nCannot write to file %s\n", hifile);
+ exit (1);
+ }
+ for (j = 0; j < 5; ++j)
+ fprintf(fp,"%s %d\n", tab_hiscores[j].name, tab_hiscores[j].score);
+ fclose(fp);
+}
+
+void create_hifile(void) {
+
+ FILE *fp;
+ int j;
+ struct tab hi[] = {{"gecko", 50},
+ {"gecko", 40},
+ {"gecko", 30},
+ {"gecko", 20},
+ {"gecko", 10}};
+
+ if((fp = fopen(hifile,"w")) == NULL) {
+ printf("\nCannot write to file %s\n", hifile);
+ //exit (1);
+ }
+ else {
+ for (j = 0; j < 5; ++j)
+ fprintf(fp,"%s %d\n", hi[j].name, hi[j].score);
+ fclose(fp);
+ }
+}
+
+void load_catalogue(void) {
+
+ FILE *fp;
+ int j;
+
+ if((fp = fopen(CATALOGUE,"r")) == NULL) {
+ printf("\nCannot read from file %s\n", CATALOGUE);
+ exit (1);
+ }
+ for (j = 0; j < N_PIC; ++j)
+ fscanf(fp,"%s", &catalogue[j]);
+ fclose(fp);
+
+}
+
+
+void load_background(int n) {
+
+ char buffor[256];
+
+ sprintf(buffor, "%s%s", BG_DIR, catalogue[n]);
+
+ SDL_FreeSurface(bg);
+
+ if ((bg = IMG_Load(buffor)) == NULL) {
+ fprintf(stdout,"Cannot load icon bitmap: %s\n", IMG_GetError ());
+ exit(1);
+ }
+}
+
+
+void load_settings(void) {
+
+ FILE *fp;
+ char line[256];
+ char * p;
+
+
+#if LINUX
+ char *path;
+ char * HOME = "HOME";
+ path=(char *)malloc(strlen(getenv(HOME))+strlen(SETTINGS)+1);
+
+ strcpy(path, getenv(HOME));
+ strcat(path, SETTINGS);
+
+ if ((fp = fopen(path,"r"))==NULL) {
+ printf ("Nie mozna otworzyc pliku: settings\n");
+
+ start_level = 1;
+ net = 0;
+ }
+#elif WINDOWS
+ if ((fp = fopen(SETTINGS,"r"))==NULL) {
+ printf ("Nie mozna otworzyc pliku: settings\n");
+
+ start_level = 1;
+ net = 0;
+ }
+#endif
+ if (fp) {
+ while((fgets(line, 256 , fp)) != NULL) {
+ if (!strncmp(line, "start", 5)) {
+ p = strrchr(line, ' ');
+ printf (" start: %d\n", atoi(p));
+ start_level = atoi(p);
+ }
+ else if (!strncmp(line, "net", 3)) {
+ p = strrchr(line, ' ');
+ printf (" net: %d\n", atoi(p));
+ use_net = atoi(p);
+ }
+ }
+ fclose(fp);
+ }
+#if LINUX
+ free(path);
+#endif
+}
+
+void save_settings(void) {
+
+ FILE *fp;
+#if LINUX
+ char *path;
+ char * HOME = "HOME";
+ path=(char *)malloc(strlen(getenv(HOME))+strlen(SETTINGS)+1);
+
+ strcpy(path, getenv(HOME));
+ strcat(path, SETTINGS);
+ printf("save settings: 1\n");
+ if ((fp = fopen(path,"w"))==NULL) {
+ printf ("Nie mozna zapisac pliku: settings\n");
+
+ start_level = 1;
+ net = 0;
+ }
+ printf("save settings: 2n");
+
+ free(path);
+#elif WINDOWS
+ if ((fp = fopen(SETTINGS,"w"))==NULL) {
+ printf ("Nie mozna zapisac pliku: settings\n");
+
+ start_level = 1;
+ net = 0;
+ }
+#endif
+
+/*
+ if((fp = fopen(SETTINGS,"w")) == NULL) {
+ printf("\nNie moge zapisac pliku: settings\n");
+// exit (1);
+ }
+*/
+ if (fp) {
+ fprintf(fp, "start %d\n", start_level);
+ fprintf(fp, "net %d\n", use_net);
+ fclose(fp);
+ }
+
+}
+
+/*
+
+void load_settings(void) {
+
+ FILE *fp;
+ char line[256];
+ char * p;
+
+ if ((fp = fopen(SETTINGS,"r"))==NULL) {
+ printf ("Nie mozna otworzyc pliku: settings\n");
+
+ start_level = 1;
+ net = 0;
+ }
+ if (fp) {
+ while((fgets(line, 256 , fp)) != NULL) {
+ if (!strncmp(line, "start", 5)) {
+ p = strrchr(line, ' ');
+ printf (" start: %d\n", atoi(p));
+ start_level = atoi(p);
+ }
+ else if (!strncmp(line, "net", 3)) {
+ p = strrchr(line, ' ');
+ printf (" net: %d\n", atoi(p));
+ use_net = atoi(p);
+ }
+ }
+ fclose(fp);
+ }
+}
+
+void save_settings(void) {
+
+ FILE *fp;
+
+ if((fp = fopen(SETTINGS,"w")) == NULL) {
+ printf("\nNie moge zapisac pliku: settings\n");
+// exit (1);
+ }
+ else {
+ fprintf(fp, "start %d\n", start_level);
+ fprintf(fp, "net %d\n", use_net);
+ fclose(fp);
+ }
+
+}
+
+*/
+
+
+void load_bitmaps(void) {
+
+ int i;
+ SDL_Rect srcrect, destrect;
+ SDL_Color bgcolor;
+ SDL_Color fgcolor;
+ SDL_Surface* icons;
+
+ fgcolor.r = 255;
+ fgcolor.g = 255;
+ fgcolor.b = 255;
+ bgcolor.r = 0;
+ bgcolor.g = 0;
+ bgcolor.b = 0;
+
+
+
+ destrect = set_rect(0,0,FIELD_SIZE,FIELD_SIZE);
+
+ if((icons = SDL_LoadBMP(ICONS)) == NULL) {
+ fprintf(stdout,"Cannot load icon bitmap: %s\n", SDL_GetError ());
+ exit(1);
+ }
+
+ /* przestrzen dla klockow */
+ for (i=0; i < 8;++i) {
+ block[i] = SDL_CreateRGBSurface(SDL_SWSURFACE,FIELD_SIZE,FIELD_SIZE,16,0,0,0,0);
+ srcrect = set_rect(i*20,0,FIELD_SIZE,FIELD_SIZE);
+ SDL_BlitSurface(icons,&srcrect, block[i],&destrect);
+ }
+
+
+ /* przestrzen dla bomby */
+ bomb = SDL_CreateRGBSurface(SDL_SWSURFACE,FIELD_SIZE,FIELD_SIZE,16,0,0,0,0);
+ srcrect = set_rect(160,0,FIELD_SIZE,FIELD_SIZE);
+ SDL_BlitSurface(icons,&srcrect, bomb,&destrect);
+ /* ustawiamy kolor przezroczystosci */
+ SDL_SetColorKey(bomb,SDL_TRUE,getpixel(bomb,0,0));
+
+ /* przestrzen dla eksplozji */
+ explode = SDL_CreateRGBSurface(SDL_SWSURFACE,FIELD_SIZE,FIELD_SIZE,16,0,0,0,0);
+ srcrect = set_rect(180,0,FIELD_SIZE,FIELD_SIZE);
+ SDL_BlitSurface(icons, &srcrect, explode, &destrect);
+ /* ustawiamy kolor przezroczystosci */
+ SDL_SetColorKey(explode,SDL_TRUE,getpixel(explode,0,0));
+
+
+ wall = SDL_CreateRGBSurface(SDL_SWSURFACE,FIELD_SIZE,FIELD_SIZE,16,0,0,0,0);
+ srcrect = set_rect(200,0,FIELD_SIZE,FIELD_SIZE);
+ SDL_BlitSurface(icons, &srcrect, wall, &destrect);
+
+ /* przestrzen dla dymku */
+ smoke = SDL_CreateRGBSurface(SDL_SWSURFACE,FIELD_SIZE,FIELD_SIZE,16,0,0,0,0);
+ srcrect = set_rect(220,0,FIELD_SIZE,FIELD_SIZE);
+ SDL_BlitSurface(icons, &srcrect, smoke, &destrect);
+ /* ustawiamy kolor przezroczystosci */
+ SDL_SetColorKey(smoke,SDL_TRUE,getpixel(smoke,0,0));
+
+ SDL_FreeSurface(icons);
+}
+
+int atrap() {
+ return START_GAME;
+}
+
+
+ int main (int argc, char ** argv)
+{
+ int done = 0;
+
+
+ if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
+ {
+ printf ("Nie mozna zainicjowac SDL: %s\n", SDL_GetError ());
+ exit (1);
+ }
+ atexit (SDL_Quit);
+
+ window = SDL_CreateWindow( "Trix", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 460, 560, SDL_WINDOW_SHOWN );
+
+ //screen = SDL_SetVideoMode (460, 560, 16, SDL_SWSURFACE | SDL_DOUBLEBUF);
+ if (window == NULL)
+ {
+ printf ("Nie mozna ustawic trybu 460x560x16: %s\n", SDL_GetError ());
+ exit (2);
+ }
+ else {
+ renderer = SDL_CreateRenderer(window, -1,0);
+ SDL_SetRenderDrawColor ( renderer ,65, 190, 215 , 255 );
+ SDL_RenderClear ( renderer );
+ //Get window surface
+ screen= SDL_GetWindowSurface( window );
+ }
+
+ /* inicjalizacja fontow */
+ if(TTF_Init()==-1) {
+ printf("TTF_Init: %s\n", TTF_GetError());
+ exit(2);
+ }
+ atexit (TTF_Quit);
+ if((font = TTF_OpenFont(NAMEFONT,FONTSIZE)) == NULL) {
+ printf("TTF_OpenFont: %s\n", TTF_GetError());
+ exit(1);
+ }
+
+#if LINUX
+ char * FILE_HISCORES_FILE = "/.trix/hiscores";
+ char * HOME = "HOME";
+ char *path;
+ int c;
+
+ path=(char *)malloc(strlen(getenv(HOME))+strlen("/.trix")+1);
+ strcpy(path, getenv(HOME));
+ strcat(path, "/.trix");
+
+
+
+ /* jesli brak katalogu to zwraca -1 */
+ if ((c = chdir(path))) {
+
+ perror("chdir");
+ if (mkdir(path, 0777)) {
+ perror("mkdir");
+ }
+
+ }
+ printf ("\n\nc: %d\n\n", c);
+ free(path);
+
+ hifile=(char *)malloc(strlen(getenv(HOME))+strlen(FILE_HISCORES_FILE)+1);
+
+ strcpy(hifile, getenv(HOME));
+ strcat(hifile, FILE_HISCORES_FILE);
+
+ if (access(hifile, F_OK)==0){
+ printf("PLIK istnieje %s",hifile);
+ //free(hifile);
+
+ }
+ else {
+ printf("PLIK nie istnieje %s",hifile);
+ create_hifile();
+ //free(hifile);
+ }
+
+
+ SDL_Surface * icon = SDL_LoadBMP("/usr/share/trix/img/trix-icon.bmp");
+ SDL_SetWindowIcon(window, icon);
+ //load_hiscores_from_file();
+
+#elif WINDOWS
+ char * FILE_HISCORES = "\\trix.txt";
+ //char * FILE_HISCORES = "/trix.txt";
+
+ //char * PATH_TRIX = "/.trix";
+ char * HOME = "HOMEPATH";
+ //char *path;
+ int c;
+
+ hifile=(char *)malloc(strlen(getenv(HOME))+strlen(FILE_HISCORES)+1);
+
+ strcpy(hifile, getenv(HOME));
+ strcat(hifile, FILE_HISCORES);
+
+ if (access(hifile, F_OK)==0){
+ printf("PLIK istnieje %s\n", hifile);
+ //free(file);
+ char bufor[48];
+
+ FILE * fp = fopen(hifile, "r");
+ for (int j = 0; j < 5; ++j)
+ fscanf(fp,"%s %d", &tab_hiscores[j].name, &tab_hiscores[j].score);
+ fclose(fp);
+
+
+
+ }
+ else{
+ printf("PLIK nie istnieje %s\n",hifile);
+
+ create_hifile();
+/*
+ FILE * fp;
+ struct tab hi[] = {{"gecko", 50},
+ {"gecko", 40},
+ {"gecko", 30},
+ {"gecko", 20},
+ {"gecko", 10}};
+
+ if((fp = fopen(hifile,"w")) == NULL) {
+ printf("\nCannot write to file %s\n", hifile);
+ exit (1);
+ }
+ for (int j = 0; j < 5; ++j){
+ fprintf(fp,"%s %d\n", hi[j].name, hi[j].score);
+ strcpy(tab_hiscores[j].name , hi[j].name);
+ tab_hiscores[j].score = hi[j].score;
+ }
+ fclose(fp);
+
+ /
+ printf ("Zapisałem: %s\n", hifile);
+ */
+ }
+#endif
+
+ load_hiscores_from_file();
+ printf("\nAAAA\n");
+ start_level = 1;
+ load_settings();
+ printf("BBBB\n");
+
+ load_bitmaps();
+ printf("CCCC\n");
+
+ load_banner();
+ printf("DDDD\n");
+
+ printf ("B\n");
+
+ load_catalogue();
+ printf("EEEEEE\n");
+
+ create_net();
+ printf("FFFFF\n");
+
+ while(!done) {
+ switch (menu()) {
+ //switch (atrap()) {
+ case START_GAME:
+ start_game();
+ printf ("start game\n");
+ break;
+ case HISCORES:
+ hiscores();
+ printf ("hiscores\n");
+ break;
+ case OPTIONS:
+ options();
+ printf ("options\n");
+ break;
+ case ABOUT:
+ about();
+ printf ("about\n");
+ break;
+ case QUIT_GAME:
+ done = 1;
+ break;
+ }
+ }
+
+
+ SDL_DestroyTexture(tex_screen);
+ SDL_DestroyRenderer(renderer);
+ SDL_DestroyWindow(window);
+ //free(hifile);
+
+}
|