DEADSOFTWARE

Добавлена звезда и гравитация
[netwar.git] / game.c
diff --git a/game.c b/game.c
index 896fb8eb25cdddf5a8de56e0b801df122877b1cd..3acaa36a82a9a558f5501e349e5bc29c7e31171b 100644 (file)
--- a/game.c
+++ b/game.c
@@ -6,9 +6,17 @@
 
 #include "game.h"
 
-#define SPEED      (0.000006 * TICK_DELAY)
-#define ROTATE     (0.000006 * TICK_DELAY)
-#define BULL_SPEED (0.0008   * TICK_DELAY)
+#define SPEED      (0.03 / TICK)
+#define ROTATE     (0.03 / TICK)
+#define BULL_SPEED (0.4  / TICK)
+
+#define MAX_SPEED  (0.3 / TICK)
+#define MAX_ROTATE (0.3 / TICK)
+
+// Цифры взяты с потолка, но вроде неплохо подобраны
+#define G      3.673e-4
+#define M_STAR 10.0
+#define M_SHIP 0.1
 
 Player g_player[MAX_PLAYERS];
 Bullet g_bullet[MAX_BULLETS];
@@ -53,10 +61,17 @@ static int freebullet() {
 static void moveplayer(int id, float speed) {
        g_player[id].vx += speed * cos(g_player[id].r * 2 * M_PI);
        g_player[id].vy += speed * sin(g_player[id].r * 2 * M_PI);
+
+       if(fabs(g_player[id].vx) > MAX_SPEED)
+               g_player[id].vx = copysignf(MAX_SPEED, g_player[id].vx);
+       if(fabs(g_player[id].vy) > MAX_SPEED)
+               g_player[id].vy = copysignf(MAX_SPEED, g_player[id].vy);
 }
 
 static void roteplayer(int id, float speed) {
        g_player[id].vr += speed;
+       if(fabs(g_player[id].vr) > MAX_ROTATE)
+               g_player[id].vr = copysignf(MAX_ROTATE, g_player[id].vr);
 }
 
 static void fireplayer(int id) {
@@ -85,9 +100,17 @@ static void checkspacebound(float * a) {
        *a = x;
 }
 
+static float length(float x1, float y1, float x2, float y2) {
+       return sqrtf(powf(x1 - x2, 2) + powf(y1 - y2, 2));
+}
+
 static bool collide(float x1, float y1, float r1, float x2, float y2, float r2) {
-       float l = sqrtf(powf(x1 - x2, 2) + powf(y1 - y2, 2));
-       return ((l - r1 - r2) <= 0);
+       return ((length(x1, y1, x2, y2) - r1 - r2) <= 0);
+}
+
+static void gravity(float * vx, float * vy, float x, float y) {
+       *vx += copysign(G * M_STAR * M_SHIP / length(0, 0, x, y), x * -1);
+       *vy += copysign(G * M_STAR * M_SHIP / length(0, 0, x, y), y * -1);
 }
 
 void g_player_does(unsigned int id, DoesBits code) {
@@ -112,12 +135,18 @@ void g_update() {
                        g_player[i].x += g_player[i].vx;
                        g_player[i].y += g_player[i].vy;
                        g_player[i].r += g_player[i].vr;
+
+                       gravity(&g_player[i].vx, &g_player[i].vy, g_player[i].x, g_player[i].y);
+
                        checkspacebound(&g_player[i].x);
                        checkspacebound(&g_player[i].y);
 
                        ++g_player[i].shoot;
                        if(g_player[i].shoot > PLAYER_SHOOT)
                                g_player[i].shoot = PLAYER_SHOOT;
+
+                       if(collide(g_player[i].x, g_player[i].y, PLAYER_SIZE, 0, 0, STAR_SIZE))
+                               g_player[i].live = false;
                }
        }