[Add] Jammers now loaded (not used yet).

This commit is contained in:
Allanis 2013-08-07 20:16:45 +01:00
parent 136289bac5
commit 0db99107e0
2 changed files with 48 additions and 4 deletions

View File

@ -36,6 +36,7 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent);
static void outfit_parseSMod(Outfit* tmp, const xmlNodePtr parent); static void outfit_parseSMod(Outfit* tmp, const xmlNodePtr parent);
static void outfit_parseSAfterburner(Outfit* tmp, const xmlNodePtr parent); static void outfit_parseSAfterburner(Outfit* tmp, const xmlNodePtr parent);
static void outfit_parseSMap(Outfit* tmp, const xmlNodePtr parent); static void outfit_parseSMap(Outfit* tmp, const xmlNodePtr parent);
static void outfit_parseSJammer(Outfit* tmp, const xmlNodePtr parent);
/* Return an outfit. */ /* Return an outfit. */
Outfit* outfit_get(const char* name) { Outfit* outfit_get(const char* name) {
@ -186,6 +187,11 @@ int outfit_isMap(const Outfit* o) {
return(o->type == OUTFIT_TYPE_MAP); return(o->type == OUTFIT_TYPE_MAP);
} }
/* Return 1 if o is a jammer. */
int outfit_isJammer(const Outfit* o) {
return(o->type == OUTFIT_TYPE_JAMMER);
}
/* 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;
@ -264,7 +270,8 @@ const char* outfit_typename[] = {
"Smart Swarm Missile Ammunition Pack", "Smart Swarm Missile Ammunition Pack",
"Ship Modification", "Ship Modification",
"Afterburner", "Afterburner",
"Map" "Map",
"Jammer"
}; };
const char* outfit_getType(const Outfit* o) { const char* outfit_getType(const Outfit* o) {
@ -280,7 +287,8 @@ const char* outfit_typenamebroad[] = {
"Turret", "Turret",
"Modification", "Modification",
"Afterburner", "Afterburner",
"Map" "Map",
"Jammer"
}; };
const char* outfit_getTypeBroad(const Outfit* o) { const char* outfit_getTypeBroad(const Outfit* o) {
@ -292,6 +300,7 @@ const char* outfit_getTypeBroad(const Outfit* o) {
else if(outfit_isMod(o)) i = 5; else if(outfit_isMod(o)) i = 5;
else if(outfit_isAfterburner(o)) i = 6; else if(outfit_isAfterburner(o)) i = 6;
else if(outfit_isMap(o)) i = 7; else if(outfit_isMap(o)) i = 7;
else if(outfit_isJammer(o)) i = 8;
return outfit_typenamebroad[i]; return outfit_typenamebroad[i];
} }
@ -328,6 +337,7 @@ static OutfitType outfit_strToOutfitType(char* buf) {
O_CMP("modification", OUTFIT_TYPE_MODIFICATION); O_CMP("modification", OUTFIT_TYPE_MODIFICATION);
O_CMP("afterburner", OUTFIT_TYPE_AFTERBURNER); O_CMP("afterburner", OUTFIT_TYPE_AFTERBURNER);
O_CMP("map", OUTFIT_TYPE_MAP); O_CMP("map", OUTFIT_TYPE_MAP);
O_CMP("jammer", OUTFIT_TYPE_JAMMER);
WARN("Invalid outfit type '%s'", buf); WARN("Invalid outfit type '%s'", buf);
return OUTFIT_TYPE_NULL; return OUTFIT_TYPE_NULL;
@ -338,14 +348,17 @@ static int outfit_parseDamage(DamageType* dtype, double* dmg, xmlNodePtr node) {
char* buf; char* buf;
if(xml_isNode(node, "damage")) { if(xml_isNode(node, "damage")) {
/* Get type. */
xmlr_attr(node, "type", buf); xmlr_attr(node, "type", buf);
(*dtype) = outfit_strToDamageType(buf); (*dtype) = outfit_strToDamageType(buf);
if(buf) free(buf); if(buf) free(buf);
/* Get damage. */
(*dmg) = xml_getFloat(node); (*dmg) = xml_getFloat(node);
return 0; return 0;
} }
/* Unknown type. */
(*dtype) = DAMAGE_TYPE_NULL; (*dtype) = DAMAGE_TYPE_NULL;
(*dmg) = 0; (*dmg) = 0;
WARN("Trying to parse non-damage node as damage node!"); WARN("Trying to parse non-damage node as damage node!");
@ -504,9 +517,31 @@ static void outfit_parseSMap(Outfit* tmp, const xmlNodePtr parent) {
node = parent->children; node = parent->children;
do { do {
if(xml_isNode(node, "radius")) xmlr_int(node, "radius", tmp->u.map.radius);
tmp->u.map.radius = xml_getInt(node);
} while(xml_nextNode(node)); } while(xml_nextNode(node));
if(tmp->u.map.radius == 0)
WARN("Outfit '%s' missing/invalid 'radius' element", tmp->name);
}
/* Parses the jammer tidbits of the outfit. */
static void outfit_parseSJammer(Outfit* tmp, const xmlNodePtr parent) {
xmlNodePtr node;
node = parent->children;
do {
xmlr_float(node, "range", tmp->u.jam.range);
xmlr_float(node, "chance", tmp->u.jam.chance);
xmlr_float(node, "energy", tmp->u.jam.energy);
} while(xml_nextNode(node));
tmp->u.jam.chance /= 100.; /* Put in per one, instead of percent. */
#define MELEMENT(o, s) \
if(o) WARN("Outfit '%s' missing/invalid '"s"' element", tmp->name)
MELEMENT(tmp->u.jam.range==0., "range");
MELEMENT(tmp->u.jam.chance==0., "chance");
#undef MELEMENT
} }
/* Parse and return Outfits from parent node. */ /* Parse and return Outfits from parent node. */
@ -569,6 +604,8 @@ static Outfit* outfit_parse(const xmlNodePtr parent) {
outfit_parseSAfterburner(tmp, node); outfit_parseSAfterburner(tmp, node);
else if(outfit_isMap(tmp)) else if(outfit_isMap(tmp))
outfit_parseSMap(tmp, node); outfit_parseSMap(tmp, node);
else if(outfit_isJammer(tmp))
outfit_parseSJammer(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)

View File

@ -26,6 +26,7 @@ typedef enum OutfitType_ {
OUTFIT_TYPE_MODIFICATION, OUTFIT_TYPE_MODIFICATION,
OUTFIT_TYPE_AFTERBURNER, OUTFIT_TYPE_AFTERBURNER,
OUTFIT_TYPE_MAP, OUTFIT_TYPE_MAP,
OUTFIT_TYPE_JAMMER,
OUTFIT_TYPE_SENTINEL /* Indicates last type. */ OUTFIT_TYPE_SENTINEL /* Indicates last type. */
} OutfitType; } OutfitType;
@ -117,6 +118,11 @@ typedef struct Outfit_ {
struct { /* Map. */ struct { /* Map. */
double radius; /* Amount of systems to add */ double radius; /* Amount of systems to add */
} map; } map;
struct {
double range; /* Range it starts to do effect. */
double chance; /* Chance of it nullifying the missile. */
double energy; /* Energy it uses to run. */
} jam;
} u; } u;
} Outfit; } Outfit;
@ -135,6 +141,7 @@ int outfit_isTurret(const Outfit* o);
int outfit_isMod(const Outfit* o); int outfit_isMod(const Outfit* o);
int outfit_isAfterburner(const Outfit* o); int outfit_isAfterburner(const Outfit* o);
int outfit_isMap(const Outfit* o); int outfit_isMap(const Outfit* o);
int outfit_isJammer(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);