diff --git a/src/celengine/stellarclass.cpp b/src/celengine/stellarclass.cpp index 0bd9d29b4..7f6912133 100644 --- a/src/celengine/stellarclass.cpp +++ b/src/celengine/stellarclass.cpp @@ -148,17 +148,37 @@ string StellarClass::str() const uint16 -StellarClass::pack() const +StellarClass::packV1() const { + // StarDB Ver. 0x0100 doesn't support Spectral_Y. + // Classes following Spectral_Y are shifted by 1. + uint16_t sc; + if (specClass == Spectral_Y) + sc = (uint16_t) Spectral_Unknown; + else + sc = (uint16_t) specClass > Spectral_Y ? specClass - 1 : specClass; + return (((uint16) starType << 12) | - (((uint16) specClass & 0xf) << 8) | - ((uint16) subclass << 4) | - ((uint16) lumClass)); + (((uint16) sc & 0x0f) << 8) | + ((uint16) subclass << 4) | + ((uint16) lumClass)); +} + + +uint16 +StellarClass::packV2() const +{ + uint16_t sc = (starType == StellarClass::WhiteDwarf ? specClass - 1 : specClass); + + return (((uint16) starType << 13) | + (((uint16) sc & 0x1f) << 8) | + (((uint16) subclass & 0x0f) << 4) | + ((uint16) lumClass & 0x0f)); } bool -StellarClass::unpack(uint16 st) +StellarClass::unpackV1(uint16 st) { starType = static_cast(st >> 12); @@ -166,6 +186,43 @@ StellarClass::unpack(uint16 st) { case NormalStar: specClass = static_cast(st >> 8 & 0xf); + // StarDB Ver. 0x0100 doesn't support Spectral_Y + // Spectral_Y has the value Spectral_C had earlier. + if (specClass == Spectral_Y) + specClass = Spectral_C; + subclass = st >> 4 & 0xf; + lumClass = static_cast(st & 0xf); + break; + case WhiteDwarf: + if ((st >> 8 & 0xf) >= WDClassCount) + return false; + specClass = static_cast((st >> 8 & 0xf) + Spectral_DA); + subclass = st >> 4 & 0xf; + lumClass = Lum_Unknown; + break; + case NeutronStar: + case BlackHole: + specClass = Spectral_Unknown; + subclass = Subclass_Unknown; + lumClass = Lum_Unknown; + break; + default: + return false; + } + + return true; +} + + +bool +StellarClass::unpackV2(uint16_t st) +{ + starType = static_cast(st >> 13); + + switch (starType) + { + case NormalStar: + specClass = static_cast(st >> 8 & 0x1f); subclass = st >> 4 & 0xf; lumClass = static_cast(st & 0xf); break; @@ -204,7 +261,7 @@ ostream& operator<<(ostream& os, const StellarClass& sc) bool operator<(const StellarClass& sc0, const StellarClass& sc1) { - return sc0.pack() < sc1.pack(); + return sc0.packV2() < sc1.packV2(); } diff --git a/src/celengine/stellarclass.h b/src/celengine/stellarclass.h index 9db3c1d1f..216e65ba5 100644 --- a/src/celengine/stellarclass.h +++ b/src/celengine/stellarclass.h @@ -105,8 +105,16 @@ public: friend bool operator<(const StellarClass& sc0, const StellarClass& sc1); - uint16 pack() const; - bool unpack(uint16); + // methods for StarDB Ver. 0x0100 + uint16 packV1() const; + bool unpackV1(uint16); + + // methods for StarDB Ver. 0x0200 + uint16 packV2() const; + bool unpackV2(uint16_t); + + inline uint16 pack() const; + inline bool unpack(uint16); private: StarType starType; @@ -162,4 +170,13 @@ StellarClass::LuminosityClass StellarClass::getLuminosityClass() const return lumClass; } +uint16 StellarClass::pack() const +{ + return packV1(); +} +bool StellarClass::unpack(uint16 t) +{ + return unpackV1(t); +} + #endif // _STELLARCLASS_H_