From 4d7c01f0782132adcbae7b428c173753b7d4f61d Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Tue, 5 Feb 2013 23:10:46 +0000
Subject: [PATCH] [Add] Basic Gui.   -- Minimap.   -- Health bars.

---
 gfx/gui/frame.png | Bin 0 -> 4079 bytes
 gfx/gui/frame.xcf | Bin 0 -> 23076 bytes
 src/main.c        |   4 +
 src/main.h        |   5 +-
 src/opengl.c      |  22 +++---
 src/pilot.c       |  25 ++++++-
 src/pilot.h       |   5 ++
 src/player.c      | 187 +++++++++++++++++++++++++++++++++++++++++++++-
 src/player.h      |   3 +
 src/ship.c        |   6 +-
 src/ship.h        |   2 +-
 src/weapon.c      |   6 +-
 12 files changed, 242 insertions(+), 23 deletions(-)
 create mode 100644 gfx/gui/frame.png
 create mode 100644 gfx/gui/frame.xcf

diff --git a/gfx/gui/frame.png b/gfx/gui/frame.png
new file mode 100644
index 0000000000000000000000000000000000000000..c92e2d2f08093180f7db404126c86110588d1f0c
GIT binary patch
literal 4079
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
P4hJDl+glY`T!{WJ*ObQ}

literal 0
HcmV?d00001

diff --git a/gfx/gui/frame.xcf b/gfx/gui/frame.xcf
new file mode 100644
index 0000000000000000000000000000000000000000..b8b8bc722e88fdcbc87ca820941005a781706d52
GIT binary patch
literal 23076
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
C$GU$2

literal 0
HcmV?d00001

diff --git a/src/main.c b/src/main.c
index 98a6696..122a607 100644
--- a/src/main.c
+++ b/src/main.c
@@ -222,10 +222,12 @@ int main(int argc, char** argv) {
     if(joystick_init())
       WARN("Error initializing joystick input");
     if(namjoystick != NULL) {
+      // Use a joystick name to find joystick.
       joystick_use(joystick_get(namjoystick));
       free(namjoystick);
     }
     else if(indjoystick >= 0)
+      // Must be using an id instead.
       joystick_use(indjoystick);
   }
 
@@ -234,6 +236,7 @@ int main(int argc, char** argv) {
     WARN("Error initializing AI");
 
   gl_fontInit(NULL, NULL, 16);
+  gui_init(); // Init the GUI crap.
 
   // Data loading.
   outfit_load();
@@ -267,6 +270,7 @@ int main(int argc, char** argv) {
   weapon_exit();  // Destroy all active weapons.
   space_exit();   // Clean up the universe!!!
   pilots_free();  // Free the pilots, they where locked up D:
+  gui_free();     // Free up the gui.
   ships_free();
   outfit_free();
 
diff --git a/src/main.h b/src/main.h
index baef2c0..8a2ec08 100644
--- a/src/main.h
+++ b/src/main.h
@@ -3,7 +3,10 @@
 #define MALLOC_L(type)(malloc(sizeof(type)))
 #define CALLOC_L(type)(calloc(1, sizeof(type)))
 
-#define ABS(X)  ((X<0)?-X:X)
+#define ABS(x)  ((x<0)?-(x):(x))
+
+#define MAX(x,y)  (((x)>(y))?(x):(y))
+#define MIN(x,y)  (((x)>(y))?(y):(x))
 
 extern char* data; // Modifiable datafile.
 #define DATA data // Data file.
diff --git a/src/opengl.c b/src/opengl.c
index 3486090..c609230 100644
--- a/src/opengl.c
+++ b/src/opengl.c
@@ -17,6 +17,10 @@
 
 #define FONT_DEF "../gfx/fonts/FreeSans.ttf"
 
+// offsets to Adjust the pilot's place onscreen to be in the middle, even with the GUI.
+extern double gui_xoff;
+extern double gui_yoff;
+
 // The screen info, gives data of current opengl settings.
 gl_info gl_screen;
 
@@ -256,8 +260,8 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons
 
   glMatrixMode(GL_PROJECTION);
   glPushMatrix(); // Projection translation matrix.
-  glTranslated(VX(*pos) - VX(*gl_camera) - sprite->sw/2.,
-        VY(*pos) -VY(*gl_camera) - sprite->sh/2., 0.);
+  glTranslated(VX(*pos) - VX(*gl_camera) - sprite->sw/2. + gui_xoff,
+        VY(*pos) -VY(*gl_camera) - sprite->sh/2. + gui_yoff, 0.);
   glScalef((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.);
 
   // Actual blitting....
@@ -293,15 +297,15 @@ void gl_blitStatic(const gl_texture* texture, const Vec2* pos) {
   // Actual blitting..
   glBindTexture(GL_TEXTURE_2D, texture->texture);
   glBegin(GL_TRIANGLE_STRIP);
-    glColor4ub(1., 1., 1., 1.);
+    glColor4d(1., 1., 1., 1.);
     glTexCoord2d(0., 0.);
       glVertex2d(0., 0.);
-    glTexCoord2d(texture->w/texture->rw, 0.);
-      glVertex2d(texture->w, 0.);
-    glTexCoord2d(0., texture->h/texture->rh);
-      glVertex2d(0., texture->h);
-    glTexCoord2d(texture->w/texture->rw, texture->h/texture->rh);
-      glVertex2d(texture->w, texture->h);
+    glTexCoord2d(texture->sw/texture->rw, 0.);
+      glVertex2d(texture->sw, 0.);
+    glTexCoord2d(0., texture->sh/texture->rh);
+      glVertex2d(0., texture->sh);
+    glTexCoord2d(texture->sw/texture->rw, texture->sh/texture->rh);
+      glVertex2d(texture->sw, texture->h);
   glEnd();
 
   glPopMatrix(); // Pop the translation matrix.
diff --git a/src/pilot.c b/src/pilot.c
index 7fa82d6..66a78e2 100644
--- a/src/pilot.c
+++ b/src/pilot.c
@@ -75,12 +75,16 @@ void pilot_hit(Pilot* p, double damage_shield, double damage_armor) {
     // Shields can take part of the blow.
     p->armor -= p->shield/damage_shield*damage_armor;
   }
+  else if(p->armor-damage_armor > 0.)
+    p->armor -= damage_armor;
+  else
+    p->armor = 0.;
 }
 
 // Render the pilot.
 void pilot_render(Pilot* p) {
   int sprite;
-  gl_texture* t = p->ship->gfx_ship;
+  gl_texture* t = p->ship->gfx_space;
 
   // Get the sprite corresponding to the direction facing.
   sprite = (int)(p->solid->dir / (2.0*M_PI / (t->sy * t->sx)));
@@ -90,6 +94,15 @@ void pilot_render(Pilot* p) {
 
 // Update the pilot.
 static void pilot_update(Pilot* pilot, const double dt) {
+  // Regeneration.
+  if(pilot->armor < pilot->armor_max)
+    pilot->armor += pilot->ship->armor_regen*dt;
+  else
+    pilot->shield += pilot->ship->shield_regen*dt;
+
+  if(pilot->armor > pilot->armor_max) pilot->armor = pilot->armor_max;
+  if(pilot->armor > pilot->armor_max) pilot->armor = pilot->armor_max;
+
   if((pilot->solid->dir > 2.*M_PI) || (pilot->solid->dir < 0.0))
     pilot->solid->dir = fmod(pilot->solid->dir, 2.*M_PI);
 
@@ -126,9 +139,13 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, const double dir, const Ve
   pilot->solid = solid_create(ship->mass, dir, pos, vel);
 
   // Max shields armor.
-  pilot->armor = ship->armor;
-  pilot->shield = ship->shield;
-  pilot->energy = ship->energy;
+  pilot->armor_max  = ship->armor;
+  pilot->shield_max = ship->shield;
+  pilot->energy_max = ship->energy;
+  pilot->armor      = pilot->armor_max;
+  pilot->shield     = pilot->shield_max;
+  pilot->energy     = pilot->energy_max;
+
 
   // Initially idle.
   pilot->task = NULL;
diff --git a/src/pilot.h b/src/pilot.h
index f3a4832..84e34ac 100644
--- a/src/pilot.h
+++ b/src/pilot.h
@@ -5,6 +5,10 @@
 #include "outfit.h"
 #include "ship.h"
 
+// Aproximation for pilot size.
+#define PILOT_SIZE_APROX  0.8
+
+// Creation flags.
 #define PILOT_PLAYER    1 // Pilot is a player.
 
 typedef struct {
@@ -24,6 +28,7 @@ typedef struct Pilot {
 
   // Current health.
   double armor, shield, energy;
+  double armor_max, shield_max, energy_max;
 
   void (*think)(struct Pilot*); // AI thinking for the pilot.
   void (*update)(struct Pilot*, const double); // Update the pilot.
diff --git a/src/player.c b/src/player.c
index 4c66d0f..5f177bf 100644
--- a/src/player.c
+++ b/src/player.c
@@ -2,8 +2,11 @@
 #include "main.h"
 #include "pilot.h"
 #include "log.h"
+#include "opengl.h"
 #include "player.h"
 
+#define POW2(x) ((x)*(x))
+
 #define KEY_PRESS    1.
 #define KEY_RELEASE -1.
 
@@ -18,17 +21,199 @@ static Keybind** player_input; // Contains the players keybindings.
 // Name of each keybinding.
 const char* keybindNames[] = { "accel", "left", "right", "primary" };
 
+// Player stuff.
 Pilot* player = NULL; // extern in pilot.h
 static double player_turn = 0.; // Turn velocity from input.
 static double player_acc  = 0.; // Accel velocity from input.
 static int player_primary = 0; // Player is shooting primary weapon.
 
+// Pilot stuff for GUI.
+extern Pilot** pilot_stack;
+extern int pilots;
+
+// GUI crap.
+// Need these offsets to render properly. -- Used in opengl.c
+// -- Colors.
+typedef struct {
+  double r, g, b, a;
+} Color;
+#define COLOR(x) (x).r, (x).g, (x).b, (x).a
+Color cRadar_player     = { .r = 0.4, .g = 0.8, .b = 0.9, .a = 1. };
+Color cRadar_neut       = { .r = 0.8, .g = 0.8, .b = 0.8, .a = 1. };
+Color cShield           = { .r = 0.2, .g = 0.2, .b = 0.8, .a = 1. };
+Color cArmor            = { .r = 0.5, .g = 0.5, .b = 0.5, .a = 1. };
+Color cEnergy           = { .r = 0.2, .g = 0.8, .b = 0.2, .a = 1. };
+
+typedef enum { RADAR_RECT, RADAR_CIRCLE } RadarShape;
+
+typedef struct {
+  double w,h; // Dimensions.
+  RadarShape shape;
+  double res; // Resolution.
+} Radar;
+
+typedef struct {
+  double w,h;
+} Rect;
+
+typedef struct {
+  // graphics.
+  gl_texture* gfx_frame;
+  Radar radar;
+  Rect shield, armor, energy;
+  // Positions.
+  Vec2 pos_frame;
+  Vec2 pos_radar;
+  Vec2 pos_shield, pos_armor, pos_energy;
+} GUI;
+
+GUI gui; // Le Gui!
+
+double gui_xoff = 0.;
+double gui_yoff = 0.;
+
 extern void pilot_render(Pilot* pilot); // Extern is in Pilot.*
 
 // Render the player.
 void player_render(void) {
   pilot_render(player);
-  // Render gui.
+
+  // GUI!
+  // -- Frame.
+  gl_blitStatic(gui.gfx_frame, &gui.pos_frame);
+  // -- Radar.
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  glTranslated(VX(gui.pos_radar) - gl_screen.w/2. + gui.radar.w/2.,
+        VY(gui.pos_radar) - gl_screen.h/2. - gui.radar.h/2., 0.);
+
+  glBegin(GL_POINTS);
+    // Player.
+    glColor4d(COLOR(cRadar_player));
+    glVertex2d(  0.,  2. );
+    glVertex2d(  0.,  1. );
+    glVertex2d(  0.,  0. );
+    glVertex2d(  0., -1. );
+    glVertex2d(  0., -2. );
+    glVertex2d(  2.,  0. );
+    glVertex2d(  2.,  0. );
+    glVertex2d( -1.,  0. );
+    glVertex2d( -2.,  0. );
+
+  int i;
+  double x, y, sx, sy;
+  Pilot* p;
+  switch(gui.radar.shape) {
+    case RADAR_RECT:
+    glEnd(); // Put end to those points.
+      for(i = 1; i < pilots; i++) {
+        p   = pilot_stack[i];
+        x   = (p->solid->pos.x - player->solid->pos.x) / gui.radar.res;
+        y   = (p->solid->pos.y - player->solid->pos.y) / gui.radar.res;
+        sx  = PILOT_SIZE_APROX/2. * p->ship->gfx_space->sw / gui.radar.res;
+        sy  = PILOT_SIZE_APROX/2. * p->ship->gfx_space->sh / gui.radar.res;
+
+        if((ABS(x) > gui.radar.w / 2+sx) || (ABS(y) > gui.radar.h / 2. + sy))
+          continue; // Pilot isn't in range.
+
+        glBegin(GL_QUADS);
+          glColor4d(COLOR(cRadar_neut));
+          glVertex2d(MAX(x-sx, -gui.radar.w/2.), MIN(y+sx,  gui.radar.w/2.)); // top left.
+          glVertex2d(MIN(x+sx,  gui.radar.w/2.), MIN(y+sy,  gui.radar.h/2.)); // Top right.
+          glVertex2d(MAX(x+sx,  gui.radar.w/2.), MAX(y-sy, -gui.radar.h/2.)); // Bottom right.
+          glVertex2d(MAX(x-sx, -gui.radar.w/2.), MIN(y-sy, -gui.radar.h/2.)); // Bottom left.
+        glEnd(); // The Quads.
+      }
+    case RADAR_CIRCLE:
+      for(i = 1; i < pilots; i++) {
+        p = pilot_stack[i];
+        glColor4d(COLOR(cRadar_neut));
+        glVertex2d((p->solid->pos.x - player->solid->pos.x) / gui.radar.res,
+              (p->solid->pos.y - player->solid->pos.y) / gui.radar.res);
+      }
+        glEnd();
+      break;
+  }
+  glPopMatrix(); // GL_PROJECTION.
+
+  // Health.
+  glBegin(GL_QUADS); // Shield.
+    glColor4d(COLOR(cShield));
+    x   = VX(gui.pos_shield) - gl_screen.w/2.;
+    y   = VY(gui.pos_shield) - gl_screen.h/2.;
+    sx  = player->shield / player->shield_max * gui.shield.w;
+    sy  = gui.shield.h;
+    glVertex2d(x, y);
+    glVertex2d(x+sx, y);
+    glVertex2d(x+sx, y-sy);
+    glVertex2d(x, y-sy);
+  glEnd();
+  
+  glBegin(GL_QUADS); // Armor.
+  glColor4d(COLOR(cArmor));
+    x   = VX(gui.pos_armor) - gl_screen.w/2.;
+    y   = VY(gui.pos_armor) - gl_screen.h/2.;
+    sx  = player->armor / player->armor_max * gui.armor.w;
+    sy  = gui.armor.h;
+    glVertex2d(x, y);
+    glVertex2d(x+sx, y);
+    glVertex2d(x+sx, y-sy);
+    glVertex2d(x, y-sy);
+  glEnd();
+  
+  glBegin(GL_QUADS); // Energy.
+    glColor4d(COLOR(cEnergy));
+    x   = VX(gui.pos_energy) - gl_screen.w/2.;
+    y   = VY(gui.pos_energy) - gl_screen.h/2.;
+    sx  = player->energy / player->energy_max * gui.energy.w;
+    sy  = gui.energy.h;
+    glVertex2d(x, y);
+    glVertex2d(x+sx, y);
+    glVertex2d(x+sx, y-sy);
+    glVertex2d(x, y-sy);
+  glEnd();
+}
+
+// Init GUI.
+int gui_init(void) {
+// -- Frame.
+  gui.gfx_frame = gl_newImage("../gfx/gui/frame.png");
+  vect_csetmin(&gui.pos_frame,
+        gl_screen.w - gui.gfx_frame->w,   // x.
+        gl_screen.h - gui.gfx_frame->h);  // y.
+  gui_xoff = -gui.gfx_frame->w/2.; // Offset is only horizontal and on the right side.
+
+// -- Radar.
+  gui.radar.res = 10.;
+  gui.radar.w   = 128.;
+  gui.radar.h   = 128.;
+  gui.radar.shape = RADAR_RECT; // RADAR_CIRCLE;
+  vect_csetmin(&gui.pos_radar,
+        VX(gui.pos_frame) + 11,                       // x
+        VY(gui.pos_frame) + gui.gfx_frame->h - 10);   // y.
+
+// -- Bars.
+  gui.shield.w = gui.armor.w = gui.energy.w = 128;
+  gui.shield.h = gui.armor.h = gui.energy.h = 10;
+  vect_csetmin(&gui.pos_shield,
+        VX(gui.pos_frame) + 10,                       // x
+        VY(gui.pos_frame) + gui.gfx_frame->h - 201);  // y.
+  
+  vect_csetmin(&gui.pos_armor,
+        VX(gui.pos_frame) + 10,                       // x
+        VY(gui.pos_frame) + gui.gfx_frame->h - 218);  // y.
+  
+  vect_csetmin(&gui.pos_energy,
+        VX(gui.pos_frame) + 10,                       // x
+        VY(gui.pos_frame) + gui.gfx_frame->h - 236);  // y.
+
+  return 0;
+
+}
+
+// Free the GUI.
+void gui_free(void) {
+  gl_freeTexture(gui.gfx_frame);
 }
 
 // Used in pilot.c
diff --git a/src/player.h b/src/player.h
index 9f23ed9..c98e3a1 100644
--- a/src/player.h
+++ b/src/player.h
@@ -6,6 +6,9 @@ extern Pilot* pilot;
 
 typedef enum { KEYBIND_NULL, KEYBIND_KEYBOARD, KEYBIND_JAXIS, KEYBIND_JBUTTON } KeybindType;
 
+// Render.
+int gui_init(void);
+void gui_free(void);
 void player_render(void);
 
 int player_isFlag(unsigned int flag);
diff --git a/src/ship.c b/src/ship.c
index 1bdd616..0ec4df9 100644
--- a/src/ship.c
+++ b/src/ship.c
@@ -49,7 +49,7 @@ static Ship* ship_parse(xmlNodePtr parent) {
     if(strcmp((char*)node->name, "GFX")==0) {
       snprintf(str, strlen((char*)node->children->content)+sizeof(SHIP_GFX),
             SHIP_GFX"%s", (char*)node->children->content);
-      tmp->gfx_ship = gl_newSprite(str, 6, 6);
+      tmp->gfx_space = gl_newSprite(str, 6, 6);
     }
     else if(strcmp((char*)node->name, "class")==0)
       tmp->class = atoi((char*)node->children->content);
@@ -121,7 +121,7 @@ static Ship* ship_parse(xmlNodePtr parent) {
 
 #define MELEMENT(o,s) if(o == 0) WARN("Ship '%s' missing '"s"' element", tmp->name)
   if(tmp->name == NULL) WARN("Ship '%s' missing 'name' tag", tmp->name);
-  if(tmp->gfx_ship == NULL) WARN("Ship '%s' missing 'GFX' element", tmp->name);
+  if(tmp->gfx_space == NULL) WARN("Ship '%s' missing 'GFX' element", tmp->name);
   MELEMENT(tmp->thrust,       "thrust");
   MELEMENT(tmp->turn,         "turn");
   MELEMENT(tmp->speed,        "speed");
@@ -191,7 +191,7 @@ void ships_free(void) {
       so = so->next;
       free(sot);
     }
-    gl_freeTexture((ship_stack+i)->gfx_ship);
+    gl_freeTexture((ship_stack+i)->gfx_space);
   }
   free(ship_stack);
   ship_stack = NULL;
diff --git a/src/ship.h b/src/ship.h
index ec4b355..3ed5037 100644
--- a/src/ship.h
+++ b/src/ship.h
@@ -28,7 +28,7 @@ typedef struct {
   double thrust, turn, speed;
 
   // Graphics.
-  gl_texture* gfx_ship, *gfx_target;
+  gl_texture* gfx_space, *gfx_target;
 
   // Characteristics.
   int crew;
diff --git a/src/weapon.c b/src/weapon.c
index 0b79ce5..d849bc6 100644
--- a/src/weapon.c
+++ b/src/weapon.c
@@ -10,8 +10,6 @@
 #include "pilot.h"
 #include "weapon.h"
 
-#define SIZE_APROX  0.8 // Aproximation for circle collision detection.
-
 // Some stuff from pilot.
 extern Pilot** pilot_stack;
 extern int pilots;
@@ -94,8 +92,8 @@ static void weapon_update(Weapon* w, const double dt, WeaponLayer layer) {
   int i;
   for(i = 0; i < pilots; i++) {
     if((w->parent != pilot_stack[i]->id) &&
-          (DIST(w->solid->pos, pilot_stack[i]->solid->pos) < (SIZE_APROX +
-          w->outfit->gfx_space->sw/2. + pilot_stack[i]->ship->gfx_ship->sw/2.))) {
+          (DIST(w->solid->pos, pilot_stack[i]->solid->pos) < (PILOT_SIZE_APROX *
+          w->outfit->gfx_space->sw/2. + pilot_stack[i]->ship->gfx_space->sw/2.))) {
       pilot_hit(pilot_stack[i], w->outfit->damage_shield, w->outfit->damage_armor);
       weapon_destroy(w, layer);
       return;