From c2d4f39a72683c26c74de8e6c4f6c553ad3dabe6 Mon Sep 17 00:00:00 2001 From: Allanis Date: Tue, 8 Oct 2013 19:34:48 +0100 Subject: [PATCH] [Add] Ships now have human readable class strings instead of numbers. --- dat/ship.xml | 46 ++++++++--------- src/ship.c | 143 ++++++++++++++++++++++++++++++++++++++------------- src/ship.h | 35 +++++++------ 3 files changed, 151 insertions(+), 73 deletions(-) diff --git a/dat/ship.xml b/dat/ship.xml index e878306..2df37e4 100644 --- a/dat/ship.xml +++ b/dat/ship.xml @@ -4,7 +4,7 @@ llama minimal engine - 1 + civ light 120000 Melendez Corp. 2 @@ -37,7 +37,7 @@ hyena minimal engine - 1 + civ light 180000 Aerosys 2 @@ -70,7 +70,7 @@ pacifier minimal engine - 2 + civ medium 1200000 Nexus 8 @@ -106,7 +106,7 @@ pacifier minimal engine - 2 + mil medium 12000000 Nexus 9999 @@ -142,7 +142,7 @@ hawking minimal engine - 3 + civ heavy 7500000 Nexus 9 @@ -177,7 +177,7 @@ hawking_empire minimal engine - 3 + mil heavy 7500000 Nexus 9999 @@ -212,7 +212,7 @@ lancelot minimal engine - 2 + civ medium 500000 Nexus 7 @@ -249,7 +249,7 @@ lancelot_empire minimal engine - 2 + mil medium 500000 Nexus 9999 @@ -285,7 +285,7 @@ mule minimal engine - 2 + civ heavy 900000 Melendez Corp 5 @@ -318,7 +318,7 @@ drone minimal engine - 7 + rob light 300000 Robosys 99 @@ -351,7 +351,7 @@ gawain minimal engine - 1 + civ light 500000 Nexus 11 @@ -384,7 +384,7 @@ goddard minimal engine - 3 + civ heavy 11500000 House Goddard 1001 @@ -420,7 +420,7 @@ goddard_draktharr minimal engine - 3 + mil heavy 11500000 House Goddard 9999 @@ -455,7 +455,7 @@ admonisher minimal engine - 2 + civ medium 900000 Nexus 10 @@ -491,7 +491,7 @@ admonisher_pirate minimal engine - 2 + civ medium 850000 Skull and Bones 9009 @@ -527,7 +527,7 @@ admonisher_empire minimal engine - 2 + civ medium 900000 Nexus 9999 @@ -564,7 +564,7 @@ schroedinger minimal engine - 1 + civ light 180000 Sirius Systems 5 @@ -597,7 +597,7 @@ vendetta minimal engine - 1 + civ light 400000 House Draktharr 8 @@ -630,7 +630,7 @@ vendetta_draktharr minimal engine - 1 + mil light 400000 House Draktharr 9999 @@ -665,7 +665,7 @@ vendetta_pirate minimal engine - 1 + civ light 450000 Skull and Bones 9009 @@ -699,7 +699,7 @@ ancestor minimal engine - 1 + civ light 600000 House Draktharr 9 @@ -734,7 +734,7 @@ ancestor_draktharr minimal engine - 1 + mil light 600000 House Draktharr 9999 @@ -769,7 +769,7 @@ ancestor_pirate minimal engine - 1 + civ light 550000 Skull and Bones 9009 diff --git a/src/ship.c b/src/ship.c index 853a941..486f17b 100644 --- a/src/ship.c +++ b/src/ship.c @@ -97,17 +97,82 @@ char** ship_getTech(int* n, const int* tech, const int techmax) { } /* Get the ship's classname. */ -static char* ship_classes[] = { - "NULL", - "Civialian Light", "Civilian Medium", "Civilian Heavy" - "Military Light", "Military Medium", "Military Heavy" - "Robotic Light", "Robotic Medium", "Robotic Heavy" - "Hybrid Light", "Hybrid Medium", "Hybrid Heavy" - -}; char* ship_class(Ship* s) { - return ship_classes[s->class]; + switch(s->class) { + case SHIP_CLASS_NULL: + return "NULL"; + /* Civilian */ + case SHIP_CLASS_CIV_LIGHT: + return "Civilian Light"; + case SHIP_CLASS_CIV_MEDIUM: + return "Civilian Medium"; + case SHIP_CLASS_CIV_HEAVY: + return "Civilian Heavy"; + /* Military. */ + case SHIP_CLASS_MIL_LIGHT: + return "Military Light"; + case SHIP_CLASS_MIL_MEDIUM: + return "Military Medium"; + case SHIP_CLASS_MIL_HEAVY: + return "Military Heavy"; + /* Robotic. */ + case SHIP_CLASS_ROB_LIGHT: + return "Robotic Light"; + case SHIP_CLASS_ROB_MEDIUM: + return "Robotic Medium"; + case SHIP_CLASS_ROB_HEAVY: + return "Robotic Heavy"; + /* Hybrid. */ + case SHIP_CLASS_HYB_LIGHT: + return "Hybrid Light"; + case SHIP_CLASS_HYB_MEDIUM: + return "Hybrid Medium"; + case SHIP_CLASS_HYB_HEAVY: + return "Hybrid Heavy"; + default: + return "Unknown"; + } +} + +/** + * @fn static ShipClass ship_classFromString(char* str) + * + * @brief Get the machine ship class identifier from a human readable string. + * @param str String to extract ship class identifier from. + */ +static ShipClass ship_classFromString(char* str) { + /* Civilian. */ + if(strcmp(str, "civ light")==0) + return SHIP_CLASS_CIV_LIGHT; + if(strcmp(str, "civ medium")==0) + return SHIP_CLASS_CIV_MEDIUM; + if(strcmp(str, "civ heavy")==0) + return SHIP_CLASS_CIV_HEAVY; + /* Military. */ + if(strcmp(str, "mil light")==0) + return SHIP_CLASS_MIL_LIGHT; + if(strcmp(str, "mil medium")==0) + return SHIP_CLASS_MIL_MEDIUM; + if(strcmp(str, "mil heavy")==0) + return SHIP_CLASS_MIL_HEAVY; + /* Robotic. */ + if(strcmp(str, "rob light")==0) + return SHIP_CLASS_ROB_LIGHT; + if(strcmp(str, "rob medium")==0) + return SHIP_CLASS_ROB_MEDIUM; + if(strcmp(str, "rob heavy")==0) + return SHIP_CLASS_ROB_HEAVY; + /* Hybrid. */ + if(strcmp(str, "hyb light")==0) + return SHIP_CLASS_HYB_LIGHT; + if(strcmp(str, "hyb medium")==0) + return SHIP_CLASS_HYB_MEDIUM; + if(strcmp(str, "hyb heavy")==0) + return SHIP_CLASS_HYB_HEAVY; + + /* Unknown. */ + return SHIP_CLASS_NULL; } /** @@ -165,9 +230,13 @@ static Ship* ship_parse(xmlNodePtr parent) { } } xmlr_strd(node, "GUI", tmp->gui); - if(xml_isNode(node, "sound")) + if(xml_isNode(node, "sound")) { tmp->sound = sound_get(xml_get(node)); - xmlr_int(node, "class", tmp->class); + continue; + } + if(xml_isNode(node, "class")) { + tmp->class = ship_classFromString(xml_get(node)); + } xmlr_int(node, "price", tmp->price); xmlr_int(node, "tech", tmp->tech); xmlr_strd(node, "fabricator", tmp->fabricator); @@ -179,8 +248,9 @@ static Ship* ship_parse(xmlNodePtr parent) { xmlr_int(cur, "turn", tmp->turn); xmlr_int(cur, "speed", tmp->speed); } while(xml_nextNode(cur)); + continue; } - else if(xml_isNode(node, "health")) { + if(xml_isNode(node, "health")) { cur = node->children; do { xmlr_float(cur, "armour", tmp->armour); @@ -193,8 +263,9 @@ static Ship* ship_parse(xmlNodePtr parent) { else if(xml_isNode(cur, "energy_regen")) tmp->energy_regen = (double)(xml_getInt(cur))/60.0; } while(xml_nextNode(cur)); + continue; } - else if(xml_isNode(node, "characteristics")) { + if(xml_isNode(node, "characteristics")) { cur = node->children; do { xmlr_int(cur, "crew", tmp->crew); @@ -203,8 +274,9 @@ static Ship* ship_parse(xmlNodePtr parent) { xmlr_int(cur, "cap_weapon", tmp->cap_weapon); xmlr_int(cur, "cap_cargo", tmp->cap_cargo); } while(xml_nextNode(cur)); + continue; } - else if(xml_isNode(node, "outfits")) { + if(xml_isNode(node, "outfits")) { cur = node->children; do { if(xml_isNode(cur, "outfit")) { @@ -225,6 +297,7 @@ static Ship* ship_parse(xmlNodePtr parent) { } } } while(xml_nextNode(cur)); + continue; } } while(xml_nextNode(node)); @@ -232,27 +305,27 @@ static Ship* ship_parse(xmlNodePtr parent) { #define MELEMENT(o,s) if(o) WARN("Ship '%s' missing '"s"' element", tmp->name) MELEMENT(tmp->name == NULL, "name"); - MELEMENT(tmp->gfx_space == NULL, "GFX"); - MELEMENT(tmp->gui == NULL, "GUI"); - MELEMENT(tmp->class==0, "class"); - MELEMENT(tmp->price==0, "price"); - MELEMENT(tmp->tech==0, "tech"); - MELEMENT(tmp->fabricator==0, "fabricator"); - MELEMENT(tmp->description==0, "description"); - MELEMENT(tmp->thrust==0, "thrust"); - MELEMENT(tmp->turn==0, "turn"); - MELEMENT(tmp->speed==0, "speed"); - MELEMENT(tmp->armour==0, "armour"); - MELEMENT(tmp->armour_regen==0, "armour_regen"); - MELEMENT(tmp->shield==0, "shield"); - MELEMENT(tmp->shield_regen==0, "shield_regen"); - MELEMENT(tmp->energy==0, "energy"); - 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"); - MELEMENT(tmp->cap_weapon==0, "cap_weapon"); + MELEMENT(tmp->gfx_space == NULL, "GFX"); + MELEMENT(tmp->gui == NULL, "GUI"); + MELEMENT(tmp->class==SHIP_CLASS_NULL, "class"); + MELEMENT(tmp->price==0, "price"); + MELEMENT(tmp->tech==0, "tech"); + MELEMENT(tmp->fabricator==0, "fabricator"); + MELEMENT(tmp->description==0, "description"); + MELEMENT(tmp->thrust==0, "thrust"); + MELEMENT(tmp->turn==0, "turn"); + MELEMENT(tmp->speed==0, "speed"); + MELEMENT(tmp->armour==0, "armour"); + MELEMENT(tmp->armour_regen==0, "armour_regen"); + MELEMENT(tmp->shield==0, "shield"); + MELEMENT(tmp->shield_regen==0, "shield_regen"); + MELEMENT(tmp->energy==0, "energy"); + 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"); + MELEMENT(tmp->cap_weapon==0, "cap_weapon"); #undef MELEMENT return tmp; diff --git a/src/ship.h b/src/ship.h index 644af96..83d8b53 100644 --- a/src/ship.h +++ b/src/ship.h @@ -4,23 +4,28 @@ #include "sound.h" /* Target gfx dimensions. */ -#define SHIP_TARGET_W 128 -#define SHIP_TARGET_H 96 +#define SHIP_TARGET_W 128 /**< Ship target graphic width. */ +#define SHIP_TARGET_H 96 /**< Ship target graphic height. */ +/** + * @typedef ShipClass + * + * @breif Contains the different types of ships. + */ typedef enum ShipClass_ { - SHIP_CLASS_NULL = 0, - SHIP_CLASS_CIV_LIGHT = 1, - SHIP_CLASS_CIV_MEDIUM = 2, - SHIP_CLASS_CIV_HEAVY = 3, - SHIP_CLASS_MIL_LIGHT = 4, - SHIP_CLASS_MIL_MEDIUM = 5, - SHIP_CLASS_MIL_HEAVY = 6, - SHIP_CLASS_ROB_LIGHT = 7, - SHIP_CLASS_ROB_MEDIUM = 8, - SHIP_CLASS_ROB_HEAVY = 9, - SHIP_CLASS_HYB_LIGHT = 10, - SHIP_CLASS_HYB_MEDIUM = 11, - SHIP_CLASS_HYB_HEAVY = 12 + SHIP_CLASS_NULL, + SHIP_CLASS_CIV_LIGHT, + SHIP_CLASS_CIV_MEDIUM, + SHIP_CLASS_CIV_HEAVY, + SHIP_CLASS_MIL_LIGHT, + SHIP_CLASS_MIL_MEDIUM, + SHIP_CLASS_MIL_HEAVY, + SHIP_CLASS_ROB_LIGHT, + SHIP_CLASS_ROB_MEDIUM, + SHIP_CLASS_ROB_HEAVY, + SHIP_CLASS_HYB_LIGHT, + SHIP_CLASS_HYB_MEDIUM, + SHIP_CLASS_HYB_HEAVY } ShipClass; /* Small wrapper for the outfits. */