[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>
|
<cargo>-15</cargo>
|
||||||
</specific>
|
</specific>
|
||||||
</outfit>
|
</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>
|
</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
|
else
|
||||||
goal = cur_system->name;
|
goal = cur_system->name;
|
||||||
|
|
||||||
s = map_getJumpPath(&jumps, start, goal);
|
s = map_getJumpPath(&jumps, start, goal, 1);
|
||||||
free(s);
|
free(s);
|
||||||
|
|
||||||
lua_pushnumber(L, jumps);
|
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)
|
if(map_path)
|
||||||
free(map_path);
|
free(map_path);
|
||||||
map_path = map_getJumpPath(&map_npath,
|
map_path = map_getJumpPath(&map_npath,
|
||||||
cur_system->name, sys->name);
|
cur_system->name, sys->name, 0);
|
||||||
|
|
||||||
if(map_npath == 0)
|
if(map_npath == 0)
|
||||||
hyperspace_target = -1;
|
hyperspace_target = -1;
|
||||||
@ -540,7 +540,7 @@ static void A_freeList(SysNode* first) {
|
|||||||
free(p);
|
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;
|
int i, cost;
|
||||||
|
|
||||||
StarSystem* sys, *ssys, *esys, **res;
|
StarSystem* sys, *ssys, *esys, **res;
|
||||||
@ -556,7 +556,7 @@ StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend) {
|
|||||||
esys = system_get(sysend); /* End. */
|
esys = system_get(sysend); /* End. */
|
||||||
|
|
||||||
/* System target must be known. */
|
/* System target must be known. */
|
||||||
if(!sys_isKnown(esys)) {
|
if(!ignore_known && !sys_isKnown(esys)) {
|
||||||
if(space_sysReachable(esys)) { /* Can we still reach it? */
|
if(space_sysReachable(esys)) { /* Can we still reach it? */
|
||||||
res = malloc(sizeof(StarSystem*));
|
res = malloc(sizeof(StarSystem*));
|
||||||
(*njumps) = 1;
|
(*njumps) = 1;
|
||||||
@ -582,7 +582,7 @@ StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend) {
|
|||||||
for(i = 0; i < cur->sys->njumps; i++) {
|
for(i = 0; i < cur->sys->njumps; i++) {
|
||||||
sys = &systems_stack[cur->sys->jumps[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);
|
neighbour = A_newNode(sys, NULL);
|
||||||
|
|
||||||
@ -617,4 +617,44 @@ StarSystem** map_getJumpPath(int* njumps, char* sysstart, char* sysend) {
|
|||||||
return res;
|
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);
|
void map_jump(void);
|
||||||
|
|
||||||
/* Manipulate universe stuff. */
|
/* 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_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);
|
||||||
|
|
||||||
/* Return an outfit. */
|
/* Return an outfit. */
|
||||||
Outfit* outfit_get(const char* name) {
|
Outfit* outfit_get(const char* name) {
|
||||||
@ -128,6 +129,10 @@ int outfit_isAfterburner(const Outfit* o) {
|
|||||||
return (o->type == OUTFIT_TYPE_AFTERBURNER);
|
return (o->type == OUTFIT_TYPE_AFTERBURNER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int outfit_isMap(const Outfit* o) {
|
||||||
|
return(o->type == OUTFIT_TYPE_MAP);
|
||||||
|
}
|
||||||
|
|
||||||
/* 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;
|
||||||
@ -189,7 +194,8 @@ const char* outfit_typename[] = {
|
|||||||
"Bolt Turret",
|
"Bolt Turret",
|
||||||
"Beam Turret",
|
"Beam Turret",
|
||||||
"Ship Modification",
|
"Ship Modification",
|
||||||
"Afterburner"
|
"Afterburner",
|
||||||
|
"Map"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* outfit_getType(const Outfit* o) {
|
const char* outfit_getType(const Outfit* o) {
|
||||||
@ -204,17 +210,19 @@ const char* outfit_typenamebroad[] = {
|
|||||||
"Ammo",
|
"Ammo",
|
||||||
"Turret",
|
"Turret",
|
||||||
"Modification",
|
"Modification",
|
||||||
"Afterburner"
|
"Afterburner",
|
||||||
|
"Map"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* outfit_getTypeBroad(const Outfit* o) {
|
const char* outfit_getTypeBroad(const Outfit* o) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if(outfit_isWeapon(o)) i = 1;
|
if(outfit_isWeapon(o)) i = 1;
|
||||||
else if(outfit_isLauncher(o)) i = 2;
|
else if(outfit_isLauncher(o)) i = 2;
|
||||||
else if(outfit_isAmmo(o)) i = 3;
|
else if(outfit_isAmmo(o)) i = 3;
|
||||||
else if(outfit_isTurret(o)) i = 4;
|
else if(outfit_isTurret(o)) i = 4;
|
||||||
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;
|
||||||
|
|
||||||
return outfit_typenamebroad[i];
|
return outfit_typenamebroad[i];
|
||||||
}
|
}
|
||||||
@ -250,6 +258,7 @@ static OutfitType outfit_strToOutfitType(char* buf) {
|
|||||||
O_CMP("turret beam", OUTFIT_TYPE_TURRET_BEAM);
|
O_CMP("turret beam", OUTFIT_TYPE_TURRET_BEAM);
|
||||||
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);
|
||||||
|
|
||||||
WARN("Invalid outfit type '%s'", buf);
|
WARN("Invalid outfit type '%s'", buf);
|
||||||
return OUTFIT_TYPE_NULL;
|
return OUTFIT_TYPE_NULL;
|
||||||
@ -421,6 +430,16 @@ static void outfit_parseSAfterburner(Outfit* tmp, const xmlNodePtr parent) {
|
|||||||
} while((node = node->next));
|
} 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. */
|
/* Parse and return Outfits from parent node. */
|
||||||
static Outfit* outfit_parse(const xmlNodePtr parent) {
|
static Outfit* outfit_parse(const xmlNodePtr parent) {
|
||||||
Outfit* tmp = CALLOC_L(Outfit);
|
Outfit* tmp = CALLOC_L(Outfit);
|
||||||
@ -479,6 +498,8 @@ static Outfit* outfit_parse(const xmlNodePtr parent) {
|
|||||||
outfit_parseSMod(tmp, node);
|
outfit_parseSMod(tmp, node);
|
||||||
else if(outfit_isAfterburner(tmp))
|
else if(outfit_isAfterburner(tmp))
|
||||||
outfit_parseSAfterburner(tmp, node);
|
outfit_parseSAfterburner(tmp, node);
|
||||||
|
else if(outfit_isMap(tmp))
|
||||||
|
outfit_parseSMap(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)
|
||||||
|
@ -24,7 +24,8 @@ typedef enum OutfitType_ {
|
|||||||
OUTFIT_TYPE_TURRET_BOLT,
|
OUTFIT_TYPE_TURRET_BOLT,
|
||||||
OUTFIT_TYPE_TURRET_BEAM,
|
OUTFIT_TYPE_TURRET_BEAM,
|
||||||
OUTFIT_TYPE_MODIFICATION,
|
OUTFIT_TYPE_MODIFICATION,
|
||||||
OUTFIT_TYPE_AFTERBURNER
|
OUTFIT_TYPE_AFTERBURNER,
|
||||||
|
OUTFIT_TYPE_MAP
|
||||||
} OutfitType;
|
} OutfitType;
|
||||||
|
|
||||||
typedef enum DamageType_ {
|
typedef enum DamageType_ {
|
||||||
@ -112,6 +113,9 @@ typedef struct Outfit_ {
|
|||||||
double speed_perc, speed_abs; /* Percent and absolute speed bonus. */
|
double speed_perc, speed_abs; /* Percent and absolute speed bonus. */
|
||||||
double energy; /* Energy used while active. */
|
double energy; /* Energy used while active. */
|
||||||
} afb;
|
} afb;
|
||||||
|
struct { /* Map. */
|
||||||
|
double radius; /* Amount of systems to add */
|
||||||
|
} map;
|
||||||
} u;
|
} u;
|
||||||
} Outfit;
|
} Outfit;
|
||||||
|
|
||||||
@ -129,6 +133,7 @@ int outfit_isAmmo(const Outfit* o);
|
|||||||
int outfit_isTurret(const Outfit* o);
|
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);
|
||||||
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);
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "spfx.h"
|
#include "spfx.h"
|
||||||
#include "rng.h"
|
#include "rng.h"
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
|
#include "map.h"
|
||||||
#include "pilot.h"
|
#include "pilot.h"
|
||||||
|
|
||||||
#define XML_ID "Fleets" /* XML section identifier. */
|
#define XML_ID "Fleets" /* XML section identifier. */
|
||||||
@ -533,6 +534,12 @@ int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity) {
|
|||||||
|
|
||||||
q = 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? */
|
/* Does outfit already exist? */
|
||||||
for(i = 0; i < pilot->noutfits; i++)
|
for(i = 0; i < pilot->noutfits; i++)
|
||||||
if(strcmp(outfit->name, pilot->outfits[i].outfit->name)==0) {
|
if(strcmp(outfit->name, pilot->outfits[i].outfit->name)==0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user