JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
bump version to 0.5.8
[vor.git] / main.c
diff --git a/main.c b/main.c
index 6f4fa1c..0af1fdd 100644 (file)
--- a/main.c
+++ b/main.c
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 
 #include "font.h"
 
 #include "args.h"
 #include "common.h"
-#include "config.h"
+#include <config.h>
+#include "vorconfig.h"
 #include "dust.h"
 #include "file.h"
 #include "float.h"
@@ -59,6 +61,9 @@ SDL_Surface
 
 font *g_font;
 
+#define ENGINEDOT 0
+#define BANGDOT 1
+
 struct dot {
        int active;
        float x, y;
@@ -66,14 +71,18 @@ struct dot {
        float mass;   // in DOT_MASS_UNITs
        float decay;  // rate at which to reduce mass.
        int heat;     // heat multiplier (color).
+       uint8_t type;  // BANGDOT or ENGINEDOT
 };
 
+void draw(void);
+
 struct dot edot[MAXENGINEDOTS], *dotptr = edot;
 struct dot bdot[MAXBANGDOTS];
 
 // Other global variables
 char topline[1024];
 char *initerror = "";
+int screenshot_number = 0;
 
 struct ship ship = { SHIP, 0, NULL, XSIZE/2, YSIZE/2, BARRIER_SPEED, 0.0 };
          
@@ -113,12 +122,12 @@ char *msgs[2][3] = {
        {
                "Press SPACE for normal game",
                "Press '1' for easy game",
-               "http://jasonwoof.org/vor"
+               "https://sametwice.com/vor"
        },
        {
                "Press SPACE for easy game",
                "Press '2' for normal game",
-               "http://jasonwoof.org/vor"
+               "https://sametwice.com/vor"
        }
 };
 
@@ -133,11 +142,28 @@ extern int optind, opterr, optopt;
 
 // ************************************* FUNCS
 
+#ifdef HAVE_NANOSLEEP
+void
+tiny_sleep() {
+       struct timespec t;
+       t.tv_sec = 0;
+       t.tv_nsec = 1;
+       nanosleep(&t, 0);
+}
+#else
+#define tiny_sleep()
+#endif
+
 void
-init_engine_dots() {
+init_dots() {
        int i;
        for(i = 0; i<MAXENGINEDOTS; i++) {
                edot[i].active = 0;
+               edot[i].type = ENGINEDOT;
+       }
+       for(i = 0; i<MAXBANGDOTS; i++) {
+               bdot[i].active = 0;
+               bdot[i].type = BANGDOT;
        }
 }
 
@@ -261,6 +287,10 @@ new_bang_dots(struct sprite *s)
        if(SDL_MUSTLOCK(img)) { SDL_UnlockSurface(img); }
 }
 
+void
+kill_rock(struct rock *r) {
+       r->x = -200;
+}
 
 void
 move_dot(struct dot *d)
@@ -279,6 +309,13 @@ move_dot(struct dot *d)
                        if(hit) if(hit->type != SHIP) {
                                d->active = 0;
                                mass = sprite_mass(hit);
+                               if(d->type == BANGDOT) {
+                                       struct rock *rock = (struct rock*)hit;
+                                       rock->life -= (d->dx - hit->dx) * (d->dx - hit->dx) + (d->dy - hit->dy) * (d->dy - hit->dy);
+                                       if(rock->life < 0) {
+                                               kill_rock(rock);
+                                       }
+                               }
                                hit->dx += DOT_MASS_UNIT * d->mass * (d->dx - hit->dx) / mass;
                                hit->dy += DOT_MASS_UNIT * d->mass * (d->dy - hit->dy) / mass;
                        }
@@ -361,6 +398,9 @@ void
 toggle_fullscreen() {
        opt_fullscreen = 1 - opt_fullscreen;
        set_video_mode();
+       if(paused) {
+               draw();
+       }
 }
 
 
@@ -431,7 +471,7 @@ init(void) {
                exit(1);
        }
 
-       init_engine_dots();
+       init_dots();
        init_dust();
 
        init_sprites();
@@ -515,7 +555,7 @@ draw_title_page(void)
        x = (XSIZE-font_width(text))/2 + cos(fadetimer/4.5)*10;
        font_write(x,YSIZE-100 + cos(fadetimer/3)*5,text);
 
-       text = "Version " VERSION;
+       text = "Version " PACKAGE_VERSION;
        x = (XSIZE-font_width(text))/2 + sin(fadetimer/4.5)*10;
        font_write(x,YSIZE-50 + sin(fadetimer/2)*5,text);
 }
@@ -676,9 +716,28 @@ gameloop() {
                                                                return;
                                                        case SDLK_3:
                                                        case SDLK_PRINT:
-                                                               // FIXME make a unique filename like vor-screenshot-<pid>-<count>.bmp
-                                                               SDL_SaveBMP(surf_screen, "snapshot.bmp");
+                                                               {
+                                                                       FILE *screenshot_fp;
+                                                                       char tmp[30];
+                                                                       char *screenshot_filename = &(tmp[0]);
+                                                                       for(;;) {
+                                                                               snprintf(screenshot_filename, 30, "vor-screenshot-%02i.bmp", screenshot_number++);
+                                                                               screenshot_fp = fopen(screenshot_filename, "r");
+                                                                               if(screenshot_fp) {
+                                                                                       fclose(screenshot_fp);
+                                                                               } else {
+                                                                                       break;
+                                                                               }
+                                                                       }
+                                                                       SDL_SaveBMP(surf_screen, screenshot_filename);
+                                                               }
                                                                break;
+                                                       case SDLK_SPACE:
+                                                               if(state != GAMEPLAY && state != DEAD_PAUSE) {
+                                                                       // don't conflict with space key to start a new game
+                                                                       break;
+                                                               }
+                                                               // else fall through
                                                        case SDLK_p:
                                                        case SDLK_PAUSE:
                                                                paused = !paused;
@@ -816,6 +875,8 @@ gameloop() {
                        state = HIGH_SCORE_DISPLAY;
                        state_timeout = 400;
                }
+
+               tiny_sleep();
        }
 }