//#define OLD_STARMAP	//To disable the starmap3 stuff and reenable the old starmap stuff, uncomment this line. (SL)

/*

	Inclusioni del c++

*/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <dir.h>
#ifdef WINDOWS
#include <windows.h>
#include <direct.h>
#else
#include <dos.h>
#include <alloc.h>
#endif

#include <io.h>
#include "defs.h"

/*

	Definizioni per NOCTIS.
	Tante.

*/

// area dati: 	lunghezza:	puntatore:	descrizione:

#define om_bytes      7340 // 	n_offsets_map	contiene "offsets.map",
			   //			(sfera concava in QT-VR).
#define gl_bytes     22586 //   n_globes_map	contiene "globes.map"
			   //			(sfera convessa in QT-VR).
			   //			texture superficie del mare.
#define gl_brest     10182 //   (indicativo)	resto dei bytes allocati per
			   //			n_globes_map in quanto questo
			   //			buffer viene usato anche per
			   //			la superficie del mare di 32K,
			   //			o altrimenti per il font 32x36
			   //			che serve al gestore di bordo.
#ifdef WINDOWS
#define st_bytes     67000 
#else
#define st_bytes     64800 
#endif
							//	s_background    mappa superficie stelle;
			   //			mappa superficie satelliti;
			   //			mappa del cielo in superficie;
			   //			buffer di shading superficie.
#define pl_bytes     65552 // 	p_background	mappa planetaria dall'orbita;
			   // 			texture per il suolo.
#define ps_bytes     40000 //   p_surfacemap	piantina altimetrica superf.;
			   //			buffer temporaneo di lettura;
			   //			buffer aggiornamento schermi.
#define oc_bytes     40000 //   objectschart	mappa oggetti in superficie;
			   //			overlay per l'atmosfera.
#define sc_bytes     65540 //	adapted	      	la pagina video nascosta, pi—
			   //		        2 bytes (supporto per polymap)
			   //			darebbe 64002. Ma l'ho estesa
			   //			a 64Kb+4bytes per evitare lo
			   //			sconfinamento di "poly3d", una
			   //			funzione difettosa che non ho
			   //			n‚ tempo n‚ voglia di modifi-
			   //			care, al momento.
//#define pv_bytes     20480 //   pvfile		data bank dinamica dei files
#define pv_bytes     15776 //   pvfile		data bank dinamica dei files
			   //			di grafica poligonale.
// ------------------------//
// totale bytes     334941 //	(memoria allocata dinamicamente)
// ------------------------//
// + 		    222099 //	(lunghezza max permessa programma NOCTIS.EXE)
// +		      6160 //	(stack)
// ------------------------//
// =	     (550K) 563200 //	(memoria richiesta in totale, come massimo)
//                 ========//                                               */

// Note a quei 550K: in teoria possono essere di pi—,
// ma se ne usasse effettivamente di pi— su molti sistemi
// potrebbe non trovare abbastanza memoria. E' un limite che
// pressappoco coincide con la massima estensione dei tre moduli
// di cui si compone l'eseguibile, e non dovrebbe essere superato.

// mappa del file stand-alone NOCTIS.EXE,
// --------------------------------------
// cui dev'essere aggiunto, dopo ogni compilazione, il file SUPPORTS.NCT
// contenente i seguenti files, nell'ordine riportato sotto (il punto tra
// nome ed estensione Š stato rimpiazzato da un sottolinea). i seguenti
// valori devono essere calcolati relativamente alla fine del file
// "SUPPORTS.NCT". il primo valore, quindi, riporta la lunghezza di
// tale file. Š consigliabile aggiungere files all'inizio del file,
// cosicch‚ per aggiungere la definizione qui sotto basta riportare
// l'opposto della lunghezza di SUPPORTS.NCT

#define off_digimap2	-60776
#define dm2_bytes	  9360

//Nevermind, we got the paths working
#ifdef NEVERMINDWINDOWS
#define path(folder) folder
#else
#define path(folder) "..\\" ##folder
#endif

#define bull_ncc path("data\\critter1.ncc")
#define supports_nct path("data\\supports.nct")
#define x_txt path("data\\x.txt")
#define xbuff_txt path("data\\xbuff.txt")
#define restart_txt path("data\\restart.txt")
#define errors_txt path("data\\errors.txt")

#define mammal_ncc	-51416

#define os_voidscrn	-48664
#define os_goescomm	-44704
#define os_logogoes	-40744

#define birdy_ncc	-36784
#define vehicle_ncc	-35782

#define header_bmp	-29980
#define offsets_map	-29926
#define globes_map	-22586

// Limiti, relativi al centro dello schermo, per i bastoncini 3D.

#define stk_lbx       -150
#define stk_lby        -90
#define stk_ubx        160
#define stk_uby         90

// Parametri di lavoro per "tdpolygs.h", la libreria 3D poligonale.

#define VERTICI_PER_POLIGONO 4

#define larghezza 306
#define altezza   180
#define x_centro  158
#define y_centro  100

#define lbx -larghezza/2 + x_centro
#define ubx larghezza/2 + x_centro
#define lby -altezza/2 + y_centro
#define uby altezza/2 + y_centro

// Quattro terzi di pigreco.

#define qt_M_PI   4*M_PI/3

// Tipi di pianeta e numero di classi stellari.

#define star_classes    12
#define planet_types    10
#define avgmoons        4
#define log2avgmoons	2

#ifdef WINDOWS
#define fg_maxbodies	20 * avgmoons
#define ng_maxplanets	31
#define ng_maxmoons_per_planet	30
#define ng_maxbodies	127
#else
#define maxbodies	20 * avgmoons
#define ng_maxbodies 20 * avgmoons
#endif

// Codici identificativi degli oggetti sulla superficie dei pianeti.

#define ROCKS	0
#define VEGET	1
#define TREES	2
#define NOTHING 3
#define WALKTREE 4

// Codici identificativi delle rovine (in tre stili di texture).

#define AF1     0x40
#define AF2     0x80
#define AF3     0xC0
#define AF4     0xF0
#define AF5     0xF1
#define AF6     0xF2

// Assegnazione handles per i files PV.

#define vehicle_handle	0
#define mini_vehicle_handle 1

#define bird_base	0
#define mamm_base	1
#define bull_base 2

/*
#define bird_result	3
#define mamm_result	4
#define bull_result 5
*/

#define generic_result	3
#define bird_result	3
#define mamm_result	3
#define bull_result	3


// Struttura di un byte nella mappa oggetti di superficie (objectschart).

struct quadrant {
	#ifdef WINDOWS
	Uchar nr_of_objects : 2;
	Uchar object0_class : 2;
	Uchar object1_class : 2;
	Uchar object2_class : 2;
	#else
	Uword nr_of_objects : 2;
	Uword object0_class : 2;
	Uword object1_class : 2;
	Uword object2_class : 2;
	#endif
};

// Struttura che identifica un poligono e i suoi vertici per le funzioni PV.

#pragma pack(1)
struct pvlist {
	Uword polygon_id : 12;
	Uword vtxflag_0  : 1;
	Uword vtxflag_1  : 1;
	Uword vtxflag_2  : 1;
	Uword vtxflag_3  : 1;
};
#pragma pack()

//PartedLongDouble and RealNumber are used by the IsNaN method in noctis.cpp.
struct PartedLongDouble {
	Uchar mantissa[8];
	Uword exponent;
};

union RealNumber {
	PartedLongDouble parted;
	long double value;
};
#define NAN_DSD 50000

//For Temperature (SL)

//1 dyam = 94,607,304,725.808 meters
//1 centidyam = 1/100 of a dyam = 946,073,047.25808 meters
//StefanBoltzmanConstant 5.67 W/m^2
#define DyamsToMeters 94607304725.808
#define CentidyamsToMeters 946073047.25808
#define MetersToCentidyams 1/CentidyamsToMeters
#define DyamsToKilometers 94607304.725808
#define CentidyamsToKilometers 946073.04725808
#define KilometersToCentidyams 1/CentidyamsToKilometers
#define LightYearsToLightSeconds 31557600
#define LightSecondsToLightYears 1/LightYearsToLightSeconds

//#define CentidyamsToLightSeconds 3.15576
//#define LightSecondsToCentidyams 1/3.15576
//light second is 299792458 meters
//light second is (299792458/946073047.25808) centidyams

//X dyams * DyamsToMeters = Y Meters


//The conversion factor for meters <-> centidyams doesn't need to be used in the temperature code, since it cancels out of the equations anyways.

#define StefanBoltzmanConstant 5.67


#define WattsPerMeterSquaredToKelvin 8.3090779424284298814520715488599e-11
//#define WattsPerMeterSquaredToKelvin 1
//#define WattsPerCentiDyamToKelvin 1.7E-9
//#define WattsPerCentiDyamToKelvin 2.1443986E-9
//WPMSTK is not scientific, it was the value needed to make felysia's orbit be 41C.


//--------------------------------------------------------------------------------------

#define COPY_NEARSTAR_FROM_AP_TARGET 0
#define NEARSTAR_ALREADY_SET 1

#ifdef WINDOWS
const double planet_orb_scaling=  5.0;
const double avg_planet_sizing =  2.4;
const double moon_orb_scaling  = 12.8;
const double avg_moon_sizing   =  1.8;
#endif
