From d11eabd358b289fbb5d006ca627acb967944d1db Mon Sep 17 00:00:00 2001 From: Allanis Date: Tue, 25 Jun 2013 22:21:56 +0100 Subject: [PATCH] [Add] New outfit: Star map, allows you to see two jump points from current location. --- dat/outfit.xml | 13 +++++++++++ gfx/outfit/store/map.png | Bin 0 -> 25673 bytes src/llua.c | 2 +- src/map.c | 48 +++++++++++++++++++++++++++++++++++---- src/map.h | 3 ++- src/outfit.c | 37 +++++++++++++++++++++++------- src/outfit.h | 7 +++++- src/pilot.c | 7 ++++++ 8 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 gfx/outfit/store/map.png diff --git a/dat/outfit.xml b/dat/outfit.xml index c4d047a..4d5d2ba 100644 --- a/dat/outfit.xml +++ b/dat/outfit.xml @@ -391,4 +391,17 @@ -15 + + +1 +4 +0 +7000 +A Star Map will give you details about all systems up to 2 jumps away. It's a great way to discover parts of the universe. +map + + +2 + + diff --git a/gfx/outfit/store/map.png b/gfx/outfit/store/map.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb936a9af5bb6fe3fb43e68b226235c6f8fecf4 GIT binary patch literal 25673 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

^!7b{~i_e(cgt)Py04EqRZ+PI*Om(!HZS5>=;2m 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 A(EtDd literal 0 HcmV?d00001 diff --git a/src/llua.c b/src/llua.c index 441a345..89fc5b7 100644 --- a/src/llua.c +++ b/src/llua.c @@ -191,7 +191,7 @@ static int space_jumpDist(lua_State* L) { else goal = cur_system->name; - s = map_getJumpPath(&jumps, start, goal); + s = map_getJumpPath(&jumps, start, goal, 1); free(s); lua_pushnumber(L, jumps); diff --git a/src/map.c b/src/map.c index 074b5ee..36ed00c 100644 --- a/src/map.c +++ b/src/map.c @@ -282,7 +282,7 @@ static void map_mouse(SDL_Event* event, double mx, double my) { if(map_path) free(map_path); map_path = map_getJumpPath(&map_npath, - cur_system->name, sys->name); + cur_system->name, sys->name, 0); if(map_npath == 0) hyperspace_target = -1; @@ -540,7 +540,7 @@ static void A_freeList(SysNode* first) { free(p); } -StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend) { +StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend, int ignore_known) { int i, cost; StarSystem* sys, *ssys, *esys, **res; @@ -556,7 +556,7 @@ StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend) { esys = system_get(sysend); /* End. */ /* System target must be known. */ - if(!sys_isKnown(esys)) { + if(!ignore_known && !sys_isKnown(esys)) { if(space_sysReachable(esys)) { /* Can we still reach it? */ res = malloc(sizeof(StarSystem*)); (*njumps) = 1; @@ -582,7 +582,7 @@ StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend) { for(i = 0; i < cur->sys->njumps; i++) { sys = &systems_stack[cur->sys->jumps[i]]; - if(!sys_isKnown(sys)) continue; + if(!ignore_known && !sys_isKnown(sys)) continue; neighbour = A_newNode(sys, NULL); @@ -617,4 +617,44 @@ StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend) { return res; } +/* Marks maps around a radius of current system as known. */ +int map_map(char* targ_sys, int r) { + int i, dep; + StarSystem* sys, *jsys; + SysNode* closed, *open, *cur, *neighbour; + + A_gc = NULL; + open = closed = NULL; + + if(targ_sys == NULL) sys = cur_system; + else sys = system_get(targ_sys); + sys_setFlag(sys, SYSTEM_KNOWN); + open = A_newNode(sys, NULL); + open->r = 0; + + while((cur = A_lowest(open)) != NULL) { + /* Mark system as known and go to next. */ + sys = cur->sys; + dep = cur->r; + sys_setFlag(sys, SYSTEM_KNOWN); + open = A_rm(open, sys); + closed = A_add(closed, cur); + + /* Check it's jumps. */ + for(i = 0; i < sys->njumps; i++) { + jsys = &systems_stack[cur->sys->jumps[i]]; + + /* System has already been parsed or is too deep. */ + if((A_in(closed, jsys) != NULL) || (dep+1 > r)) + continue; + + /* Create new node and such. */ + neighbour = A_newNode(jsys, NULL); + neighbour->r = dep+1; + open = A_add(open, neighbour); + } + } + A_freeList(A_gc); + return 0; +} diff --git a/src/map.h b/src/map.h index 3520f6b..93983f6 100644 --- a/src/map.h +++ b/src/map.h @@ -9,5 +9,6 @@ void map_clear(void); void map_jump(void); /* Manipulate universe stuff. */ -StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend); +StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend, int ignore_known); +int map_map(char* targ_sys, int r); diff --git a/src/outfit.c b/src/outfit.c index 8b294a3..84d8225 100644 --- a/src/outfit.c +++ b/src/outfit.c @@ -35,6 +35,7 @@ static void outfit_parseSLauncher(Outfit* tmp, const xmlNodePtr parent); static void outfit_parseSAmmo(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_parseSMap(Outfit* tmp, const xmlNodePtr parent); /* Return an outfit. */ Outfit* outfit_get(const char* name) { @@ -128,6 +129,10 @@ int outfit_isAfterburner(const Outfit* o) { return (o->type == OUTFIT_TYPE_AFTERBURNER); } +int outfit_isMap(const Outfit* o) { + return(o->type == OUTFIT_TYPE_MAP); +} + /* Get the outfit graphics. */ glTexture* outfit_gfx(const Outfit* o) { if(outfit_isWeapon(o)) return o->u.blt.gfx_space; @@ -189,7 +194,8 @@ const char* outfit_typename[] = { "Bolt Turret", "Beam Turret", "Ship Modification", - "Afterburner" + "Afterburner", + "Map" }; const char* outfit_getType(const Outfit* o) { @@ -204,17 +210,19 @@ const char* outfit_typenamebroad[] = { "Ammo", "Turret", "Modification", - "Afterburner" + "Afterburner", + "Map" }; const char* outfit_getTypeBroad(const Outfit* o) { int i = 0; - if(outfit_isWeapon(o)) i = 1; - else if(outfit_isLauncher(o)) i = 2; - else if(outfit_isAmmo(o)) i = 3; - else if(outfit_isTurret(o)) i = 4; - else if(outfit_isMod(o)) i = 5; - else if(outfit_isAfterburner(o)) i = 6; + if(outfit_isWeapon(o)) i = 1; + else if(outfit_isLauncher(o)) i = 2; + else if(outfit_isAmmo(o)) i = 3; + else if(outfit_isTurret(o)) i = 4; + else if(outfit_isMod(o)) i = 5; + else if(outfit_isAfterburner(o)) i = 6; + else if(outfit_isMap(o)) i = 7; return outfit_typenamebroad[i]; } @@ -250,6 +258,7 @@ static OutfitType outfit_strToOutfitType(char* buf) { O_CMP("turret beam", OUTFIT_TYPE_TURRET_BEAM); O_CMP("modification", OUTFIT_TYPE_MODIFICATION); O_CMP("afterburner", OUTFIT_TYPE_AFTERBURNER); + O_CMP("map", OUTFIT_TYPE_MAP); WARN("Invalid outfit type '%s'", buf); return OUTFIT_TYPE_NULL; @@ -421,6 +430,16 @@ static void outfit_parseSAfterburner(Outfit* tmp, const xmlNodePtr parent) { } while((node = node->next)); } +static void outfit_parseSMap(Outfit* tmp, const xmlNodePtr parent) { + xmlNodePtr node; + node = parent->children; + + do { + if(xml_isNode(node, "radius")) + tmp->u.map.radius = xml_getInt(node); + } while(xml_nextNode(node)); +} + /* Parse and return Outfits from parent node. */ static Outfit* outfit_parse(const xmlNodePtr parent) { Outfit* tmp = CALLOC_L(Outfit); @@ -479,6 +498,8 @@ static Outfit* outfit_parse(const xmlNodePtr parent) { outfit_parseSMod(tmp, node); else if(outfit_isAfterburner(tmp)) outfit_parseSAfterburner(tmp, node); + else if(outfit_isMap(tmp)) + outfit_parseSMap(tmp, node); } } while((node = node->next)); #define MELEMENT(o,s) if(o) WARN("Outfit '%s' missing '"s"' element", tmp->name) diff --git a/src/outfit.h b/src/outfit.h index 1c20f70..33952cf 100644 --- a/src/outfit.h +++ b/src/outfit.h @@ -24,7 +24,8 @@ typedef enum OutfitType_ { OUTFIT_TYPE_TURRET_BOLT, OUTFIT_TYPE_TURRET_BEAM, OUTFIT_TYPE_MODIFICATION, - OUTFIT_TYPE_AFTERBURNER + OUTFIT_TYPE_AFTERBURNER, + OUTFIT_TYPE_MAP } OutfitType; typedef enum DamageType_ { @@ -112,6 +113,9 @@ typedef struct Outfit_ { double speed_perc, speed_abs; /* Percent and absolute speed bonus. */ double energy; /* Energy used while active. */ } afb; + struct { /* Map. */ + double radius; /* Amount of systems to add */ + } map; } u; } Outfit; @@ -129,6 +133,7 @@ int outfit_isAmmo(const Outfit* o); int outfit_isTurret(const Outfit* o); int outfit_isMod(const Outfit* o); int outfit_isAfterburner(const Outfit* o); +int outfit_isMap(const Outfit* o); const char* outfit_getType(const Outfit* o); const char* outfit_getTypeBroad(const Outfit* o); diff --git a/src/pilot.c b/src/pilot.c index a55fc96..2c84215 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -10,6 +10,7 @@ #include "spfx.h" #include "rng.h" #include "hook.h" +#include "map.h" #include "pilot.h" #define XML_ID "Fleets" /* XML section identifier. */ @@ -533,6 +534,12 @@ int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity) { q = quantity; + /* Special case if it's a map. */ + if(outfit_isMap(outfit)) { + map_map(NULL, outfit->u.map.radius); + return 1; /* Must return 1 for paying purposes. */ + } + /* Does outfit already exist? */ for(i = 0; i < pilot->noutfits; i++) if(strcmp(outfit->name, pilot->outfits[i].outfit->name)==0) {