[Add] New outfit: Star map, allows you to see two jump points from current location.
This commit is contained in:
parent
5760978e56
commit
d11eabd358
@ -391,4 +391,17 @@
|
||||
<cargo>-15</cargo>
|
||||
</specific>
|
||||
</outfit>
|
||||
<outfit name="Star Map">
|
||||
<general>
|
||||
<max>1</max>
|
||||
<tech>4</tech>
|
||||
<mass>0</mass>
|
||||
<price>7000</price>
|
||||
<description>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.</description>
|
||||
<gfx_store>map</gfx_store>
|
||||
</general>
|
||||
<specific type="map">
|
||||
<radius>2</radius>
|
||||
</specific>
|
||||
</outfit>
|
||||
</Outfits>
|
||||
|
BIN
gfx/outfit/store/map.png
Normal file
BIN
gfx/outfit/store/map.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
@ -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);
|
||||
|
48
src/map.c
48
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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
37
src/outfit.c
37
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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user