[Add] Modification/Upgrades to ships.
This commit is contained in:
parent
2f59ae1b84
commit
ee3c81b7ff
@ -141,4 +141,28 @@
|
|||||||
</damage>
|
</damage>
|
||||||
</specific>
|
</specific>
|
||||||
</outfit>
|
</outfit>
|
||||||
|
<outfit name="Battery">
|
||||||
|
<general>
|
||||||
|
<max>10</max>
|
||||||
|
<tech>3</tech>
|
||||||
|
<mass>2</mass>
|
||||||
|
<price>22500</price>
|
||||||
|
<description>A heavy battery that will increase your ships energy allowing you to pack more firepower.</description>
|
||||||
|
</general>
|
||||||
|
<specific type="15">
|
||||||
|
<energy>75</energy>
|
||||||
|
</specific>
|
||||||
|
</outfit>
|
||||||
|
<outfit name="Solar Panel">
|
||||||
|
<general>
|
||||||
|
<max>3</max>
|
||||||
|
<tech>5</tech>
|
||||||
|
<mass>3</mass>
|
||||||
|
<price>55000</price>
|
||||||
|
<description>A big panel that will generate energy based off solar energy. This will allow ships to regenerate it's enrgy supplies faster.</description>
|
||||||
|
</general>
|
||||||
|
<specific type="15">
|
||||||
|
<energy_regen>125</energy_regen>
|
||||||
|
</specific>
|
||||||
|
</outfit>
|
||||||
</Outfits>
|
</Outfits>
|
||||||
|
45
src/outfit.c
45
src/outfit.c
@ -28,6 +28,7 @@ static Outfit* outfit_parse(const xmlNodePtr parent);
|
|||||||
static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent);
|
static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent);
|
||||||
static void outfit_parseSLauncher(Outfit* tmp, const xmlNodePtr parent);
|
static void outfit_parseSLauncher(Outfit* tmp, const xmlNodePtr parent);
|
||||||
static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent);
|
static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent);
|
||||||
|
static void outfit_parseSMod(Outfit* tmp, const xmlNodePtr parent);
|
||||||
|
|
||||||
// Return an outfit.
|
// Return an outfit.
|
||||||
Outfit* outfit_get(const char* name) {
|
Outfit* outfit_get(const char* name) {
|
||||||
@ -89,6 +90,10 @@ int outfit_isTurret(const Outfit* o) {
|
|||||||
(o->type == OUTFIT_TYPE_TURRET_BEAM));
|
(o->type == OUTFIT_TYPE_TURRET_BEAM));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int outfit_isMod(const Outfit* o) {
|
||||||
|
return (o->type == OUTFIT_TYPE_MODIFICATION);
|
||||||
|
}
|
||||||
|
|
||||||
// Get the outfit graphics.
|
// Get the outfit graphics.
|
||||||
glTexture* outfit_gfx(const Outfit* o) {
|
glTexture* outfit_gfx(const Outfit* o) {
|
||||||
if(outfit_isWeapon(o)) return o->u.blt.gfx_space;
|
if(outfit_isWeapon(o)) return o->u.blt.gfx_space;
|
||||||
@ -148,7 +153,8 @@ const char* outfit_typename[] = {
|
|||||||
"Smart Swarm Missile",
|
"Smart Swarm Missile",
|
||||||
"Smart Swarm Missile Ammunition Pack",
|
"Smart Swarm Missile Ammunition Pack",
|
||||||
"Bolt Turret",
|
"Bolt Turret",
|
||||||
"Beam Turret"
|
"Beam Turret",
|
||||||
|
"Modification"
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return the broad outfit type.
|
// Return the broad outfit type.
|
||||||
@ -157,7 +163,8 @@ const char* outfit_typenamebroad[] = {
|
|||||||
"Weapon",
|
"Weapon",
|
||||||
"Launcher",
|
"Launcher",
|
||||||
"Ammo",
|
"Ammo",
|
||||||
"Turret"
|
"Turret",
|
||||||
|
"Modification"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* outfit_getTypeBroad(const Outfit* o) {
|
const char* outfit_getTypeBroad(const Outfit* o) {
|
||||||
@ -166,6 +173,7 @@ const char* outfit_getTypeBroad(const Outfit* o) {
|
|||||||
else if(outfit_isLauncher(o)) i = 2;
|
else if(outfit_isLauncher(o)) i = 2;
|
||||||
else if(outfit_isAmmo(o)) i = 3;
|
else if(outfit_isAmmo(o)) i = 3;
|
||||||
else if(outfit_isTurret(o)) i = 4;
|
else if(outfit_isTurret(o)) i = 4;
|
||||||
|
else if(outfit_isMod(o)) i = 5;
|
||||||
|
|
||||||
return outfit_typenamebroad[i];
|
return outfit_typenamebroad[i];
|
||||||
}
|
}
|
||||||
@ -284,6 +292,37 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) {
|
|||||||
#undef MELEMENT
|
#undef MELEMENT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void outfit_parseSMod(Outfit* tmp, const xmlNodePtr parent) {
|
||||||
|
xmlNodePtr node;
|
||||||
|
node = parent->xmlChildrenNode;
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// 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"))
|
||||||
|
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;
|
||||||
|
else if(xml_isNode(node, "energy_regen"))
|
||||||
|
tmp->u.mod.energy_regen = xml_getFloat(node)/60.0;
|
||||||
|
|
||||||
|
} while((node = node->next));
|
||||||
|
}
|
||||||
|
|
||||||
// Parse and return Outfits from parent node.
|
// Parse and return Outfits from parent node.
|
||||||
static Outfit* outfit_parse(const xmlNodePtr parent) {
|
static Outfit* outfit_parse(const xmlNodePtr parent) {
|
||||||
Outfit* tmp = CALLOC_L(Outfit);
|
Outfit* tmp = CALLOC_L(Outfit);
|
||||||
@ -332,6 +371,8 @@ static Outfit* outfit_parse(const xmlNodePtr parent) {
|
|||||||
outfit_parseSAmmo(tmp, node);
|
outfit_parseSAmmo(tmp, node);
|
||||||
else if(outfit_isTurret(tmp))
|
else if(outfit_isTurret(tmp))
|
||||||
outfit_parseSWeapon(tmp, node);
|
outfit_parseSWeapon(tmp, node);
|
||||||
|
else if(outfit_isMod(tmp))
|
||||||
|
outfit_parseSMod(tmp, node);
|
||||||
}
|
}
|
||||||
} while((node = node->next));
|
} while((node = node->next));
|
||||||
#define MELEMENT(o,s) if(o) WARN("Outfit '%s' missing '"s"' element", tmp->name)
|
#define MELEMENT(o,s) if(o) WARN("Outfit '%s' missing '"s"' element", tmp->name)
|
||||||
|
13
src/outfit.h
13
src/outfit.h
@ -22,7 +22,8 @@ typedef enum OutfitType_ {
|
|||||||
OUTFIT_TYPE_MISSILE_SWARM_SMART = 11,
|
OUTFIT_TYPE_MISSILE_SWARM_SMART = 11,
|
||||||
OUTFIT_TYPE_MISSILE_SWARM_SMART_AMMO = 12,
|
OUTFIT_TYPE_MISSILE_SWARM_SMART_AMMO = 12,
|
||||||
OUTFIT_TYPE_TURRET_BOLT = 13,
|
OUTFIT_TYPE_TURRET_BOLT = 13,
|
||||||
OUTFIT_TYPE_TURRET_BEAM = 14
|
OUTFIT_TYPE_TURRET_BEAM = 14,
|
||||||
|
OUTFIT_TYPE_MODIFICATION = 15
|
||||||
} OutfitType;
|
} OutfitType;
|
||||||
|
|
||||||
// An outfit depends a lot on the type.
|
// An outfit depends a lot on the type.
|
||||||
@ -80,6 +81,15 @@ typedef struct Outfit_ {
|
|||||||
int spfx; // Special effect on hit.
|
int spfx; // Special effect on hit.
|
||||||
unsigned int lockon; // Time taken to lock on the target.
|
unsigned int lockon; // Time taken to lock on the target.
|
||||||
} amm;
|
} amm;
|
||||||
|
struct { // Modification.
|
||||||
|
// Movement.
|
||||||
|
double thrust, turn, speed;
|
||||||
|
|
||||||
|
// Health.
|
||||||
|
double armour, armour_regen;
|
||||||
|
double shield, shield_regen;
|
||||||
|
double energy, energy_regen;
|
||||||
|
} mod;
|
||||||
} u;
|
} u;
|
||||||
} Outfit;
|
} Outfit;
|
||||||
|
|
||||||
@ -91,6 +101,7 @@ int outfit_isWeapon(const Outfit* o);
|
|||||||
int outfit_isLauncher(const Outfit* o);
|
int outfit_isLauncher(const Outfit* o);
|
||||||
int outfit_isAmmo(const Outfit* o);
|
int outfit_isAmmo(const Outfit* o);
|
||||||
int outfit_isTurret(const Outfit* o);
|
int outfit_isTurret(const Outfit* o);
|
||||||
|
int outfit_isMod(const Outfit* o);
|
||||||
const char* outfit_getType(const Outfit* o);
|
const char* outfit_getType(const Outfit* o);
|
||||||
const char* outfit_getTypeBroad(const Outfit* o);
|
const char* outfit_getTypeBroad(const Outfit* o);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user