From 053d7b75b678be77a32d58d2a919f9e44d260aad Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Wed, 13 Feb 2013 14:30:17 +0000
Subject: [PATCH] [Change] Target color changes based on target.

---
 src/opengl.c | 19 +++++++++-------
 src/opengl.h | 15 +++++++++----
 src/pilot.c  |  2 +-
 src/player.c | 62 ++++++++++++++++++++++++++--------------------------
 src/space.c  |  2 +-
 src/weapon.c |  2 +-
 6 files changed, 56 insertions(+), 46 deletions(-)

diff --git a/src/opengl.c b/src/opengl.c
index 76dc36c..4ab05e9 100644
--- a/src/opengl.c
+++ b/src/opengl.c
@@ -329,7 +329,7 @@ void gl_getSpriteFromDir(int* x, int* y, const gl_texture* t, const double dir)
 // ================
 
 // Blit the sprite at given position.
-void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy) {
+void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy, const glColor* c) {
   // Don't bother drawing if offscreen -- waste of cycles.
   if(fabs(VX(*pos) -VX(*gl_camera)) > gl_screen.w / 2 + sprite->sw / 2 ||
         fabs(VY(*pos) -VY(*gl_camera)) > gl_screen.h / 2 + sprite->sh / 2)
@@ -345,12 +345,13 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons
   glPushMatrix(); // Projection translation matrix.
   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.);
+  //glScalef((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.);
 
   // Actual blitting....
   glBindTexture(GL_TEXTURE_2D, sprite->texture);
   glBegin(GL_TRIANGLE_STRIP);
-    glColor4d(1., 1., 1., 1.);
+    if(c == NULL) glColor4d(1., 1., 1., 1.);
+    else COLOR(*c);
     glTexCoord2d(0., 0.);
       glVertex2d(0., 0.);
     glTexCoord2d(sprite->sw/sprite->rw, 0.);
@@ -370,17 +371,18 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons
 }
 
 // Just straight out blit the thing at position.
-void gl_blitStatic(const gl_texture* texture, const Vec2* pos) {
+void gl_blitStatic(const gl_texture* texture, const Vec2* pos, const glColor* c) {
   glEnable(GL_TEXTURE_2D);
   glMatrixMode(GL_PROJECTION);
   glPushMatrix(); // Set up translation matrix.
   glTranslated(VX(*pos) - (double)gl_screen.w/2., VY(*pos) - (double)gl_screen.h/2., 0);
-  glScaled((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.);
+  //glScaled((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.);
   
   // Actual blitting..
   glBindTexture(GL_TEXTURE_2D, texture->texture);
   glBegin(GL_TRIANGLE_STRIP);
-    glColor4d(1., 1., 1., 1.);
+    if(c == NULL) glColor4d(1., 1., 1., 1.);
+    else COLOR(*c);
     glTexCoord2d(0., 0.);
       glVertex2d(0., 0.);
     glTexCoord2d(texture->sw/texture->rw, 0.);
@@ -403,7 +405,7 @@ void gl_bindCamera(const Vec2* pos) {
 
 // Print text on screen! YES!!!! Just like printf! But different!
 // Defaults ft_font to gl_defFont if NULL.
-void gl_print(const gl_font* ft_font, const Vec2* pos, const char* fmt, ...) {
+void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const char* fmt, ...) {
   //float h = ft_font->h / .63; // Slightly increases font size.
   char text[256];
   va_list ap;
@@ -427,7 +429,8 @@ void gl_print(const gl_font* ft_font, const Vec2* pos, const char* fmt, ...) {
   glPushMatrix(); // Translation matrix.
   glTranslated(VX(*pos) - (double)gl_screen.w/2., VY(*pos) - (double)gl_screen.h/2., 0);
 
-  glColor4d(1., 1., 1., 1.);
+  if(c == NULL) glColor4d(1., 1., 1., 1.);
+  else COLOR(*c);
   glCallLists(strlen(text), GL_UNSIGNED_BYTE, &text);
 
   glPopMatrix(); // Translation matrix.
diff --git a/src/opengl.h b/src/opengl.h
index 7981103..1a03749 100644
--- a/src/opengl.h
+++ b/src/opengl.h
@@ -25,9 +25,14 @@ typedef struct {
   int r, g, b, a;   // Framebuffer values in bits.
   int doublebuf;    // Double buffer.
 } gl_info;
-
 extern gl_info gl_screen; // Local structure set with gl_init etc.
 
+// Colors.
+typedef struct {
+  double r, g, b, a;
+} glColor;
+#define COLOR(x) glColor4d((x).r, (x).g, (x).b, (x).a)
+
 // Spritesheet info.
 typedef struct {
   double w, h;        // Real size of the image (excluding POT buffer.
@@ -58,10 +63,12 @@ gl_texture* gl_newSprite(const char* path, const int sx, const int sy);
 void gl_freeTexture(gl_texture* texture);
 
 // Rendering.
-void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy);
-void gl_blitStatic(const gl_texture* texture, const Vec2* pos);
+void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, 
+      const int sx, const int sy, const glColor* c);
+
+void gl_blitStatic(const gl_texture* texture, const Vec2* pos, const glColor* c);
 void gl_bindCamera(const Vec2* pos);
-void gl_print(const gl_font* ft_font, const Vec2* pos, const char* fmt, ...);
+void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const char* fmt, ...);
 
 // Initialize/cleanup.
 int gl_init(void);
diff --git a/src/pilot.c b/src/pilot.c
index 7b2ecf4..a674544 100644
--- a/src/pilot.c
+++ b/src/pilot.c
@@ -154,7 +154,7 @@ void pilot_render(Pilot* p) {
   // Get the sprite corresponding to the direction facing.
   gl_getSpriteFromDir(&sx, &sy, p->ship->gfx_space, p->solid->dir);
 
-  gl_blitSprite(p->ship->gfx_space, &p->solid->pos, sx, sy);
+  gl_blitSprite(p->ship->gfx_space, &p->solid->pos, sx, sy, NULL);
 }
 
 // Update the pilot.
diff --git a/src/player.c b/src/player.c
index dfa3afc..6a98bf6 100644
--- a/src/player.c
+++ b/src/player.c
@@ -50,25 +50,21 @@ 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) glColor4d((x).r, (x).g, (x).b, (x).a)
-// Standard colors.
-Color cInert            = { .r = 0.6, .g = 0.6, .b = 0.6, .a = 1. };
-Color cNeutral          = { .r = 0.9, .g = 1.0, .b = 0.3, .a = 1. };
-Color cFriend           = { .r = 0.0, .g = 1.0, .b = 0.0, .a = 1. };
-Color cHostile          = { .r = 0.9, .g = 0.2, .b = 0.2, .a = 1. };
 
-Color cRadar_player     = { .r = 0.4, .g = 0.8, .b = 0.4, .a = 1. };
-Color cRadar_targ       = { .r = 0.0, .g = 0.7, .b = 1.0, .a = 1. };
-Color cRadar_weap       = { .r = 0.8, .g = 0.2, .b = 0.2, .a = 1. };
+// -- Colors.
+// Standard colors.
+glColor cInert            = { .r = 0.6, .g = 0.6, .b = 0.6, .a = 1. };
+glColor cNeutral          = { .r = 0.9, .g = 1.0, .b = 0.3, .a = 1. };
+glColor cFriend           = { .r = 0.0, .g = 1.0, .b = 0.0, .a = 1. };
+glColor cHostile          = { .r = 0.9, .g = 0.2, .b = 0.2, .a = 1. };
+
+glColor cRadar_player     = { .r = 0.4, .g = 0.8, .b = 0.4, .a = 1. };
+glColor cRadar_targ       = { .r = 0.0, .g = 0.7, .b = 1.0, .a = 1. };
+glColor cRadar_weap       = { .r = 0.8, .g = 0.2, .b = 0.2, .a = 1. };
 // Bars.
-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. };
+glColor cShield           = { .r = 0.2, .g = 0.2, .b = 0.8, .a = 1. };
+glColor cArmor            = { .r = 0.5, .g = 0.5, .b = 0.5, .a = 1. };
+glColor cEnergy           = { .r = 0.2, .g = 0.8, .b = 0.2, .a = 1. };
 
 typedef struct {
   double w,h; // Dimensions.
@@ -124,7 +120,7 @@ extern void planets_minimap(const double res, const double w, const double h, co
 static void rect_parse(const xmlNodePtr parent, double* x, double* y, double* w, double* h);
 static int gui_parse(const xmlNodePtr parent, const char* name);
 static void gui_renderPilot(const Pilot* p);
-static void gui_renderBar(const Color* c, const Vec2* p, const Rect* r, const double w);
+static void gui_renderBar(const glColor* c, const Vec2* p, const Rect* r, const double w);
 
 void player_message(const char* fmt, ...) {
   va_list ap;
@@ -151,20 +147,24 @@ void player_render(void) {
   int i, j;
   Pilot* p;
   Vec2 v;
+  glColor* c;
 
   // Render the player target graphics.
   if(player_target != PLAYER_ID) {
     p = pilot_get(player_target);
 
+    if(pilot_isFlag(p, PILOT_HOSTILE)) c = &cHostile;
+    else c = &cNeutral;
+
     vect_csetmin(&v, VX(p->solid->pos) - p->ship->gfx_space->sw * PILOT_SIZE_APROX/2.,
           VY(p->solid->pos) + p->ship->gfx_space->sh * PILOT_SIZE_APROX/2.);
-    gl_blitSprite(gui.gfx_targetPilot, &v, 0, 0); // Top left.
+    gl_blitSprite(gui.gfx_targetPilot, &v, 0, 0, c); // Top left.
     VX(v) += p->ship->gfx_space->sw * PILOT_SIZE_APROX;
-    gl_blitSprite(gui.gfx_targetPilot, &v, 1, 0); // Top right.
+    gl_blitSprite(gui.gfx_targetPilot, &v, 1, 0, c); // Top right.
     VY(v) -= p->ship->gfx_space->sh * PILOT_SIZE_APROX;
-    gl_blitSprite(gui.gfx_targetPilot, &v, 1, 1); // Bottom right.
+    gl_blitSprite(gui.gfx_targetPilot, &v, 1, 1, c); // Bottom right.
     VX(v) -= p->ship->gfx_space->sw * PILOT_SIZE_APROX;
-    gl_blitSprite(gui.gfx_targetPilot, &v, 0, 1); // Bottom left.
+    gl_blitSprite(gui.gfx_targetPilot, &v, 0, 1, c); // Bottom left.
   }
 
   // Render the player.
@@ -172,7 +172,7 @@ void player_render(void) {
 
   // GUI!
   // -- Frame.
-  gl_blitStatic(gui.gfx_frame, &gui.pos_frame);
+  gl_blitStatic(gui.gfx_frame, &gui.pos_frame, NULL);
   // -- Radar.
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
@@ -229,22 +229,22 @@ void player_render(void) {
   if(player_target != PLAYER_ID) {
     p = pilot_get(player_target);
 
-    gl_blitStatic(p->ship->gfx_target, &gui.pos_target);
+    gl_blitStatic(p->ship->gfx_target, &gui.pos_target, NULL);
     
     // Target name.
-    gl_print(NULL, &gui.pos_target_name, "%s", p->name);
-    gl_print(&gui.smallFont, &gui.pos_target_faction, "%s", p->faction->name);
+    gl_print(NULL, &gui.pos_target_name, NULL, "%s", p->name);
+    gl_print(&gui.smallFont, &gui.pos_target_faction, NULL, "%s", p->faction->name);
 
     // Target status.
     if(p->armor < p->armor_max * PILOT_DISABLED)
       // Disable the pilot.
-      gl_print(&gui.smallFont, &gui.pos_target_health, "Disabled");
+      gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "Disabled");
     else if(p->shield > p->shield_max / 100.)
       // On shields.
-      gl_print(&gui.smallFont, &gui.pos_target_health, "%s: %.0f%%", "Shield", p->shield/p->shield_max*100.);
+      gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "%s: %.0f%%", "Shield", p->shield/p->shield_max*100.);
     else
       // On armor.
-      gl_print(&gui.smallFont, &gui.pos_target_health, "%s: %.0f%%", "Armor", p->armor/p->armor_max*100.);
+      gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "%s: %.0f%%", "Armor", p->armor/p->armor_max*100.);
   }
   // Messages.
   VX(v) = VX(gui.pos_msg);
@@ -254,7 +254,7 @@ void player_render(void) {
     if(msg_stack[msg_max-i-1].str[0] != '\0') {
       if(msg_stack[msg_max-i-1].t < SDL_GetTicks())
         msg_stack[msg_max-i-1].str[0] = '\0';
-      else gl_print(NULL, &v, "%s", msg_stack[msg_max-i-1].str);
+      else gl_print(NULL, &v, NULL, "%s", msg_stack[msg_max-i-1].str);
     }
   }
 }
@@ -300,7 +300,7 @@ static void gui_renderPilot(const Pilot* p) {
 }
 
 // Render a bar.
-static void gui_renderBar(const Color* c, const Vec2* p, const Rect* r, const double w) {
+static void gui_renderBar(const glColor* c, const Vec2* p, const Rect* r, const double w) {
   int x, y, sx, sy;
 
   glBegin(GL_QUADS);
diff --git a/src/space.c b/src/space.c
index b1f8dda..7df67d3 100644
--- a/src/space.c
+++ b/src/space.c
@@ -460,7 +460,7 @@ void space_render(double dt) {
 void planets_render(void) {
   int i;
   for(i = 0; i < cur_system->nplanets; i++)
-    gl_blitSprite(cur_system->planets[i].gfx_space, &cur_system->planets[i].pos, 0, 0);
+    gl_blitSprite(cur_system->planets[i].gfx_space, &cur_system->planets[i].pos, 0, 0, NULL);
 }
 
 // Clean up the system.
diff --git a/src/weapon.c b/src/weapon.c
index f73288e..021375a 100644
--- a/src/weapon.c
+++ b/src/weapon.c
@@ -115,7 +115,7 @@ static void weapon_render(const Weapon* w) {
   // Get the sprite corresponding to the direction facing.
   gl_getSpriteFromDir(&sx, &sy, w->outfit->gfx_space, w->solid->dir);
 
-  gl_blitSprite(w->outfit->gfx_space, &w->solid->pos, sx, sy);
+  gl_blitSprite(w->outfit->gfx_space, &w->solid->pos, sx, sy, NULL);
 }
 
 // Update the weapon.