[Add] Some Hyperspace range stuff.

[Add] SectorMap indicates current ship location.
This commit is contained in:
Allanis 2017-11-13 20:59:38 +00:00
parent ec2479eb80
commit 56f5411516
12 changed files with 80 additions and 26 deletions

View File

@ -1,6 +1,7 @@
#include "l3d.h"
#include "generic_system_view.h"
#include "sector_view.h"
#include "sector.h"
GenericSystemView::GenericSystemView(void) : View() {
px = py = pidx = 0xdeadbeef;
@ -29,9 +30,14 @@ void GenericSystemView::Draw3D(void) {
if(s && !s->IsSystem(px, py, pidx)) {
s->GetPos(&px, &py, &pidx);
Sector sec(px, py);
Sector psec(L3D::playerLoc.secX, L3D::playerLoc.secY);
const float dist = Sector::DistanceBetween(&sec, pidx, &psec, L3D::playerLoc.sysIdx);
char buf[256];
snprintf(buf, sizeof(buf), "Dist. %.2f light years.", dist);
m_systemName->SetText(s->rootBody->name);
m_distance->SetText("Dist. XX.XX light years.");
m_distance->SetText(buf);
m_starType->SetText(s->rootBody->GetAstroDescription());
m_shortDesc->SetText("Short description of system");

View File

@ -33,6 +33,10 @@ void InfoView::UpdateInfo(void) {
stats.free_capacity, stats.used_capacity,
stats.total_mass);
nfo += std::string(buf);
snprintf(buf, sizeof(buf), "\n\nHyperspace range: %.2f light years.", stats.hyperspace_range);
nfo += std::string(buf);
info1->SetText(nfo);
}

View File

@ -5,6 +5,7 @@
#include "gui.h"
#include "view.h"
#include "mtrand.h"
#include "star_system.h"
class Player;
class SectorView;
@ -69,6 +70,7 @@ public:
static View* GetView(void) { return current_view; }
static StarSystem* GetSelectedSystem(void);
static systemloc_t playerLoc;
static Player* player;
static SectorView* sector_view;
static SystemInfoView* system_info_view;

View File

@ -46,6 +46,7 @@ MTRand L3D::rng;
double L3D::gameTime;
float L3D::frameTime;
GLUquadric* L3D::gluQuadric;
systemloc_t L3D::playerLoc;
void L3D::Init(IniConfig& config) {
int width = config.Int("ScrWidth");
@ -186,7 +187,7 @@ void L3D::MainLoop(void) {
Space::AddBody(player);
for(int i = 0; i < 4; i++) {
Ship* body = new Ship(ShipType::LADYBIRD);
Ship* body = new Ship(ShipType::SLEEK/*LADYBIRD*/);
char buf[64];
snprintf(buf, sizeof(buf), "X%c-0%02d", "A"+i, i);
body->SetLabel(buf);
@ -325,6 +326,7 @@ void L3D::HyperspaceTo(StarSystem* dest) {
Space::BuildSystem(dest);
float ang = rng(M_PI);
L3D::player->SetPosition(vector3d(sin(ang)*8*AU, cos(ang)*8*AU, 0));
dest->GetPos(&L3D::playerLoc);
}
IniConfig::IniConfig(const char* filename) {

View File

@ -8,15 +8,16 @@ static const char* sys_names[SYS_NAME_FLAGS] =
Sector::Sector(int x, int y) {
unsigned long _init[2] = { x, y };
sx = x; sy = y;
MTRand rand(_init, 2);
m_numSystems = rand(3,6);
for(int i = 0; i < m_numSystems; i++) {
System s;
s.p.x = rand(1.0);
s.p.y = rand(1.0);
s.p.z = 20.0*(rand(1.0)-0.5);
s.p.x = rand(SIZE);
s.p.y = rand(SIZE);
s.p.z = rand(2*SIZE)-SIZE;
s.name = GenName(rand);
float spec = rand(1.0);
@ -41,10 +42,16 @@ Sector::Sector(int x, int y) {
}
}
float Sector::DistanceBetween(const Sector* a, int sysIdxA, const Sector* b, int sysIdxB) {
vector3f dv = a->m_systems[sysIdxA].p - b->m_systems[sysIdxB].p;
dv += Sector::SIZE*vector3f(a->sx - b->sx, a->sy - b->sy, 0);
return dv.Length();
}
std::string Sector::GenName(MTRand& rand) {
std::string name;
int len = rand(2, 4);
int len = rand(2, 3);
for(int i = 0; i < len; i++) {
name += sys_names[rand(0, SYS_NAME_FLAGS-1)];
}

View File

@ -6,7 +6,10 @@
class Sector {
public:
/* Lightyears. */
enum { SIZE=8 };
Sector(int x, int y);
static float DistanceBetween(const Sector* a, int sysIdxA, const Sector* b, int sysIdxB);
int m_numSystems;
struct System {
@ -18,5 +21,6 @@ public:
private:
std::string GenName(MTRand& rand);
int sx, sy;
};

View File

@ -4,6 +4,7 @@
#include "sector_view.h"
#include "sector.h"
#include "system_info_view.h"
#include "player.h"
SectorView::SectorView(void) : GenericSystemView() {
SetTransparency(true);
@ -50,7 +51,6 @@ bool SectorView::GetSelectedSystem(int* sector_x, int* sector_y, int* system_idx
return m_selected != -1;
}
#define SEC_SIZE 8
#define DRAW_RAD 2
#define FFRAC(_x) ((_x)-floor(_x))
@ -73,13 +73,13 @@ void SectorView::Draw3D(void) {
glTranslatef(0, 0, -10-10*m_zoom);
glRotatef(m_rot_x, 1, 0, 0);
glRotatef(m_rot_z, 0, 0, 1);
glTranslatef(-FFRAC(m_px)*SEC_SIZE, -FFRAC(m_py)*SEC_SIZE, 0);
glTranslatef(-FFRAC(m_px)*Sector::SIZE, -FFRAC(m_py)*Sector::SIZE, 0);
glDisable(GL_LIGHTING);
for(int sx = -DRAW_RAD; sx <= DRAW_RAD; sx++) {
for(int sy = -DRAW_RAD; sy <= DRAW_RAD; sy++) {
glPushMatrix();
glTranslatef(sx*SEC_SIZE, sy*SEC_SIZE, 0);
glTranslatef(sx*Sector::SIZE, sy*Sector::SIZE, 0);
DrawSector(m_secx+sx, m_secy+sy);
glPopMatrix();
}
@ -111,9 +111,9 @@ void SectorView::DrawSector(int sx, int sy) {
glColor3f(0, .8, 0);
glBegin(GL_LINE_LOOP);
glVertex3f(0, 0, 0);
glVertex3f(0, SEC_SIZE, 0);
glVertex3f(SEC_SIZE, SEC_SIZE, 0);
glVertex3f(SEC_SIZE, 0, 0);
glVertex3f(0, Sector::SIZE, 0);
glVertex3f(Sector::SIZE, Sector::SIZE, 0);
glVertex3f(Sector::SIZE, 0, 0);
glEnd();
if(!(sx || sy)) glColor3f(1, 1, 0);
@ -121,7 +121,7 @@ void SectorView::DrawSector(int sx, int sy) {
for(std::vector<Sector::System>::iterator i = s.m_systems.begin(); i != s.m_systems.end(); ++i) {
glColor3fv(StarSystem::starColors[(*i).primaryStarClass]);
glPushMatrix();
glTranslatef((*i).p.x*SEC_SIZE, (*i).p.y*SEC_SIZE, 0);
glTranslatef((*i).p.x, (*i).p.y, 0);
glBegin(GL_LINES);
glVertex3f(0, 0, 0);
glVertex3f(0, 0, (*i).p.z);
@ -132,12 +132,32 @@ void SectorView::DrawSector(int sx, int sy) {
glRotatef(-m_rot_z, 0, 0, 1);
glRotatef(-m_rot_x, 1, 0, 0);
glCallList(m_gluDiskDlist);
/* Player location indicator. */
if((sx == L3D::playerLoc.secX) && (sy == L3D::playerLoc.secY) && (num == L3D::playerLoc.sysIdx)) {
shipstats_t stats;
L3D::player->CalcStats(&stats);
glColor3f(0, 0, 1);
glBegin(GL_LINE_LOOP);
/* Draw a lovely circle around our beloved player. */
for(float theta = 0; theta < 2*M_PI; theta += 0.05*M_PI) {
glVertex3f(stats.hyperspace_range*sin(theta), stats.hyperspace_range*cos(theta), 0);
}
glEnd();
glPushMatrix();
glDepthRange(0.2, 1.2);
glColor3f(3, 3, 3);
glCallList(m_gluDiskDlist);
glPopMatrix();
}
/* Selected indicator. */
if((sx == m_secx) && (sy == m_secy) && (num == m_selected)) {
glDepthRange(0.1, 1.1);
glColor3f(0, 0.8, 0);
glScalef(2, 2, 2);
glCallList(m_gluDiskDlist);
}
glDepthRange(0, 1);
glPopMatrix();
glColor3f(.7, .7, .7);
PutText((*i).name);
@ -169,8 +189,8 @@ void SectorView::Update(void) {
m_secy = (int)floor(m_py);
Sector s = Sector(m_secx, m_secy);
float px = FFRAC(m_px);
float py = FFRAC(m_py);
float px = FFRAC(m_px)*Sector::SIZE;
float py = FFRAC(m_py)*Sector::SIZE;
m_selected = -1;
float min_dist = FLT_MAX;

View File

@ -50,6 +50,10 @@ void Ship::CalcStats(shipstats_t* stats) {
}
stats->free_capacity = stats->max_capacity - stats->used_capacity;
stats->total_mass = stats->used_capacity + stype.hullMass;
Equip::Type t = m_equipment.Get(Equip::SLOT_ENGINE);
float hyperclass = EquipType::types[t].pval;
stats->hyperspace_range = 200 * hyperclass * hyperclass / stats->total_mass;
}
void Ship::AITurn(void) {

View File

@ -49,22 +49,22 @@ const EquipType EquipType::types[] = {
{
"None",
Equip::SLOT_ENGINE,
0,
0, 0
},
{
"Interplanetary Drive",
Equip::SLOT_ENGINE,
1
1, 0
},
{
"Class 1 Hyperdrive",
Equip::SLOT_ENGINE,
4
4, 1
},
{
"1MW beam laser",
Equip::SLOT_LASER,
1
1, 1
}
};

View File

@ -56,7 +56,7 @@ struct EquipType {
const char* name;
Equip::Slot slot;
int mass;
int pval; /* Used for general 'power' attribute.. */
static const EquipType types[];
};

View File

@ -236,9 +236,9 @@ void StarSystem::SBody::EliminateBadChildren(void) {
StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
unsigned long _init[3] = { system_idx, sector_x, sector_y };
m_sectorX = sector_x;
m_sectorY = sector_y;
m_systemIdx = system_idx;
loc.secX = sector_x;
loc.secY = sector_y;
loc.sysIdx = system_idx;
rootBody = 0;
if(system_idx == -1) return;
rand.seed(_init, 3);
@ -442,7 +442,7 @@ StarSystem::~StarSystem(void) {
}
bool StarSystem::IsSystem(int sector_x, int sector_y, int system_idx) {
return (sector_x == m_sectorX) && (sector_y == m_sectorY) && (system_idx == m_systemIdx);
return(sector_x == loc.secX) && (sector_y == loc.secY) && (system_idx == loc.sysIdx);
}
StarSystem::SBody::~SBody(void) {

View File

@ -13,14 +13,19 @@
#define AU 149598000000.0
#define G 6.67428e-11
struct systemloc_t {
int secX, secY, sysIdx;
};
/* All masses are in Kg, all lengths in meters. */
class StarSystem {
public:
StarSystem(int sector_x, int sector_y, int system_idx);
~StarSystem(void);
bool IsSystem(int sector_x, int sector_y, int system_idx);
void GetPos(systemloc_t* l) { *l = loc; };
void GetPos(int* sec_x, int* sec_y, int* sys_idx) {
*sec_x = m_sectorX; *sec_y = m_sectorY; *sys_idx = m_systemIdx;
*sec_x = loc.secX; *sec_y = loc.secY, *sys_idx = loc.sysIdx;
}
static float starColors[7][3];
@ -84,7 +89,7 @@ public:
SBody* rootBody;
private:
int m_sectorX, m_sectorY, m_systemIdx;
systemloc_t loc;
MTRand rand;
};