summaryrefslogtreecommitdiff
path: root/src/uqm/planets/planets.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/planets/planets.h')
-rw-r--r--src/uqm/planets/planets.h322
1 files changed, 322 insertions, 0 deletions
diff --git a/src/uqm/planets/planets.h b/src/uqm/planets/planets.h
new file mode 100644
index 0000000..c6f440d
--- /dev/null
+++ b/src/uqm/planets/planets.h
@@ -0,0 +1,322 @@
+//Copyright Paul Reiche, Fred Ford. 1992-2002
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef UQM_PLANETS_PLANETS_H_
+#define UQM_PLANETS_PLANETS_H_
+
+#include "libs/mathlib.h"
+
+#define END_INTERPLANETARY START_INTERPLANETARY
+
+enum PlanetScanTypes
+{
+ MINERAL_SCAN = 0,
+ ENERGY_SCAN,
+ BIOLOGICAL_SCAN,
+
+ NUM_SCAN_TYPES,
+};
+
+#define MAP_WIDTH SIS_SCREEN_WIDTH
+#define MAP_HEIGHT (75 - SAFE_Y)
+
+enum
+{
+ BIOLOGICAL_DISASTER = 0,
+ EARTHQUAKE_DISASTER,
+ LIGHTNING_DISASTER,
+ LAVASPOT_DISASTER,
+
+ /* additional lander sounds */
+ LANDER_INJURED,
+ LANDER_SHOOTS,
+ LANDER_HITS,
+ LIFEFORM_CANNED,
+ LANDER_PICKUP,
+ LANDER_FULL,
+ LANDER_DEPARTS,
+ LANDER_RETURNS,
+ LANDER_DESTROYED
+};
+
+#define MAX_SCROUNGED 50 /* max lander can hold */
+
+#define SCALE_RADIUS(r) ((r) << 6)
+#define UNSCALE_RADIUS(r) ((r) >> 6)
+#define MAX_ZOOM_RADIUS SCALE_RADIUS(128)
+#define MIN_ZOOM_RADIUS (MAX_ZOOM_RADIUS>>3)
+#define EARTH_RADIUS SCALE_RADIUS(8)
+
+#define MIN_PLANET_RADIUS SCALE_RADIUS (4)
+#define MAX_PLANET_RADIUS SCALE_RADIUS (124)
+
+#define DISPLAY_FACTOR ((SIS_SCREEN_WIDTH >> 1) - 8)
+
+#define NUM_SCANDOT_TRANSITIONS 4
+
+#define MIN_MOON_RADIUS 35
+#define MOON_DELTA 20
+
+#define MAX_SUNS 1
+#define MAX_PLANETS 16
+#define MAX_MOONS 4
+
+#define MAP_BORDER_HEIGHT 5
+#define SCAN_SCREEN_HEIGHT (SIS_SCREEN_HEIGHT - MAP_HEIGHT - MAP_BORDER_HEIGHT)
+
+#define PLANET_ROTATION_TIME (ONE_SECOND * 12)
+#define PLANET_ROTATION_RATE (PLANET_ROTATION_TIME / MAP_WIDTH)
+// XXX: -9 to match the original, but why? I have no idea
+#define PLANET_ORG_Y ((SCAN_SCREEN_HEIGHT - 9) / 2)
+
+#define NUM_RACE_RUINS 16
+
+typedef struct planet_desc PLANET_DESC;
+typedef struct star_desc STAR_DESC;
+typedef struct node_info NODE_INFO;
+typedef struct planet_orbit PLANET_ORBIT;
+typedef struct solarsys_state SOLARSYS_STATE;
+
+
+#include "generate.h"
+#include "../menustat.h"
+#include "../units.h"
+
+#include "elemdata.h"
+#include "lifeform.h"
+#include "plandata.h"
+#include "sundata.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct planet_desc
+{
+ DWORD rand_seed;
+
+ BYTE data_index;
+ BYTE NumPlanets;
+ SIZE radius;
+ POINT location;
+
+ Color temp_color;
+ COUNT NextIndex;
+ STAMP image;
+
+ PLANET_DESC *pPrevDesc;
+ // The Sun or planet that this world is orbiting around.
+};
+
+struct star_desc
+{
+ POINT star_pt;
+ BYTE Type;
+ BYTE Index;
+ BYTE Prefix;
+ BYTE Postfix;
+};
+
+struct node_info
+{
+ // This structire is filled in when a generateMinerals, generateEnergy,
+ // or generateLife call is made.
+ POINT loc_pt;
+ // Position of the mineral/bio/energy node on the planet.
+ COUNT density;
+ // For bio and energy: undefined
+ // For minerals the low byte is the gross size of the
+ // deposit (this determines the image), and the high
+ // byte is the fine size (the actual quantity).
+ COUNT type;
+ // For minerals: the type of element
+ // For bio: the type of the creature.
+ // 0 through NUM_CREATURE_TYPES - 1 are normal creatures,
+ // NUM_CREATURE_TYPES is an Evil One
+ // NUM_CREATURE_TYPES + 1 is a Brainbox Bulldozer
+ // NUM_CREATURE_TYPES + 2 is Zex' Beauty
+ // For energy: undefined
+};
+
+struct planet_orbit
+{
+ FRAME TopoZoomFrame;
+ // 4x scaled topo image for planet-side
+ SBYTE *lpTopoData;
+ // normal topo data; expressed in elevation levels
+ // data is signed for planets other than gas giants
+ // transformed to light variance map for 3d planet
+ FRAME SphereFrame;
+ // rotating 3d planet frames (current and next)
+ FRAME ObjectFrame;
+ // any extra planetary object (shield, atmo, rings)
+ // automatically drawn if present
+ FRAME TintFrame;
+ // tinted topo images for current scan type (dynamic)
+ Color TintColor;
+ // the color of the last used tint
+ Color *TopoColors;
+ // RGBA version of topo image; for 3d planet
+ Color *ScratchArray;
+ // temp RGBA data for whatever transforms (nuked often)
+ FRAME WorkFrame;
+ // any extra frame workspace (for dynamic objects)
+};
+
+// See doc/devel/generate for information on how this structure is
+// filled.
+struct solarsys_state
+{
+ // Standard field required by DoInput()
+ BOOLEAN (*InputFunc) (struct solarsys_state *);
+
+ BOOLEAN InIpFlight;
+ // Set to TRUE when player is flying around in interplanetary
+ // Reset to FALSE when going into orbit or encounter
+
+ COUNT WaitIntersect;
+ // Planet/moon number with which the flagship should not collide
+ // For example, if the player just left the planet or inner system
+ // If set to (COUNT)~0, all planet collisions are disabled until
+ // the flagship stops intersecting with all planets.
+ PLANET_DESC SunDesc[MAX_SUNS];
+ PLANET_DESC PlanetDesc[MAX_PLANETS];
+ // Description of the planets in the system.
+ // Only defined after a call to (*genFuncs)->generatePlanets()
+ // and overwritten by subsequent calls.
+ PLANET_DESC MoonDesc[MAX_MOONS];
+ // Description of the moons orbiting the planet pointed to
+ // by pBaseDesc.
+ // Only defined after a call to (*genFuncs)->generateMoons()
+ // as its argument, and overwritten by subsequent calls.
+ PLANET_DESC *pBaseDesc;
+ // In outer system: points to PlanetDesc[]
+ // In inner system: points to MoonDesc[]
+ PLANET_DESC *pOrbitalDesc;
+ // In orbit: points into PlanetDesc or MoonDesc to the planet
+ // currently orbiting.
+ // In inner system: points into PlanetDesc to the planet whose
+ // inner system the ship is inside
+ SIZE FirstPlanetIndex, LastPlanetIndex;
+ // The planets get sorted on their image.origin.y value.
+ // PlanetDesc[FirstPlanetIndex] is the planet with the lowest
+ // image.origin.y, and PlanetDesc[LastPlanetIndex] has the
+ // highest image.origin.y.
+ // PlanetDesc[PlanetDesc[i].NextIndex] is the next planet
+ // after PlanetDesc[i] in the ordering.
+
+ BYTE turn_counter;
+ BYTE turn_wait;
+ BYTE thrust_counter;
+ BYTE max_ship_speed;
+
+ STRING XlatRef;
+ const void *XlatPtr;
+ COLORMAP OrbitalCMap;
+
+ SYSTEM_INFO SysInfo;
+
+ const GenerateFunctions *genFuncs;
+ // Functions to call to fill in various parts of this structure.
+ // See generate.h, doc/devel/generate
+
+ FRAME PlanetSideFrame[3 + MAX_LIFE_VARIATION];
+ /* Frames for planet-side elements.
+ * [0] = bio cannister
+ * [1] = energy node (world-specific)
+ * [2] = unused (formerly static slave shield, presumed)
+ * [3] = bio 1 (world-specific)
+ * [4] = bio 2 (world-specific)
+ * [5] = bio 3 (world-specific)
+ */
+ FRAME TopoFrame;
+ PLANET_ORBIT Orbit;
+ BOOLEAN InOrbit;
+ // Set to TRUE when player hits a world in an inner system
+ // Homeworld encounters count as 'in orbit'
+};
+
+extern SOLARSYS_STATE *pSolarSysState;
+extern MUSIC_REF SpaceMusic;
+extern CONTEXT PlanetContext;
+
+// Random context used for all solar system, planets and surfaces generation
+extern RandomContext *SysGenRNG;
+
+bool playerInSolarSystem (void);
+bool playerInPlanetOrbit (void);
+bool playerInInnerSystem (void);
+bool worldIsPlanet (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world);
+bool worldIsMoon (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world);
+COUNT planetIndex (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world);
+COUNT moonIndex (const SOLARSYS_STATE *solarSys, const PLANET_DESC *moon);
+#define MATCH_PLANET ((BYTE) -1)
+bool matchWorld (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world,
+ BYTE planetI, BYTE moonI);
+
+DWORD GetRandomSeedForStar (const STAR_DESC *star);
+
+POINT locationToDisplay (POINT pt, SIZE scaleRadius);
+POINT displayToLocation (POINT pt, SIZE scaleRadius);
+POINT planetOuterLocation (COUNT planetI);
+
+extern void LoadPlanet (FRAME SurfDefFrame);
+extern void DrawPlanet (int dy, Color tintColor);
+extern void FreePlanet (void);
+extern void LoadStdLanderFont (PLANET_INFO *info);
+extern void FreeLanderFont (PLANET_INFO *info);
+
+extern void ExploreSolarSys (void);
+extern void DrawStarBackGround (void);
+extern void XFormIPLoc (POINT *pIn, POINT *pOut, BOOLEAN ToDisplay);
+extern void DrawOval (RECT *pRect, BYTE num_off_pixels);
+extern void DrawFilledOval (RECT *pRect);
+extern void FillOrbits (SOLARSYS_STATE *system, BYTE NumPlanets,
+ PLANET_DESC *pBaseDesc, BOOLEAN TypesDefined);
+extern void InitLander (BYTE LanderFlags);
+
+extern void InitSphereRotation (int direction, BOOLEAN shielded);
+extern void UninitSphereRotation (void);
+extern void PrepareNextRotationFrame (void);
+extern void DrawPlanetSphere (int x, int y);
+extern void DrawDefaultPlanetSphere (void);
+extern void RenderPlanetSphere (FRAME Frame, int offset, BOOLEAN doThrob);
+extern void SetShieldThrobEffect (FRAME FromFrame, int offset, FRAME ToFrame);
+
+extern void ZoomInPlanetSphere (void);
+extern void RotatePlanetSphere (BOOLEAN keepRate);
+
+extern void DrawScannedObjects (BOOLEAN Reversed);
+extern void GeneratePlanetSurface (PLANET_DESC *pPlanetDesc,
+ FRAME SurfDefFrame);
+extern void DeltaTopography (COUNT num_iterations, SBYTE *DepthArray,
+ RECT *pRect, SIZE depth_delta);
+
+extern void DrawPlanetSurfaceBorder (void);
+
+extern UNICODE* GetNamedPlanetaryBody (void);
+extern void GetPlanetOrMoonName (UNICODE *buf, COUNT bufsize);
+
+extern void PlanetOrbitMenu (void);
+extern void SaveSolarSysLocation (void);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* UQM_PLANETS_PLANETS_H_ */