From 439fce48c8a827b931441cb5c4862b20a6957e33 Mon Sep 17 00:00:00 2001 From: Allanis Date: Sun, 24 Feb 2013 18:18:52 +0000 Subject: [PATCH] [Add] Combat rating based on mass of pilots killed. -- [Add] Player name. --- src/menu.c | 8 +++++--- src/pilot.c | 14 ++++++++++++-- src/pilot.h | 5 +++-- src/player.c | 31 ++++++++++++++++++++++++++++++- src/player.h | 3 +++ src/weapon.c | 2 +- 6 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/menu.c b/src/menu.c index 897da9e..ae6633b 100644 --- a/src/menu.c +++ b/src/menu.c @@ -7,6 +7,7 @@ #include "pause.h" #include "pilot.h" #include "space.h" +#include "player.h" #include "menu.h" #define MENU_WIDTH 120 @@ -89,9 +90,10 @@ void info_menu(void) { "Combat Rating:\n"); snprintf(str, 128, - "Foobar\n" - "Luser\n"); - + "%s\n" + "%s\n", + player_name, player_rating()); + window_addText(wid, 120, 20, INFO_WIDTH-120-BUTTON_WIDTH, INFO_HEIGHT-60, 0, "txtPilot", &gl_smallFont, &cBlack, str); diff --git a/src/pilot.c b/src/pilot.c index 3942440..7b7a622 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -21,7 +21,9 @@ static unsigned int pilot_id = PLAYER_ID; Pilot** pilot_stack = NULL; // Not static, it is used in player.c and weapon.c and ai.c int pilots = 0; static int mpilots = 0; + extern Pilot* player; +extern unsigned int combat_rating; // Stack of fleets. static Fleet* fleet_stack = NULL; @@ -177,8 +179,8 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w, const unsigned int t) { } // Damage the pilot. -void pilot_hit(Pilot* p, const Solid* w,const double damage_shield, - const double damage_armour) { +void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter, + const double damage_shield, const double damage_armour) { double dam_mod; @@ -197,8 +199,16 @@ void pilot_hit(Pilot* p, const Solid* w,const double damage_shield, dam_mod = damage_armour/p->armour_max; } else { + // We are officially dead. p->armour = 0.; dam_mod = 0.; + + if(!pilot_isFlag(p, PILOT_DEAD)) { + pilot_setFlag(p, PILOT_DEAD); + + // Adjust the combat rating based on pilot mass. + if(shooter == PLAYER_ID) combat_rating += MAX(1, p->ship->mass/50); + } } vect_cadd(&p->solid->vel, diff --git a/src/pilot.h b/src/pilot.h index d93b2c3..4ebd010 100644 --- a/src/pilot.h +++ b/src/pilot.h @@ -29,7 +29,8 @@ #define PILOT_HYP_BEGIN (1<<6) // Pilot is starting engines. #define PILOT_HYPERSPACE (1<<7) // Pilot is in hyperspace. #define PILOT_DISABLED (1<<9) // Pilot is disabled. -#define PILOT_DELETE (1<<10) // Pilot will get delete asap. +#define PILOT_DEAD (1<<10) // Pilot is on it's death bed. +#define PILOT_DELETE (1<<15) // Pilot will get delete asap. // Just makes life simpler. #define pilot_isPlayer(p) ((p)->flags & PILOT_PLAYER) @@ -105,7 +106,7 @@ Fleet* fleet_get(const char* name); // MISC. void pilot_shoot(Pilot* p, const unsigned int target, const int secondary); -void pilot_hit(Pilot* p, const Solid* w, +void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter, const double damage_shield, const double damage_armour); void pilot_setAmmo(Pilot* p); double pilot_face(Pilot* p, const float dir); diff --git a/src/player.c b/src/player.c index 9cfdf1d..780eb7b 100644 --- a/src/player.c +++ b/src/player.c @@ -31,12 +31,17 @@ // Player stuff. Pilot* player = NULL; // extern in pilot.h -unsigned int credits = 0; +// Player global properties. +char* player_name = NULL; // Player name. +unsigned int credits = NULL; // Ze monies. +unsigned int combat_rating = 0; // Ze rating. unsigned int player_flags = 0; // Player flags. +// Input.c double player_turn = 0.; // Turn velocity from input. double player_acc = 0.; // Accel velocity from input. unsigned int player_target = PLAYER_ID; // Targetted pilot. static int planet_target = -1; // Targetted planet. +// Internal. static int hyperspace_target = -1; // Target hyperspace route. static double hyperspace_flash = 0.; @@ -158,6 +163,8 @@ void player_new(void) { else if(xml_isNode(tmp, "y")) y = xml_getFloat(tmp); } while((tmp = tmp->next)); } + else if(xml_isNode(cur, "combat_rating")) + combat_rating = xml_getInt(cur); } while((cur = cur->next)); } }while((node = node->next)); @@ -213,6 +220,28 @@ void player_clear(void) { hyperspace_target = -1; } +static char* player_ratings[] = { + "None", + "Smallfry", + "Minor", + "Average", + "Major", + "Fearsom", + "Godlike" +}; + +const char* player_rating(void) { + if(combat_rating == 0) return player_ratings[0]; + else if(combat_rating < 50) return player_ratings[1]; + else if(combat_rating < 200) return player_ratings[2]; + else if(combat_rating < 500) return player_ratings[3]; + else if(combat_rating < 1000) return player_ratings[4]; + else if(combat_rating < 2500) return player_ratings[5]; + else if(combat_rating < 10000) return player_ratings[6]; + else return player_ratings[7]; + +} + // Render the background player stuff, namely planet target void player_renderBG(void) { double x, y; diff --git a/src/player.h b/src/player.h index cc27499..6a4269f 100644 --- a/src/player.h +++ b/src/player.h @@ -16,8 +16,10 @@ // The player. extern Pilot* pilot; +extern char* player_name; extern unsigned int player_flags; extern unsigned int credits; +extern unsigned int combat_rating; typedef enum { RADAR_RECT, RADAR_CIRCLE } RadarShape; // For render functions. @@ -34,6 +36,7 @@ void player_renderBG(void); // Render BG layer. void player_message(const char* fmt, ...); void player_clear(void); void player_warp(const double x, const double y); +const char* player_rating(void); // Keybind actions. void player_setRadarRel(int mod); diff --git a/src/weapon.c b/src/weapon.c index 39d592d..69b08b4 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -243,7 +243,7 @@ static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer) { pilot_setFlag(p, PILOT_HOSTILE); // Let the ship know that is should take some kind of damage. - pilot_hit(p, w->solid, w->outfit->damage_shield, w->outfit->damage_armour); + pilot_hit(p, w->solid, w->parent, w->outfit->damage_shield, w->outfit->damage_armour); // We don't need the weapon particle any longer. weapon_destroy(w, layer); }