[Change] Faction and combat ratings are now continuous.

This commit is contained in:
Allanis 2013-12-31 17:38:02 +00:00
parent b5e34f6ef3
commit 9539e22d8b
9 changed files with 67 additions and 76 deletions

View File

@ -26,7 +26,7 @@ function escort()
dir = ai.face(target)
dist = ai.dist(ai.pos(target))
bdist = ai.mindbrakedist()
bdist = ai.minbrakedist()
-- Close enough.
if ai.isstopped() and dist < 300 then

View File

@ -21,7 +21,7 @@
#define FACTION_DATA "../dat/faction.xml" /**< Faction xml file. */
#define FACTION_LOGO_PATH "../gfx/logo/" /**< Path to logo gfx. */
#define PLAYER_ALLY 70 /**< Above this, player is considered ally. */
#define PLAYER_ALLY 70. /**< Above this, player is considered ally. */
/**
* @struct Faction.
@ -33,18 +33,18 @@ typedef struct Faction_ {
char* longname; /**< Long name. */
/* Graphics. */
glTexture* logo_small; /**< Small logo. */
glTexture* logo_small; /**< Small logo. */
/* Enemies. */
int* enemies; /**< Enemies by ID of the faction. */
int nenemies; /**< Number of enemies. */
int* enemies; /**< Enemies by ID of the faction. */
int nenemies; /**< Number of enemies. */
/* Allies. */
int* allies; /**< Allies by ID of the faction. */
int nallies; /**< Number of allies. */
int* allies; /**< Allies by ID of the faction. */
int nallies; /**< Number of allies. */
int player_def; /**< Default player standing. */
int player; /**< Standing with player - from -100 to 100. */
double player_def; /**< Default player standing. */
double player; /**< Standing with player - from -100 to 100. */
} Faction;
static Faction* faction_stack = NULL; /**< Faction stack. */
@ -136,14 +136,14 @@ glTexture* faction_logoSmall(int f) {
* @param faction Faction to sanitize.
*/
static void faction_sanitizePlayer(Faction* faction) {
if(faction->player > 100)
faction->player = 100;
else if(faction->player < -100)
faction->player = -100;
if(faction->player > 100.)
faction->player = 100.;
else if(faction->player < -100.)
faction->player = -100.;
}
/**
* @fn void faction_modPlayer(int f, int mod)
* @fn void faction_modPlayer(int f, double mod)
*
* @brief Modifies the players standing with a faction.
*
@ -153,7 +153,7 @@ static void faction_sanitizePlayer(Faction* faction) {
*
* @sa faction_modPlayerRaw
*/
void faction_modPlayer(int f, int mod) {
void faction_modPlayer(int f, double mod) {
int i;
Faction* faction, *ally, *enemy;
@ -172,7 +172,7 @@ void faction_modPlayer(int f, int mod) {
for(i = 0; i < faction->nallies; i++) {
ally = &faction_stack[faction->allies[i]];
ally->player += RNG(0, (mod*3)/4);
ally->player += RNGF() * (mod*3/4);
faction_sanitizePlayer(ally);
}
@ -180,13 +180,13 @@ void faction_modPlayer(int f, int mod) {
for(i = 0; i < faction->nenemies; i++) {
enemy = &faction_stack[faction->enemies[i]];
enemy->player -= MIN(1, RNG(0, (mod*3)/4));
enemy->player -= RNGF() * mod; /* Enemies are made faster. */
faction_sanitizePlayer(enemy);
}
}
/**
* @fn void faction_modPlayerRaw(int f, int mod)
* @fn void faction_modPlayerRaw(int f, double mod)
*
* @brief Modifies the players standing without affecting others.
* @param f Faction whose standing to modify.
@ -194,7 +194,7 @@ void faction_modPlayer(int f, int mod) {
*
* @sa faction_modPlayer
*/
void faction_modPlayerRaw(int f, int mod) {
void faction_modPlayerRaw(int f, double mod) {
Faction* faction;
if(!faction_isFaction(f)) {
@ -209,13 +209,13 @@ void faction_modPlayerRaw(int f, int mod) {
}
/**
* @fn int faction_getPlayer(int f)
* @fn double faction_getPlayer(int f)
*
* @brief Get the players standing with a faction.
* @param f Faction to get standing from.
* @return The standing the player has with the faction.
*/
int faction_getPlayer(int f) {
double faction_getPlayer(int f) {
if(faction_isFaction(f)) {
return faction_stack[f].player;
} else {
@ -241,35 +241,24 @@ glColour* faction_getColour(int f) {
}
/**
* @fn char* faction_getStanding(int mod)
* @fn char* faction_getStanding(double mod)
*
* @brief Get the players standing in human readable form.
* @param mod Players standing.
* @return Human readable players standing.
*/
static char* player_standings[] = {
"Hero", /* 0 */
"Admired",
"Great",
"Good",
"Decent",
"Wanted", /* 5 */
"Outlaw",
"Criminal",
"Enemy"
};
#define STANDING(m, i) if(mod >= m) return player_standings[i];
char* faction_getStanding(int mod) {
STANDING( 90, 0);
STANDING( 70, 1);
STANDING( 50, 2);
STANDING( 30, 3);
STANDING( 0, 4);
STANDING(-15, 5);
STANDING(-30, 6);
STANDING(-50, 7);
return player_standings[8];
#define STANDING(m, s) if(mod >= m) return s;
char* faction_getStanding(double mod) {
STANDING( 90., "Here");
STANDING( 70., "Admired");
STANDING( 50., "Great");
STANDING( 30., "Good");
STANDING( 0., "Decent");
STANDING(-15., "Wanted");
STANDING(-30., "Outlaw");
STANDING(-50., "Criminal");
return "Enemy";
}
#undef STANDING
@ -443,7 +432,7 @@ static Faction* faction_parse(xmlNodePtr parent) {
do {
/* Can be 0 or negative, so we have to take that into account. */
if(xml_isNode(node, "player")) {
tmp->player_def = xml_getInt(node);
tmp->player_def = xml_getFloat(node);
player = 1;
continue;
}
@ -610,7 +599,7 @@ int pfaction_save(xmlTextWriterPtr writer) {
xmlw_startElem(writer, "faction");
xmlw_attr(writer, "name", "%s", faction_stack[i].name);
xmlw_str(writer, "%d", faction_stack[i].player);
xmlw_str(writer, "%f", faction_stack[i].player);
xmlw_endElem(writer); /* Faction. */
}
@ -642,7 +631,7 @@ int pfaction_load(xmlNodePtr parent) {
xmlr_attr(cur, "name", str);
faction = faction_get(str);
if(faction != -1) /* Faction is valid. */
faction_stack[faction].player = xml_getInt(cur);
faction_stack[faction].player = xml_getFloat(cur);
free(str);
}
} while(xml_nextNode(cur));

View File

@ -11,10 +11,10 @@ char* faction_longname(int f);
glTexture* faction_logoSmall(int f);
/* Player stuff. */
void faction_modPlayer(int f, int mod);
void faction_modPlayerRaw(int f, int mod);
int faction_getPlayer(int f);
char* faction_getStanding(int mod);
void faction_modPlayer(int f, double mod);
void faction_modPlayerRaw(int f, double mod);
double faction_getPlayer(int f);
char* faction_getStanding(double mod);
glColour* faction_getColour(int f);
/* Works with only factions. */

View File

@ -302,7 +302,7 @@ static int factionL_areallies(lua_State* L) {
*/
static int factionL_modplayer(lua_State* L) {
LuaFaction* f;
int n;
double n;
f = lua_tofaction(L, 1);
if(lua_isnumber(L, 2)) n = lua_tonumber(L, 2);
@ -324,7 +324,7 @@ static int factionL_modplayer(lua_State* L) {
*/
static int factionL_modplayerraw(lua_State* L) {
LuaFaction* f;
int n;
double n;
f = lua_tofaction(L, 1);
if(lua_isnumber(L, 2)) n = lua_tonumber(L, 2);

View File

@ -782,12 +782,13 @@ static int player_msg(lua_State* L) {
static int player_modFaction(lua_State* L) {
LLUA_MIN_ARGS(2);
int f, mod;
int f;
double mod;
if(lua_isstring(L, 1)) f = faction_get(lua_tostring(L, 1));
else LLUA_INVALID_PARAMETER();
if(lua_isnumber(L, 2)) mod = (int)lua_tonumber(L, 2);
if(lua_isnumber(L, 2)) mod = lua_tonumber(L, 2);
else LLUA_INVALID_PARAMETER();
faction_modPlayer(f, mod);
@ -797,12 +798,13 @@ static int player_modFaction(lua_State* L) {
static int player_modFactionRaw(lua_State* L) {
LLUA_MIN_ARGS(2);
int f, mod;
int f;
double mod;
if(lua_isstring(L, 1)) f = faction_get(lua_tostring(L,1));
else LLUA_INVALID_PARAMETER();
if(lua_isnumber(L,2)) mod = (int) lua_tonumber(L,2);
if(lua_isnumber(L,2)) mod = lua_tonumber(L,2);
else LLUA_INVALID_PARAMETER();
faction_modPlayerRaw(f, mod);

View File

@ -38,7 +38,7 @@ int pilot_nstack = 0; /**< Same. */
static int pilot_mstack = 0; /** Memory allocated for pilot_stack. */
extern Pilot* player;
extern unsigned int player_crating; /**< Players combat rating. */
extern double player_crating; /**< Players combat rating. */
extern void player_abortAutonav(void);
/* Stack of fleets. */
@ -424,8 +424,8 @@ void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
/* Adjust the combat rating based on pilot mass and ditto faction. */
pshooter = pilot_get(shooter);
if(pshooter->faction == FACTION_PLAYER) {
mod = (int)MAX(1, ceil(pow(p->ship->mass, 1./3.))-1.);
player_crating += MAX(1, mod);
mod = pow(p->ship->mass, 1./3.);
player_crating += 2*mod;
faction_modPlayer(p->faction, -mod);
}
}

View File

@ -68,7 +68,7 @@ static int player_nstack = 0; /**< Number of ships player has. */
/* Player global properties. */
char* player_name = NULL; /**< Player name. */
int player_crating = 0; /**< Player combar rating. */
double player_crating = 0; /**< Player combar rating. */
unsigned int player_flags = 0; /**< Player flags. */
/* Input.c */
@ -325,7 +325,7 @@ static void player_newMake(void) {
xmlr_float(tmp, "y", y);
} while(xml_nextNode(tmp));
}
xmlr_int(cur, "player_crating", player_crating);
xmlr_float(cur, "player_crating", player_crating);
if(xml_isNode(cur, "date")) {
tmp = cur->children;
do {
@ -698,14 +698,14 @@ static char* player_ratings[] = {
};
const char* player_rating(void) {
if(player_crating == 0) return player_ratings[0];
else if(player_crating < 50) return player_ratings[1];
else if(player_crating < 200) return player_ratings[2];
else if(player_crating < 500) return player_ratings[3];
else if(player_crating < 1000) return player_ratings[4];
else if(player_crating < 2500) return player_ratings[5];
else if(player_crating < 10000) return player_ratings[6];
else return player_ratings[7];
if(player_crating == 0.) return player_ratings[0];
else if(player_crating < 50.) return player_ratings[1];
else if(player_crating < 200.) return player_ratings[2];
else if(player_crating < 500.) return player_ratings[3];
else if(player_crating < 1000.) return player_ratings[4];
else if(player_crating < 2500.) return player_ratings[5];
else if(player_crating < 10000.) return player_ratings[6];
else return player_ratings[7];
}
/**
@ -2141,7 +2141,7 @@ int player_save(xmlTextWriterPtr writer) {
xmlw_startElem(writer, "player");
xmlw_attr(writer, "name", player_name);
xmlw_elem(writer, "rating", "%d", player_crating);
xmlw_elem(writer, "rating", "%f", player_crating);
xmlw_elem(writer, "scred", "%d", player->credits);
xmlw_elem(writer, "time", "%d", ltime_get());
@ -2245,7 +2245,7 @@ static int player_parse(xmlNodePtr parent) {
do {
/* Global stuff. */
xmlr_int(node, "rating", player_crating);
xmlr_float(node, "rating", player_crating);
xmlr_int(node, "credits", player_credits);
xmlr_long(node, "time", player_time);
xmlr_str(node, "location", planet);

View File

@ -22,10 +22,10 @@
#define player_rmFlag(f) if(player_isFlag(f)) (player_flags ^= f) /**< Remove a player flag. */
/* The player. */
extern Pilot* pilot; /**< The player. */
extern Pilot* player; /**< The player. */
extern char* player_name; /**< Player's name. */
extern unsigned int player_flags; /**< Player's flags. */
extern int player_crating; /**< Player's combat rating. */
extern double player_crating; /**< Player's combat rating. */
/* Enums. */

View File

@ -601,7 +601,7 @@ static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer, Vec2* pos) {
parent = pilot_get(w->parent);
if((parent->faction == FACTION_PLAYER) &&
(!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */
faction_modPlayer(p->faction, -1); /* Slowly lower faction. */
faction_modPlayer(p->faction, -1.); /* Slowly lower faction. */
pilot_setFlag(p, PILOT_HOSTILE);
}
ai_attacked(p, w->parent);
@ -642,7 +642,7 @@ static void weapon_hitBeam(Weapon* w, Pilot* p, WeaponLayer layer,
parent = pilot_get(w->parent);
if((parent->faction == FACTION_PLAYER) &&
(!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */
faction_modPlayer(p->faction, -1); /* Slowly lower faction. */
faction_modPlayer(p->faction, -1.); /* Slowly lower faction. */
pilot_setFlag(p, PILOT_HOSTILE);
}
ai_attacked(p, w->parent);