[Add] Implemented fleet addition and removal!

This commit is contained in:
Allanis 2013-12-11 22:19:06 +00:00
parent 80c45c3067
commit 8b1b6e2af0
3 changed files with 86 additions and 18 deletions

View File

@ -819,11 +819,57 @@ int system_rmPlanet(StarSystem* sys, char* planetname) {
return 0; return 0;
} }
/**
* @fn int system_addFleet(StarSystem* sys, SystemFleet* fleet)
*
* @brief Add a fleet to a star system.
* @param sys Star system to add fleet to.
* @param fleet Fleet to add.
* @return 0 on success.
*/
int system_addFleet(StarSystem* sys, SystemFleet* fleet) {
if(sys == NULL)
return -1;
sys->fleets = realloc(sys->fleets, sizeof(SystemFleet) * (++sys->nfleets));
memcpy(sys->fleets+(sys->nfleets-1), fleet, sizeof(SystemFleet));
return 0;
}
/**
* @fn int system_rmFleet(StarSystem* sys, SystemFleet* fleet)
*
* @brief Remove a fleet from a star system.
* @param sys Star System to remove fleet from.
* @param fleet Fleet to remove.
* @return 0 on success.
*/
int system_rmFleet(StarSystem* sys, SystemFleet* fleet) {
int i;
/* Find a matching fleet (will grab first since can be duplicates). */
for(i = 0; i < sys->nfleets; i++)
if((fleet->fleet == sys->fleets[i].fleet) &&
(fleet->chance == sys->fleets[i].chance))
break;
/* Not found. */
if(i >= sys->nfleets)
return -1;
sys->nfleets--;
memmove(&sys->fleets[i], &sys->fleets[i+1], sizeof(SystemFleet) * (sys->nfleets - i));
sys->fleets = realloc(sys->fleets, sizeof(SystemFleet) * sys->nfleets);
return 0;
}
/* Parse node 'parent' which should be the node of a system. */ /* Parse node 'parent' which should be the node of a system. */
/* Return the StarSystem fully loaded. */ /* Return the StarSystem fully loaded. */
static StarSystem* system_parse(StarSystem* sys, const xmlNodePtr parent) { static StarSystem* system_parse(StarSystem* sys, const xmlNodePtr parent) {
Planet* planet; Planet* planet;
SystemFleet* fleet; SystemFleet fleet;
char* ptrc; char* ptrc;
xmlNodePtr cur, node; xmlNodePtr cur, node;
@ -833,7 +879,6 @@ static StarSystem* system_parse(StarSystem* sys, const xmlNodePtr parent) {
/* Clear memory for sane defaults. */ /* Clear memory for sane defaults. */
memset(sys, 0, sizeof(StarSystem)); memset(sys, 0, sizeof(StarSystem));
planet = NULL; planet = NULL;
fleet = NULL;
size = 0; size = 0;
sys->name = xml_nodeProp(parent, "name"); /* Already mallocs. */ sys->name = xml_nodeProp(parent, "name"); /* Already mallocs. */
@ -891,21 +936,21 @@ static StarSystem* system_parse(StarSystem* sys, const xmlNodePtr parent) {
cur = node->children; cur = node->children;
do { do {
if(cur && xml_isNode(cur, "fleet")) { if(cur && xml_isNode(cur, "fleet")) {
fleet = CALLOC_L(SystemFleet); memset(&fleet, 0, sizeof(SystemFleet));
fleet->fleet = fleet_get(xml_get(cur));
if(fleet->fleet == NULL) fleet.fleet = fleet_get(xml_get(cur));
if(fleet.fleet == NULL)
WARN("Fleet %s for Star System %s not found", xml_get(cur), sys->name); WARN("Fleet %s for Star System %s not found", xml_get(cur), sys->name);
ptrc = xml_nodeProp(cur, "chance"); /* Malloc ptrc. */ xmlr_attr(cur, "chance", ptrc); /* mallocs ptrc. */
fleet->chance = atoi(ptrc); if(ptrc == NULL) fleet.chance = 0; /* Gives warning. */
if(fleet->chance == 0) else fleet.chance = atoi(ptrc);
if(fleet.chance == 0)
WARN("Fleet %s for Star System %s has 0%% chance to appear", WARN("Fleet %s for Star System %s has 0%% chance to appear",
fleet->fleet->name, sys->name); fleet.fleet->name, sys->name);
if(ptrc) free(ptrc); /* Free the ptrc. */ if(ptrc) free(ptrc); /* Free the ptrc. */
sys->fleets = realloc(sys->fleets, sizeof(SystemFleet)*(++sys->nfleets)); system_addFleet(sys, &fleet);
memcpy(sys->fleets+(sys->nfleets-1), fleet, sizeof(SystemFleet));
free(fleet);
} }
} while(xml_nextNode(cur)); } while(xml_nextNode(cur));
} }

View File

@ -142,8 +142,12 @@ void space_exit(void);
char* planet_getSystem(char* planetname); char* planet_getSystem(char* planetname);
Planet* planet_get(char* planetname); Planet* planet_get(char* planetname);
char planet_getClass(Planet* p); char planet_getClass(Planet* p);
/* System adding/removing stuff. */
int system_addPlanet(StarSystem* sys, char* planetname); int system_addPlanet(StarSystem* sys, char* planetname);
int system_rmPlanet(StarSystem* sys, char* planetname); int system_rmPlanet(StarSystem* sys, char* planetname);
int system_addFleet(StarSystem* sys, SystemFleet* fleet);
int system_rmFleet(StarSystem* sys, SystemFleet* fleet);
/* Render. */ /* Render. */
void space_render(const double dt); void space_render(const double dt);

View File

@ -68,6 +68,7 @@ typedef struct UniHunk_ {
UniHunkType_t type; /**< Type of hunk it is. */ UniHunkType_t type; /**< Type of hunk it is. */
union { union {
char* name; char* name;
SystemFleet fleet;
} u; /* Actual data to patch. */ } u; /* Actual data to patch. */
} UniHunk_t; } UniHunk_t;
@ -241,8 +242,13 @@ static int diff_patch(xmlNodePtr parent) {
hunk.target.type = base.target.type; hunk.target.type = base.target.type;
hunk.target.u.name = strdup(base.target.u.name); hunk.target.u.name = strdup(base.target.u.name);
/* Get the planet to modify. */ /* Get the fleet properties. */
xmlr_attr(cur, "name", hunk.u.name); xmlr_attr(cur, "name", buf);
hunk.u.fleet.fleet = fleet_get(buf);
free(buf);
xmlr_attr(cur, "chance", buf);
hunk.u.fleet.chance = atoi(buf);
free(buf);
/* Get the type. */ /* Get the type. */
buf = xml_get(cur); buf = xml_get(cur);
@ -285,10 +291,14 @@ static int diff_patchHunk(UniHunk_t* hunk) {
case HUNK_TYPE_PLANET_REMOVE: case HUNK_TYPE_PLANET_REMOVE:
return system_rmPlanet(system_get(hunk->target.u.name), hunk->u.name); return system_rmPlanet(system_get(hunk->target.u.name), hunk->u.name);
/* Adding a fleet. */
case HUNK_TYPE_FLEET_ADD: case HUNK_TYPE_FLEET_ADD:
break; return system_addFleet(system_get(hunk->target.u.name), &hunk->u.fleet);
/* Removing a fleet. */
case HUNK_TYPE_FLEET_REMOVE: case HUNK_TYPE_FLEET_REMOVE:
break; return system_rmFleet(system_get(hunk->target.u.name), &hunk->u.fleet);
default: default:
WARN("Unkown hunk type '%d'.", hunk->type); WARN("Unkown hunk type '%d'.", hunk->type);
break; break;
@ -463,8 +473,17 @@ static void diff_cleanup(UniDiff_t* diff) {
static void diff_cleanupHunk(UniHunk_t* hunk) { static void diff_cleanupHunk(UniHunk_t* hunk) {
if(hunk->target.u.name != NULL) if(hunk->target.u.name != NULL)
free(hunk->target.u.name); free(hunk->target.u.name);
switch(hunk->type) {
case HUNK_TYPE_PLANET_ADD:
case HUNK_TYPE_PLANET_REMOVE:
if(hunk->u.name != NULL) if(hunk->u.name != NULL)
free(hunk->u.name); free(hunk->u.name);
break;
default:
break;
}
memset(hunk, 0, sizeof(UniHunk_t)); memset(hunk, 0, sizeof(UniHunk_t));
} }