[Change] Preparations for adding fuel.

This commit is contained in:
Allanis 2013-05-16 19:15:00 +01:00
parent 5f2f57f6ee
commit 25adf125e4
8 changed files with 74 additions and 81 deletions

View File

@ -25,6 +25,7 @@
<characteristics>
<crew>2</crew>
<mass>32</mass>
<fuel>400</fuel>
<cap_weapon>25</cap_weapon>
<cap_cargo>20</cap_cargo>
</characteristics>
@ -57,6 +58,7 @@
<characteristics>
<crew>2</crew>
<mass>25</mass>
<fuel>300</fuel>
<cap_weapon>30</cap_weapon>
<cap_cargo>10</cap_cargo>
</characteristics>
@ -89,6 +91,7 @@
<characteristics>
<crew>35</crew>
<mass>500</mass>
<fuel>300</fuel>
<cap_weapon>180</cap_weapon>
<cap_cargo>70</cap_cargo>
</characteristics>
@ -123,6 +126,7 @@
<characteristics>
<crew>9</crew>
<mass>130</mass>
<fuel>400</fuel>
<cap_weapon>90</cap_weapon>
<cap_cargo>20</cap_cargo>
</characteristics>
@ -157,6 +161,7 @@
<characteristics>
<crew>13</crew>
<mass>350</mass>
<fuel>500</fuel>
<cap_weapon>50</cap_weapon>
<cap_cargo>250</cap_cargo>
</characteristics>
@ -189,6 +194,7 @@
<characteristics>
<crew>1</crew>
<mass>15</mass>
<fuel>1</fuel>
<cap_weapon>24</cap_weapon>
<cap_cargo>1</cap_cargo>
</characteristics>

View File

@ -263,11 +263,11 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) {
char str[PATH_MAX] = "\0";
do {
if(xml_isNode(node, "thrust")) tmp->u.amm.thrust = xml_getFloat(node);
else if(xml_isNode(node, "turn")) tmp->u.amm.turn = xml_getFloat(node);
else if(xml_isNode(node, "speed")) tmp->u.amm.speed = xml_getFloat(node);
else if(xml_isNode(node, "energy")) tmp->u.amm.energy = xml_getFloat(node);
else if(xml_isNode(node, "duration"))
xmlr_float(node, "thrust", tmp->u.amm.thrust);
xmlr_float(node, "turn", tmp->u.amm.turn);
xmlr_float(node, "speed", tmp->u.amm.speed);
xmlr_float(node, "energy", tmp->u.amm.energy);
if(xml_isNode(node, "duration"))
tmp->u.amm.duration = (unsigned int)1000.*xml_getFloat(node);
else if(xml_isNode(node, "lockon"))
tmp->u.amm.lockon = (unsigned int)1000.*xml_getFloat(node);
@ -283,8 +283,8 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) {
else if(xml_isNode(node, "damage")) {
cur = node->children;
do {
if(xml_isNode(cur, "armour")) tmp->u.amm.damage_armour = xml_getFloat(cur);
else if(xml_isNode(cur, "shield")) tmp->u.amm.damage_shield = xml_getFloat(cur);
xmlr_float(cur, "armour", tmp->u.amm.damage_armour);
xmlr_float(cur, "shield", tmp->u.amm.damage_shield);
} while((cur = cur->next));
}
} while((node = node->next));
@ -308,21 +308,15 @@ static void outfit_parseSMod(Outfit* tmp, const xmlNodePtr parent) {
// Load all the data.
do {
// Movement.
if(xml_isNode(node, "thrust"))
tmp->u.mod.thrust = xml_getFloat(node);
else if(xml_isNode(node, "turn"))
tmp->u.mod.turn = xml_getFloat(node);
else if(xml_isNode(node, "speed"))
tmp->u.mod.speed = xml_getFloat(node);
xmlr_float(node, "thrust", tmp->u.mod.thrust);
xmlr_float(node, "turn", tmp->u.mod.turn);
xmlr_float(node, "speed", tmp->u.mod.speed);
// Health.
if(xml_isNode(node, "armour"))
tmp->u.mod.armour = xml_getFloat(node);
else if(xml_isNode(node, "shield"))
tmp->u.mod.shield = xml_getFloat(node);
else if(xml_isNode(node, "energy"))
tmp->u.mod.energy = xml_getFloat(node);
else if(xml_isNode(node, "armour_regen"))
xmlr_float(node, "armour", tmp->u.mod.armour);
xmlr_float(node, "shield", tmp->u.mod.shield);
xmlr_float(node, "energy", tmp->u.mod.energy);
xmlr_float(node, "fuel", tmp->u.mod.fuel);
if(xml_isNode(node, "armour_regen"))
tmp->u.mod.armour_regen = xml_getFloat(node)/60.0;
else if(xml_isNode(node, "shield_regen"))
tmp->u.mod.shield_regen = xml_getFloat(node)/60.0;
@ -371,13 +365,12 @@ static Outfit* outfit_parse(const xmlNodePtr parent) {
if(xml_isNode(node, "general")) {
cur = node->children;
do {
if(xml_isNode(cur, "max")) tmp->max = xml_getInt(cur);
else if(xml_isNode(cur, "tech")) tmp->tech = xml_getInt(cur);
else if(xml_isNode(cur, "mass")) tmp->mass = xml_getInt(cur);
else if(xml_isNode(cur, "price")) tmp->price = xml_getInt(cur);
else if(xml_isNode(cur, "description"))
tmp->description = strdup(xml_get(cur));
else if(xml_isNode(cur, "gfx_store")) {
xmlr_int(cur, "max", tmp->max);
xmlr_int(cur, "tech", tmp->tech);
xmlr_int(cur, "mass", tmp->mass);
xmlr_int(cur, "price", tmp->price);
xmlr_strd(cur, "description", tmp->description);
if(xml_isNode(cur, "gfx_store")) {
snprintf(str, strlen(xml_get(cur))+sizeof(OUTFIT_GFX)+10,
OUTFIT_GFX"store/%s.png", xml_get(cur));
tmp->gfx_store = gl_newImage(str);

View File

@ -90,6 +90,7 @@ typedef struct Outfit_ {
double armour, armour_regen;
double shield, shield_regen;
double energy, energy_regen;
double fuel;
} mod;
struct { // Afterburner.
double thrust_perc, thrust_abs; // Percent and absolute thrust bonus.

View File

@ -580,7 +580,7 @@ static void pilot_calcStats(Pilot* pilot) {
int i;
double q;
Outfit* o;
double ac, sc, ec; // Temp health coeficients to set.
double ac, sc, ec, fc; // Temp health coeficients to set.
// -- Set up the basic stuff.
// Movement.
@ -591,9 +591,11 @@ static void pilot_calcStats(Pilot* pilot) {
ac = pilot->armour / pilot->armour_max;
sc = pilot->shield / pilot->shield_max;
ec = pilot->energy / pilot->energy_max;
fc = pilot->fuel / pilot->fuel_max;
pilot->armour_max = pilot->ship->armour;
pilot->shield_max = pilot->ship->shield;
pilot->energy_max = pilot->ship->energy;
pilot->fuel_max = pilot->ship->fuel;
pilot->armour_regen = pilot->ship->armour_regen;
pilot->shield_regen = pilot->ship->shield_regen;
pilot->energy_regen = pilot->ship->energy_regen;
@ -615,7 +617,8 @@ static void pilot_calcStats(Pilot* pilot) {
pilot->shield_regen += o->u.mod.shield_regen * q;
pilot->energy_max += o->u.mod.energy * q;
pilot->energy_regen += o->u.mod.energy_regen * q;
// Fuel.
pilot->fuel_max += o->u.mod.fuel * q;
}
else if(outfit_isAfterburner(pilot->outfits[i].outfit)) {
// Set the afterburner.
@ -627,6 +630,7 @@ static void pilot_calcStats(Pilot* pilot) {
pilot->armour = ac * pilot->armour_max;
pilot->shield = sc * pilot->shield_max;
pilot->energy = ec * pilot->energy_max;
pilot->fuel = fc * pilot->fuel_max;
}
// Pilot free cargo space.
@ -792,10 +796,11 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, int faction,
}
// Set the pilot stats based on her ship and outfits.
// Hack to have full armour/shield/energy.
// Hack to have full armour/shield/energy/fuel.
pilot->armour = pilot->armour_max = 1.;
pilot->shield = pilot->shield_max = 1.;
pilot->energy = pilot->energy_max = 1.;
pilot->fuel = pilot->fuel_max = 1.;
pilot_calcStats(pilot);
// Cargo.

View File

@ -78,10 +78,9 @@ typedef struct Pilot_ {
double thrust, turn, speed;
// Current health.
double armour, shield, energy;
double armour_max, shield_max, energy_max;
double armour, shield, energy, fuel;
double armour_max, shield_max, energy_max, fuel_max;
double armour_regen, shield_regen, energy_regen;
double fuel; // Used only for jumps. TODO: make it do something.
void (*think)(struct Pilot_*); // AI thinking for the pilot.
void (*update)(struct Pilot_*, const double); // Update the pilot.

View File

@ -85,7 +85,7 @@ static Ship* ship_parse(xmlNodePtr parent) {
char str[PATH_MAX] = "\0";
char* stmp;
tmp->name = xml_nodeProp(parent, "name");
xmlr_attr(parent, "name", tmp->name);
if(tmp->name == NULL) WARN("Ship in "SHIP_DATA" has invalid or no name");
node = parent->xmlChildrenNode;
@ -104,60 +104,45 @@ static Ship* ship_parse(xmlNodePtr parent) {
tmp->gfx_target = gl_newImage(str);
}
else if(xml_isNode(node, "GUI"))
tmp->gui = strdup(xml_get(node));
else if(xml_isNode(node, "sound"))
xmlr_strd(node, "GUI", tmp->gui);
if(xml_isNode(node, "sound"))
tmp->sound = sound_get(xml_get(node));
else if(xml_isNode(node, "class"))
tmp->class = xml_getInt(node);
else if(xml_isNode(node, "price"))
tmp->price = xml_getInt(node);
else if(xml_isNode(node, "tech"))
tmp->tech = xml_getInt(node);
else if(xml_isNode(node, "fabricator"))
tmp->fabricator = strdup(xml_get(node));
else if(xml_isNode(node, "description"))
tmp->description = strdup(xml_get(node));
else if(xml_isNode(node, "movement")) {
xmlr_int(node, "class", tmp->class);
xmlr_int(node, "price", tmp->price);
xmlr_int(node, "tech", tmp->tech);
xmlr_strd(node, "fabricator", tmp->fabricator);
xmlr_strd(node, "description", tmp->description);
if(xml_isNode(node, "movement")) {
cur = node->children;
do {
if(xml_isNode(cur, "thrust"))
tmp->thrust = xml_getInt(cur);
else if(xml_isNode(cur, "turn"))
tmp->turn = xml_getInt(cur);
else if(xml_isNode(cur, "speed"))
tmp->speed = xml_getInt(cur);
} while((cur = cur->next));
xmlr_int(cur, "thrust", tmp->thrust);
xmlr_int(cur, "turn", tmp->turn);
xmlr_int(cur, "speed", tmp->speed);
} while(xml_nextNode(cur));
}
else if(xml_isNode(node, "health")) {
cur = node->children;
do {
if(xml_isNode(cur, "armour"))
tmp->armour = (double)xml_getInt(cur);
else if(xml_isNode(cur, "shield"))
tmp->shield = (double)xml_getInt(cur);
else if(xml_isNode(cur, "energy"))
tmp->energy = (double)xml_getInt(cur);
else if(xml_isNode(cur, "armour_regen"))
xmlr_float(cur, "armour", tmp->armour);
xmlr_float(cur, "shield", tmp->shield);
xmlr_float(cur, "energy", tmp->energy);
if(xml_isNode(cur, "armour_regen"))
tmp->armour_regen = (double)(xml_getInt(cur))/60.0;
else if(xml_isNode(cur, "shield_regen"))
tmp->shield_regen = (double)(xml_getInt(cur))/60.0;
else if(xml_isNode(cur, "energy_regen"))
tmp->energy_regen = (double)(xml_getInt(cur))/60.0;
} while((cur = cur->next));
} while(xml_nextNode(cur));
}
else if(xml_isNode(node, "characteristics")) {
cur = node->children;
do {
if(xml_isNode(cur, "crew"))
tmp->crew = xml_getInt(cur);
else if(xml_isNode(cur, "mass"))
tmp->mass = (double)xml_getInt(cur);
else if(xml_isNode(cur, "cap_weapon"))
tmp->cap_weapon = xml_getInt(cur);
else if(xml_isNode(cur, "cap_cargo"))
tmp->cap_cargo = xml_getInt(cur);
} while((cur = cur->next));
xmlr_int(cur, "crew", tmp->crew);
xmlr_float(cur, "mass", tmp->mass);
xmlr_int(cur, "fuel", tmp->fuel);
xmlr_int(cur, "cap_weapon", tmp->cap_weapon);
xmlr_int(cur, "cap_cargo", tmp->cap_cargo);
} while(xml_nextNode(cur));
}
else if(xml_isNode(node, "outfits")) {
cur = node->children;
@ -179,9 +164,9 @@ static Ship* ship_parse(xmlNodePtr parent) {
ocur->next = otmp;
}
}
} while((cur = cur->next));
} while(xml_nextNode(cur));
}
} while((node = node->next));
} while(xml_nextNode(node));
tmp->thrust *= tmp->mass; // Helps keep number sane.
@ -202,7 +187,8 @@ static Ship* ship_parse(xmlNodePtr parent) {
MELEMENT(tmp->shield==0, "shield");
MELEMENT(tmp->shield_regen==0, "shield_regen");
MELEMENT(tmp->energy==0, "energy");
MELEMENT(tmp->energy_regen==0, "energt_regen");
MELEMENT(tmp->energy_regen==0, "energy_regen");
MELEMENT(tmp->fuel==0, "fuel");
MELEMENT(tmp->crew==0, "crew");
MELEMENT(tmp->mass==0, "mass");
MELEMENT(tmp->cap_cargo==0, "cap_cargo");

View File

@ -57,6 +57,7 @@ typedef struct Ship_ {
// Characteristics.
int crew;
int mass;
int fuel; // How many jumps by default.
// Health.
double armour, armour_regen;

View File

@ -34,6 +34,8 @@
if(xml_isNode(n,s)) { f = xml_getFloat(n); continue; }
#define xmlr_str(n,s,str) \
if(xml_isNode(n,s)) { str = xml_get(n); continue; }
#define xmlr_strd(n,s,str) \
if(xml_isNode(n,s)) { str = strdup(xml_get(n)); continue; }
#define xmlr_attr(n,s,a) \
a = xml_nodeProp(n,s)