Refactoring the universe generation code.
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3334 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
Changes towards version 0.7:
|
Changes towards version 0.7:
|
||||||
|
- Refactored universe generation - SvdB
|
||||||
- Comm animation processing rewrite, bugs fixed - Alex
|
- Comm animation processing rewrite, bugs fixed - Alex
|
||||||
- Added graphics context debugging function - SvdB
|
- Added graphics context debugging function - SvdB
|
||||||
- Thread down-throttling and game sleep when inactive (currently disabled),
|
- Thread down-throttling and game sleep when inactive (currently disabled),
|
||||||
|
|||||||
@@ -1,3 +1,30 @@
|
|||||||
|
Note: this file (still) describes the way in which various things were
|
||||||
|
generated in the original source. It is still useful, but there are some
|
||||||
|
changes:
|
||||||
|
- all of this functionality used to be handled through a single function,
|
||||||
|
either the function returned by GenerateIP(), or GenerateRandomIP().
|
||||||
|
Now, there is a structure GenerateFunctions, which contains a function
|
||||||
|
for each of the type of generation. See generate.h.
|
||||||
|
- most functions don't use the global variables pSolarSysState, pOrbitalDesc,
|
||||||
|
and pPlanetDesc anymore. Instead, where these are needed, they are passed
|
||||||
|
along through a parameter.
|
||||||
|
|
||||||
|
Files related to this system:
|
||||||
|
- planets/generate.h
|
||||||
|
Defines GenerateFunctions.
|
||||||
|
- planets/generate/gendefault.c
|
||||||
|
Default generation functions for when no specific one is specified.
|
||||||
|
- planets/generate/gen*.c
|
||||||
|
Specific generation functions.
|
||||||
|
- gendef.c
|
||||||
|
Glue code.
|
||||||
|
|
||||||
|
This file should eventually be updated to reflect the new system.
|
||||||
|
See the file 'orggenerate' for a description on how the system originally
|
||||||
|
worked.
|
||||||
|
|
||||||
|
============================================================================
|
||||||
|
|
||||||
The various universe related game data is generated through a call
|
The various universe related game data is generated through a call
|
||||||
to a solar system dependant generation function.
|
to a solar system dependant generation function.
|
||||||
This function is of type PLAN_GEN_FUNC, which is a typedef to
|
This function is of type PLAN_GEN_FUNC, which is a typedef to
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
Note: this file describes the way in which various things were generated
|
||||||
|
in the original source. See the file 'generate' for the current system.
|
||||||
|
|
||||||
|
============================================================================
|
||||||
|
|
||||||
|
The various universe related game data is generated through a call
|
||||||
|
to a solar system dependant generation function.
|
||||||
|
This function is of type PLAN_GEN_FUNC, which is a typedef to
|
||||||
|
void (*PLAN_GEN_FUNC) (BYTE control)
|
||||||
|
, where the 'control' argument specifies what type of data needs to be
|
||||||
|
generated (one of GENERATE_PLANETS, GENERATE_MOONS, GENERATE_ORBITAL,
|
||||||
|
INIT_NPCS, REINIT_NPCS, UNINIT_NPCS, GENERATE_MINERAL, GENERATE_ENERGY,
|
||||||
|
GENERATE_LIFE, or GENERATE_NAME).
|
||||||
|
|
||||||
|
The generation function for a solar system is kept in the 'GenFunc'
|
||||||
|
field of the SOLARSYS_STATE structure.
|
||||||
|
The SOLARSYS_STATE structure contains the data for a solar system.
|
||||||
|
Currently, only one SOLARSYS_STATE structure is used at once, and
|
||||||
|
the global variable pSolarSysState points to the current one.
|
||||||
|
The GenFunc field is initialised in ExploreSolarSys(), to the value
|
||||||
|
returned by GenerateIP() in sc2code/gendef.c. Usually, this will be
|
||||||
|
'GenerateRandomIP', but for some specific solar systems a (pointer to a)
|
||||||
|
custom generation function is returned. This depends on the value of
|
||||||
|
CurStarDescPtr->Index, which contains values such as SOL_DEFINED,
|
||||||
|
MELNORME0_DEFINED, AQUA_HELIX_DEFINED, etc (see sc2code/encount.h
|
||||||
|
for the complete list).
|
||||||
|
The starmap_array in sc2code/plandata.c specifies Index for all
|
||||||
|
the solar systems in the game.
|
||||||
|
|
||||||
|
Following are the possible values of the 'control' argument to the
|
||||||
|
generation function, with the description of how the generation function
|
||||||
|
acts on this. As the custom generation functions often only need to
|
||||||
|
change one specific aspect of this game data generation, they will
|
||||||
|
often call GenerateRandomIP() for the rest.
|
||||||
|
StarBases are handled as if they were moons.
|
||||||
|
|
||||||
|
GENERATE_PLANETS
|
||||||
|
Pre: the global variable pSolarSysState points to the relevant solar system.
|
||||||
|
Pre: the RNG is initialised with a seed to be used for the generation.
|
||||||
|
In practice, this seed is generated from the HyperSpace coordinates
|
||||||
|
of the solar system (which are hardcoded in sc2code/plandata.c),
|
||||||
|
followed by exactly one call to TFB_Random().
|
||||||
|
Post: the RNG is in an undefined state.
|
||||||
|
This function determines how many planets the system has, and fills in
|
||||||
|
pSolarSysState->PlanetDesc[] for all planets, including the NumPlanets
|
||||||
|
field, which determines how many moons the planet will have.
|
||||||
|
It also sets the random seed that is used for data generated for this planet
|
||||||
|
(including the number of moons), based on its coordinates (which are in the
|
||||||
|
general case randomly determined themselves).
|
||||||
|
|
||||||
|
GENERATE_MOONS
|
||||||
|
Pre: the global variable pSolarSysState points to the relevant solar system,
|
||||||
|
which is initialised by a GENERATE_PLANETS call.
|
||||||
|
Pre: the RNG is initialised with a seed to be used for the generation.
|
||||||
|
In practice, this seed is the seed stored by GENERATE_PLANETS
|
||||||
|
in the rand_seed field for the planet around which the moon(s) orbit.
|
||||||
|
Pre: pSolarSysState->pBaseDesc points to the the relevant planet
|
||||||
|
of pSolarSysState->PlanetDesc[].
|
||||||
|
Post: The RNG is in an undefined state.
|
||||||
|
This function fills in pSolarSysState->MoonDesc[] for all moons around
|
||||||
|
the planet pointed to by pSolarSysState->pBaseDesc.
|
||||||
|
It also sets the random seed that is used for data generated for the moon
|
||||||
|
based on its coordinates (which are in the general case randomly determined
|
||||||
|
themselves).
|
||||||
|
|
||||||
|
GENERATE_ORBITAL
|
||||||
|
Pre: the global variable pSolarSysState points to the relevant solar system,
|
||||||
|
which is initialised by a GENERATE_PLANETS call.
|
||||||
|
Pre: pSolarSysState->pOrbitalDesc points to the relevant planet or moon from
|
||||||
|
pSolarSysState->PlanetDesc[] or pSolarSysState->moonDesc[]
|
||||||
|
Pre: the planet or moon that pSolarSysState->pOrbitalDesc points to
|
||||||
|
is initialised by a GENERATE_PLANETS or GENERATE_MOONS call.
|
||||||
|
This function fills in pSolarSysState->SysInfo with the characteristics
|
||||||
|
of the planet or moon, as seen from orbit.
|
||||||
|
It also initialises the random seeds used for the generation of bio,
|
||||||
|
minerals, and energy nodes on the surface.
|
||||||
|
It also sets the discovery report string (if appropriate), initialises
|
||||||
|
the surface graphics, and start the planet music.
|
||||||
|
For specific planets, it may initiate race communication and possibly combat,
|
||||||
|
and will only return once these are over.
|
||||||
|
NB. The GENERATE_ORBITAL code should be split up into separate calculation
|
||||||
|
and activation (graphics and music) parts.
|
||||||
|
|
||||||
|
GENERATE_MINERAL, GENERATE_ENERGY, GENERATE_LIFE
|
||||||
|
Pre: the global variable pSolarSysState points to the relevant solar system,
|
||||||
|
which is initialised by a GENERATE_PLANETS call.
|
||||||
|
Pre: pSolarSysState->pOrbitalDesc points to the relevant planet or moon from
|
||||||
|
pSolarSysState->PlanetDesc[] or pSolarSysState->moonDesc[]
|
||||||
|
Pre: the planet or moon that pSolarSysState->pOrbitalDesc points to
|
||||||
|
is initialised by a GENERATE_PLANETS or GENERATE_MOONS call.
|
||||||
|
Pre: pSolarSysState->SysInfo is filled in by a GENERATE_ORBITAL call
|
||||||
|
This function determines the properties of one mineral deposit, energy node,
|
||||||
|
or life form on a planet or moon. On entry the caller sets
|
||||||
|
pSolarSysState->CurNode to the index of the requested item. This function
|
||||||
|
will then fill in pSolarSysState->SysInfo.PlanetInfo.CurPt,
|
||||||
|
pSolarSysState->SysInfo.PlanetInfo.CurType, and in the case of minerals also
|
||||||
|
pSolarSysState->SysInfo.PlanetInfo.CurDensity.
|
||||||
|
In case pSolarSysState->CurNode is set to a value larger than or equal to
|
||||||
|
the number of items of the requested kind ((COUNT) ~0 in practice), it is
|
||||||
|
set to the real number of nodes. In this case the CurXXX fields of
|
||||||
|
pSolarSysState->SysInfo.PlanetInfo are set to the values corresponding to
|
||||||
|
the largest valid CurNode index, but should probably be considered to be
|
||||||
|
undefined.
|
||||||
|
These functions may also change the game state, cause the lander
|
||||||
|
to take off (by setting InTransit to true in the active PLANETSIDE_DESC
|
||||||
|
structure), or mark an energy node as not retrieved, usually in response
|
||||||
|
to an item having been picked up since the last call. The game makes
|
||||||
|
a GENERATE_MINERAL, GENERATE_ENERGY or GENERATE_LIFE call (whatever
|
||||||
|
is relevant) for each item right after it is picked up.
|
||||||
|
|
||||||
|
GENERATE_NAME
|
||||||
|
Pre: pSolarSysState is set to the relevant solar system.
|
||||||
|
Pre: The planet is initialised by GENERATE_PLANETS.
|
||||||
|
Pre: pSolarSysState->pBaseDesc points to the relevant planet, which should
|
||||||
|
be in the system.
|
||||||
|
This function fills GLOBAL_SIS (PlanetName) with the name of the planet
|
||||||
|
pointed to by pSolarSysState->pBaseDesc.
|
||||||
|
It also sets the GAME_STATE flag BATTLE_PLANET to the type of this planet,
|
||||||
|
so that it will be shown appropriately in melee if combat follows.
|
||||||
|
There is no generate function for the names of moons. The few moons that
|
||||||
|
are named (those in the Sol system), are handled as a special case of
|
||||||
|
the routines that prints these names (PrintCoarseScan3DO and
|
||||||
|
PrintCoraseScanPC).
|
||||||
|
|
||||||
|
INIT_NPCS
|
||||||
|
REINIT_NPCS
|
||||||
|
UNINIT_NPCS
|
||||||
|
[TODO]
|
||||||
|
|
||||||
|
|
||||||
|
Initial version of this document created by Serge van den Boom, on 2005-07-11.
|
||||||
|
|
||||||
|
|
||||||
@@ -19,6 +19,9 @@
|
|||||||
#ifndef _ENCOUNT_H
|
#ifndef _ENCOUNT_H
|
||||||
#define _ENCOUNT_H
|
#define _ENCOUNT_H
|
||||||
|
|
||||||
|
typedef struct brief_ship_info BRIEF_SHIP_INFO;
|
||||||
|
typedef struct encounter ENCOUNTER;
|
||||||
|
|
||||||
// XXX: temporary, for CONVERSATION
|
// XXX: temporary, for CONVERSATION
|
||||||
#include "commglue.h"
|
#include "commglue.h"
|
||||||
#include "displist.h"
|
#include "displist.h"
|
||||||
@@ -33,7 +36,7 @@ typedef HLINK HENCOUNTER;
|
|||||||
#define ONE_SHOT_ENCOUNTER (1 << 7)
|
#define ONE_SHOT_ENCOUNTER (1 << 7)
|
||||||
#define ENCOUNTER_REFORMING (1 << 6)
|
#define ENCOUNTER_REFORMING (1 << 6)
|
||||||
|
|
||||||
typedef struct
|
struct brief_ship_info
|
||||||
{
|
{
|
||||||
// The only field actually used right now is crew_level
|
// The only field actually used right now is crew_level
|
||||||
BYTE race_id;
|
BYTE race_id;
|
||||||
@@ -41,9 +44,9 @@ typedef struct
|
|||||||
COUNT max_crew;
|
COUNT max_crew;
|
||||||
BYTE max_energy;
|
BYTE max_energy;
|
||||||
|
|
||||||
} BRIEF_SHIP_INFO;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct encounter
|
||||||
{
|
{
|
||||||
// LINK elements; must be first
|
// LINK elements; must be first
|
||||||
HENCOUNTER pred, succ;
|
HENCOUNTER pred, succ;
|
||||||
@@ -58,7 +61,7 @@ typedef struct
|
|||||||
BRIEF_SHIP_INFO ShipList[MAX_HYPER_SHIPS];
|
BRIEF_SHIP_INFO ShipList[MAX_HYPER_SHIPS];
|
||||||
|
|
||||||
SDWORD log_x, log_y;
|
SDWORD log_x, log_y;
|
||||||
} ENCOUNTER;
|
};
|
||||||
|
|
||||||
#define AllocEncounter() AllocLink (&GLOBAL (encounter_q))
|
#define AllocEncounter() AllocLink (&GLOBAL (encounter_q))
|
||||||
#define PutEncounter(h) PutQueue (&GLOBAL (encounter_q), h)
|
#define PutEncounter(h) PutQueue (&GLOBAL (encounter_q), h)
|
||||||
|
|||||||
+66
-60
@@ -17,26 +17,54 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "encount.h"
|
#include "encount.h"
|
||||||
|
#include "planets/generate.h"
|
||||||
|
|
||||||
PLAN_GEN_FUNC
|
|
||||||
GenerateIP (BYTE Index)
|
extern GenerateFunctions generateDefaultFunctions;
|
||||||
|
|
||||||
|
extern GenerateFunctions generateAndrosynthFunctions;
|
||||||
|
extern GenerateFunctions generateBurvixeseFunctions;
|
||||||
|
extern GenerateFunctions generateChmmrFunctions;
|
||||||
|
extern GenerateFunctions generateColonyFunctions;
|
||||||
|
extern GenerateFunctions generateDruugeFunctions;
|
||||||
|
extern GenerateFunctions generateIlwrathFunctions;
|
||||||
|
extern GenerateFunctions generateMelnormeFunctions;
|
||||||
|
extern GenerateFunctions generateMyconFunctions;
|
||||||
|
extern GenerateFunctions generateOrzFunctions;
|
||||||
|
extern GenerateFunctions generatePkunkFunctions;
|
||||||
|
extern GenerateFunctions generateRainbowWorldFunctions;
|
||||||
|
extern GenerateFunctions generateSaMatraFunctions;
|
||||||
|
extern GenerateFunctions generateShofixtiFunctions;
|
||||||
|
extern GenerateFunctions generateSlylandroFunctions;
|
||||||
|
extern GenerateFunctions generateSolFunctions;
|
||||||
|
extern GenerateFunctions generateSpathiFunctions;
|
||||||
|
extern GenerateFunctions generateSupoxFunctions;
|
||||||
|
extern GenerateFunctions generateSyreenFunctions;
|
||||||
|
extern GenerateFunctions generateTalkingPetFunctions;
|
||||||
|
extern GenerateFunctions generateThraddashFunctions;
|
||||||
|
extern GenerateFunctions generateTrapFunctions;
|
||||||
|
extern GenerateFunctions generateUtwigFunctions;
|
||||||
|
extern GenerateFunctions generateVaultFunctions;
|
||||||
|
extern GenerateFunctions generateVuxFunctions;
|
||||||
|
extern GenerateFunctions generateWreckFunctions;
|
||||||
|
extern GenerateFunctions generateYehatFunctions;
|
||||||
|
extern GenerateFunctions generateZoqFotPikFunctions;
|
||||||
|
extern GenerateFunctions generateZoqFotPikScoutFunctions;
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions *
|
||||||
|
getGenerateFunctions (BYTE Index)
|
||||||
{
|
{
|
||||||
PLAN_GEN_FUNC GenFunc;
|
|
||||||
|
|
||||||
switch (Index)
|
switch (Index)
|
||||||
{
|
{
|
||||||
case SOL_DEFINED:
|
case SOL_DEFINED:
|
||||||
GenFunc = GenerateSOL;
|
return &generateSolFunctions;
|
||||||
break;
|
|
||||||
case SHOFIXTI_DEFINED:
|
case SHOFIXTI_DEFINED:
|
||||||
GenFunc = GenerateShofixti;
|
return &generateShofixtiFunctions;
|
||||||
break;
|
|
||||||
case START_COLONY_DEFINED:
|
case START_COLONY_DEFINED:
|
||||||
GenFunc = GenerateColony;
|
return &generateColonyFunctions;
|
||||||
break;
|
|
||||||
case SPATHI_DEFINED:
|
case SPATHI_DEFINED:
|
||||||
GenFunc = GenerateSpathi;
|
return &generateSpathiFunctions;
|
||||||
break;
|
|
||||||
case MELNORME0_DEFINED:
|
case MELNORME0_DEFINED:
|
||||||
case MELNORME1_DEFINED:
|
case MELNORME1_DEFINED:
|
||||||
case MELNORME2_DEFINED:
|
case MELNORME2_DEFINED:
|
||||||
@@ -46,86 +74,64 @@ GenerateIP (BYTE Index)
|
|||||||
case MELNORME6_DEFINED:
|
case MELNORME6_DEFINED:
|
||||||
case MELNORME7_DEFINED:
|
case MELNORME7_DEFINED:
|
||||||
case MELNORME8_DEFINED:
|
case MELNORME8_DEFINED:
|
||||||
GenFunc = GenerateMelnorme;
|
return &generateMelnormeFunctions;
|
||||||
break;
|
|
||||||
case TALKING_PET_DEFINED:
|
case TALKING_PET_DEFINED:
|
||||||
GenFunc = GenerateTalkingPet;
|
return &generateTalkingPetFunctions;
|
||||||
break;
|
|
||||||
case CHMMR_DEFINED:
|
case CHMMR_DEFINED:
|
||||||
GenFunc = GenerateChmmr;
|
return &generateChmmrFunctions;
|
||||||
break;
|
|
||||||
case SYREEN_DEFINED:
|
case SYREEN_DEFINED:
|
||||||
|
return &generateSyreenFunctions;
|
||||||
case MYCON_TRAP_DEFINED:
|
case MYCON_TRAP_DEFINED:
|
||||||
GenFunc = GenerateSyreen;
|
return &generateTrapFunctions;
|
||||||
break;
|
|
||||||
case BURVIXESE_DEFINED:
|
case BURVIXESE_DEFINED:
|
||||||
GenFunc = GenerateBurvixes;
|
return &generateBurvixeseFunctions;
|
||||||
break;
|
|
||||||
case SLYLANDRO_DEFINED:
|
case SLYLANDRO_DEFINED:
|
||||||
GenFunc = GenerateSlylandro;
|
return &generateSlylandroFunctions;
|
||||||
break;
|
|
||||||
case DRUUGE_DEFINED:
|
case DRUUGE_DEFINED:
|
||||||
GenFunc = GenerateDruuge;
|
return &generateDruugeFunctions;
|
||||||
break;
|
|
||||||
case BOMB_DEFINED:
|
case BOMB_DEFINED:
|
||||||
case UTWIG_DEFINED:
|
case UTWIG_DEFINED:
|
||||||
GenFunc = GenerateUtwig;
|
return &generateUtwigFunctions;
|
||||||
break;
|
|
||||||
case AQUA_HELIX_DEFINED:
|
case AQUA_HELIX_DEFINED:
|
||||||
case THRADD_DEFINED:
|
case THRADD_DEFINED:
|
||||||
GenFunc = GenerateThradd;
|
return &generateThraddashFunctions;
|
||||||
break;
|
|
||||||
case SUN_DEVICE_DEFINED:
|
case SUN_DEVICE_DEFINED:
|
||||||
case MYCON_DEFINED:
|
case MYCON_DEFINED:
|
||||||
case EGG_CASE0_DEFINED:
|
case EGG_CASE0_DEFINED:
|
||||||
case EGG_CASE1_DEFINED:
|
case EGG_CASE1_DEFINED:
|
||||||
case EGG_CASE2_DEFINED:
|
case EGG_CASE2_DEFINED:
|
||||||
GenFunc = GenerateMycon;
|
return &generateMyconFunctions;
|
||||||
break;
|
|
||||||
case ANDROSYNTH_DEFINED:
|
case ANDROSYNTH_DEFINED:
|
||||||
|
return &generateAndrosynthFunctions;
|
||||||
case TAALO_PROTECTOR_DEFINED:
|
case TAALO_PROTECTOR_DEFINED:
|
||||||
case ORZ_DEFINED:
|
case ORZ_DEFINED:
|
||||||
GenFunc = GenerateOrz;
|
return &generateOrzFunctions;
|
||||||
break;
|
|
||||||
case SHIP_VAULT_DEFINED:
|
case SHIP_VAULT_DEFINED:
|
||||||
GenFunc = GenerateShipVault;
|
return &generateVaultFunctions;
|
||||||
break;
|
|
||||||
case URQUAN_WRECK_DEFINED:
|
case URQUAN_WRECK_DEFINED:
|
||||||
GenFunc = GenerateUrquanWreck;
|
return &generateWreckFunctions;
|
||||||
break;
|
|
||||||
case MAIDENS_DEFINED:
|
case MAIDENS_DEFINED:
|
||||||
case VUX_BEAST_DEFINED:
|
case VUX_BEAST_DEFINED:
|
||||||
case VUX_DEFINED:
|
case VUX_DEFINED:
|
||||||
GenFunc = GenerateVUX;
|
return &generateVuxFunctions;
|
||||||
break;
|
|
||||||
case SAMATRA_DEFINED:
|
case SAMATRA_DEFINED:
|
||||||
GenFunc = GenerateSamatra;
|
return &generateSaMatraFunctions;
|
||||||
break;
|
|
||||||
case ZOQFOT_DEFINED:
|
case ZOQFOT_DEFINED:
|
||||||
|
return &generateZoqFotPikFunctions;
|
||||||
case ZOQ_SCOUT_DEFINED:
|
case ZOQ_SCOUT_DEFINED:
|
||||||
GenFunc = GenerateZoqFotPik;
|
return &generateZoqFotPikScoutFunctions;
|
||||||
break;
|
|
||||||
case YEHAT_DEFINED:
|
case YEHAT_DEFINED:
|
||||||
GenFunc = GenerateYehat;
|
return &generateYehatFunctions;
|
||||||
break;
|
|
||||||
case PKUNK_DEFINED:
|
case PKUNK_DEFINED:
|
||||||
GenFunc = GeneratePkunk;
|
return &generatePkunkFunctions;
|
||||||
break;
|
|
||||||
case SUPOX_DEFINED:
|
case SUPOX_DEFINED:
|
||||||
GenFunc = GenerateSupox;
|
return &generateSupoxFunctions;
|
||||||
break;
|
|
||||||
case RAINBOW_DEFINED:
|
case RAINBOW_DEFINED:
|
||||||
GenFunc = GenerateRainbow;
|
return &generateRainbowWorldFunctions;
|
||||||
break;
|
|
||||||
case ILWRATH_DEFINED:
|
case ILWRATH_DEFINED:
|
||||||
GenFunc = GenerateIlwrath;
|
return &generateIlwrathFunctions;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
GenFunc = GenerateRandomIP;
|
return &generateDefaultFunctions;
|
||||||
break;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (GenFunc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef GENDEF_H
|
||||||
|
#define GENDEF_H
|
||||||
|
|
||||||
|
#include "planets/generate.h"
|
||||||
|
#include "libs/compiler.h"
|
||||||
|
|
||||||
|
const GenerateFunctions *getGenerateFunctions (BYTE Index);
|
||||||
|
|
||||||
|
#endif /* GENDEF_H */
|
||||||
|
|
||||||
+2
-1
@@ -568,7 +568,8 @@ LoadGame (COUNT which_game, SUMMARY_DESC *SummPtr)
|
|||||||
|
|
||||||
LoadRaceQueue (fh, &GLOBAL (avail_race_q));
|
LoadRaceQueue (fh, &GLOBAL (avail_race_q));
|
||||||
// START_INTERPLANETARY is only set when saving from Homeworld
|
// START_INTERPLANETARY is only set when saving from Homeworld
|
||||||
// encounter screen. When the game is loaded, GENERATE_ORBITAL will
|
// encounter screen. When the game is loaded, the
|
||||||
|
// GenerateOrbitalFunction for the current star system will
|
||||||
// create the encounter anew and populate the npc queue.
|
// create the encounter anew and populate the npc queue.
|
||||||
if (!(NextActivity & START_INTERPLANETARY))
|
if (!(NextActivity & START_INTERPLANETARY))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -852,6 +852,8 @@ InitMelee (MELEE_STATE *pMS)
|
|||||||
|
|
||||||
r.corner.x = r.corner.y = 0;
|
r.corner.x = r.corner.y = 0;
|
||||||
RedrawMeleeFrame ();
|
RedrawMeleeFrame ();
|
||||||
|
|
||||||
|
(void) pMS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
uqm_CFILES="calc.c cargo.c devices.c genburv.c genchmmr.c gencol.c
|
uqm_SUBDIRS="generate"
|
||||||
gendru.c genilw.c genmel.c genmyc.c genorz.c genpet.c genpku.c
|
uqm_CFILES="calc.c cargo.c devices.c gentopo.c lander.c orbits.c
|
||||||
genrain.c gensam.c genshof.c gensly.c gensol.c genspa.c gensup.c
|
oval.c pl_stuff.c planets.c plangen.c pstarmap.c report.c
|
||||||
gensyr.c genthrad.c gentopo.c genutw.c genvault.c genvux.c
|
|
||||||
genwreck.c genyeh.c genzoq.c lander.c orbits.c oval.c pl_stuff.c
|
|
||||||
planets.c plangen.c pstarmap.c report.c
|
|
||||||
roster.c scan.c solarsys.c surface.c"
|
roster.c scan.c solarsys.c surface.c"
|
||||||
|
|||||||
@@ -1,183 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateBurvixes (BYTE control)
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
DWORD rand_val;
|
|
||||||
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT which_node;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0]
|
|
||||||
&& !GET_GAME_STATE (BURVIXESE_BROADCASTERS))
|
|
||||||
{
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (BURVIXESE_BROADCASTERS, 1);
|
|
||||||
SET_GAME_STATE (BURV_BROADCASTERS_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_MOONS:
|
|
||||||
GenerateRandomIP (GENERATE_MOONS);
|
|
||||||
if (pSolarSysState->pBaseDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = SELENIC_WORLD;
|
|
||||||
pSolarSysState->MoonDesc[0].radius = MIN_MOON_RADIUS
|
|
||||||
+ (MAX_MOONS - 1) * MOON_DELTA;
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
|
||||||
pSolarSysState->MoonDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
pSolarSysState->MoonDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = REDUX_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 39L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
{
|
|
||||||
rand_val = DoPlanetaryAnalysis (
|
|
||||||
&pSolarSysState->SysInfo, pSolarSysState->pOrbitalDesc
|
|
||||||
);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
rand_val = GenerateLifeForms (&pSolarSysState->SysInfo, &i);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
GenerateMineralDeposits (&pSolarSysState->SysInfo, &i);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN] = rand_val;
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (BURV_RUINS_STRTAB));
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
}
|
|
||||||
else if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0]
|
|
||||||
&& !GET_GAME_STATE (BURVIXESE_BROADCASTERS))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (BURV_BCS_MASK_PMAP_ANIM));
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (BURV_BCS_STRTAB));
|
|
||||||
}
|
|
||||||
LoadPlanet (NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../sounds.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateChmmr (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_MOONS:
|
|
||||||
GenerateRandomIP (GENERATE_MOONS);
|
|
||||||
if (pSolarSysState->pBaseDesc == &pSolarSysState->PlanetDesc[1])
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
DWORD rand_val;
|
|
||||||
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = HIERARCHY_STARBASE;
|
|
||||||
pSolarSysState->MoonDesc[0].radius = MIN_MOON_RADIUS;
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
|
||||||
pSolarSysState->MoonDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
pSolarSysState->MoonDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[1].data_index = SAPPHIRE_WORLD;
|
|
||||||
if (!GET_GAME_STATE (CHMMR_UNLEASHED))
|
|
||||||
pSolarSysState->PlanetDesc[1].data_index |= PLANET_SHIELDED;
|
|
||||||
pSolarSysState->PlanetDesc[1].NumPlanets = 1;
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[1])
|
|
||||||
{
|
|
||||||
if (GET_GAME_STATE (CHMMR_UNLEASHED))
|
|
||||||
{
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (CHMMR_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (GET_GAME_STATE (CHMMR_BOMB_STATE) == 2)
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) |= END_INTERPLANETARY;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (GET_GAME_STATE (SUN_DEVICE_ON_SHIP)
|
|
||||||
&& !GET_GAME_STATE (ILWRATH_DECEIVED)
|
|
||||||
&& ActivateStarShip (ILWRATH_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (ILWRATH_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
InitCommunication (ILWRATH_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Starbase */
|
|
||||||
else if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[1]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0])
|
|
||||||
{
|
|
||||||
RECT r;
|
|
||||||
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (CHMMR_BASE_STRTAB));
|
|
||||||
|
|
||||||
ScanContext = CreateContext ("genchmmr.ScanContext");
|
|
||||||
SetContext (ScanContext);
|
|
||||||
SetContextFGFrame (Screen);
|
|
||||||
r.corner.x = (SIS_ORG_X + SIS_SCREEN_WIDTH) - MAP_WIDTH;
|
|
||||||
r.corner.y = (SIS_ORG_Y + SIS_SCREEN_HEIGHT) - MAP_HEIGHT;
|
|
||||||
r.extent.width = MAP_WIDTH;
|
|
||||||
r.extent.height = MAP_HEIGHT;
|
|
||||||
SetContextClipRect (&r);
|
|
||||||
|
|
||||||
DoDiscoveryReport (MenuSounds);
|
|
||||||
|
|
||||||
SetContext (SpaceContext);
|
|
||||||
DestroyContext (ScanContext);
|
|
||||||
ScanContext = 0;
|
|
||||||
|
|
||||||
DestroyStringTable (ReleaseStringTable (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString
|
|
||||||
));
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString = 0;
|
|
||||||
FreeLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../grpinfo.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateColony (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
{
|
|
||||||
HIPGROUP hGroup;
|
|
||||||
|
|
||||||
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (COLONY_GRPOFFS0);
|
|
||||||
if (GLOBAL (BattleGroupRef) == 0)
|
|
||||||
{
|
|
||||||
CloneShipFragment (URQUAN_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
SET_GAME_STATE_32 (COLONY_GRPOFFS0, GLOBAL (BattleGroupRef));
|
|
||||||
}
|
|
||||||
|
|
||||||
GenerateRandomIP (INIT_NPCS);
|
|
||||||
|
|
||||||
if (GLOBAL (BattleGroupRef)
|
|
||||||
&& (hGroup = GetHeadLink (&GLOBAL (ip_group_q))))
|
|
||||||
{
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
GroupPtr->task = IN_ORBIT;
|
|
||||||
GroupPtr->sys_loc = 0 + 1; /* orbitting colony */
|
|
||||||
GroupPtr->dest_loc = 0 + 1; /* orbitting colony */
|
|
||||||
GroupPtr->loc.x = 0;
|
|
||||||
GroupPtr->loc.y = 0;
|
|
||||||
GroupPtr->group_counter = 0;
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
PLANET_DESC *pMinPlanet;
|
|
||||||
|
|
||||||
pMinPlanet = &pSolarSysState->PlanetDesc[0];
|
|
||||||
FillOrbits (pSolarSysState, (BYTE)~0, pMinPlanet, FALSE);
|
|
||||||
|
|
||||||
pMinPlanet->radius = EARTH_RADIUS * 115L / 100;
|
|
||||||
angle = ARCTAN (pMinPlanet->location.x, pMinPlanet->location.y);
|
|
||||||
pMinPlanet->location.x =
|
|
||||||
COSINE (angle, pMinPlanet->radius);
|
|
||||||
pMinPlanet->location.y =
|
|
||||||
SINE (angle, pMinPlanet->radius);
|
|
||||||
pMinPlanet->data_index = WATER_WORLD | PLANET_SHIELDED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
DoPlanetaryAnalysis (
|
|
||||||
&pSolarSysState->SysInfo, pSolarSysState->pOrbitalDesc
|
|
||||||
);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
EARTH_ATMOSPHERE * 98 / 100;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 28;
|
|
||||||
|
|
||||||
LoadPlanet (NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateDruuge (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
if (!GET_GAME_STATE (ROSY_SPHERE))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
else
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
&= ~(1L << i);
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (ROSY_SPHERE))
|
|
||||||
{
|
|
||||||
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
|
||||||
|
|
||||||
SET_GAME_STATE (ROSY_SPHERE, 1);
|
|
||||||
SET_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
|
|
||||||
memmove (&pSolarSysState->PlanetDesc[1],
|
|
||||||
&pSolarSysState->PlanetDesc[0],
|
|
||||||
sizeof (pSolarSysState->PlanetDesc[0])
|
|
||||||
* pSolarSysState->SunDesc[0].NumPlanets);
|
|
||||||
++pSolarSysState->SunDesc[0].NumPlanets;
|
|
||||||
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = DUST_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 50L / 100;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 0;
|
|
||||||
angle = HALF_CIRCLE - OCTANT;
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].rand_seed = MAKE_DWORD (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (ActivateStarShip (DRUUGE_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (DRUUGE_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (DRUUGE_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (DRUUGE_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (DRUUGE_RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
if (GET_GAME_STATE (ROSY_SPHERE))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetAbsStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* 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 GENERATE_H
|
||||||
|
#define GENERATE_H
|
||||||
|
|
||||||
|
typedef struct GenerateFunctions GenerateFunctions;
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "planets.h"
|
||||||
|
#include "libs/compiler.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To do (for further cleanups):
|
||||||
|
* - split off pickupMineral, pickupEnergy, pickupLife from Generate*
|
||||||
|
* - split off generateOrbital in a calculation and an activation
|
||||||
|
* (graphics and music) part.
|
||||||
|
* - for GenerateNameFunction, set the name in an argument, instead
|
||||||
|
* of in GLOBAL_SYS(PlanetName)
|
||||||
|
* - make generateName work for moons
|
||||||
|
* - add parameters to initNcs, reinitNpcs, and uninitNpcs, so that
|
||||||
|
* globals don't have to be used.
|
||||||
|
* - Add a reference from each world to the solar system, so that most
|
||||||
|
* of these functions can do with one less argument.
|
||||||
|
* - (maybe) don't directly call the generate functions via
|
||||||
|
* solarSys->genFuncs->..., but use a function for this, which first
|
||||||
|
* checks for solar system dependent handlers, and if this does not exist,
|
||||||
|
* or returns false, calls the default function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Any of these functions returning true means that the action has been
|
||||||
|
// handled, and that the default function should not be called.
|
||||||
|
typedef bool (*InitNpcsFunction)(void);
|
||||||
|
typedef bool (*ReinitNpcsFunction)(void);
|
||||||
|
typedef bool (*UninitNpcsFunction)(void);
|
||||||
|
typedef bool (*GeneratePlanetsFunction)(SOLARSYS_STATE *solarSys);
|
||||||
|
typedef bool (*GenerateMoonsFunction)(SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
typedef bool (*GenerateOrbitalFunction)(SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
typedef bool (*GenerateNameFunction)(SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
typedef bool (*GenerateMineralsFunction)(SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
typedef bool (*GenerateEnergyFunction)(SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
typedef bool (*GenerateLifeFunction)(SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
struct GenerateFunctions {
|
||||||
|
InitNpcsFunction initNpcs;
|
||||||
|
// Ships in the solar system, the first time it is accessed.
|
||||||
|
ReinitNpcsFunction reinitNpcs;
|
||||||
|
// Ships in the solar system, every next time it is accessed.
|
||||||
|
UninitNpcsFunction uninitNpcs;
|
||||||
|
// When leaving the solar system.
|
||||||
|
GeneratePlanetsFunction generatePlanets;
|
||||||
|
// Layout of planets within a solar system.
|
||||||
|
GenerateMoonsFunction generateMoons;
|
||||||
|
// Layout of moons around a planet.
|
||||||
|
GenerateNameFunction generateName;
|
||||||
|
// Name of a planet.
|
||||||
|
GenerateOrbitalFunction generateOrbital;
|
||||||
|
// Characteristics of words (planets and moons).
|
||||||
|
GenerateMineralsFunction generateMinerals;
|
||||||
|
// Minerals on the planet surface.
|
||||||
|
GenerateEnergyFunction generateEnergy;
|
||||||
|
// Energy sources on the planet surface.
|
||||||
|
GenerateLifeFunction generateLife;
|
||||||
|
// Bio on the planet surface.
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* GENERATE_H */
|
||||||
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
uqm_CFILES="gendefault.c genand.c genburv.c genchmmr.c gencol.c gendru.c
|
||||||
|
genilw.c genmel.c genmyc.c genorz.c genpet.c genpku.c genrain.c
|
||||||
|
gensam.c genshof.c gensly.c gensol.c genspa.c gensup.c gensyr.c
|
||||||
|
genthrad.c gentrap.c genutw.c genvault.c genvux.c genwreck.c
|
||||||
|
genyeh.c genzfpscout.c genzoq.c"
|
||||||
@@ -17,11 +17,10 @@
|
|||||||
#ifndef _GENALL_H
|
#ifndef _GENALL_H
|
||||||
#define _GENALL_H
|
#define _GENALL_H
|
||||||
|
|
||||||
#include "planets.h"
|
#include "gendefault.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include "../generate.h"
|
||||||
#include "libs/compiler.h"
|
#include "libs/compiler.h"
|
||||||
#include "../globdata.h"
|
|
||||||
#include "../nameref.h"
|
|
||||||
#include "../resinst.h"
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _GENALL_H */
|
#endif /* _GENALL_H */
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../resinst.h"
|
||||||
|
#include "../../sounds.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateAndrosynth_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateAndrosynth_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateAndrosynth_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateAndrosynthFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateAndrosynth_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateAndrosynth_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateAndrosynth_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateAndrosynth_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[1].data_index = TELLURIC_WORLD;
|
||||||
|
solarSys->PlanetDesc[1].radius = EARTH_RADIUS * 204L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[1].location.x,
|
||||||
|
solarSys->PlanetDesc[1].location.y);
|
||||||
|
solarSys->PlanetDesc[1].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[1].radius);
|
||||||
|
solarSys->PlanetDesc[1].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[1].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateAndrosynth_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 1, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
UWORD retval;
|
||||||
|
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (ANDROSYNTH_RUINS_STRTAB));
|
||||||
|
retval = HIWORD (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]);
|
||||||
|
while (retval)
|
||||||
|
{
|
||||||
|
if (retval & 1)
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetRelStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
|
||||||
|
if (GetStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString) == 0)
|
||||||
|
{
|
||||||
|
DestroyStringTable (ReleaseStringTable (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retval >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 1, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity =
|
||||||
|
EARTH_ATMOSPHERE * 144 / 100;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 28;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateAndrosynth_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 1, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
&= ~(1L << i);
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << (i + 16))))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (PLANETARY_CHANGE, 1);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
|= (1L << (i + 16));
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.DiscoveryString)
|
||||||
|
{
|
||||||
|
UnbatchGraphics ();
|
||||||
|
DoDiscoveryReport (MenuSounds);
|
||||||
|
BatchGraphics ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetRelStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString,
|
||||||
|
1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../resinst.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateBurvixese_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateBurvixese_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
static bool GenerateBurvixese_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateBurvixese_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateBurvixeseFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateBurvixese_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateBurvixese_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateBurvixese_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateBurvixese_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateBurvixese_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = REDUX_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 39L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateBurvixese_generateMoons (SOLARSYS_STATE *solarSys, PLANET_DESC *planet)
|
||||||
|
{
|
||||||
|
GenerateDefault_generateMoons (solarSys, planet);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, planet, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
DWORD rand_val;
|
||||||
|
|
||||||
|
solarSys->MoonDesc[0].data_index = SELENIC_WORLD;
|
||||||
|
solarSys->MoonDesc[0].radius = MIN_MOON_RADIUS
|
||||||
|
+ (MAX_MOONS - 1) * MOON_DELTA;
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
||||||
|
solarSys->MoonDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
solarSys->MoonDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateBurvixese_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
DWORD rand_val;
|
||||||
|
|
||||||
|
rand_val = DoPlanetaryAnalysis (&solarSys->SysInfo, world);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
rand_val = GenerateLifeForms (&solarSys->SysInfo, &i);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
GenerateMineralDeposits (&solarSys->SysInfo, &i);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN] = rand_val;
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (
|
||||||
|
LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (BURV_RUINS_STRTAB));
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
}
|
||||||
|
else if (matchWorld (solarSys, world, 0, 0)
|
||||||
|
&& !GET_GAME_STATE (BURVIXESE_BROADCASTERS))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] = CaptureDrawable (
|
||||||
|
LoadGraphic (BURV_BCS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (BURV_BCS_STRTAB));
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadPlanet (NULL);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateBurvixese_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT nodeI;
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, 0)
|
||||||
|
&& !GET_GAME_STATE (BURVIXESE_BROADCASTERS))
|
||||||
|
{
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (BURVIXESE_BROADCASTERS, 1);
|
||||||
|
SET_GAME_STATE (BURV_BROADCASTERS_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../setup.h"
|
||||||
|
#include "../../sounds.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
static bool GenerateChmmr_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateChmmr_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
static bool GenerateChmmr_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateChmmrFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateChmmr_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateChmmr_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateChmmr_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateChmmr_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[1].data_index = SAPPHIRE_WORLD;
|
||||||
|
if (!GET_GAME_STATE (CHMMR_UNLEASHED))
|
||||||
|
solarSys->PlanetDesc[1].data_index |= PLANET_SHIELDED;
|
||||||
|
solarSys->PlanetDesc[1].NumPlanets = 1;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateChmmr_generateMoons (SOLARSYS_STATE *solarSys, PLANET_DESC *planet)
|
||||||
|
{
|
||||||
|
GenerateDefault_generateMoons (solarSys, planet);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, planet, 1, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
DWORD rand_val;
|
||||||
|
|
||||||
|
solarSys->MoonDesc[0].data_index = HIERARCHY_STARBASE;
|
||||||
|
solarSys->MoonDesc[0].radius = MIN_MOON_RADIUS;
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
||||||
|
solarSys->MoonDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
solarSys->MoonDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateChmmr_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 1, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (GET_GAME_STATE (CHMMR_UNLEASHED))
|
||||||
|
{
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (CHMMR_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (GET_GAME_STATE (CHMMR_BOMB_STATE) == 2)
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) |= END_INTERPLANETARY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (GET_GAME_STATE (SUN_DEVICE_ON_SHIP)
|
||||||
|
&& !GET_GAME_STATE (ILWRATH_DECEIVED)
|
||||||
|
&& ActivateStarShip (ILWRATH_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (ILWRATH_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
InitCommunication (ILWRATH_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (matchWorld (solarSys, world, 1, 0))
|
||||||
|
{
|
||||||
|
/* Starbase */
|
||||||
|
RECT r;
|
||||||
|
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (CHMMR_BASE_STRTAB));
|
||||||
|
|
||||||
|
ScanContext = CreateContext ("genchmmr.ScanContext");
|
||||||
|
SetContext (ScanContext);
|
||||||
|
SetContextFGFrame (Screen);
|
||||||
|
r.corner.x = (SIS_ORG_X + SIS_SCREEN_WIDTH) - MAP_WIDTH;
|
||||||
|
r.corner.y = (SIS_ORG_Y + SIS_SCREEN_HEIGHT) - MAP_HEIGHT;
|
||||||
|
r.extent.width = MAP_WIDTH;
|
||||||
|
r.extent.height = MAP_HEIGHT;
|
||||||
|
SetContextClipRect (&r);
|
||||||
|
|
||||||
|
DoDiscoveryReport (MenuSounds);
|
||||||
|
|
||||||
|
SetContext (SpaceContext);
|
||||||
|
DestroyContext (ScanContext);
|
||||||
|
ScanContext = 0;
|
||||||
|
|
||||||
|
DestroyStringTable (ReleaseStringTable (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString = 0;
|
||||||
|
FreeLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../grpinfo.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateColony_initNpcs (void);
|
||||||
|
static bool GenerateColony_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateColony_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateColonyFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateColony_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateColony_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateColony_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateColony_initNpcs (void)
|
||||||
|
{
|
||||||
|
HIPGROUP hGroup;
|
||||||
|
|
||||||
|
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (COLONY_GRPOFFS0);
|
||||||
|
if (GLOBAL (BattleGroupRef) == 0)
|
||||||
|
{
|
||||||
|
CloneShipFragment (URQUAN_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
SET_GAME_STATE_32 (COLONY_GRPOFFS0, GLOBAL (BattleGroupRef));
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_initNpcs ();
|
||||||
|
|
||||||
|
if (GLOBAL (BattleGroupRef)
|
||||||
|
&& (hGroup = GetHeadLink (&GLOBAL (ip_group_q))))
|
||||||
|
{
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
GroupPtr->task = IN_ORBIT;
|
||||||
|
GroupPtr->sys_loc = 0 + 1; /* orbitting colony */
|
||||||
|
GroupPtr->dest_loc = 0 + 1; /* orbitting colony */
|
||||||
|
GroupPtr->loc.x = 0;
|
||||||
|
GroupPtr->loc.y = 0;
|
||||||
|
GroupPtr->group_counter = 0;
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateColony_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
PLANET_DESC *pMinPlanet;
|
||||||
|
|
||||||
|
pMinPlanet = &solarSys->PlanetDesc[0];
|
||||||
|
FillOrbits (solarSys, (BYTE)~0, pMinPlanet, FALSE);
|
||||||
|
|
||||||
|
pMinPlanet->radius = EARTH_RADIUS * 115L / 100;
|
||||||
|
angle = ARCTAN (pMinPlanet->location.x, pMinPlanet->location.y);
|
||||||
|
pMinPlanet->location.x = COSINE (angle, pMinPlanet->radius);
|
||||||
|
pMinPlanet->location.y = SINE (angle, pMinPlanet->radius);
|
||||||
|
pMinPlanet->data_index = WATER_WORLD | PLANET_SHIELDED;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateColony_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
DoPlanetaryAnalysis (&solarSys->SysInfo, world);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity =
|
||||||
|
EARTH_ATMOSPHERE * 98 / 100;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 28;
|
||||||
|
|
||||||
|
LoadPlanet (NULL);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,276 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../gamestr.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../grpinfo.h"
|
||||||
|
#include "../../races.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
bool GenerateDefault_initNpcs (void);
|
||||||
|
bool GenerateDefault_reinitNpcs (void);
|
||||||
|
bool GenerateDefault_uninitNpcs (void);
|
||||||
|
bool GenerateDefault_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
bool GenerateDefault_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
bool GenerateDefault_generateName (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
bool GenerateDefault_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
bool GenerateDefault_generateMinerals (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
bool GenerateDefault_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
bool GenerateDefault_generateLife (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
static void GeneratePlanets (SOLARSYS_STATE *system);
|
||||||
|
static void check_yehat_rebellion (void);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateDefaultFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateDefault_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateDefault_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_initNpcs (void)
|
||||||
|
{
|
||||||
|
if (!GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP))
|
||||||
|
{
|
||||||
|
GLOBAL (BattleGroupRef) = 0;
|
||||||
|
BuildGroups ();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_reinitNpcs (void)
|
||||||
|
{
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
// This is not a great place to do the Yehat rebellion check, but
|
||||||
|
// since you can start the rebellion in any star system (not just
|
||||||
|
// the Homeworld), I could not find a better place for it.
|
||||||
|
// At least it is better than where it was originally.
|
||||||
|
check_yehat_rebellion ();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_uninitNpcs (void)
|
||||||
|
{
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
FillOrbits (solarSys, (BYTE)~0, solarSys->PlanetDesc, FALSE);
|
||||||
|
GeneratePlanets (solarSys);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_generateMoons (SOLARSYS_STATE *solarSys, PLANET_DESC *planet)
|
||||||
|
{
|
||||||
|
FillOrbits (solarSys, planet->NumPlanets, solarSys->MoonDesc, FALSE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_generateName (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
COUNT i = planetIndex (solarSys, world);
|
||||||
|
utf8StringCopy (GLOBAL_SIS (PlanetName), sizeof (GLOBAL_SIS (PlanetName)),
|
||||||
|
GAME_STRING (PLANET_NUMBER_BASE + (9 + 7) + i));
|
||||||
|
SET_GAME_STATE (BATTLE_PLANET, world->data_index);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
DWORD rand_val;
|
||||||
|
SYSTEM_INFO *sysInfo;
|
||||||
|
|
||||||
|
#ifdef DEBUG_SOLARSYS
|
||||||
|
if (worldIsPlanet (solarSys, world))
|
||||||
|
{
|
||||||
|
log_add (log_Debug, "Planet index = %d",
|
||||||
|
planetIndex (solarSys, world));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_add (log_Debug, "Planet index = %d, Moon index = %d",
|
||||||
|
planetIndex (solarSys, world),
|
||||||
|
moonIndex (solarSys, world));
|
||||||
|
}
|
||||||
|
#endif /* DEBUG_SOLARSYS */
|
||||||
|
|
||||||
|
sysInfo = &solarSys->SysInfo;
|
||||||
|
|
||||||
|
rand_val = DoPlanetaryAnalysis (sysInfo, world);
|
||||||
|
|
||||||
|
sysInfo->PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
rand_val = GenerateLifeForms (sysInfo, &i);
|
||||||
|
|
||||||
|
sysInfo->PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
GenerateMineralDeposits (sysInfo, &i);
|
||||||
|
|
||||||
|
sysInfo->PlanetInfo.ScanSeed[ENERGY_SCAN] = rand_val;
|
||||||
|
LoadPlanet (NULL);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_generateMinerals (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode)
|
||||||
|
{
|
||||||
|
GenerateMineralDeposits (&solarSys->SysInfo, whichNode);
|
||||||
|
(void) world;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
(void) solarSys;
|
||||||
|
(void) world;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GenerateDefault_generateLife (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
GenerateLifeForms (&solarSys->SysInfo, whichNode);
|
||||||
|
(void) world;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// NB. This function modifies the RNG state.
|
||||||
|
static void
|
||||||
|
GeneratePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
PLANET_DESC *planet;
|
||||||
|
|
||||||
|
for (i = solarSys->SunDesc[0].NumPlanets,
|
||||||
|
planet = &solarSys->PlanetDesc[0]; i; --i, ++planet)
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
BYTE byte_val;
|
||||||
|
BYTE num_moons;
|
||||||
|
BYTE type;
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
byte_val = LOBYTE (rand_val);
|
||||||
|
|
||||||
|
num_moons = 0;
|
||||||
|
type = PlanData[planet->data_index & ~PLANET_SHIELDED].Type;
|
||||||
|
switch (PLANSIZE (type))
|
||||||
|
{
|
||||||
|
case LARGE_ROCKY_WORLD:
|
||||||
|
if (byte_val < 0x00FF * 25 / 100)
|
||||||
|
{
|
||||||
|
if (byte_val < 0x00FF * 5 / 100)
|
||||||
|
++num_moons;
|
||||||
|
++num_moons;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GAS_GIANT:
|
||||||
|
if (byte_val < 0x00FF * 90 / 100)
|
||||||
|
{
|
||||||
|
if (byte_val < 0x00FF * 75 / 100)
|
||||||
|
{
|
||||||
|
if (byte_val < 0x00FF * 50 / 100)
|
||||||
|
{
|
||||||
|
if (byte_val < 0x00FF * 25 / 100)
|
||||||
|
++num_moons;
|
||||||
|
++num_moons;
|
||||||
|
}
|
||||||
|
++num_moons;
|
||||||
|
}
|
||||||
|
++num_moons;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
planet->NumPlanets = num_moons;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_yehat_rebellion (void)
|
||||||
|
{
|
||||||
|
HIPGROUP hGroup, hNextGroup;
|
||||||
|
|
||||||
|
// XXX: Is there a better way to do this? I could not find one.
|
||||||
|
// When you talk to a Yehat ship (YEHAT_SHIP) and start the rebellion,
|
||||||
|
// there is no battle following the comm. There is *never* a battle in
|
||||||
|
// an encounter with Rebels, but the group race_id (YEHAT_REBEL_SHIP)
|
||||||
|
// is different from Royalists (YEHAT_SHIP). There is *always* a battle
|
||||||
|
// in an encounter with Royalists.
|
||||||
|
// TRANSLATION: "If the civil war has not started yet, or the player
|
||||||
|
// battled a ship -- bail."
|
||||||
|
if (!GET_GAME_STATE (YEHAT_CIVIL_WAR) || EncounterRace >= 0)
|
||||||
|
return; // not this time
|
||||||
|
|
||||||
|
// Send Yehat groups to flee the system, but only if the player
|
||||||
|
// has actually talked to a ship.
|
||||||
|
for (hGroup = GetHeadLink (&GLOBAL (ip_group_q)); hGroup;
|
||||||
|
hGroup = hNextGroup)
|
||||||
|
{
|
||||||
|
IP_GROUP *GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
hNextGroup = _GetSuccLink (GroupPtr);
|
||||||
|
// IGNORE_FLAGSHIP was set in ipdisp.c:ip_group_collision()
|
||||||
|
// during a collision with the flagship.
|
||||||
|
if (GroupPtr->race_id == YEHAT_SHIP
|
||||||
|
&& (GroupPtr->task & IGNORE_FLAGSHIP))
|
||||||
|
{
|
||||||
|
GroupPtr->task &= REFORM_GROUP;
|
||||||
|
GroupPtr->task |= FLEE | IGNORE_FLAGSHIP;
|
||||||
|
GroupPtr->dest_loc = 0;
|
||||||
|
}
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* 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 GENDEFAULT_H
|
||||||
|
#define GENDEFAULT_H
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "libs/compiler.h"
|
||||||
|
|
||||||
|
bool GenerateDefault_initNpcs (void);
|
||||||
|
bool GenerateDefault_reinitNpcs (void);
|
||||||
|
bool GenerateDefault_uninitNpcs (void);
|
||||||
|
bool GenerateDefault_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
bool GenerateDefault_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
bool GenerateDefault_generateName (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
bool GenerateDefault_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
bool GenerateDefault_generateMinerals (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
bool GenerateDefault_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
bool GenerateDefault_generateLife (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
extern const GenerateFunctions generateDefaultFunctions;
|
||||||
|
|
||||||
|
#endif /* GENDEFAULT_H */
|
||||||
|
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateDruuge_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateDruuge_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateDruuge_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateDruugeFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateDruuge_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateDruuge_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDruuge_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateDruuge_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
memmove (&solarSys->PlanetDesc[1], &solarSys->PlanetDesc[0],
|
||||||
|
sizeof (solarSys->PlanetDesc[0])
|
||||||
|
* solarSys->SunDesc[0].NumPlanets);
|
||||||
|
++solarSys->SunDesc[0].NumPlanets;
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = DUST_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 50L / 100;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 0;
|
||||||
|
angle = HALF_CIRCLE - OCTANT;
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].rand_seed = MAKE_DWORD (
|
||||||
|
solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateDruuge_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (ActivateStarShip (DRUUGE_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (DRUUGE_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (DRUUGE_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (DRUUGE_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (DRUUGE_RUINS_STRTAB));
|
||||||
|
if (GET_GAME_STATE (ROSY_SPHERE))
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetAbsStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateDruuge_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
if (!GET_GAME_STATE (ROSY_SPHERE))
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
else
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
&= ~(1L << i);
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (ROSY_SPHERE))
|
||||||
|
{
|
||||||
|
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
||||||
|
|
||||||
|
SET_GAME_STATE (ROSY_SPHERE, 1);
|
||||||
|
SET_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateIlwrath_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateIlwrath_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateIlwrath_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateIlwrathFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateIlwrath_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateIlwrath_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateIlwrath_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateIlwrath_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = PRIMORDIAL_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 204L / 100;
|
||||||
|
angle = ARCTAN (
|
||||||
|
solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateIlwrath_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (ActivateStarShip (ILWRATH_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (ILWRATH_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (ILWRATH_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (ILWRATH_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (
|
||||||
|
LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 2;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateIlwrath_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/log.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateMelnorme_initNpcs (void);
|
||||||
|
|
||||||
|
static int SelectMelnormeRefVar (void);
|
||||||
|
static DWORD GetMelnormeRef (void);
|
||||||
|
static void SetMelnormeRef (DWORD Ref);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateMelnormeFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateMelnorme_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateDefault_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateDefault_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateMelnorme_initNpcs (void)
|
||||||
|
{
|
||||||
|
GLOBAL (BattleGroupRef) = GetMelnormeRef ();
|
||||||
|
if (GLOBAL (BattleGroupRef) == 0)
|
||||||
|
{
|
||||||
|
CloneShipFragment (MELNORME_SHIP, &GLOBAL (npc_built_ship_q), 0);
|
||||||
|
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
SetMelnormeRef (GLOBAL (BattleGroupRef));
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_initNpcs ();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
SelectMelnormeRefVar (void)
|
||||||
|
{
|
||||||
|
switch (CurStarDescPtr->Index)
|
||||||
|
{
|
||||||
|
case MELNORME0_DEFINED: return MELNORME0_GRPOFFS0;
|
||||||
|
case MELNORME1_DEFINED: return MELNORME1_GRPOFFS0;
|
||||||
|
case MELNORME2_DEFINED: return MELNORME2_GRPOFFS0;
|
||||||
|
case MELNORME3_DEFINED: return MELNORME3_GRPOFFS0;
|
||||||
|
case MELNORME4_DEFINED: return MELNORME4_GRPOFFS0;
|
||||||
|
case MELNORME5_DEFINED: return MELNORME5_GRPOFFS0;
|
||||||
|
case MELNORME6_DEFINED: return MELNORME6_GRPOFFS0;
|
||||||
|
case MELNORME7_DEFINED: return MELNORME7_GRPOFFS0;
|
||||||
|
case MELNORME8_DEFINED: return MELNORME8_GRPOFFS0;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD
|
||||||
|
GetMelnormeRef (void)
|
||||||
|
{
|
||||||
|
int RefVar = SelectMelnormeRefVar ();
|
||||||
|
if (RefVar < 0)
|
||||||
|
{
|
||||||
|
log_add (log_Warning, "GetMelnormeRef(): reference unknown");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GET_GAME_STATE_32 (RefVar);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SetMelnormeRef (DWORD Ref)
|
||||||
|
{
|
||||||
|
int RefVar = SelectMelnormeRefVar ();
|
||||||
|
if (RefVar < 0)
|
||||||
|
{
|
||||||
|
log_add (log_Warning, "SetMelnormeRef(): reference unknown");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_GAME_STATE_32 (RefVar, Ref);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,269 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../setup.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateMycon_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateMycon_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateMycon_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
static bool GenerateMycon_generateLife (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateMyconFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateMycon_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateMycon_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateMycon_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateMycon_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateMycon_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = SHATTERED_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 80L / 100;
|
||||||
|
if (solarSys->PlanetDesc[0].NumPlanets > 2)
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 2;
|
||||||
|
angle = ARCTAN (
|
||||||
|
solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateMycon_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if ((CurStarDescPtr->Index == MYCON_DEFINED
|
||||||
|
|| CurStarDescPtr->Index == SUN_DEVICE_DEFINED)
|
||||||
|
&& ActivateStarShip (MYCON_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
if (CurStarDescPtr->Index == MYCON_DEFINED
|
||||||
|
|| !GET_GAME_STATE (SUN_DEVICE_UNGUARDED))
|
||||||
|
{
|
||||||
|
NotifyOthers (MYCON_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == MYCON_DEFINED
|
||||||
|
|| !GET_GAME_STATE (MYCON_FELL_FOR_AMBUSH))
|
||||||
|
{
|
||||||
|
CloneShipFragment (MYCON_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
for (i = 0; i < 5; ++i)
|
||||||
|
CloneShipFragment (MYCON_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
if (CurStarDescPtr->Index == MYCON_DEFINED)
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
||||||
|
}
|
||||||
|
InitCommunication (MYCON_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
{
|
||||||
|
BOOLEAN MyconSurvivors;
|
||||||
|
|
||||||
|
MyconSurvivors =
|
||||||
|
GetHeadLink (&GLOBAL (npc_built_ship_q)) != 0;
|
||||||
|
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
|
||||||
|
if (MyconSurvivors)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
SET_GAME_STATE (SUN_DEVICE_UNGUARDED, 1);
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
RepairSISBorder ();
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (CurStarDescPtr->Index)
|
||||||
|
{
|
||||||
|
case SUN_DEVICE_DEFINED:
|
||||||
|
if (!GET_GAME_STATE (SUN_DEVICE))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (
|
||||||
|
LoadGraphic (SUN_DEVICE_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (SUN_DEVICE_STRTAB));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EGG_CASE0_DEFINED:
|
||||||
|
case EGG_CASE1_DEFINED:
|
||||||
|
case EGG_CASE2_DEFINED:
|
||||||
|
if (GET_GAME_STATE (KNOW_ABOUT_SHATTERED) == 0)
|
||||||
|
SET_GAME_STATE (KNOW_ABOUT_SHATTERED, 1);
|
||||||
|
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0)))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (
|
||||||
|
LoadGraphic (EGG_CASE_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (EGG_CASE_STRTAB));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateMycon_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (CurStarDescPtr->Index != MYCON_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (CurStarDescPtr->Index == SUN_DEVICE_DEFINED)
|
||||||
|
{
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (SUN_DEVICE, 1);
|
||||||
|
SET_GAME_STATE (SUN_DEVICE_ON_SHIP, 1);
|
||||||
|
SET_GAME_STATE (MYCON_VISITS, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if ((solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& solarSys->SysInfo.PlanetInfo.DiscoveryString)
|
||||||
|
{
|
||||||
|
switch (CurStarDescPtr->Index)
|
||||||
|
{
|
||||||
|
case EGG_CASE0_DEFINED:
|
||||||
|
SET_GAME_STATE (EGG_CASE0_ON_SHIP, 1);
|
||||||
|
break;
|
||||||
|
case EGG_CASE1_DEFINED:
|
||||||
|
SET_GAME_STATE (EGG_CASE1_ON_SHIP, 1);
|
||||||
|
break;
|
||||||
|
case EGG_CASE2_DEFINED:
|
||||||
|
SET_GAME_STATE (EGG_CASE2_ON_SHIP, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateMycon_generateLife (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
(void) solarSys;
|
||||||
|
(void) world;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,241 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../setup.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateOrz_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateOrz_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateOrz_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateOrzFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateOrz_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateOrz_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateOrz_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateOrz_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == ORZ_DEFINED)
|
||||||
|
{
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 156L / 100;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 0;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateOrz_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if ((CurStarDescPtr->Index == ORZ_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
|| (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 1, 2)
|
||||||
|
&& !GET_GAME_STATE (TAALO_PROTECTOR)))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
if ((CurStarDescPtr->Index == ORZ_DEFINED
|
||||||
|
|| !GET_GAME_STATE (TAALO_UNPROTECTED))
|
||||||
|
&& ActivateStarShip (ORZ_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (ORZ_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == ORZ_DEFINED)
|
||||||
|
{
|
||||||
|
CloneShipFragment (ORZ_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < 14; ++i)
|
||||||
|
{
|
||||||
|
CloneShipFragment (ORZ_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
}
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
||||||
|
}
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
InitCommunication (ORZ_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
{
|
||||||
|
BOOLEAN OrzSurvivors;
|
||||||
|
|
||||||
|
OrzSurvivors = GetHeadLink (&GLOBAL (npc_built_ship_q))
|
||||||
|
&& (CurStarDescPtr->Index == ORZ_DEFINED
|
||||||
|
|| !GET_GAME_STATE (TAALO_UNPROTECTED));
|
||||||
|
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
|
||||||
|
if (OrzSurvivors)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
RepairSISBorder ();
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_GAME_STATE (TAALO_UNPROTECTED, 1);
|
||||||
|
if (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED)
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (
|
||||||
|
LoadGraphic (TAALO_DEVICE_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (TAALO_DEVICE_STRTAB));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateOrz_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index != ORZ_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 1, 2)
|
||||||
|
&& !GET_GAME_STATE (TAALO_PROTECTOR))
|
||||||
|
{
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (TAALO_PROTECTOR, 1);
|
||||||
|
SET_GAME_STATE (TAALO_PROTECTOR_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == ORZ_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode &&
|
||||||
|
!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,272 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../setup.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateTalkingPet_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateTalkingPet_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateTalkingPet_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
static void ZapToUrquanEncounter (void);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateTalkingPetFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateTalkingPet_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateTalkingPet_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateTalkingPet_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateTalkingPet_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = TELLURIC_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 204L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateTalkingPet_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET)
|
||||||
|
&& (GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES)
|
||||||
|
|| !GET_GAME_STATE (TALKING_PET)
|
||||||
|
|| ActivateStarShip (UMGAH_SHIP, SPHERE_TRACKING)))
|
||||||
|
{
|
||||||
|
NotifyOthers (UMGAH_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
if (ActivateStarShip (UMGAH_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
if (!GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES))
|
||||||
|
{
|
||||||
|
CloneShipFragment (UMGAH_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
InitCommunication (UMGAH_CONVERSATION);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
for (i = 0; i < 10; ++i)
|
||||||
|
{
|
||||||
|
CloneShipFragment (UMGAH_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
}
|
||||||
|
InitCommunication (TALKING_PET_CONVERSATION);
|
||||||
|
}
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
BOOLEAN UmgahSurvivors;
|
||||||
|
|
||||||
|
UmgahSurvivors = GetHeadLink (
|
||||||
|
&GLOBAL (npc_built_ship_q)) != 0;
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
|
||||||
|
if (GET_GAME_STATE (PLAYER_HYPNOTIZED))
|
||||||
|
ZapToUrquanEncounter ();
|
||||||
|
else if (GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES)
|
||||||
|
&& !UmgahSurvivors)
|
||||||
|
{
|
||||||
|
// Defeated the zombie fleet.
|
||||||
|
InitCommunication (TALKING_PET_CONVERSATION);
|
||||||
|
}
|
||||||
|
else if (!(ActivateStarShip (UMGAH_SHIP, SPHERE_TRACKING)))
|
||||||
|
{
|
||||||
|
// The Kohr-Ah have destroyed the Umgah, but the
|
||||||
|
// talking pet survived.
|
||||||
|
InitCommunication (TALKING_PET_CONVERSATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateTalkingPet_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
COUNT old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ZapToUrquanEncounter (void)
|
||||||
|
{
|
||||||
|
HENCOUNTER hEncounter;
|
||||||
|
|
||||||
|
if ((hEncounter = AllocEncounter ()) || (hEncounter = GetHeadEncounter ()))
|
||||||
|
{
|
||||||
|
SIZE dx, dy;
|
||||||
|
ENCOUNTER *EncounterPtr;
|
||||||
|
HFLEETINFO hStarShip;
|
||||||
|
FLEET_INFO *TemplatePtr;
|
||||||
|
BRIEF_SHIP_INFO *BSIPtr;
|
||||||
|
|
||||||
|
LockEncounter (hEncounter, &EncounterPtr);
|
||||||
|
|
||||||
|
if (hEncounter == GetHeadEncounter ())
|
||||||
|
RemoveEncounter (hEncounter);
|
||||||
|
memset (EncounterPtr, 0, sizeof (*EncounterPtr));
|
||||||
|
|
||||||
|
InsertEncounter (hEncounter, GetHeadEncounter ());
|
||||||
|
|
||||||
|
hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), URQUAN_SHIP);
|
||||||
|
TemplatePtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip);
|
||||||
|
EncounterPtr->origin = TemplatePtr->loc;
|
||||||
|
EncounterPtr->radius = TemplatePtr->actual_strength;
|
||||||
|
EncounterPtr->SD.Type = URQUAN_SHIP;
|
||||||
|
EncounterPtr->SD.Index = MAKE_BYTE (1, 0) | ONE_SHOT_ENCOUNTER;
|
||||||
|
BSIPtr = &EncounterPtr->ShipList[0];
|
||||||
|
BSIPtr->race_id = URQUAN_SHIP;
|
||||||
|
BSIPtr->crew_level = TemplatePtr->crew_level;
|
||||||
|
BSIPtr->max_crew = TemplatePtr->max_crew;
|
||||||
|
BSIPtr->max_energy = TemplatePtr->max_energy;
|
||||||
|
EncounterPtr->SD.star_pt.x = 5288;
|
||||||
|
EncounterPtr->SD.star_pt.y = 4892;
|
||||||
|
EncounterPtr->log_x = UNIVERSE_TO_LOGX (EncounterPtr->SD.star_pt.x);
|
||||||
|
EncounterPtr->log_y = UNIVERSE_TO_LOGY (EncounterPtr->SD.star_pt.y);
|
||||||
|
GLOBAL_SIS (log_x) = EncounterPtr->log_x;
|
||||||
|
GLOBAL_SIS (log_y) = EncounterPtr->log_y;
|
||||||
|
UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip);
|
||||||
|
|
||||||
|
{
|
||||||
|
#define LOST_DAYS 15
|
||||||
|
BYTE black_buf[] = {FadeAllToBlack};
|
||||||
|
|
||||||
|
SleepThreadUntil (XFormColorMap ((COLORMAPPTR)black_buf, ONE_SECOND * 2));
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
MoveGameClockDays (LOST_DAYS);
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL (CurrentActivity) = MAKE_WORD (IN_HYPERSPACE, 0) | START_ENCOUNTER;
|
||||||
|
|
||||||
|
dx = CurStarDescPtr->star_pt.x - EncounterPtr->SD.star_pt.x;
|
||||||
|
dy = CurStarDescPtr->star_pt.y - EncounterPtr->SD.star_pt.y;
|
||||||
|
dx = (SIZE)square_root ((long)dx * dx + (long)dy * dy)
|
||||||
|
+ (FUEL_TANK_SCALE >> 1);
|
||||||
|
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
DeltaSISGauges (0, -dx, 0);
|
||||||
|
if (GLOBAL_SIS (FuelOnBoard) < 5 * FUEL_TANK_SCALE)
|
||||||
|
{
|
||||||
|
dx = ((5 + ((COUNT)TFB_Random () % 5)) * FUEL_TANK_SCALE)
|
||||||
|
- (SIZE)GLOBAL_SIS (FuelOnBoard);
|
||||||
|
DeltaSISGauges (0, dx, 0);
|
||||||
|
}
|
||||||
|
DrawSISMessage (NULL);
|
||||||
|
DrawHyperCoords (EncounterPtr->SD.star_pt);
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
|
||||||
|
UnlockEncounter (hEncounter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GeneratePkunk_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GeneratePkunk_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GeneratePkunk_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generatePkunkFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GeneratePkunk_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GeneratePkunk_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GeneratePkunk_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GeneratePkunk_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 104L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GeneratePkunk_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (ActivateStarShip (PKUNK_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (PKUNK_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (PKUNK_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (PKUNK_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (PKUNK_RUINS_STRTAB));
|
||||||
|
if (GET_GAME_STATE (CLEAR_SPINDLE))
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetAbsStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GeneratePkunk_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
if (!GET_GAME_STATE (CLEAR_SPINDLE))
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
else
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
&= ~(1L << i);
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (CLEAR_SPINDLE))
|
||||||
|
{
|
||||||
|
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
||||||
|
|
||||||
|
SET_GAME_STATE (CLEAR_SPINDLE, 1);
|
||||||
|
SET_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateRainbowWorld_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateRainbowWorld_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateRainbowWorldFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateRainbowWorld_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateRainbowWorld_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateRainbowWorld_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = RAINBOW_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 0;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 50L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
if (angle <= QUADRANT)
|
||||||
|
angle += QUADRANT;
|
||||||
|
else if (angle >= FULL_CIRCLE - QUADRANT)
|
||||||
|
angle -= QUADRANT;
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateRainbowWorld_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
BYTE which_rainbow;
|
||||||
|
UWORD rainbow_mask;
|
||||||
|
STAR_DESC *SDPtr;
|
||||||
|
|
||||||
|
rainbow_mask = MAKE_WORD (
|
||||||
|
GET_GAME_STATE (RAINBOW_WORLD0),
|
||||||
|
GET_GAME_STATE (RAINBOW_WORLD1));
|
||||||
|
|
||||||
|
which_rainbow = 0;
|
||||||
|
SDPtr = &star_array[0];
|
||||||
|
while (SDPtr != CurStarDescPtr)
|
||||||
|
{
|
||||||
|
if (SDPtr->Index == RAINBOW_DEFINED)
|
||||||
|
++which_rainbow;
|
||||||
|
++SDPtr;
|
||||||
|
}
|
||||||
|
rainbow_mask |= 1 << which_rainbow;
|
||||||
|
SET_GAME_STATE (RAINBOW_WORLD0, LOBYTE (rainbow_mask));
|
||||||
|
SET_GAME_STATE (RAINBOW_WORLD1, HIBYTE (rainbow_mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,320 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../grpinfo.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateSaMatra_initNpcs (void);
|
||||||
|
static bool GenerateSaMatra_reinitNpcs (void);
|
||||||
|
static bool GenerateSaMatra_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateSaMatra_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
static bool GenerateSaMatra_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
|
||||||
|
static void BuildUrquanGuard (void);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateSaMatraFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateSaMatra_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateSaMatra_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateSaMatra_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateSaMatra_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateSaMatra_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSaMatra_initNpcs (void)
|
||||||
|
{
|
||||||
|
if (!GET_GAME_STATE (URQUAN_MESSED_UP))
|
||||||
|
{
|
||||||
|
BuildUrquanGuard ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // Exorcise Ur-Quan ghosts upon system reentry
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
// wipe out the group
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSaMatra_reinitNpcs (void)
|
||||||
|
{
|
||||||
|
BOOLEAN GuardEngaged;
|
||||||
|
HIPGROUP hGroup;
|
||||||
|
HIPGROUP hNextGroup;
|
||||||
|
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
EncounterGroup = 0;
|
||||||
|
EncounterRace = -1;
|
||||||
|
// Do not want guards to chase the player
|
||||||
|
|
||||||
|
GuardEngaged = FALSE;
|
||||||
|
for (hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
||||||
|
hGroup; hGroup = hNextGroup)
|
||||||
|
{
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
hNextGroup = _GetSuccLink (GroupPtr);
|
||||||
|
|
||||||
|
if (GET_GAME_STATE (URQUAN_MESSED_UP))
|
||||||
|
{
|
||||||
|
GroupPtr->task &= REFORM_GROUP;
|
||||||
|
GroupPtr->task |= FLEE | IGNORE_FLAGSHIP;
|
||||||
|
GroupPtr->dest_loc = 0;
|
||||||
|
}
|
||||||
|
else if (GroupPtr->task & REFORM_GROUP)
|
||||||
|
{
|
||||||
|
// REFORM_GROUP was set in ipdisp.c:ip_group_collision
|
||||||
|
// during a collision with the flagship.
|
||||||
|
GroupPtr->task &= ~REFORM_GROUP;
|
||||||
|
GroupPtr->group_counter = 0;
|
||||||
|
|
||||||
|
GuardEngaged = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GuardEngaged)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
POINT org;
|
||||||
|
|
||||||
|
XFormIPLoc (&pSolarSysState->PlanetDesc[4].image.origin, &org, FALSE);
|
||||||
|
angle = ARCTAN (GLOBAL (ip_location.x) - org.x,
|
||||||
|
GLOBAL (ip_location.y) - org.y);
|
||||||
|
GLOBAL (ip_location.x) = org.x + COSINE (angle, 3000);
|
||||||
|
GLOBAL (ip_location.y) = org.y + SINE (angle, 3000);
|
||||||
|
XFormIPLoc (&GLOBAL (ip_location),
|
||||||
|
&GLOBAL (ShipStamp.origin), TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSaMatra_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
solarSys->PlanetDesc[4].NumPlanets = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSaMatra_generateMoons (SOLARSYS_STATE *solarSys, PLANET_DESC *planet)
|
||||||
|
{
|
||||||
|
GenerateDefault_generateMoons (solarSys, planet);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, planet, 4, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
DWORD rand_val;
|
||||||
|
|
||||||
|
solarSys->MoonDesc[0].data_index = SA_MATRA;
|
||||||
|
solarSys->MoonDesc[0].radius = MIN_MOON_RADIUS + (2 * MOON_DELTA);
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
||||||
|
solarSys->MoonDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
solarSys->MoonDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSaMatra_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
/* Samatra */
|
||||||
|
if (matchWorld (solarSys, world, 4, 0))
|
||||||
|
{
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (URQUAN_MESSED_UP))
|
||||||
|
{
|
||||||
|
CloneShipFragment (!GET_GAME_STATE (KOHR_AH_FRENZY) ?
|
||||||
|
URQUAN_SHIP : BLACK_URQUAN_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#define URQUAN_REMNANTS 3
|
||||||
|
BYTE i;
|
||||||
|
|
||||||
|
for (i = 0; i < URQUAN_REMNANTS; ++i)
|
||||||
|
{
|
||||||
|
CloneShipFragment (URQUAN_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
CloneShipFragment (BLACK_URQUAN_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
SET_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 1);
|
||||||
|
InitCommunication (URQUAN_CONVERSATION);
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
BOOLEAN UrquanSurvivors;
|
||||||
|
|
||||||
|
UrquanSurvivors = GetHeadLink (&GLOBAL (npc_built_ship_q)) != 0;
|
||||||
|
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
if (UrquanSurvivors)
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EncounterGroup = 0;
|
||||||
|
EncounterRace = -1;
|
||||||
|
GLOBAL (CurrentActivity) = IN_LAST_BATTLE | START_ENCOUNTER;
|
||||||
|
if (GET_GAME_STATE (YEHAT_CIVIL_WAR)
|
||||||
|
&& ActivateStarShip (YEHAT_SHIP, SPHERE_TRACKING)
|
||||||
|
&& ActivateStarShip (YEHAT_REBEL_SHIP,
|
||||||
|
FEASIBILITY_STUDY))
|
||||||
|
InitCommunication (YEHAT_REBEL_CONVERSATION);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
BuildUrquanGuard (void)
|
||||||
|
{
|
||||||
|
BYTE ship1, ship2;
|
||||||
|
BYTE b0, b1;
|
||||||
|
POINT org;
|
||||||
|
HIPGROUP hGroup, hNextGroup;
|
||||||
|
|
||||||
|
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (SAMATRA_GRPOFFS0);
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (KOHR_AH_FRENZY))
|
||||||
|
{
|
||||||
|
ship1 = URQUAN_SHIP;
|
||||||
|
ship2 = BLACK_URQUAN_SHIP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ship1 = BLACK_URQUAN_SHIP;
|
||||||
|
ship2 = URQUAN_SHIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
for (b0 = 0; b0 < MAX_SHIPS_PER_SIDE; ++b0)
|
||||||
|
CloneShipFragment (ship1, &GLOBAL (npc_built_ship_q), 0);
|
||||||
|
|
||||||
|
if (GLOBAL (BattleGroupRef) == 0)
|
||||||
|
{
|
||||||
|
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
||||||
|
SET_GAME_STATE_32 (SAMATRA_GRPOFFS0, GLOBAL (BattleGroupRef));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NUM_URQUAN_GUARDS0 12
|
||||||
|
for (b0 = 1; b0 <= NUM_URQUAN_GUARDS0; ++b0)
|
||||||
|
PutGroupInfo (GLOBAL (BattleGroupRef), b0);
|
||||||
|
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
for (b0 = 0; b0 < MAX_SHIPS_PER_SIDE; ++b0)
|
||||||
|
CloneShipFragment (ship2, &GLOBAL (npc_built_ship_q), 0);
|
||||||
|
|
||||||
|
#define NUM_URQUAN_GUARDS1 4
|
||||||
|
for (b0 = 1; b0 <= NUM_URQUAN_GUARDS1; ++b0)
|
||||||
|
PutGroupInfo (GLOBAL (BattleGroupRef),
|
||||||
|
(BYTE)(NUM_URQUAN_GUARDS0 + b0));
|
||||||
|
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
|
||||||
|
GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP);
|
||||||
|
|
||||||
|
XFormIPLoc (&pSolarSysState->PlanetDesc[4].image.origin, &org, FALSE);
|
||||||
|
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
||||||
|
for (b0 = 0, b1 = 0;
|
||||||
|
b0 < NUM_URQUAN_GUARDS0;
|
||||||
|
++b0, b1 += FULL_CIRCLE / (NUM_URQUAN_GUARDS0 + NUM_URQUAN_GUARDS1))
|
||||||
|
{
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
if (b1 % (FULL_CIRCLE / NUM_URQUAN_GUARDS1) == 0)
|
||||||
|
b1 += FULL_CIRCLE / (NUM_URQUAN_GUARDS0 + NUM_URQUAN_GUARDS1);
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
hNextGroup = _GetSuccLink (GroupPtr);
|
||||||
|
GroupPtr->task = ON_STATION | IGNORE_FLAGSHIP;
|
||||||
|
GroupPtr->sys_loc = 0;
|
||||||
|
GroupPtr->dest_loc = 4 + 1;
|
||||||
|
GroupPtr->orbit_pos = NORMALIZE_FACING (ANGLE_TO_FACING (b1));
|
||||||
|
GroupPtr->group_counter = 0;
|
||||||
|
GroupPtr->loc.x = org.x + COSINE (b1, STATION_RADIUS);
|
||||||
|
GroupPtr->loc.y = org.y + SINE (b1, STATION_RADIUS);
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
hGroup = hNextGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (b0 = 0, b1 = 0;
|
||||||
|
b0 < NUM_URQUAN_GUARDS1;
|
||||||
|
++b0, b1 += FULL_CIRCLE / NUM_URQUAN_GUARDS1)
|
||||||
|
{
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
hNextGroup = _GetSuccLink (GroupPtr);
|
||||||
|
GroupPtr->task = ON_STATION | IGNORE_FLAGSHIP;
|
||||||
|
GroupPtr->sys_loc = 0;
|
||||||
|
GroupPtr->dest_loc = 4 + 1;
|
||||||
|
GroupPtr->orbit_pos = NORMALIZE_FACING (ANGLE_TO_FACING (b1));
|
||||||
|
GroupPtr->group_counter = 0;
|
||||||
|
GroupPtr->loc.x = org.x + COSINE (b1, STATION_RADIUS);
|
||||||
|
GroupPtr->loc.y = org.y + SINE (b1, STATION_RADIUS);
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
hGroup = hNextGroup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,173 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../grpinfo.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateShofixti_initNpcs (void);
|
||||||
|
static bool GenerateShofixti_reinitNpcs (void);
|
||||||
|
static bool GenerateShofixti_uninitNpcs (void);
|
||||||
|
static bool GenerateShofixti_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
|
||||||
|
static void check_old_shofixti (void);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateShofixtiFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateShofixti_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateShofixti_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateShofixti_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateShofixti_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateDefault_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateShofixti_initNpcs (void)
|
||||||
|
{
|
||||||
|
if (!GET_GAME_STATE (SHOFIXTI_RECRUITED)
|
||||||
|
&& (!GET_GAME_STATE (SHOFIXTI_KIA)
|
||||||
|
|| (!GET_GAME_STATE (SHOFIXTI_BRO_KIA)
|
||||||
|
&& GET_GAME_STATE (MAIDENS_ON_SHIP))))
|
||||||
|
{
|
||||||
|
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (SHOFIXTI_GRPOFFS0);
|
||||||
|
if (GLOBAL (BattleGroupRef) == 0
|
||||||
|
|| !GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP))
|
||||||
|
{
|
||||||
|
HSHIPFRAG hStarShip;
|
||||||
|
|
||||||
|
if (GLOBAL (BattleGroupRef) == 0)
|
||||||
|
GLOBAL (BattleGroupRef) = ~0L;
|
||||||
|
|
||||||
|
hStarShip = CloneShipFragment (SHOFIXTI_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 1);
|
||||||
|
if (hStarShip)
|
||||||
|
{ /* Set old Shofixti name; his brother if Tanaka died */
|
||||||
|
SHIP_FRAGMENT *FragPtr = LockShipFrag (
|
||||||
|
&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
|
/* Name Tanaka or Katana (+1) */
|
||||||
|
FragPtr->captains_name_index =
|
||||||
|
NAME_OFFSET + NUM_CAPTAINS_NAMES +
|
||||||
|
(GET_GAME_STATE (SHOFIXTI_KIA) & 1);
|
||||||
|
UnlockShipFrag (&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL (BattleGroupRef) = PutGroupInfo (
|
||||||
|
GLOBAL (BattleGroupRef), 1);
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
SET_GAME_STATE_32 (SHOFIXTI_GRPOFFS0, GLOBAL (BattleGroupRef));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This was originally a fallthrough to REINIT_NPCS.
|
||||||
|
// XXX: is the call to check_old_shofixti() needed?
|
||||||
|
GenerateDefault_initNpcs ();
|
||||||
|
check_old_shofixti ();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateShofixti_reinitNpcs (void)
|
||||||
|
{
|
||||||
|
GenerateDefault_reinitNpcs ();
|
||||||
|
check_old_shofixti ();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateShofixti_uninitNpcs (void)
|
||||||
|
{
|
||||||
|
if (GLOBAL (BattleGroupRef)
|
||||||
|
&& !GET_GAME_STATE (SHOFIXTI_RECRUITED)
|
||||||
|
&& GetHeadLink (&GLOBAL (ip_group_q)) == 0)
|
||||||
|
{
|
||||||
|
if (!GET_GAME_STATE (SHOFIXTI_KIA))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (SHOFIXTI_KIA, 1);
|
||||||
|
SET_GAME_STATE (SHOFIXTI_VISITS, 0);
|
||||||
|
}
|
||||||
|
else if (GET_GAME_STATE (MAIDENS_ON_SHIP))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (SHOFIXTI_BRO_KIA, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_uninitNpcs ();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateShofixti_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
#define NUM_PLANETS 6
|
||||||
|
solarSys->SunDesc[0].NumPlanets = NUM_PLANETS;
|
||||||
|
for (i = 0; i < NUM_PLANETS; ++i)
|
||||||
|
{
|
||||||
|
PLANET_DESC *pCurDesc = &solarSys->PlanetDesc[i];
|
||||||
|
|
||||||
|
pCurDesc->NumPlanets = 0;
|
||||||
|
if (i < (NUM_PLANETS >> 1))
|
||||||
|
pCurDesc->data_index = SELENIC_WORLD;
|
||||||
|
else
|
||||||
|
pCurDesc->data_index = METAL_WORLD;
|
||||||
|
}
|
||||||
|
|
||||||
|
FillOrbits (solarSys, NUM_PLANETS, solarSys->PlanetDesc, TRUE);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_old_shofixti (void)
|
||||||
|
{
|
||||||
|
HIPGROUP hGroup;
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
if (!GLOBAL (BattleGroupRef))
|
||||||
|
return; // nothing to check
|
||||||
|
|
||||||
|
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
||||||
|
if (!hGroup)
|
||||||
|
return; // still nothing to check
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
// REFORM_GROUP was set in ipdisp.c:ip_group_collision()
|
||||||
|
// during a collision with the flagship.
|
||||||
|
if (GroupPtr->race_id == SHOFIXTI_SHIP
|
||||||
|
&& (GroupPtr->task & REFORM_GROUP)
|
||||||
|
&& GET_GAME_STATE (SHOFIXTI_RECRUITED))
|
||||||
|
{
|
||||||
|
GroupPtr->task = FLEE | IGNORE_FLAGSHIP | REFORM_GROUP;
|
||||||
|
GroupPtr->dest_loc = 0;
|
||||||
|
}
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateSlylandro_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateSlylandro_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateSlylandroFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateSlylandro_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateSlylandro_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSlylandro_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[3].data_index = RED_GAS_GIANT;
|
||||||
|
solarSys->PlanetDesc[3].NumPlanets = 1;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSlylandro_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 3, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
InitCommunication (SLYLANDRO_HOME_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,663 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../lifeform.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../gamestr.h"
|
||||||
|
#include "../../grpinfo.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateSol_initNpcs (void);
|
||||||
|
static bool GenerateSol_reinitNpcs (void);
|
||||||
|
static bool GenerateSol_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateSol_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
static bool GenerateSol_generateName (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateSol_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateSol_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
static bool GenerateSol_generateLife (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
static int init_probe (void);
|
||||||
|
static void check_probe (void);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateSolFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateSol_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateSol_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateSol_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateSol_generateMoons,
|
||||||
|
/* .generateName = */ GenerateSol_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateSol_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateSol_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateSol_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_initNpcs (void)
|
||||||
|
{
|
||||||
|
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0);
|
||||||
|
if (GLOBAL (BattleGroupRef) == 0)
|
||||||
|
{
|
||||||
|
CloneShipFragment (URQUAN_DRONE_SHIP, &GLOBAL (npc_built_ship_q), 0);
|
||||||
|
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
SET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0, GLOBAL (BattleGroupRef));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!init_probe ())
|
||||||
|
GenerateDefault_initNpcs ();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_reinitNpcs (void)
|
||||||
|
{
|
||||||
|
if (GET_GAME_STATE (CHMMR_BOMB_STATE) != 3)
|
||||||
|
{
|
||||||
|
GenerateDefault_reinitNpcs ();
|
||||||
|
check_probe ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLOBAL (BattleGroupRef) = 0;
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT planetI;
|
||||||
|
|
||||||
|
#define SOL_SEED 334241042L
|
||||||
|
TFB_SeedRandom (SOL_SEED);
|
||||||
|
|
||||||
|
solarSys->SunDesc[0].NumPlanets = 9;
|
||||||
|
for (planetI = 0; planetI < 9; ++planetI)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
DWORD rand_val;
|
||||||
|
UWORD word_val;
|
||||||
|
PLANET_DESC *pCurDesc = &solarSys->PlanetDesc[planetI];
|
||||||
|
|
||||||
|
pCurDesc->rand_seed = rand_val = TFB_Random ();
|
||||||
|
word_val = LOWORD (rand_val);
|
||||||
|
angle = NORMALIZE_ANGLE ((COUNT)HIBYTE (word_val));
|
||||||
|
|
||||||
|
switch (planetI)
|
||||||
|
{
|
||||||
|
case 0: /* MERCURY */
|
||||||
|
pCurDesc->data_index = METAL_WORLD;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 39L / 100;
|
||||||
|
pCurDesc->NumPlanets = 0;
|
||||||
|
break;
|
||||||
|
case 1: /* VENUS */
|
||||||
|
pCurDesc->data_index = PRIMORDIAL_WORLD;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 72L / 100;
|
||||||
|
pCurDesc->NumPlanets = 0;
|
||||||
|
angle = NORMALIZE_ANGLE (FULL_CIRCLE - angle);
|
||||||
|
break;
|
||||||
|
case 2: /* EARTH */
|
||||||
|
pCurDesc->data_index = WATER_WORLD | PLANET_SHIELDED;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS;
|
||||||
|
pCurDesc->NumPlanets = 2;
|
||||||
|
break;
|
||||||
|
case 3: /* MARS */
|
||||||
|
pCurDesc->data_index = DUST_WORLD;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 152L / 100;
|
||||||
|
pCurDesc->NumPlanets = 0;
|
||||||
|
break;
|
||||||
|
case 4: /* JUPITER */
|
||||||
|
pCurDesc->data_index = RED_GAS_GIANT;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 500L /* 520L */ / 100;
|
||||||
|
pCurDesc->NumPlanets = 4;
|
||||||
|
break;
|
||||||
|
case 5: /* SATURN */
|
||||||
|
pCurDesc->data_index = ORA_GAS_GIANT;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 750L /* 952L */ / 100;
|
||||||
|
pCurDesc->NumPlanets = 1;
|
||||||
|
break;
|
||||||
|
case 6: /* URANUS */
|
||||||
|
pCurDesc->data_index = GRN_GAS_GIANT;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 1000L /* 1916L */ / 100;
|
||||||
|
pCurDesc->NumPlanets = 0;
|
||||||
|
break;
|
||||||
|
case 7: /* NEPTUNE */
|
||||||
|
pCurDesc->data_index = BLU_GAS_GIANT;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 1250L /* 2999L */ / 100;
|
||||||
|
pCurDesc->NumPlanets = 1;
|
||||||
|
break;
|
||||||
|
case 8: /* PLUTO */
|
||||||
|
pCurDesc->data_index = PELLUCID_WORLD;
|
||||||
|
pCurDesc->radius = EARTH_RADIUS * 1550L /* 3937L */ / 100;
|
||||||
|
pCurDesc->NumPlanets = 0;
|
||||||
|
angle = FULL_CIRCLE - OCTANT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCurDesc->location.x = COSINE (angle, pCurDesc->radius);
|
||||||
|
pCurDesc->location.y = SINE (angle, pCurDesc->radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_generateMoons (SOLARSYS_STATE *solarSys, PLANET_DESC *planet)
|
||||||
|
{
|
||||||
|
COUNT planetNr;
|
||||||
|
DWORD rand_val;
|
||||||
|
|
||||||
|
GenerateDefault_generateMoons (solarSys, planet);
|
||||||
|
|
||||||
|
planetNr = planetIndex (solarSys, planet);
|
||||||
|
switch (planetNr)
|
||||||
|
{
|
||||||
|
case 2: /* moons of EARTH */
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
/* Starbase: */
|
||||||
|
solarSys->MoonDesc[0].data_index = HIERARCHY_STARBASE;
|
||||||
|
solarSys->MoonDesc[0].radius = MIN_MOON_RADIUS;
|
||||||
|
angle = HALF_CIRCLE + QUADRANT;
|
||||||
|
solarSys->MoonDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
solarSys->MoonDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
|
||||||
|
/* Luna: */
|
||||||
|
solarSys->MoonDesc[1].data_index = SELENIC_WORLD;
|
||||||
|
solarSys->MoonDesc[1].radius = MIN_MOON_RADIUS
|
||||||
|
+ (MAX_MOONS - 1) * MOON_DELTA;
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
||||||
|
solarSys->MoonDesc[1].location.x =
|
||||||
|
COSINE (angle, solarSys->MoonDesc[1].radius);
|
||||||
|
solarSys->MoonDesc[1].location.y =
|
||||||
|
SINE (angle, solarSys->MoonDesc[1].radius);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4: /* moons of JUPITER */
|
||||||
|
solarSys->MoonDesc[0].data_index = RADIOACTIVE_WORLD;
|
||||||
|
/* Io */
|
||||||
|
solarSys->MoonDesc[1].data_index = HALIDE_WORLD;
|
||||||
|
/* Europa */
|
||||||
|
solarSys->MoonDesc[2].data_index = CYANIC_WORLD;
|
||||||
|
/* Ganymede */
|
||||||
|
solarSys->MoonDesc[3].data_index = PELLUCID_WORLD;
|
||||||
|
/* Callisto */
|
||||||
|
break;
|
||||||
|
case 5: /* moons of SATURN */
|
||||||
|
solarSys->MoonDesc[0].data_index = ALKALI_WORLD;
|
||||||
|
/* Titan */
|
||||||
|
break;
|
||||||
|
case 7: /* moons of NEPTUNE */
|
||||||
|
solarSys->MoonDesc[0].data_index = VINYLOGOUS_WORLD;
|
||||||
|
/* Triton */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_generateName (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
COUNT planetNr = planetIndex (solarSys, world);
|
||||||
|
utf8StringCopy (GLOBAL_SIS (PlanetName), sizeof (GLOBAL_SIS (PlanetName)),
|
||||||
|
GAME_STRING (PLANET_NUMBER_BASE + planetNr));
|
||||||
|
SET_GAME_STATE (BATTLE_PLANET, solarSys->PlanetDesc[planetNr].data_index);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
COUNT planetNr;
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 2, 0))
|
||||||
|
{
|
||||||
|
/* Starbase */
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
EncounterGroup = 0;
|
||||||
|
GLOBAL (CurrentActivity) |= START_ENCOUNTER;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, (BYTE)~0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
rand_val = DoPlanetaryAnalysis (&solarSys->SysInfo, world);
|
||||||
|
if (rand_val)
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
rand_val = GenerateMineralDeposits (&solarSys->SysInfo, &i);
|
||||||
|
}
|
||||||
|
|
||||||
|
planetNr = planetIndex (solarSys, world);
|
||||||
|
if (worldIsPlanet (solarSys, world))
|
||||||
|
{
|
||||||
|
switch (planetNr)
|
||||||
|
{
|
||||||
|
case 0: /* MERCURY */
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 98;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 38;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 3;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 2;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 59 * 240;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 165;
|
||||||
|
break;
|
||||||
|
case 1: /* VENUS */
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = 90 *
|
||||||
|
EARTH_ATMOSPHERE;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 95;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 95;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 177;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 7;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 243 * 240;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 457;
|
||||||
|
break;
|
||||||
|
case 2: /* EARTH */
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity =
|
||||||
|
EARTH_ATMOSPHERE;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 100;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 100;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 23;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 240;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 22;
|
||||||
|
break;
|
||||||
|
case 3: /* MARS */
|
||||||
|
// XXX: Mars atmo should actually be 1/2 in current units
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 72;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 53;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 24;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 246;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -53;
|
||||||
|
break;
|
||||||
|
case 4: /* JUPITER */
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity =
|
||||||
|
GAS_GIANT_ATMOSPHERE;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 24;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 1120;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 3;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 7;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 98;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -143;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 520L / 100;
|
||||||
|
break;
|
||||||
|
case 5: /* SATURN */
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity =
|
||||||
|
GAS_GIANT_ATMOSPHERE;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 13;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 945;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 27;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 7;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 102;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -197;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 952L / 100;
|
||||||
|
break;
|
||||||
|
case 6: /* URANUS */
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity =
|
||||||
|
GAS_GIANT_ATMOSPHERE;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 21;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 411;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 98;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 7;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 172;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -217;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 1916L / 100;
|
||||||
|
break;
|
||||||
|
case 7: /* NEPTUNE */
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity =
|
||||||
|
GAS_GIANT_ATMOSPHERE;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 28;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 396;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 30;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 7;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 182;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -229;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 2999L / 100;
|
||||||
|
break;
|
||||||
|
case 8: /* PLUTO */
|
||||||
|
if (!GET_GAME_STATE (FOUND_PLUTO_SPATHI))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (
|
||||||
|
LoadGraphic (SPAPLUTO_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (SPAPLUTO_STRTAB));
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 33;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 18;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 119;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 1533;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -235;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 3937L / 100;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceGravity =
|
||||||
|
CalcGravity (solarSys->SysInfo.PlanetInfo.PlanetDensity,
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius);
|
||||||
|
LoadPlanet (planetNr == 2 ?
|
||||||
|
CaptureDrawable (LoadGraphic (EARTH_MASK_ANIM)) : NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// World is a moon.
|
||||||
|
COUNT moonNr = moonIndex (solarSys, world);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
switch (planetNr)
|
||||||
|
{
|
||||||
|
case 2: /* moons of EARTH */
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] =
|
||||||
|
rand_val;
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (MOONBASE_DESTROYED))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (
|
||||||
|
LoadGraphic (MOONBASE_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (MOONBASE_STRTAB));
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 60;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 25;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AxialTilt = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 240 * 29;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -18;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: /* moons of JUPITER */
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 520L / 100;
|
||||||
|
switch (moonNr)
|
||||||
|
{
|
||||||
|
case 0: /* Io */
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 69;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 25;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 3;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 390;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -163;
|
||||||
|
break;
|
||||||
|
case 1: /* Europa */
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 54;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 25;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 840;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -161;
|
||||||
|
break;
|
||||||
|
case 2: /* Ganymede */
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 35;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 41;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 1728;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -164;
|
||||||
|
break;
|
||||||
|
case 3: /* Callisto */
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 35;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 38;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 4008;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -167;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: /* moon of SATURN: Titan */
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 952L / 100;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = 160;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 2;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 34;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 40;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 3816;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -178;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7: /* moon of NEPTUNE: Triton */
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetToSunDist =
|
||||||
|
EARTH_RADIUS * 2999L / 100;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = 10;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetDensity = 95;
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 27;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.RotationPeriod = 4300;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = -216;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceGravity =
|
||||||
|
CalcGravity (solarSys->SysInfo.PlanetInfo.PlanetDensity,
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius);
|
||||||
|
LoadPlanet (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 8, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
/* Pluto */
|
||||||
|
if (!GET_GAME_STATE (FOUND_PLUTO_SPATHI))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x = 20;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT - 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 2;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (FOUND_PLUTO_SPATHI, 1);
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
&= ~(1L << 0);
|
||||||
|
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
||||||
|
}
|
||||||
|
else if (*whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (matchWorld (solarSys, world, 2, 1)
|
||||||
|
&& !GET_GAME_STATE (MOONBASE_DESTROYED))
|
||||||
|
{
|
||||||
|
/* Earth Moon */
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH * 3 / 4;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 1 / 4;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
{
|
||||||
|
*whichNode = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (MOONBASE_DESTROYED, 1);
|
||||||
|
SET_GAME_STATE (MOONBASE_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSol_generateLife (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (!matchWorld (solarSys, world, 2, 1))
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
}
|
||||||
|
else /* Earth Moon */
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD old_rand;
|
||||||
|
DWORD rand_val;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = NUM_CREATURE_TYPES + 1;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 10);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
init_probe (void)
|
||||||
|
{
|
||||||
|
HIPGROUP hGroup;
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (PROBE_MESSAGE_DELIVERED)
|
||||||
|
&& GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP)
|
||||||
|
&& (hGroup = GetHeadLink (&GLOBAL (ip_group_q))))
|
||||||
|
{
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
GroupPtr->task = IN_ORBIT;
|
||||||
|
GroupPtr->sys_loc = 2 + 1; /* orbitting earth */
|
||||||
|
GroupPtr->dest_loc = 2 + 1; /* orbitting earth */
|
||||||
|
GroupPtr->loc.x = 0;
|
||||||
|
GroupPtr->loc.y = 0;
|
||||||
|
GroupPtr->group_counter = 0;
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_probe (void)
|
||||||
|
{
|
||||||
|
HIPGROUP hGroup;
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
if (!GLOBAL (BattleGroupRef))
|
||||||
|
return; // nothing to check
|
||||||
|
|
||||||
|
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
||||||
|
if (!hGroup)
|
||||||
|
return; // still nothing to check
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
// REFORM_GROUP was set in ipdisp.c:ip_group_collision()
|
||||||
|
// during a collision with the flagship.
|
||||||
|
if (GroupPtr->race_id == URQUAN_DRONE_SHIP
|
||||||
|
&& (GroupPtr->task & REFORM_GROUP))
|
||||||
|
{
|
||||||
|
// We just want the probe to take off as fast as possible,
|
||||||
|
// so clear out REFORM_GROUP
|
||||||
|
GroupPtr->task = FLEE | IGNORE_FLAGSHIP;
|
||||||
|
GroupPtr->dest_loc = 0;
|
||||||
|
}
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,284 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lifeform.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateSpathi_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateSpathi_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
static bool GenerateSpathi_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateSpathi_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
static bool GenerateSpathi_generateLife (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateSpathiFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateSpathi_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateSpathi_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateSpathi_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateSpathi_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateSpathi_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSpathi_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
PLANET_DESC *pMinPlanet;
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
pMinPlanet = &solarSys->PlanetDesc[0];
|
||||||
|
solarSys->SunDesc[0].NumPlanets = 1;
|
||||||
|
FillOrbits (solarSys,
|
||||||
|
solarSys->SunDesc[0].NumPlanets, pMinPlanet, FALSE);
|
||||||
|
|
||||||
|
pMinPlanet->radius = EARTH_RADIUS * 1150L / 100;
|
||||||
|
angle = ARCTAN (pMinPlanet->location.x, pMinPlanet->location.y);
|
||||||
|
pMinPlanet->location.x = COSINE (angle, pMinPlanet->radius);
|
||||||
|
pMinPlanet->location.y = SINE (angle, pMinPlanet->radius);
|
||||||
|
pMinPlanet->data_index = WATER_WORLD;
|
||||||
|
if (GET_GAME_STATE (SPATHI_SHIELDED_SELVES))
|
||||||
|
pMinPlanet->data_index |= PLANET_SHIELDED;
|
||||||
|
pMinPlanet->NumPlanets = 1;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSpathi_generateMoons (SOLARSYS_STATE *solarSys, PLANET_DESC *planet)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generateMoons (solarSys, planet);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, planet, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
#ifdef NOTYET
|
||||||
|
utf8StringCopy (GLOBAL_SIS (PlanetName),
|
||||||
|
sizeof (GLOBAL_SIS (PlanetName)),
|
||||||
|
"Spathiwa");
|
||||||
|
#endif /* NOTYET */
|
||||||
|
|
||||||
|
solarSys->MoonDesc[0].data_index = PELLUCID_WORLD;
|
||||||
|
solarSys->MoonDesc[0].radius = MIN_MOON_RADIUS + MOON_DELTA;
|
||||||
|
angle = NORMALIZE_ANGLE (LOWORD (TFB_Random ()));
|
||||||
|
solarSys->MoonDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
solarSys->MoonDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->MoonDesc[0].radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSpathi_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, 0))
|
||||||
|
{
|
||||||
|
/* Spathiwa's moon */
|
||||||
|
if (!GET_GAME_STATE (SPATHI_SHIELDED_SELVES)
|
||||||
|
&& ActivateStarShip (SPATHI_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (SPATHI_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (SPATHI_SHIP, &GLOBAL (npc_built_ship_q),
|
||||||
|
INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
InitCommunication (SPATHI_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
rand_val = DoPlanetaryAnalysis (&solarSys->SysInfo, world);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
rand_val = GenerateLifeForms (&solarSys->SysInfo, &i);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
GenerateMineralDeposits (&solarSys->SysInfo, &i);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN] = rand_val;
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 28;
|
||||||
|
if (!GET_GAME_STATE (UMGAH_BROADCASTERS))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (UMGAH_BCS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (UMGAH_BCS_STRTAB));
|
||||||
|
}
|
||||||
|
LoadPlanet (NULL);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
/* visiting Spathiwa */
|
||||||
|
rand_val = DoPlanetaryAnalysis (&solarSys->SysInfo, world);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
||||||
|
i = (COUNT)~0;
|
||||||
|
rand_val = GenerateMineralDeposits (&solarSys->SysInfo, &i);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius = 120;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceGravity =
|
||||||
|
CalcGravity (solarSys->SysInfo.PlanetInfo.PlanetDensity,
|
||||||
|
solarSys->SysInfo.PlanetInfo.PlanetRadius);
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 31;
|
||||||
|
|
||||||
|
LoadPlanet (NULL);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSpathi_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, 0)
|
||||||
|
&& !GET_GAME_STATE (UMGAH_BROADCASTERS))
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (UMGAH_BROADCASTERS, 1);
|
||||||
|
SET_GAME_STATE (UMGAH_BROADCASTERS_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSpathi_generateLife (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET)
|
||||||
|
&& !GET_GAME_STATE (SPATHI_SHIELDED_SELVES))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
DWORD rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = NUM_CREATURE_TYPES;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 32);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN])
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (SPATHI_CREATURES_EXAMINED, 1);
|
||||||
|
if (solarSys->SysInfo.
|
||||||
|
PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] == 0xFFFFFFFF)
|
||||||
|
SET_GAME_STATE (SPATHI_CREATURES_ELIMINATED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateSupox_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateSupox_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateSupox_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateSupoxFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateSupox_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateSupox_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateSupox_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSupox_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 2;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 152L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSupox_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (ActivateStarShip (SUPOX_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (SUPOX_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (SUPOX_SHIP, &GLOBAL (npc_built_ship_q),
|
||||||
|
INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (SUPOX_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
if (!GET_GAME_STATE (ULTRON_CONDITION))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetAbsStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSupox_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
if (!GET_GAME_STATE (ULTRON_CONDITION))
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
else
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
&= ~(1L << i);
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (ULTRON_CONDITION))
|
||||||
|
{
|
||||||
|
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
||||||
|
|
||||||
|
SET_GAME_STATE (ULTRON_CONDITION, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
|
||||||
|
static bool GenerateSyreen_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateSyreen_generateMoons (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *planet);
|
||||||
|
static bool GenerateSyreen_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateSyreenFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateSyreen_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateSyreen_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateSyreen_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSyreen_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD | PLANET_SHIELDED;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSyreen_generateMoons (SOLARSYS_STATE *solarSys, PLANET_DESC *planet)
|
||||||
|
{
|
||||||
|
GenerateDefault_generateMoons (solarSys, planet);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, planet, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
solarSys->MoonDesc[0].data_index = HIERARCHY_STARBASE;
|
||||||
|
solarSys->MoonDesc[0].radius = MIN_MOON_RADIUS;
|
||||||
|
solarSys->MoonDesc[0].location.x =
|
||||||
|
COSINE (QUADRANT, solarSys->MoonDesc[0].radius);
|
||||||
|
solarSys->MoonDesc[0].location.y =
|
||||||
|
SINE (QUADRANT, solarSys->MoonDesc[0].radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateSyreen_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
/* Syreen home planet */
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 19;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = EARTH_ATMOSPHERE * 9 / 10;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, 0))
|
||||||
|
{
|
||||||
|
/* Starbase */
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
InitCommunication (SYREEN_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../setup.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateThraddash_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateThraddash_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateThraddash_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateThraddashFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateThraddash_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateThraddash_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateThraddash_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateThraddash_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == AQUA_HELIX_DEFINED)
|
||||||
|
{
|
||||||
|
solarSys->PlanetDesc[0].data_index = PRIMORDIAL_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 65L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
}
|
||||||
|
else /* CurStarDescPtr->Index == THRADD_DEFINED */
|
||||||
|
{
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 0;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 98L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateThraddash_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (ActivateStarShip (THRADDASH_SHIP, SPHERE_TRACKING)
|
||||||
|
&& (CurStarDescPtr->Index == THRADD_DEFINED
|
||||||
|
|| (!GET_GAME_STATE (HELIX_UNPROTECTED)
|
||||||
|
&& (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3)))
|
||||||
|
{
|
||||||
|
NotifyOthers (THRADDASH_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (THRADDASH_SHIP, &GLOBAL (npc_built_ship_q),
|
||||||
|
INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
if (CurStarDescPtr->Index == THRADD_DEFINED)
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
||||||
|
}
|
||||||
|
InitCommunication (THRADD_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == THRADD_DEFINED
|
||||||
|
|| (!GET_GAME_STATE (HELIX_UNPROTECTED)
|
||||||
|
&& (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
RepairSISBorder ();
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == AQUA_HELIX_DEFINED
|
||||||
|
&& !GET_GAME_STATE (AQUA_HELIX))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (AQUA_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (AQUA_STRTAB));
|
||||||
|
}
|
||||||
|
else if (CurStarDescPtr->Index == THRADD_DEFINED)
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateThraddash_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index != AQUA_HELIX_DEFINED)
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (AQUA_HELIX))
|
||||||
|
{
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0)) && *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (HELIX_VISITS, 0);
|
||||||
|
SET_GAME_STATE (AQUA_HELIX, 1);
|
||||||
|
SET_GAME_STATE (AQUA_HELIX_ON_SHIP, 1);
|
||||||
|
SET_GAME_STATE (HELIX_UNPROTECTED, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateTrap_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateTrap_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateTrapFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateTrap_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateTrap_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateTrap_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = TELLURIC_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 203L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateTrap_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.AtmoDensity = EARTH_ATMOSPHERE * 2;
|
||||||
|
solarSys->SysInfo.PlanetInfo.SurfaceTemperature = 35;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 3;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,289 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../setup.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateUtwig_initNpcs (void);
|
||||||
|
static bool GenerateUtwig_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateUtwig_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateUtwig_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateUtwigFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateUtwig_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateUtwig_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateUtwig_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateUtwig_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateUtwig_initNpcs (void)
|
||||||
|
{
|
||||||
|
if (CurStarDescPtr->Index == BOMB_DEFINED
|
||||||
|
&& !GET_GAME_STATE (UTWIG_BOMB))
|
||||||
|
{
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GenerateDefault_initNpcs ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateUtwig_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == UTWIG_DEFINED)
|
||||||
|
{
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 174L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateUtwig_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if ((CurStarDescPtr->Index == UTWIG_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
|| (CurStarDescPtr->Index == BOMB_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 5, 1)
|
||||||
|
&& !GET_GAME_STATE (UTWIG_BOMB)))
|
||||||
|
{
|
||||||
|
if ((CurStarDescPtr->Index == UTWIG_DEFINED
|
||||||
|
|| !GET_GAME_STATE (UTWIG_HAVE_ULTRON))
|
||||||
|
&& ActivateStarShip (UTWIG_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (UTWIG_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (UTWIG_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
if (CurStarDescPtr->Index == UTWIG_DEFINED)
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
||||||
|
}
|
||||||
|
InitCommunication (UTWIG_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == BOMB_DEFINED
|
||||||
|
&& !GET_GAME_STATE (BOMB_UNPROTECTED)
|
||||||
|
&& ActivateStarShip (DRUUGE_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
for (i = 0; i < 5; ++i)
|
||||||
|
{
|
||||||
|
CloneShipFragment (DRUUGE_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
}
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
||||||
|
InitCommunication (DRUUGE_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
{
|
||||||
|
BOOLEAN DruugeSurvivors;
|
||||||
|
|
||||||
|
DruugeSurvivors =
|
||||||
|
GetHeadLink (&GLOBAL (npc_built_ship_q)) != 0;
|
||||||
|
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
|
||||||
|
if (DruugeSurvivors)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
RepairSISBorder ();
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
SET_GAME_STATE (BOMB_UNPROTECTED, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == BOMB_DEFINED)
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (BOMB_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (BOMB_STRTAB));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == UTWIG_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateUtwig_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == UTWIG_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == BOMB_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 5, 1)
|
||||||
|
&& !GET_GAME_STATE (UTWIG_BOMB))
|
||||||
|
{
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (UTWIG_BOMB, 1);
|
||||||
|
SET_GAME_STATE (UTWIG_BOMB_ON_SHIP, 1);
|
||||||
|
SET_GAME_STATE (DRUUGE_MANNER, 1);
|
||||||
|
SET_GAME_STATE (DRUUGE_VISITS, 0);
|
||||||
|
SET_GAME_STATE (DRUUGE_HOME_VISITS, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../resinst.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateVault_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateVault_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateVaultFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateDefault_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateVault_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateVault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateVault_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, 0))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (VAULT_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (VAULT_STRTAB));
|
||||||
|
if (GET_GAME_STATE (SHIP_VAULT_UNLOCKED))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetAbsStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString, 2);
|
||||||
|
}
|
||||||
|
else if (GET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetAbsStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateVault_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, 0))
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (!GET_GAME_STATE (SHIP_VAULT_UNLOCKED))
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
else
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
*whichNode = 1;
|
||||||
|
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
&= ~(1L << 0);
|
||||||
|
if (GET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP))
|
||||||
|
{
|
||||||
|
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
||||||
|
|
||||||
|
SET_GAME_STATE (SHIP_VAULT_UNLOCKED, 1);
|
||||||
|
SET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 0);
|
||||||
|
SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
|
||||||
|
}
|
||||||
|
else if (!GET_GAME_STATE (KNOW_SYREEN_VAULT))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (KNOW_SYREEN_VAULT, 1);
|
||||||
|
SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,366 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../lifeform.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../encount.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../setup.h"
|
||||||
|
#include "../../sounds.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateVux_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateVux_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateVux_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
static bool GenerateVux_generateLife (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateVuxFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateVux_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateVux_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateVux_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateVux_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateVux_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == MAIDENS_DEFINED)
|
||||||
|
{
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
// XXX: this is the second time that this function is
|
||||||
|
// called. Is it safe to remove one, or does this change
|
||||||
|
// the RNG so that the outcome is different?
|
||||||
|
solarSys->PlanetDesc[0].data_index = REDUX_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 212L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (CurStarDescPtr->Index == VUX_DEFINED)
|
||||||
|
{
|
||||||
|
solarSys->PlanetDesc[0].data_index = REDUX_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 42L / 100;
|
||||||
|
angle = HALF_CIRCLE + OCTANT;
|
||||||
|
}
|
||||||
|
else /* if (CurStarDescPtr->Index == VUX_BEAST_DEFINED) */
|
||||||
|
{
|
||||||
|
memmove (&solarSys->PlanetDesc[1], &solarSys->PlanetDesc[0],
|
||||||
|
sizeof (solarSys->PlanetDesc[0])
|
||||||
|
* solarSys->SunDesc[0].NumPlanets);
|
||||||
|
++solarSys->SunDesc[0].NumPlanets;
|
||||||
|
|
||||||
|
angle = HALF_CIRCLE - OCTANT;
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 110L / 100;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].rand_seed = MAKE_DWORD (
|
||||||
|
solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateVux_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if ((matchWorld (solarSys, world, 0, MATCH_PLANET)
|
||||||
|
&& (CurStarDescPtr->Index == VUX_DEFINED
|
||||||
|
|| (CurStarDescPtr->Index == MAIDENS_DEFINED
|
||||||
|
&& !GET_GAME_STATE (ZEX_IS_DEAD))))
|
||||||
|
&& ActivateStarShip (VUX_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (VUX_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (VUX_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
||||||
|
if (CurStarDescPtr->Index == VUX_DEFINED)
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
InitCommunication (VUX_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == VUX_DEFINED
|
||||||
|
|| !GET_GAME_STATE (ZEX_IS_DEAD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
RepairSISBorder ();
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (CurStarDescPtr->Index == MAIDENS_DEFINED)
|
||||||
|
{
|
||||||
|
if (!GET_GAME_STATE (SHOFIXTI_MAIDENS))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] = CaptureDrawable (
|
||||||
|
LoadGraphic (MAIDENS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (MAIDENS_STRTAB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (CurStarDescPtr->Index == VUX_BEAST_DEFINED)
|
||||||
|
{
|
||||||
|
if (!GET_GAME_STATE (VUX_BEAST))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (
|
||||||
|
LoadStringTable (BEAST_STRTAB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.Weather = 2;
|
||||||
|
solarSys->SysInfo.PlanetInfo.Tectonics = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateVux_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET)
|
||||||
|
&& CurStarDescPtr->Index != VUX_BEAST_DEFINED)
|
||||||
|
{
|
||||||
|
if (CurStarDescPtr->Index == MAIDENS_DEFINED
|
||||||
|
&& !GET_GAME_STATE (SHOFIXTI_MAIDENS))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH / 3;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 5 / 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
if (!(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
&& *whichNode == (COUNT)~0)
|
||||||
|
*whichNode = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*whichNode = 0;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
SET_GAME_STATE (SHOFIXTI_MAIDENS, 1);
|
||||||
|
SET_GAME_STATE (MAIDENS_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == VUX_DEFINED)
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateVux_generateLife (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (CurStarDescPtr->Index == MAIDENS_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
DWORD rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
if (i < 4)
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 9;
|
||||||
|
else if (i < 8)
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 14;
|
||||||
|
else /* if (i < 12) */
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 18;
|
||||||
|
if (i >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
} while (++i < 12);
|
||||||
|
*whichNode = i;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurStarDescPtr->Index == VUX_BEAST_DEFINED
|
||||||
|
&& matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
DWORD rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
if (i == 0)
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = NUM_CREATURE_TYPES + 2;
|
||||||
|
else if (i <= 5)
|
||||||
|
/* {SPEED_MOTIONLESS | DANGER_NORMAL, MAKE_BYTE (5, 3)}, */
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 3;
|
||||||
|
else /* if (i <= 10) */
|
||||||
|
/* {BEHAVIOR_UNPREDICTABLE | SPEED_SLOW | DANGER_NORMAL, MAKE_BYTE (3, 8)}, */
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 8;
|
||||||
|
if (i >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
else if (i == 0
|
||||||
|
&& (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
||||||
|
& (1L << i))
|
||||||
|
&& !GET_GAME_STATE (VUX_BEAST))
|
||||||
|
{
|
||||||
|
UnbatchGraphics ();
|
||||||
|
DoDiscoveryReport (MenuSounds);
|
||||||
|
BatchGraphics ();
|
||||||
|
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
||||||
|
|
||||||
|
SET_GAME_STATE (VUX_BEAST, 1);
|
||||||
|
SET_GAME_STATE (VUX_BEAST_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
} while (++i < 11);
|
||||||
|
*whichNode = i;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateLife (solarSys, world, whichNode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../lander.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../resinst.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateWreck_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateWreck_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateWreckFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateDefault_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateWreck_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateWreck_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateWreck_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 6, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (WRECK_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (WRECK_STRTAB));
|
||||||
|
if (GET_GAME_STATE (PORTAL_KEY))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
SetAbsStringTableIndex (
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateWreck_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 6, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (!GET_GAME_STATE (PORTAL_KEY))
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 0;
|
||||||
|
else
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
*whichNode = 1;
|
||||||
|
if (solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << 0))
|
||||||
|
{
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
&= ~(1L << 0);
|
||||||
|
|
||||||
|
if (!GET_GAME_STATE (PORTAL_KEY))
|
||||||
|
{
|
||||||
|
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
||||||
|
|
||||||
|
SET_GAME_STATE (PORTAL_KEY, 1);
|
||||||
|
SET_GAME_STATE (PORTAL_KEY_ON_SHIP, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../ipdisp.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateYehat_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateYehat_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateYehat_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateYehatFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateDefault_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateYehat_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateYehat_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateYehat_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateYehat_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
solarSys->PlanetDesc[0].data_index = WATER_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 106L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateYehat_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (ActivateStarShip (YEHAT_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
NotifyOthers (YEHAT_SHIP, IPNL_ALL_CLEAR);
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
CloneShipFragment (YEHAT_SHIP, &GLOBAL (npc_built_ship_q),
|
||||||
|
INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (YEHAT_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateYehat_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../grpinfo.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateZoqFotPikScout_initNpcs (void);
|
||||||
|
static bool GenerateZoqFotPikScout_reinitNpcs (void);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateZoqFotPikScoutFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateZoqFotPikScout_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateZoqFotPikScout_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateDefault_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateDefault_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateDefault_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateZoqFotPikScout_initNpcs (void)
|
||||||
|
{
|
||||||
|
if (!GET_GAME_STATE (MET_ZOQFOT))
|
||||||
|
{
|
||||||
|
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (ZOQFOT_GRPOFFS0);
|
||||||
|
if (GLOBAL (BattleGroupRef) == 0)
|
||||||
|
{
|
||||||
|
CloneShipFragment (ZOQFOTPIK_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
SET_GAME_STATE_32 (ZOQFOT_GRPOFFS0, GLOBAL (BattleGroupRef));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_initNpcs ();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateZoqFotPikScout_reinitNpcs (void)
|
||||||
|
{
|
||||||
|
HIPGROUP hGroup;
|
||||||
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
|
GenerateDefault_reinitNpcs ();
|
||||||
|
|
||||||
|
if (!GLOBAL (BattleGroupRef))
|
||||||
|
return true; // nothing to check
|
||||||
|
|
||||||
|
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
||||||
|
if (!hGroup)
|
||||||
|
return true; // still nothing to check
|
||||||
|
|
||||||
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
// REFORM_GROUP was set in ipdisp.c:ip_group_collision()
|
||||||
|
// during a collision with the flagship.
|
||||||
|
if (GroupPtr->race_id == ZOQFOTPIK_SHIP
|
||||||
|
&& (GroupPtr->task & REFORM_GROUP))
|
||||||
|
{
|
||||||
|
GroupPtr->task = FLEE | IGNORE_FLAGSHIP | REFORM_GROUP;
|
||||||
|
GroupPtr->dest_loc = 0;
|
||||||
|
}
|
||||||
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "genall.h"
|
||||||
|
#include "../planets.h"
|
||||||
|
#include "../../build.h"
|
||||||
|
#include "../../comm.h"
|
||||||
|
#include "../../globdata.h"
|
||||||
|
#include "../../nameref.h"
|
||||||
|
#include "../../state.h"
|
||||||
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
static bool GenerateZoqFotPik_initNpcs (void);
|
||||||
|
static bool GenerateZoqFotPik_generatePlanets (SOLARSYS_STATE *solarSys);
|
||||||
|
static bool GenerateZoqFotPik_generateOrbital (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world);
|
||||||
|
static bool GenerateZoqFotPik_generateEnergy (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *whichNode);
|
||||||
|
|
||||||
|
|
||||||
|
const GenerateFunctions generateZoqFotPikFunctions = {
|
||||||
|
/* .initNpcs = */ GenerateZoqFotPik_initNpcs,
|
||||||
|
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
|
||||||
|
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
|
||||||
|
/* .generatePlanets = */ GenerateZoqFotPik_generatePlanets,
|
||||||
|
/* .generateMoons = */ GenerateDefault_generateMoons,
|
||||||
|
/* .generateName = */ GenerateDefault_generateName,
|
||||||
|
/* .generateOrbital = */ GenerateZoqFotPik_generateOrbital,
|
||||||
|
/* .generateMinerals = */ GenerateDefault_generateMinerals,
|
||||||
|
/* .generateEnergy = */ GenerateZoqFotPik_generateEnergy,
|
||||||
|
/* .generateLife = */ GenerateDefault_generateLife,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateZoqFotPik_initNpcs (void)
|
||||||
|
{
|
||||||
|
if (GET_GAME_STATE (ZOQFOT_DISTRESS) != 1)
|
||||||
|
GenerateDefault_initNpcs ();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateZoqFotPik_generatePlanets (SOLARSYS_STATE *solarSys)
|
||||||
|
{
|
||||||
|
COUNT angle;
|
||||||
|
|
||||||
|
GenerateDefault_generatePlanets (solarSys);
|
||||||
|
|
||||||
|
solarSys->PlanetDesc[0].data_index = REDUX_WORLD;
|
||||||
|
solarSys->PlanetDesc[0].NumPlanets = 1;
|
||||||
|
solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 138L / 100;
|
||||||
|
angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
|
||||||
|
solarSys->PlanetDesc[0].location.y);
|
||||||
|
solarSys->PlanetDesc[0].location.x =
|
||||||
|
COSINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
solarSys->PlanetDesc[0].location.y =
|
||||||
|
SINE (angle, solarSys->PlanetDesc[0].radius);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateZoqFotPik_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
if (ActivateStarShip (ZOQFOTPIK_SHIP, SPHERE_TRACKING))
|
||||||
|
{
|
||||||
|
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||||
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
|
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
||||||
|
|
||||||
|
if (GET_GAME_STATE (ZOQFOT_DISTRESS))
|
||||||
|
{
|
||||||
|
CloneShipFragment (BLACK_URQUAN_SHIP,
|
||||||
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (BLACKURQ_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (GetHeadLink (&GLOBAL (npc_built_ship_q)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CloneShipFragment (ZOQFOTPIK_SHIP, &GLOBAL (npc_built_ship_q),
|
||||||
|
INFINITE_FLEET);
|
||||||
|
|
||||||
|
solarSys->MenuState.Initialized += 2;
|
||||||
|
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
||||||
|
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
||||||
|
InitCommunication (ZOQFOTPIK_CONVERSATION);
|
||||||
|
solarSys->MenuState.Initialized -= 2;
|
||||||
|
|
||||||
|
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
||||||
|
{
|
||||||
|
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
||||||
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
|
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
|
||||||
|
solarSys->PlanetSideFrame[1] =
|
||||||
|
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
|
||||||
|
solarSys->SysInfo.PlanetInfo.DiscoveryString =
|
||||||
|
CaptureStringTable (LoadStringTable (RUINS_STRTAB));
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateDefault_generateOrbital (solarSys, world);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
GenerateZoqFotPik_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *whichNode)
|
||||||
|
{
|
||||||
|
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
|
||||||
|
{
|
||||||
|
COUNT i;
|
||||||
|
COUNT nodeI;
|
||||||
|
DWORD rand_val;
|
||||||
|
DWORD old_rand;
|
||||||
|
|
||||||
|
old_rand = TFB_SeedRandom (
|
||||||
|
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
|
||||||
|
|
||||||
|
nodeI = 0;
|
||||||
|
i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rand_val = TFB_Random ();
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.x =
|
||||||
|
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurPt.y =
|
||||||
|
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurType = 1;
|
||||||
|
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
|
||||||
|
if (nodeI >= *whichNode
|
||||||
|
&& !(solarSys->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
||||||
|
& (1L << i)))
|
||||||
|
break;
|
||||||
|
++nodeI;
|
||||||
|
} while (++i < 16);
|
||||||
|
*whichNode = nodeI;
|
||||||
|
|
||||||
|
TFB_SeedRandom (old_rand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*whichNode = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateIlwrath (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = PRIMORDIAL_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 204L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (ActivateStarShip (ILWRATH_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (ILWRATH_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (ILWRATH_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (ILWRATH_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GenerateRandomIP (GENERATE_ORBITAL);
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 2;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 3;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/log.h"
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
SelectMelnormeRefVar (void)
|
|
||||||
{
|
|
||||||
int RefVar;
|
|
||||||
|
|
||||||
switch (CurStarDescPtr->Index)
|
|
||||||
{
|
|
||||||
case MELNORME0_DEFINED:
|
|
||||||
RefVar = MELNORME0_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME1_DEFINED:
|
|
||||||
RefVar = MELNORME1_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME2_DEFINED:
|
|
||||||
RefVar = MELNORME2_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME3_DEFINED:
|
|
||||||
RefVar = MELNORME3_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME4_DEFINED:
|
|
||||||
RefVar = MELNORME4_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME5_DEFINED:
|
|
||||||
RefVar = MELNORME5_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME6_DEFINED:
|
|
||||||
RefVar = MELNORME6_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME7_DEFINED:
|
|
||||||
RefVar = MELNORME7_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
case MELNORME8_DEFINED:
|
|
||||||
RefVar = MELNORME8_GRPOFFS0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
RefVar = -1;
|
|
||||||
}
|
|
||||||
return RefVar;
|
|
||||||
}
|
|
||||||
|
|
||||||
static DWORD
|
|
||||||
GetMelnormeRef (void)
|
|
||||||
{
|
|
||||||
int RefVar = SelectMelnormeRefVar ();
|
|
||||||
if (RefVar < 0)
|
|
||||||
{
|
|
||||||
log_add (log_Warning, "GetMelnormeRef(): reference unknown");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GET_GAME_STATE_32 (RefVar);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
SetMelnormeRef (DWORD Ref)
|
|
||||||
{
|
|
||||||
int RefVar = SelectMelnormeRefVar ();
|
|
||||||
if (RefVar < 0)
|
|
||||||
{
|
|
||||||
log_add (log_Warning, "SetMelnormeRef(): reference unknown");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_GAME_STATE_32 (RefVar, Ref);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateMelnorme (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
GLOBAL (BattleGroupRef) = GetMelnormeRef ();
|
|
||||||
if (GLOBAL (BattleGroupRef) == 0)
|
|
||||||
{
|
|
||||||
CloneShipFragment (MELNORME_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
SetMelnormeRef (GLOBAL (BattleGroupRef));
|
|
||||||
}
|
|
||||||
GenerateRandomIP (INIT_NPCS);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,235 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateMycon (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_LIFE:
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (CurStarDescPtr->Index != MYCON_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (CurStarDescPtr->Index == SUN_DEVICE_DEFINED)
|
|
||||||
{
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (SUN_DEVICE, 1);
|
|
||||||
SET_GAME_STATE (SUN_DEVICE_ON_SHIP, 1);
|
|
||||||
SET_GAME_STATE (MYCON_VISITS, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if ((pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->SysInfo.PlanetInfo.DiscoveryString)
|
|
||||||
{
|
|
||||||
switch (CurStarDescPtr->Index)
|
|
||||||
{
|
|
||||||
case EGG_CASE0_DEFINED:
|
|
||||||
SET_GAME_STATE (EGG_CASE0_ON_SHIP, 1);
|
|
||||||
break;
|
|
||||||
case EGG_CASE1_DEFINED:
|
|
||||||
SET_GAME_STATE (EGG_CASE1_ON_SHIP, 1);
|
|
||||||
break;
|
|
||||||
case EGG_CASE2_DEFINED:
|
|
||||||
SET_GAME_STATE (EGG_CASE2_ON_SHIP, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = SHATTERED_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 80L / 100;
|
|
||||||
if (pSolarSysState->PlanetDesc[0].NumPlanets > 2)
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 2;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if ((CurStarDescPtr->Index == MYCON_DEFINED
|
|
||||||
|| CurStarDescPtr->Index == SUN_DEVICE_DEFINED)
|
|
||||||
&& ActivateStarShip (MYCON_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
if (CurStarDescPtr->Index == MYCON_DEFINED
|
|
||||||
|| !GET_GAME_STATE (SUN_DEVICE_UNGUARDED))
|
|
||||||
{
|
|
||||||
NotifyOthers (MYCON_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == MYCON_DEFINED
|
|
||||||
|| !GET_GAME_STATE (MYCON_FELL_FOR_AMBUSH))
|
|
||||||
CloneShipFragment (MYCON_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q),
|
|
||||||
INFINITE_FLEET);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
|
|
||||||
for (i = 0; i < 5; ++i)
|
|
||||||
CloneShipFragment (MYCON_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
if (CurStarDescPtr->Index == MYCON_DEFINED)
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
|
||||||
}
|
|
||||||
InitCommunication (MYCON_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
|
||||||
break;
|
|
||||||
|
|
||||||
{
|
|
||||||
BOOLEAN MyconSurvivors;
|
|
||||||
|
|
||||||
MyconSurvivors = GetHeadLink (
|
|
||||||
&GLOBAL (npc_built_ship_q)
|
|
||||||
) != 0;
|
|
||||||
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
|
|
||||||
if (MyconSurvivors)
|
|
||||||
break;
|
|
||||||
|
|
||||||
SET_GAME_STATE (SUN_DEVICE_UNGUARDED, 1);
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
RepairSISBorder ();
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (CurStarDescPtr->Index)
|
|
||||||
{
|
|
||||||
case SUN_DEVICE_DEFINED:
|
|
||||||
if (!GET_GAME_STATE (SUN_DEVICE))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (SUN_DEVICE_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (SUN_DEVICE_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EGG_CASE0_DEFINED:
|
|
||||||
case EGG_CASE1_DEFINED:
|
|
||||||
case EGG_CASE2_DEFINED:
|
|
||||||
if (GET_GAME_STATE (KNOW_ABOUT_SHATTERED) == 0)
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (KNOW_ABOUT_SHATTERED, 1);
|
|
||||||
}
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0)))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (EGG_CASE_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (EGG_CASE_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,366 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../sounds.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
GenerateAndrosynth (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[1])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
&= ~(1L << i);
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << (i + 16))))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (PLANETARY_CHANGE, 1);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
|= (1L << (i + 16));
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.DiscoveryString)
|
|
||||||
{
|
|
||||||
UnbatchGraphics ();
|
|
||||||
DoDiscoveryReport (MenuSounds);
|
|
||||||
BatchGraphics ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetRelStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[1].data_index = TELLURIC_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[1].radius = EARTH_RADIUS * 204L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[1].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[1].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[1].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[1].radius);
|
|
||||||
pSolarSysState->PlanetDesc[1].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[1].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[1])
|
|
||||||
{
|
|
||||||
UWORD retval;
|
|
||||||
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (ANDROSYNTH_RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
retval = HIWORD (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
while (retval)
|
|
||||||
{
|
|
||||||
if (retval & 1)
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetRelStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
if (GetStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString
|
|
||||||
) == 0)
|
|
||||||
{
|
|
||||||
DestroyStringTable (ReleaseStringTable (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString
|
|
||||||
));
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
retval >>= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GenerateRandomIP (GENERATE_ORBITAL);
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[1])
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
EARTH_ATMOSPHERE * 144 / 100;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 28;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateOrz (BYTE control)
|
|
||||||
{
|
|
||||||
if (CurStarDescPtr && CurStarDescPtr->Index == ANDROSYNTH_DEFINED)
|
|
||||||
{
|
|
||||||
GenerateAndrosynth (control);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index != ORZ_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[1]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[2]
|
|
||||||
&& !GET_GAME_STATE (TAALO_PROTECTOR))
|
|
||||||
{
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (TAALO_PROTECTOR, 1);
|
|
||||||
SET_GAME_STATE (TAALO_PROTECTOR_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (CurStarDescPtr->Index == ORZ_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
if (CurStarDescPtr->Index == ORZ_DEFINED)
|
|
||||||
{
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 156L / 100;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 0;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if ((CurStarDescPtr->Index == ORZ_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
|| (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[1]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[2]
|
|
||||||
&& !GET_GAME_STATE (TAALO_PROTECTOR)))
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
|
|
||||||
if ((CurStarDescPtr->Index == ORZ_DEFINED
|
|
||||||
|| !GET_GAME_STATE (TAALO_UNPROTECTED))
|
|
||||||
&& ActivateStarShip (ORZ_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (ORZ_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == ORZ_DEFINED)
|
|
||||||
{
|
|
||||||
CloneShipFragment (ORZ_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i = 0; i < 14; ++i)
|
|
||||||
CloneShipFragment (ORZ_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
|
||||||
}
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
InitCommunication (ORZ_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
BOOLEAN OrzSurvivors;
|
|
||||||
|
|
||||||
OrzSurvivors = GetHeadLink (&GLOBAL (npc_built_ship_q))
|
|
||||||
&& (CurStarDescPtr->Index == ORZ_DEFINED
|
|
||||||
|| !GET_GAME_STATE (TAALO_UNPROTECTED));
|
|
||||||
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
|
|
||||||
if (OrzSurvivors)
|
|
||||||
break;
|
|
||||||
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
RepairSISBorder ();
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_GAME_STATE (TAALO_UNPROTECTED, 1);
|
|
||||||
if (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED)
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (TAALO_DEVICE_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (TAALO_DEVICE_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,242 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
ZapToUrquanEncounter (void)
|
|
||||||
{
|
|
||||||
HENCOUNTER hEncounter;
|
|
||||||
|
|
||||||
if ((hEncounter = AllocEncounter ()) || (hEncounter = GetHeadEncounter ()))
|
|
||||||
{
|
|
||||||
SIZE dx, dy;
|
|
||||||
ENCOUNTER *EncounterPtr;
|
|
||||||
HFLEETINFO hStarShip;
|
|
||||||
FLEET_INFO *TemplatePtr;
|
|
||||||
BRIEF_SHIP_INFO *BSIPtr;
|
|
||||||
|
|
||||||
LockEncounter (hEncounter, &EncounterPtr);
|
|
||||||
|
|
||||||
if (hEncounter == GetHeadEncounter ())
|
|
||||||
RemoveEncounter (hEncounter);
|
|
||||||
memset (EncounterPtr, 0, sizeof (*EncounterPtr));
|
|
||||||
|
|
||||||
InsertEncounter (hEncounter, GetHeadEncounter ());
|
|
||||||
|
|
||||||
hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), URQUAN_SHIP);
|
|
||||||
TemplatePtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip);
|
|
||||||
EncounterPtr->origin = TemplatePtr->loc;
|
|
||||||
EncounterPtr->radius = TemplatePtr->actual_strength;
|
|
||||||
EncounterPtr->SD.Type = URQUAN_SHIP;
|
|
||||||
EncounterPtr->SD.Index = MAKE_BYTE (1, 0) | ONE_SHOT_ENCOUNTER;
|
|
||||||
BSIPtr = &EncounterPtr->ShipList[0];
|
|
||||||
BSIPtr->race_id = URQUAN_SHIP;
|
|
||||||
BSIPtr->crew_level = TemplatePtr->crew_level;
|
|
||||||
BSIPtr->max_crew = TemplatePtr->max_crew;
|
|
||||||
BSIPtr->max_energy = TemplatePtr->max_energy;
|
|
||||||
EncounterPtr->SD.star_pt.x = 5288;
|
|
||||||
EncounterPtr->SD.star_pt.y = 4892;
|
|
||||||
EncounterPtr->log_x = UNIVERSE_TO_LOGX (EncounterPtr->SD.star_pt.x);
|
|
||||||
EncounterPtr->log_y = UNIVERSE_TO_LOGY (EncounterPtr->SD.star_pt.y);
|
|
||||||
GLOBAL_SIS (log_x) = EncounterPtr->log_x;
|
|
||||||
GLOBAL_SIS (log_y) = EncounterPtr->log_y;
|
|
||||||
UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip);
|
|
||||||
|
|
||||||
{
|
|
||||||
#define LOST_DAYS 15
|
|
||||||
BYTE black_buf[] = {FadeAllToBlack};
|
|
||||||
|
|
||||||
SleepThreadUntil (XFormColorMap ((COLORMAPPTR)black_buf, ONE_SECOND * 2));
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
MoveGameClockDays (LOST_DAYS);
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLOBAL (CurrentActivity) = MAKE_WORD (IN_HYPERSPACE, 0) | START_ENCOUNTER;
|
|
||||||
|
|
||||||
dx = CurStarDescPtr->star_pt.x - EncounterPtr->SD.star_pt.x;
|
|
||||||
dy = CurStarDescPtr->star_pt.y - EncounterPtr->SD.star_pt.y;
|
|
||||||
dx = (SIZE)square_root ((long)dx * dx + (long)dy * dy)
|
|
||||||
+ (FUEL_TANK_SCALE >> 1);
|
|
||||||
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
DeltaSISGauges (0, -dx, 0);
|
|
||||||
if (GLOBAL_SIS (FuelOnBoard) < 5 * FUEL_TANK_SCALE)
|
|
||||||
{
|
|
||||||
dx = ((5 + ((COUNT)TFB_Random () % 5)) * FUEL_TANK_SCALE)
|
|
||||||
- (SIZE)GLOBAL_SIS (FuelOnBoard);
|
|
||||||
DeltaSISGauges (0, dx, 0);
|
|
||||||
}
|
|
||||||
DrawSISMessage (NULL);
|
|
||||||
DrawHyperCoords (EncounterPtr->SD.star_pt);
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
|
|
||||||
UnlockEncounter (hEncounter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateTalkingPet (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = TELLURIC_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 204L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& (GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES)
|
|
||||||
|| !GET_GAME_STATE (TALKING_PET)
|
|
||||||
|| ActivateStarShip (UMGAH_SHIP, SPHERE_TRACKING)))
|
|
||||||
{
|
|
||||||
NotifyOthers (UMGAH_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
if (ActivateStarShip (UMGAH_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
if (!GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES))
|
|
||||||
{
|
|
||||||
CloneShipFragment (UMGAH_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
InitCommunication (UMGAH_CONVERSATION);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
|
|
||||||
for (i = 0; i < 10; ++i)
|
|
||||||
CloneShipFragment (UMGAH_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
InitCommunication (TALKING_PET_CONVERSATION);
|
|
||||||
}
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
BOOLEAN UmgahSurvivors;
|
|
||||||
|
|
||||||
UmgahSurvivors = GetHeadLink (
|
|
||||||
&GLOBAL (npc_built_ship_q)
|
|
||||||
) != 0;
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
|
|
||||||
if (GET_GAME_STATE (PLAYER_HYPNOTIZED))
|
|
||||||
ZapToUrquanEncounter ();
|
|
||||||
else if (GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES)
|
|
||||||
&& !UmgahSurvivors)
|
|
||||||
{
|
|
||||||
// Defeated the zombie fleet.
|
|
||||||
InitCommunication (TALKING_PET_CONVERSATION);
|
|
||||||
}
|
|
||||||
else if (!(ActivateStarShip (UMGAH_SHIP, SPHERE_TRACKING)))
|
|
||||||
{
|
|
||||||
// The Kohr-Ah have destroyed the Umgah, but the
|
|
||||||
// talking pet survived.
|
|
||||||
InitCommunication (TALKING_PET_CONVERSATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_ORBITAL);
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GeneratePkunk (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
if (!GET_GAME_STATE (CLEAR_SPINDLE))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
else
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
&= ~(1L << i);
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (CLEAR_SPINDLE))
|
|
||||||
{
|
|
||||||
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
|
||||||
|
|
||||||
SET_GAME_STATE (CLEAR_SPINDLE, 1);
|
|
||||||
SET_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 104L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (ActivateStarShip (PKUNK_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (PKUNK_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (PKUNK_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (PKUNK_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (PKUNK_RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
if (GET_GAME_STATE (CLEAR_SPINDLE))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetAbsStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateRainbow (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = RAINBOW_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 0;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 50L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
if (angle <= QUADRANT)
|
|
||||||
angle += QUADRANT;
|
|
||||||
else if (angle >= FULL_CIRCLE - QUADRANT)
|
|
||||||
angle -= QUADRANT;
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
BYTE which_rainbow;
|
|
||||||
UWORD rainbow_mask;
|
|
||||||
STAR_DESC *SDPtr;
|
|
||||||
|
|
||||||
rainbow_mask = MAKE_WORD (
|
|
||||||
GET_GAME_STATE (RAINBOW_WORLD0),
|
|
||||||
GET_GAME_STATE (RAINBOW_WORLD1)
|
|
||||||
);
|
|
||||||
|
|
||||||
which_rainbow = 0;
|
|
||||||
SDPtr = &star_array[0];
|
|
||||||
while (SDPtr != CurStarDescPtr)
|
|
||||||
{
|
|
||||||
if (SDPtr->Index == RAINBOW_DEFINED)
|
|
||||||
++which_rainbow;
|
|
||||||
++SDPtr;
|
|
||||||
}
|
|
||||||
rainbow_mask |= 1 << which_rainbow;
|
|
||||||
SET_GAME_STATE (RAINBOW_WORLD0, LOBYTE (rainbow_mask));
|
|
||||||
SET_GAME_STATE (RAINBOW_WORLD1, HIBYTE (rainbow_mask));
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,271 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../races.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../grpinfo.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
BuildUrquanGuard (void)
|
|
||||||
{
|
|
||||||
BYTE ship1, ship2;
|
|
||||||
BYTE b0, b1;
|
|
||||||
POINT org;
|
|
||||||
HIPGROUP hGroup, hNextGroup;
|
|
||||||
|
|
||||||
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (SAMATRA_GRPOFFS0);
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (KOHR_AH_FRENZY))
|
|
||||||
ship1 = URQUAN_SHIP, ship2 = BLACK_URQUAN_SHIP;
|
|
||||||
else
|
|
||||||
ship1 = BLACK_URQUAN_SHIP, ship2 = URQUAN_SHIP;
|
|
||||||
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
for (b0 = 0; b0 < MAX_SHIPS_PER_SIDE; ++b0)
|
|
||||||
CloneShipFragment (ship1,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
|
|
||||||
if (GLOBAL (BattleGroupRef) == 0)
|
|
||||||
{
|
|
||||||
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
|
||||||
SET_GAME_STATE_32 (SAMATRA_GRPOFFS0, GLOBAL (BattleGroupRef));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define NUM_URQUAN_GUARDS0 12
|
|
||||||
for (b0 = 1; b0 <= NUM_URQUAN_GUARDS0; ++b0)
|
|
||||||
PutGroupInfo (GLOBAL (BattleGroupRef), b0);
|
|
||||||
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
for (b0 = 0; b0 < MAX_SHIPS_PER_SIDE; ++b0)
|
|
||||||
CloneShipFragment (ship2,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
#define NUM_URQUAN_GUARDS1 4
|
|
||||||
for (b0 = 1; b0 <= NUM_URQUAN_GUARDS1; ++b0)
|
|
||||||
PutGroupInfo (GLOBAL (BattleGroupRef), (BYTE)(NUM_URQUAN_GUARDS0 + b0));
|
|
||||||
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
|
|
||||||
GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP);
|
|
||||||
|
|
||||||
XFormIPLoc (&pSolarSysState->PlanetDesc[4].image.origin,
|
|
||||||
&org, FALSE);
|
|
||||||
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
|
||||||
for (b0 = 0, b1 = 0;
|
|
||||||
b0 < NUM_URQUAN_GUARDS0;
|
|
||||||
++b0, b1 += FULL_CIRCLE / (NUM_URQUAN_GUARDS0 + NUM_URQUAN_GUARDS1))
|
|
||||||
{
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
if (b1 % (FULL_CIRCLE / NUM_URQUAN_GUARDS1) == 0)
|
|
||||||
b1 += FULL_CIRCLE / (NUM_URQUAN_GUARDS0 + NUM_URQUAN_GUARDS1);
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
hNextGroup = _GetSuccLink (GroupPtr);
|
|
||||||
GroupPtr->task = ON_STATION | IGNORE_FLAGSHIP;
|
|
||||||
GroupPtr->sys_loc = 0;
|
|
||||||
GroupPtr->dest_loc = 4 + 1;
|
|
||||||
GroupPtr->orbit_pos = NORMALIZE_FACING (ANGLE_TO_FACING (b1));
|
|
||||||
GroupPtr->group_counter = 0;
|
|
||||||
GroupPtr->loc.x = org.x + COSINE (b1, STATION_RADIUS);
|
|
||||||
GroupPtr->loc.y = org.y + SINE (b1, STATION_RADIUS);
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
hGroup = hNextGroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (b0 = 0, b1 = 0;
|
|
||||||
b0 < NUM_URQUAN_GUARDS1;
|
|
||||||
++b0, b1 += FULL_CIRCLE / NUM_URQUAN_GUARDS1)
|
|
||||||
{
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
hNextGroup = _GetSuccLink (GroupPtr);
|
|
||||||
GroupPtr->task = ON_STATION | IGNORE_FLAGSHIP;
|
|
||||||
GroupPtr->sys_loc = 0;
|
|
||||||
GroupPtr->dest_loc = 4 + 1;
|
|
||||||
GroupPtr->orbit_pos = NORMALIZE_FACING (ANGLE_TO_FACING (b1));
|
|
||||||
GroupPtr->group_counter = 0;
|
|
||||||
GroupPtr->loc.x = org.x + COSINE (b1, STATION_RADIUS);
|
|
||||||
GroupPtr->loc.y = org.y + SINE (b1, STATION_RADIUS);
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
hGroup = hNextGroup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateSamatra (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
if (!GET_GAME_STATE (URQUAN_MESSED_UP))
|
|
||||||
BuildUrquanGuard ();
|
|
||||||
else
|
|
||||||
{ // Exorcise Ur-Quan ghosts upon system reentry
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); // wipe out the group
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case REINIT_NPCS:
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
EncounterGroup = 0;
|
|
||||||
EncounterRace = -1; // Do not want guards to chase the player
|
|
||||||
{
|
|
||||||
BOOLEAN GuardEngaged;
|
|
||||||
HIPGROUP hGroup, hNextGroup;
|
|
||||||
|
|
||||||
GuardEngaged = FALSE;
|
|
||||||
for (hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
|
||||||
hGroup; hGroup = hNextGroup)
|
|
||||||
{
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
hNextGroup = _GetSuccLink (GroupPtr);
|
|
||||||
|
|
||||||
if (GET_GAME_STATE (URQUAN_MESSED_UP))
|
|
||||||
{
|
|
||||||
GroupPtr->task &= REFORM_GROUP;
|
|
||||||
GroupPtr->task |= FLEE | IGNORE_FLAGSHIP;
|
|
||||||
GroupPtr->dest_loc = 0;
|
|
||||||
}
|
|
||||||
else if (GroupPtr->task & REFORM_GROUP)
|
|
||||||
{
|
|
||||||
// REFORM_GROUP was set in ipdisp.c:ip_group_collision
|
|
||||||
// during a collision with the flagship.
|
|
||||||
GroupPtr->task &= ~REFORM_GROUP;
|
|
||||||
GroupPtr->group_counter = 0;
|
|
||||||
|
|
||||||
GuardEngaged = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GuardEngaged)
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
POINT org;
|
|
||||||
|
|
||||||
XFormIPLoc (
|
|
||||||
&pSolarSysState->PlanetDesc[4].image.origin,
|
|
||||||
&org, FALSE);
|
|
||||||
angle = ARCTAN (GLOBAL (ip_location.x) - org.x,
|
|
||||||
GLOBAL (ip_location.y) - org.y);
|
|
||||||
GLOBAL (ip_location.x) = org.x + COSINE (angle, 3000);
|
|
||||||
GLOBAL (ip_location.y) = org.y + SINE (angle, 3000);
|
|
||||||
XFormIPLoc (&GLOBAL (ip_location),
|
|
||||||
&GLOBAL (ShipStamp.origin), TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GENERATE_MOONS:
|
|
||||||
GenerateRandomIP (GENERATE_MOONS);
|
|
||||||
if (pSolarSysState->pBaseDesc == &pSolarSysState->PlanetDesc[4])
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
DWORD rand_val;
|
|
||||||
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = SA_MATRA;
|
|
||||||
pSolarSysState->MoonDesc[0].radius = MIN_MOON_RADIUS
|
|
||||||
+ (2 * MOON_DELTA);
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
|
||||||
pSolarSysState->MoonDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
pSolarSysState->MoonDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[4].NumPlanets = 1;
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
/* Samatra */
|
|
||||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[4]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0])
|
|
||||||
{
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (URQUAN_MESSED_UP))
|
|
||||||
CloneShipFragment (!GET_GAME_STATE (KOHR_AH_FRENZY) ?
|
|
||||||
URQUAN_SHIP : BLACK_URQUAN_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#define URQUAN_REMNANTS 3
|
|
||||||
BYTE i;
|
|
||||||
|
|
||||||
for (i = 0; i < URQUAN_REMNANTS; ++i)
|
|
||||||
{
|
|
||||||
CloneShipFragment (URQUAN_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
CloneShipFragment (BLACK_URQUAN_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
SET_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 1);
|
|
||||||
InitCommunication (URQUAN_CONVERSATION);
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
BOOLEAN UrquanSurvivors;
|
|
||||||
|
|
||||||
UrquanSurvivors = GetHeadLink (
|
|
||||||
&GLOBAL (npc_built_ship_q)
|
|
||||||
) != 0;
|
|
||||||
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
if (UrquanSurvivors)
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EncounterGroup = 0;
|
|
||||||
EncounterRace = -1;
|
|
||||||
GLOBAL (CurrentActivity) = IN_LAST_BATTLE | START_ENCOUNTER;
|
|
||||||
if (GET_GAME_STATE (YEHAT_CIVIL_WAR)
|
|
||||||
&& ActivateStarShip (YEHAT_SHIP, SPHERE_TRACKING)
|
|
||||||
&& ActivateStarShip (YEHAT_REBEL_SHIP, FEASIBILITY_STUDY))
|
|
||||||
InitCommunication (YEHAT_REBEL_CONVERSATION);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../grpinfo.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_old_shofixti (void)
|
|
||||||
{
|
|
||||||
HIPGROUP hGroup;
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
if (!GLOBAL (BattleGroupRef))
|
|
||||||
return; // nothing to check
|
|
||||||
|
|
||||||
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
|
||||||
if (!hGroup)
|
|
||||||
return; // still nothing to check
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
// REFORM_GROUP was set in ipdisp.c:ip_group_collision()
|
|
||||||
// during a collision with the flagship.
|
|
||||||
if (GroupPtr->race_id == SHOFIXTI_SHIP
|
|
||||||
&& (GroupPtr->task & REFORM_GROUP)
|
|
||||||
&& GET_GAME_STATE (SHOFIXTI_RECRUITED))
|
|
||||||
{
|
|
||||||
GroupPtr->task = FLEE | IGNORE_FLAGSHIP | REFORM_GROUP;
|
|
||||||
GroupPtr->dest_loc = 0;
|
|
||||||
}
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateShofixti (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
if (!GET_GAME_STATE (SHOFIXTI_RECRUITED)
|
|
||||||
&& (!GET_GAME_STATE (SHOFIXTI_KIA)
|
|
||||||
|| (!GET_GAME_STATE (SHOFIXTI_BRO_KIA)
|
|
||||||
&& GET_GAME_STATE (MAIDENS_ON_SHIP))))
|
|
||||||
{
|
|
||||||
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (SHOFIXTI_GRPOFFS0);
|
|
||||||
if (GLOBAL (BattleGroupRef) == 0
|
|
||||||
|| !GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP))
|
|
||||||
{
|
|
||||||
HSHIPFRAG hStarShip;
|
|
||||||
|
|
||||||
if (GLOBAL (BattleGroupRef) == 0)
|
|
||||||
GLOBAL (BattleGroupRef) = ~0L;
|
|
||||||
|
|
||||||
hStarShip = CloneShipFragment (SHOFIXTI_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 1);
|
|
||||||
if (hStarShip)
|
|
||||||
{ /* Set old Shofixti name; his brother if Tanaka died */
|
|
||||||
SHIP_FRAGMENT *FragPtr = LockShipFrag (
|
|
||||||
&GLOBAL (npc_built_ship_q), hStarShip);
|
|
||||||
/* Name Tanaka or Katana (+1) */
|
|
||||||
FragPtr->captains_name_index = NAME_OFFSET +
|
|
||||||
NUM_CAPTAINS_NAMES +
|
|
||||||
(GET_GAME_STATE (SHOFIXTI_KIA) & 1);
|
|
||||||
UnlockShipFrag (&GLOBAL (npc_built_ship_q), hStarShip);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLOBAL (BattleGroupRef) = PutGroupInfo (
|
|
||||||
GLOBAL (BattleGroupRef), 1);
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
SET_GAME_STATE_32 (SHOFIXTI_GRPOFFS0,
|
|
||||||
GLOBAL (BattleGroupRef));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case REINIT_NPCS:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
check_old_shofixti ();
|
|
||||||
break;
|
|
||||||
case UNINIT_NPCS:
|
|
||||||
if (GLOBAL (BattleGroupRef)
|
|
||||||
&& !GET_GAME_STATE (SHOFIXTI_RECRUITED)
|
|
||||||
&& GetHeadLink (&GLOBAL (ip_group_q)) == 0)
|
|
||||||
{
|
|
||||||
if (!GET_GAME_STATE (SHOFIXTI_KIA))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (SHOFIXTI_KIA, 1);
|
|
||||||
SET_GAME_STATE (SHOFIXTI_VISITS, 0);
|
|
||||||
}
|
|
||||||
else if (GET_GAME_STATE (MAIDENS_ON_SHIP))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (SHOFIXTI_BRO_KIA, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GenerateRandomIP (UNINIT_NPCS);
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
PLANET_DESC *pCurDesc;
|
|
||||||
|
|
||||||
#define NUM_PLANETS 6
|
|
||||||
pSolarSysState->SunDesc[0].NumPlanets = NUM_PLANETS;
|
|
||||||
for (i = 0, pCurDesc = pSolarSysState->PlanetDesc;
|
|
||||||
i < NUM_PLANETS; ++i, ++pCurDesc)
|
|
||||||
{
|
|
||||||
pCurDesc->NumPlanets = 0;
|
|
||||||
if (i < (NUM_PLANETS >> 1))
|
|
||||||
pCurDesc->data_index = SELENIC_WORLD;
|
|
||||||
else
|
|
||||||
pCurDesc->data_index = METAL_WORLD;
|
|
||||||
}
|
|
||||||
|
|
||||||
FillOrbits (pSolarSysState,
|
|
||||||
NUM_PLANETS, &pSolarSysState->PlanetDesc[0], TRUE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateSlylandro (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[3].data_index = RED_GAS_GIANT;
|
|
||||||
pSolarSysState->PlanetDesc[3].NumPlanets = 1;
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[3])
|
|
||||||
{
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
InitCommunication (SLYLANDRO_HOME_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,612 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "lifeform.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../gamestr.h"
|
|
||||||
#include "../races.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../grpinfo.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
init_probe (void)
|
|
||||||
{
|
|
||||||
HIPGROUP hGroup;
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (PROBE_MESSAGE_DELIVERED)
|
|
||||||
&& GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP)
|
|
||||||
&& (hGroup = GetHeadLink (&GLOBAL (ip_group_q))))
|
|
||||||
{
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
GroupPtr->task = IN_ORBIT;
|
|
||||||
GroupPtr->sys_loc = 2 + 1; /* orbitting earth */
|
|
||||||
GroupPtr->dest_loc = 2 + 1; /* orbitting earth */
|
|
||||||
GroupPtr->loc.x = 0;
|
|
||||||
GroupPtr->loc.y = 0;
|
|
||||||
GroupPtr->group_counter = 0;
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_probe (void)
|
|
||||||
{
|
|
||||||
HIPGROUP hGroup;
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
if (!GLOBAL (BattleGroupRef))
|
|
||||||
return; // nothing to check
|
|
||||||
|
|
||||||
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
|
||||||
if (!hGroup)
|
|
||||||
return; // still nothing to check
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
// REFORM_GROUP was set in ipdisp.c:ip_group_collision()
|
|
||||||
// during a collision with the flagship.
|
|
||||||
if (GroupPtr->race_id == URQUAN_DRONE_SHIP
|
|
||||||
&& (GroupPtr->task & REFORM_GROUP))
|
|
||||||
{
|
|
||||||
// We just want the probe to take off as fast as possible,
|
|
||||||
// so clear out REFORM_GROUP
|
|
||||||
GroupPtr->task = FLEE | IGNORE_FLAGSHIP;
|
|
||||||
GroupPtr->dest_loc = 0;
|
|
||||||
}
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
generate_energy_nodes (void)
|
|
||||||
{
|
|
||||||
/* Pluto */
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[8])
|
|
||||||
{
|
|
||||||
if (!GET_GAME_STATE (FOUND_PLUTO_SPATHI))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x = 20;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT - 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 2;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (FOUND_PLUTO_SPATHI, 1);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
&= ~(1L << 0);
|
|
||||||
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
|
||||||
}
|
|
||||||
else if (pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Earth Moon */
|
|
||||||
else if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[2]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[1]
|
|
||||||
&& !GET_GAME_STATE (MOONBASE_DESTROYED))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH * 3 / 4;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 1 / 4;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (MOONBASE_DESTROYED, 1);
|
|
||||||
SET_GAME_STATE (MOONBASE_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
generate_tractors (void)
|
|
||||||
{
|
|
||||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc != &pSolarSysState->PlanetDesc[2]
|
|
||||||
|| pSolarSysState->pOrbitalDesc != &pSolarSysState->MoonDesc[1])
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
else /* Earth Moon */
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD old_rand, rand_val;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = NUM_CREATURE_TYPES + 1;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 10);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
generate_orbital (void)
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
DWORD rand_val;
|
|
||||||
|
|
||||||
/* Starbase */
|
|
||||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[2]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0])
|
|
||||||
{
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
EncounterGroup = 0;
|
|
||||||
GLOBAL (CurrentActivity) |= START_ENCOUNTER;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, (BYTE)~0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rand_val = DoPlanetaryAnalysis (&pSolarSysState->SysInfo,
|
|
||||||
pSolarSysState->pOrbitalDesc);
|
|
||||||
if (rand_val)
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] =
|
|
||||||
rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
rand_val = GenerateMineralDeposits (&pSolarSysState->SysInfo, &i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->SunDesc[0])
|
|
||||||
{
|
|
||||||
i = pSolarSysState->pOrbitalDesc - pSolarSysState->PlanetDesc;
|
|
||||||
switch (i)
|
|
||||||
{
|
|
||||||
case 0: /* MERCURY */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 98;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 38;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 3;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 2;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 59 * 240;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 165;
|
|
||||||
break;
|
|
||||||
case 1: /* VENUS */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = 90 *
|
|
||||||
EARTH_ATMOSPHERE;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 95;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 95;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 177;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 7;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 243 * 240;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 457;
|
|
||||||
break;
|
|
||||||
case 2: /* EARTH */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
EARTH_ATMOSPHERE;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 100;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 100;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 23;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 240;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 22;
|
|
||||||
break;
|
|
||||||
case 3: /* MARS */
|
|
||||||
// XXX: Mars atmo should actually be 1/2 in current units
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 72;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 53;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 24;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 246;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -53;
|
|
||||||
break;
|
|
||||||
case 4: /* JUPITER */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
GAS_GIANT_ATMOSPHERE;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 24;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 1120;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 3;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 7;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 98;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -143;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist =
|
|
||||||
EARTH_RADIUS * 520L / 100;
|
|
||||||
break;
|
|
||||||
case 5: /* SATURN */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
GAS_GIANT_ATMOSPHERE;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 13;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 945;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 27;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 7;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 102;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -197;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist =
|
|
||||||
EARTH_RADIUS * 952L / 100;
|
|
||||||
break;
|
|
||||||
case 6: /* URANUS */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
GAS_GIANT_ATMOSPHERE;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 21;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 411;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 98;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 7;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 172;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -217;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist =
|
|
||||||
EARTH_RADIUS * 1916L / 100;
|
|
||||||
break;
|
|
||||||
case 7: /* NEPTUNE */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
GAS_GIANT_ATMOSPHERE;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 28;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 396;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 30;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 7;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 182;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -229;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist =
|
|
||||||
EARTH_RADIUS * 2999L / 100;
|
|
||||||
break;
|
|
||||||
case 8: /* PLUTO */
|
|
||||||
if (!GET_GAME_STATE (FOUND_PLUTO_SPATHI))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (SPAPLUTO_MASK_PMAP_ANIM));
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (SPAPLUTO_STRTAB));
|
|
||||||
}
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 33;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 18;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 119;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 1533;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -235;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist =
|
|
||||||
EARTH_RADIUS * 3937L / 100;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity =
|
|
||||||
CalcGravity (pSolarSysState->SysInfo.PlanetInfo.PlanetDensity,
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius);
|
|
||||||
LoadPlanet (i == 2 ? CaptureDrawable (LoadGraphic (EARTH_MASK_ANIM))
|
|
||||||
: NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i = pSolarSysState->pOrbitalDesc->pPrevDesc
|
|
||||||
- pSolarSysState->PlanetDesc;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
switch (i)
|
|
||||||
{
|
|
||||||
case 2: /* moons of EARTH */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] =
|
|
||||||
rand_val;
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (MOONBASE_DESTROYED))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (MOONBASE_MASK_PMAP_ANIM));
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (MOONBASE_STRTAB));
|
|
||||||
}
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 60;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 25;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AxialTilt = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 240 * 29;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -18;
|
|
||||||
break;
|
|
||||||
case 4: /* moons of JUPITER */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist =
|
|
||||||
EARTH_RADIUS * 520L / 100;
|
|
||||||
switch (pSolarSysState->pOrbitalDesc - pSolarSysState->MoonDesc)
|
|
||||||
{
|
|
||||||
case 0: /* Io */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 69;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 25;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 3;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 390;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -163;
|
|
||||||
break;
|
|
||||||
case 1: /* Europa */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 54;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 25;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 840;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -161;
|
|
||||||
break;
|
|
||||||
case 2: /* Ganymede */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 35;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 41;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 1728;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -164;
|
|
||||||
break;
|
|
||||||
case 3: /* Callisto */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 35;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 38;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 4008;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -167;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5: /* moon of SATURN: Titan */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist = EARTH_RADIUS * 952L / 100;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = 160;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 2;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 34;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 40;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 3816;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -178;
|
|
||||||
break;
|
|
||||||
case 7: /* moon of NEPTUNE: Triton */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetToSunDist = EARTH_RADIUS * 2999L / 100;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = 10;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetDensity = 95;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 27;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.RotationPeriod = 4300;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = -216;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity =
|
|
||||||
CalcGravity (pSolarSysState->SysInfo.PlanetInfo.PlanetDensity,
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius);
|
|
||||||
LoadPlanet (NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateSOL (BYTE control)
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
DWORD rand_val;
|
|
||||||
PLANET_DESC *pCurDesc;
|
|
||||||
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
GLOBAL (BattleGroupRef) =
|
|
||||||
GET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0);
|
|
||||||
if (GLOBAL (BattleGroupRef) == 0)
|
|
||||||
{
|
|
||||||
CloneShipFragment (URQUAN_DRONE_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
SET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0,
|
|
||||||
GLOBAL (BattleGroupRef));
|
|
||||||
}
|
|
||||||
if (!init_probe ())
|
|
||||||
GenerateRandomIP (INIT_NPCS);
|
|
||||||
break;
|
|
||||||
case REINIT_NPCS:
|
|
||||||
if (GET_GAME_STATE (CHMMR_BOMB_STATE) != 3)
|
|
||||||
{
|
|
||||||
GenerateRandomIP (REINIT_NPCS);
|
|
||||||
check_probe ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GLOBAL (BattleGroupRef) = 0;
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
generate_energy_nodes ();
|
|
||||||
break;
|
|
||||||
case GENERATE_LIFE:
|
|
||||||
generate_tractors ();
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
generate_orbital ();
|
|
||||||
break;
|
|
||||||
case GENERATE_NAME:
|
|
||||||
i = pSolarSysState->pBaseDesc - pSolarSysState->PlanetDesc;
|
|
||||||
utf8StringCopy (GLOBAL_SIS (PlanetName),
|
|
||||||
sizeof (GLOBAL_SIS (PlanetName)),
|
|
||||||
GAME_STRING (PLANET_NUMBER_BASE + i));
|
|
||||||
SET_GAME_STATE (BATTLE_PLANET,
|
|
||||||
pSolarSysState->PlanetDesc[i].data_index);
|
|
||||||
break;
|
|
||||||
case GENERATE_MOONS:
|
|
||||||
{
|
|
||||||
GenerateRandomIP (GENERATE_MOONS);
|
|
||||||
|
|
||||||
i = pSolarSysState->pBaseDesc - pSolarSysState->PlanetDesc;
|
|
||||||
switch (i)
|
|
||||||
{
|
|
||||||
case 2: /* moons of EARTH */
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
/* Starbase: */
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = HIERARCHY_STARBASE;
|
|
||||||
pSolarSysState->MoonDesc[0].radius = MIN_MOON_RADIUS;
|
|
||||||
angle = HALF_CIRCLE + QUADRANT;
|
|
||||||
pSolarSysState->MoonDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
pSolarSysState->MoonDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
|
|
||||||
/* Luna: */
|
|
||||||
pSolarSysState->MoonDesc[1].data_index = SELENIC_WORLD;
|
|
||||||
pSolarSysState->MoonDesc[1].radius = MIN_MOON_RADIUS
|
|
||||||
+ (MAX_MOONS - 1) * MOON_DELTA;
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
angle = NORMALIZE_ANGLE (LOWORD (rand_val));
|
|
||||||
pSolarSysState->MoonDesc[1].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->MoonDesc[1].radius);
|
|
||||||
pSolarSysState->MoonDesc[1].location.y =
|
|
||||||
SINE (angle, pSolarSysState->MoonDesc[1].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4: /* moons of JUPITER */
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = RADIOACTIVE_WORLD;
|
|
||||||
/* Io */
|
|
||||||
pSolarSysState->MoonDesc[1].data_index = HALIDE_WORLD;
|
|
||||||
/* Europa */
|
|
||||||
pSolarSysState->MoonDesc[2].data_index = CYANIC_WORLD;
|
|
||||||
/* Ganymede */
|
|
||||||
pSolarSysState->MoonDesc[3].data_index = PELLUCID_WORLD;
|
|
||||||
/* Callisto */
|
|
||||||
break;
|
|
||||||
case 5: /* moons of SATURN */
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = ALKALI_WORLD;
|
|
||||||
/* Titan */
|
|
||||||
break;
|
|
||||||
case 7: /* moons of NEPTUNE */
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = VINYLOGOUS_WORLD;
|
|
||||||
/* Triton */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
#define SOL_SEED 334241042L
|
|
||||||
TFB_SeedRandom (SOL_SEED);
|
|
||||||
|
|
||||||
pSolarSysState->SunDesc[0].NumPlanets = 9;
|
|
||||||
for (i = 0, pCurDesc = pSolarSysState->PlanetDesc; i < 9; ++i, ++pCurDesc)
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
UWORD word_val;
|
|
||||||
|
|
||||||
pCurDesc->rand_seed = rand_val = TFB_Random ();
|
|
||||||
word_val = LOWORD (rand_val);
|
|
||||||
angle = NORMALIZE_ANGLE ((COUNT)HIBYTE (word_val));
|
|
||||||
|
|
||||||
switch (i)
|
|
||||||
{
|
|
||||||
case 0: /* MERCURY */
|
|
||||||
pCurDesc->data_index = METAL_WORLD;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 39L / 100;
|
|
||||||
pCurDesc->NumPlanets = 0;
|
|
||||||
break;
|
|
||||||
case 1: /* VENUS */
|
|
||||||
pCurDesc->data_index = PRIMORDIAL_WORLD;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 72L / 100;
|
|
||||||
pCurDesc->NumPlanets = 0;
|
|
||||||
angle = NORMALIZE_ANGLE (FULL_CIRCLE - angle);
|
|
||||||
break;
|
|
||||||
case 2: /* EARTH */
|
|
||||||
pCurDesc->data_index = WATER_WORLD | PLANET_SHIELDED;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS;
|
|
||||||
pCurDesc->NumPlanets = 2;
|
|
||||||
break;
|
|
||||||
case 3: /* MARS */
|
|
||||||
pCurDesc->data_index = DUST_WORLD;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 152L / 100;
|
|
||||||
pCurDesc->NumPlanets = 0;
|
|
||||||
break;
|
|
||||||
case 4: /* JUPITER */
|
|
||||||
pCurDesc->data_index = RED_GAS_GIANT;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 500L /* 520L */ / 100;
|
|
||||||
pCurDesc->NumPlanets = 4;
|
|
||||||
break;
|
|
||||||
case 5: /* SATURN */
|
|
||||||
pCurDesc->data_index = ORA_GAS_GIANT;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 750L /* 952L */ / 100;
|
|
||||||
pCurDesc->NumPlanets = 1;
|
|
||||||
break;
|
|
||||||
case 6: /* URANUS */
|
|
||||||
pCurDesc->data_index = GRN_GAS_GIANT;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 1000L /* 1916L */ / 100;
|
|
||||||
pCurDesc->NumPlanets = 0;
|
|
||||||
break;
|
|
||||||
case 7: /* NEPTUNE */
|
|
||||||
pCurDesc->data_index = BLU_GAS_GIANT;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 1250L /* 2999L */ / 100;
|
|
||||||
pCurDesc->NumPlanets = 1;
|
|
||||||
break;
|
|
||||||
case 8: /* PLUTO */
|
|
||||||
pCurDesc->data_index = PELLUCID_WORLD;
|
|
||||||
pCurDesc->radius = EARTH_RADIUS * 1550L /* 3937L */ / 100;
|
|
||||||
pCurDesc->NumPlanets = 0;
|
|
||||||
angle = FULL_CIRCLE - OCTANT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pCurDesc->location.x =
|
|
||||||
COSINE (angle, pCurDesc->radius);
|
|
||||||
pCurDesc->location.y =
|
|
||||||
SINE (angle, pCurDesc->radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,243 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lifeform.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateSpathi (BYTE control)
|
|
||||||
{
|
|
||||||
COUNT i, angle;
|
|
||||||
DWORD rand_val;
|
|
||||||
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0]
|
|
||||||
&& !GET_GAME_STATE (UMGAH_BROADCASTERS))
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (UMGAH_BROADCASTERS, 1);
|
|
||||||
SET_GAME_STATE (UMGAH_BROADCASTERS_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_MOONS:
|
|
||||||
GenerateRandomIP (GENERATE_MOONS);
|
|
||||||
if (pSolarSysState->pBaseDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
#ifdef NOTYET
|
|
||||||
utf8StringCopy (GLOBAL_SIS (PlanetName),
|
|
||||||
sizeof (GLOBAL_SIS (PlanetName)),
|
|
||||||
"Spathiwa");
|
|
||||||
#endif /* NOTYET */
|
|
||||||
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = PELLUCID_WORLD;
|
|
||||||
pSolarSysState->MoonDesc[0].radius = MIN_MOON_RADIUS + MOON_DELTA;
|
|
||||||
angle = NORMALIZE_ANGLE (LOWORD (TFB_Random ()));
|
|
||||||
pSolarSysState->MoonDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
pSolarSysState->MoonDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
PLANET_DESC *pMinPlanet;
|
|
||||||
|
|
||||||
pMinPlanet = &pSolarSysState->PlanetDesc[0];
|
|
||||||
pSolarSysState->SunDesc[0].NumPlanets = 1;
|
|
||||||
FillOrbits (pSolarSysState,
|
|
||||||
pSolarSysState->SunDesc[0].NumPlanets, pMinPlanet, FALSE);
|
|
||||||
|
|
||||||
pMinPlanet->radius = EARTH_RADIUS * 1150L / 100;
|
|
||||||
angle = ARCTAN (pMinPlanet->location.x, pMinPlanet->location.y);
|
|
||||||
pMinPlanet->location.x =
|
|
||||||
COSINE (angle, pMinPlanet->radius);
|
|
||||||
pMinPlanet->location.y =
|
|
||||||
SINE (angle, pMinPlanet->radius);
|
|
||||||
pMinPlanet->data_index = WATER_WORLD;
|
|
||||||
if (GET_GAME_STATE (SPATHI_SHIELDED_SELVES))
|
|
||||||
pMinPlanet->data_index |= PLANET_SHIELDED;
|
|
||||||
pMinPlanet->NumPlanets = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_LIFE:
|
|
||||||
/* visiting Spathiwa */
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& !GET_GAME_STATE (SPATHI_SHIELDED_SELVES))
|
|
||||||
{
|
|
||||||
COUNT which_node;
|
|
||||||
DWORD old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = NUM_CREATURE_TYPES;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 32);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN])
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (SPATHI_CREATURES_EXAMINED, 1);
|
|
||||||
if (pSolarSysState->SysInfo.
|
|
||||||
PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] == 0xFFFFFFFF)
|
|
||||||
SET_GAME_STATE (SPATHI_CREATURES_ELIMINATED, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0])
|
|
||||||
{
|
|
||||||
if (!GET_GAME_STATE (SPATHI_SHIELDED_SELVES)
|
|
||||||
&& ActivateStarShip (SPATHI_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (SPATHI_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (SPATHI_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
InitCommunication (SPATHI_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
rand_val = DoPlanetaryAnalysis (
|
|
||||||
&pSolarSysState->SysInfo, pSolarSysState->pOrbitalDesc
|
|
||||||
);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
rand_val = GenerateLifeForms (&pSolarSysState->SysInfo, &i);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
GenerateMineralDeposits (&pSolarSysState->SysInfo, &i);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN] = rand_val;
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 28;
|
|
||||||
if (!GET_GAME_STATE (UMGAH_BROADCASTERS))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (UMGAH_BCS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (UMGAH_BCS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
LoadPlanet (NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
/* visiting Spathiwa */
|
|
||||||
rand_val = DoPlanetaryAnalysis (
|
|
||||||
&pSolarSysState->SysInfo, pSolarSysState->pOrbitalDesc
|
|
||||||
);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
rand_val = GenerateMineralDeposits (&pSolarSysState->SysInfo, &i);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius = 120;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity =
|
|
||||||
CalcGravity (pSolarSysState->SysInfo.PlanetInfo.PlanetDensity,
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.PlanetRadius);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 31;
|
|
||||||
|
|
||||||
LoadPlanet (NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateSupox (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
if (!GET_GAME_STATE (ULTRON_CONDITION))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
else
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
&= ~(1L << i);
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (ULTRON_CONDITION))
|
|
||||||
{
|
|
||||||
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
|
||||||
|
|
||||||
SET_GAME_STATE (ULTRON_CONDITION, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 2;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 152L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (ActivateStarShip (SUPOX_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (SUPOX_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (SUPOX_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (SUPOX_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
if (!GET_GAME_STATE (ULTRON_CONDITION))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetAbsStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
GenerateTrap (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = TELLURIC_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 203L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
GenerateRandomIP (GENERATE_ORBITAL);
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity = EARTH_ATMOSPHERE * 2;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 35;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 3;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateSyreen (BYTE control)
|
|
||||||
{
|
|
||||||
if (CurStarDescPtr && CurStarDescPtr->Index == MYCON_TRAP_DEFINED)
|
|
||||||
{
|
|
||||||
GenerateTrap (control);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_MOONS:
|
|
||||||
GenerateRandomIP (GENERATE_MOONS);
|
|
||||||
if (pSolarSysState->pBaseDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
pSolarSysState->MoonDesc[0].data_index = HIERARCHY_STARBASE;
|
|
||||||
pSolarSysState->MoonDesc[0].radius = MIN_MOON_RADIUS;
|
|
||||||
pSolarSysState->MoonDesc[0].location.x =
|
|
||||||
COSINE (QUADRANT, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
pSolarSysState->MoonDesc[0].location.y =
|
|
||||||
SINE (QUADRANT, pSolarSysState->MoonDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index =
|
|
||||||
WATER_WORLD | PLANET_SHIELDED;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
GenerateRandomIP (GENERATE_ORBITAL);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceTemperature = 19;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.AtmoDensity =
|
|
||||||
EARTH_ATMOSPHERE * 9 / 10;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Starbase */
|
|
||||||
else if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0])
|
|
||||||
{
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
InitCommunication (SYREEN_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,213 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateThradd (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index != AQUA_HELIX_DEFINED)
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (!GET_GAME_STATE (AQUA_HELIX))
|
|
||||||
{
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (HELIX_VISITS, 0);
|
|
||||||
SET_GAME_STATE (AQUA_HELIX, 1);
|
|
||||||
SET_GAME_STATE (AQUA_HELIX_ON_SHIP, 1);
|
|
||||||
SET_GAME_STATE (HELIX_UNPROTECTED, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
if (CurStarDescPtr->Index == AQUA_HELIX_DEFINED)
|
|
||||||
{
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = PRIMORDIAL_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 65L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 0;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 98L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (ActivateStarShip (THRADDASH_SHIP, SPHERE_TRACKING)
|
|
||||||
&& (CurStarDescPtr->Index == THRADD_DEFINED
|
|
||||||
|| (!GET_GAME_STATE (HELIX_UNPROTECTED)
|
|
||||||
&& (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3)))
|
|
||||||
{
|
|
||||||
NotifyOthers (THRADDASH_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (THRADDASH_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
if (CurStarDescPtr->Index == THRADD_DEFINED)
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
|
||||||
}
|
|
||||||
InitCommunication (THRADD_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
|
||||||
break;
|
|
||||||
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == THRADD_DEFINED
|
|
||||||
|| (!GET_GAME_STATE (HELIX_UNPROTECTED)
|
|
||||||
&& (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3))
|
|
||||||
break;
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
RepairSISBorder ();
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == AQUA_HELIX_DEFINED
|
|
||||||
&& !GET_GAME_STATE (AQUA_HELIX))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (AQUA_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (AQUA_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if (CurStarDescPtr->Index == THRADD_DEFINED)
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,260 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateUtwig (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
if (CurStarDescPtr->Index == BOMB_DEFINED
|
|
||||||
&& !GET_GAME_STATE (UTWIG_BOMB))
|
|
||||||
{
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
GenerateRandomIP (INIT_NPCS);
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
if (CurStarDescPtr->Index == UTWIG_DEFINED)
|
|
||||||
{
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 174L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == UTWIG_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (CurStarDescPtr->Index == BOMB_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[5]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[1]
|
|
||||||
&& !GET_GAME_STATE (UTWIG_BOMB))
|
|
||||||
{
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (UTWIG_BOMB, 1);
|
|
||||||
SET_GAME_STATE (UTWIG_BOMB_ON_SHIP, 1);
|
|
||||||
SET_GAME_STATE (DRUUGE_MANNER, 1);
|
|
||||||
SET_GAME_STATE (DRUUGE_VISITS, 0);
|
|
||||||
SET_GAME_STATE (DRUUGE_HOME_VISITS, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if ((CurStarDescPtr->Index == UTWIG_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
|| (CurStarDescPtr->Index == BOMB_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[5]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[1]
|
|
||||||
&& !GET_GAME_STATE (UTWIG_BOMB)))
|
|
||||||
{
|
|
||||||
if ((CurStarDescPtr->Index == UTWIG_DEFINED
|
|
||||||
|| !GET_GAME_STATE (UTWIG_HAVE_ULTRON))
|
|
||||||
&& ActivateStarShip (UTWIG_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (UTWIG_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (UTWIG_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
if (CurStarDescPtr->Index == UTWIG_DEFINED)
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
|
||||||
}
|
|
||||||
InitCommunication (UTWIG_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (CurStarDescPtr->Index == BOMB_DEFINED
|
|
||||||
&& !GET_GAME_STATE (BOMB_UNPROTECTED)
|
|
||||||
&& ActivateStarShip (DRUUGE_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
for (i = 0; i < 5; ++i)
|
|
||||||
CloneShipFragment (DRUUGE_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
|
||||||
InitCommunication (DRUUGE_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
BOOLEAN DruugeSurvivors;
|
|
||||||
|
|
||||||
DruugeSurvivors = GetHeadLink (
|
|
||||||
&GLOBAL (npc_built_ship_q)
|
|
||||||
) != 0;
|
|
||||||
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
|
|
||||||
if (DruugeSurvivors)
|
|
||||||
break;
|
|
||||||
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
RepairSISBorder ();
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
SET_GAME_STATE (BOMB_UNPROTECTED, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == BOMB_DEFINED)
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (BOMB_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (BOMB_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GenerateRandomIP (GENERATE_ORBITAL);
|
|
||||||
if (CurStarDescPtr->Index == UTWIG_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateShipVault (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0])
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (!GET_GAME_STATE (SHIP_VAULT_UNLOCKED))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
else
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
&= ~(1L << 0);
|
|
||||||
if (GET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP))
|
|
||||||
{
|
|
||||||
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
|
||||||
|
|
||||||
SET_GAME_STATE (SHIP_VAULT_UNLOCKED, 1);
|
|
||||||
SET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 0);
|
|
||||||
SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
|
|
||||||
}
|
|
||||||
else if (!GET_GAME_STATE (KNOW_SYREEN_VAULT))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (KNOW_SYREEN_VAULT, 1);
|
|
||||||
SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->MoonDesc[0])
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (VAULT_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (VAULT_STRTAB)
|
|
||||||
);
|
|
||||||
if (GET_GAME_STATE (SHIP_VAULT_UNLOCKED))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetAbsStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
else if (GET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetAbsStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,333 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "lifeform.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../setup.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../sounds.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateVUX (BYTE control)
|
|
||||||
{
|
|
||||||
DWORD rand_val;
|
|
||||||
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& CurStarDescPtr->Index != VUX_BEAST_DEFINED)
|
|
||||||
{
|
|
||||||
if (CurStarDescPtr->Index == MAIDENS_DEFINED
|
|
||||||
&& !GET_GAME_STATE (SHOFIXTI_MAIDENS))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH / 3;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 5 / 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
&& pSolarSysState->CurNode == (COUNT)~0)
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (SHOFIXTI_MAIDENS, 1);
|
|
||||||
SET_GAME_STATE (MAIDENS_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (CurStarDescPtr->Index == VUX_DEFINED)
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == MAIDENS_DEFINED)
|
|
||||||
{
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = REDUX_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 212L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (CurStarDescPtr->Index == VUX_DEFINED)
|
|
||||||
{
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = REDUX_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 42L / 100;
|
|
||||||
angle = HALF_CIRCLE + OCTANT;
|
|
||||||
}
|
|
||||||
else /* if (CurStarDescPtr->Index == VUX_BEAST_DEFINED) */
|
|
||||||
{
|
|
||||||
memmove (&pSolarSysState->PlanetDesc[1],
|
|
||||||
&pSolarSysState->PlanetDesc[0],
|
|
||||||
sizeof (pSolarSysState->PlanetDesc[0])
|
|
||||||
* pSolarSysState->SunDesc[0].NumPlanets);
|
|
||||||
++pSolarSysState->SunDesc[0].NumPlanets;
|
|
||||||
|
|
||||||
angle = HALF_CIRCLE - OCTANT;
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 110L / 100;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 0;
|
|
||||||
}
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].rand_seed = MAKE_DWORD (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
{
|
|
||||||
if ((pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0]
|
|
||||||
&& (CurStarDescPtr->Index == VUX_DEFINED
|
|
||||||
|| (CurStarDescPtr->Index == MAIDENS_DEFINED
|
|
||||||
&& !GET_GAME_STATE (ZEX_IS_DEAD))))
|
|
||||||
&& ActivateStarShip (VUX_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (VUX_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (VUX_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
if (CurStarDescPtr->Index == VUX_DEFINED)
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
InitCommunication (VUX_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
|
|
||||||
if (CurStarDescPtr->Index == VUX_DEFINED
|
|
||||||
|| !GET_GAME_STATE (ZEX_IS_DEAD))
|
|
||||||
break;
|
|
||||||
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
RepairSISBorder ();
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (CurStarDescPtr->Index == MAIDENS_DEFINED)
|
|
||||||
{
|
|
||||||
if (!GET_GAME_STATE (SHOFIXTI_MAIDENS))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (MAIDENS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (MAIDENS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (CurStarDescPtr->Index == VUX_BEAST_DEFINED)
|
|
||||||
{
|
|
||||||
if (!GET_GAME_STATE (VUX_BEAST))
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] = 0;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (BEAST_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GenerateRandomIP (GENERATE_ORBITAL);
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Weather = 2;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.Tectonics = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_LIFE:
|
|
||||||
if (CurStarDescPtr->Index == MAIDENS_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
DWORD old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
if (i < 4)
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 9;
|
|
||||||
else if (i < 8)
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 14;
|
|
||||||
else /* if (i < 12) */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 18;
|
|
||||||
if (i >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
} while (++i < 12);
|
|
||||||
pSolarSysState->CurNode = i;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (CurStarDescPtr->Index == VUX_BEAST_DEFINED
|
|
||||||
&& pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
DWORD old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN]);
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
if (i == 0)
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = NUM_CREATURE_TYPES + 2;
|
|
||||||
else if (i <= 5)
|
|
||||||
/* {SPEED_MOTIONLESS | DANGER_NORMAL, MAKE_BYTE (5, 3)}, */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 3;
|
|
||||||
else /* if (i <= 10) */
|
|
||||||
/* {BEHAVIOR_UNPREDICTABLE | SPEED_SLOW | DANGER_NORMAL, MAKE_BYTE (3, 8)}, */
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 8;
|
|
||||||
if (i >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
else if (i == 0
|
|
||||||
&& (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN]
|
|
||||||
& (1L << i))
|
|
||||||
&& !GET_GAME_STATE (VUX_BEAST))
|
|
||||||
{
|
|
||||||
UnbatchGraphics ();
|
|
||||||
DoDiscoveryReport (MenuSounds);
|
|
||||||
BatchGraphics ();
|
|
||||||
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
|
||||||
|
|
||||||
SET_GAME_STATE (VUX_BEAST, 1);
|
|
||||||
SET_GAME_STATE (VUX_BEAST_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
} while (++i < 11);
|
|
||||||
pSolarSysState->CurNode = i;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "lander.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateUrquanWreck (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[6])
|
|
||||||
{
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (!GET_GAME_STATE (PORTAL_KEY))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 0;
|
|
||||||
else
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->CurNode = 1;
|
|
||||||
if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << 0))
|
|
||||||
{
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
&= ~(1L << 0);
|
|
||||||
|
|
||||||
if (!GET_GAME_STATE (PORTAL_KEY))
|
|
||||||
{
|
|
||||||
pLanderInputState->planetSideDesc->InTransit = TRUE;
|
|
||||||
|
|
||||||
SET_GAME_STATE (PORTAL_KEY, 1);
|
|
||||||
SET_GAME_STATE (PORTAL_KEY_ON_SHIP, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[6])
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (WRECK_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (WRECK_STRTAB)
|
|
||||||
);
|
|
||||||
if (GET_GAME_STATE (PORTAL_KEY))
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
SetAbsStringTableIndex (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../ipdisp.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateYehat (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 106L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (ActivateStarShip (YEHAT_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
NotifyOthers (YEHAT_SHIP, IPNL_ALL_CLEAR);
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
CloneShipFragment (YEHAT_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (YEHAT_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,215 +0,0 @@
|
|||||||
//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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "genall.h"
|
|
||||||
#include "../build.h"
|
|
||||||
#include "../encount.h"
|
|
||||||
#include "../state.h"
|
|
||||||
#include "../grpinfo.h"
|
|
||||||
#include "libs/mathlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_scout (void)
|
|
||||||
{
|
|
||||||
HIPGROUP hGroup;
|
|
||||||
IP_GROUP *GroupPtr;
|
|
||||||
|
|
||||||
if (!GLOBAL (BattleGroupRef))
|
|
||||||
return; // nothing to check
|
|
||||||
|
|
||||||
hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
|
||||||
if (!hGroup)
|
|
||||||
return; // still nothing to check
|
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
// REFORM_GROUP was set in ipdisp.c:ip_group_collision()
|
|
||||||
// during a collision with the flagship.
|
|
||||||
if (GroupPtr->race_id == ZOQFOTPIK_SHIP
|
|
||||||
&& (GroupPtr->task & REFORM_GROUP))
|
|
||||||
{
|
|
||||||
GroupPtr->task = FLEE | IGNORE_FLAGSHIP | REFORM_GROUP;
|
|
||||||
GroupPtr->dest_loc = 0;
|
|
||||||
}
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
GenerateScout (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
if (!GET_GAME_STATE (MET_ZOQFOT))
|
|
||||||
{
|
|
||||||
GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (ZOQFOT_GRPOFFS0);
|
|
||||||
if (GLOBAL (BattleGroupRef) == 0)
|
|
||||||
{
|
|
||||||
CloneShipFragment (ZOQFOTPIK_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
SET_GAME_STATE_32 (ZOQFOT_GRPOFFS0,
|
|
||||||
GLOBAL (BattleGroupRef));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GenerateRandomIP (INIT_NPCS);
|
|
||||||
break;
|
|
||||||
case REINIT_NPCS:
|
|
||||||
GenerateRandomIP (REINIT_NPCS);
|
|
||||||
check_scout ();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateZoqFotPik (BYTE control)
|
|
||||||
{
|
|
||||||
if (CurStarDescPtr && CurStarDescPtr->Index == ZOQ_SCOUT_DEFINED)
|
|
||||||
{
|
|
||||||
GenerateScout (control);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
if (GET_GAME_STATE (ZOQFOT_DISTRESS) != 1)
|
|
||||||
GenerateRandomIP (INIT_NPCS);
|
|
||||||
break;
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
COUNT i, which_node;
|
|
||||||
DWORD rand_val, old_rand;
|
|
||||||
|
|
||||||
old_rand = TFB_SeedRandom (
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]
|
|
||||||
);
|
|
||||||
|
|
||||||
which_node = i = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x =
|
|
||||||
(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.y =
|
|
||||||
(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurType = 1;
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;
|
|
||||||
if (which_node >= pSolarSysState->CurNode
|
|
||||||
&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]
|
|
||||||
& (1L << i)))
|
|
||||||
break;
|
|
||||||
++which_node;
|
|
||||||
} while (++i < 16);
|
|
||||||
pSolarSysState->CurNode = which_node;
|
|
||||||
|
|
||||||
TFB_SeedRandom (old_rand);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
COUNT angle;
|
|
||||||
|
|
||||||
GenerateRandomIP (GENERATE_PLANETS);
|
|
||||||
pSolarSysState->PlanetDesc[0].data_index = REDUX_WORLD;
|
|
||||||
pSolarSysState->PlanetDesc[0].NumPlanets = 1;
|
|
||||||
pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 138L / 100;
|
|
||||||
angle = ARCTAN (
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x,
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y
|
|
||||||
);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.x =
|
|
||||||
COSINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
pSolarSysState->PlanetDesc[0].location.y =
|
|
||||||
SINE (angle, pSolarSysState->PlanetDesc[0].radius);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])
|
|
||||||
{
|
|
||||||
if (ActivateStarShip (ZOQFOTPIK_SHIP, SPHERE_TRACKING))
|
|
||||||
{
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
|
|
||||||
|
|
||||||
if (GET_GAME_STATE (ZOQFOT_DISTRESS))
|
|
||||||
{
|
|
||||||
CloneShipFragment (BLACK_URQUAN_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), 0);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (BLACKURQ_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
|
|
||||||
if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (GetHeadLink (&GLOBAL (npc_built_ship_q)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CloneShipFragment (ZOQFOTPIK_SHIP,
|
|
||||||
&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
|
|
||||||
|
|
||||||
pSolarSysState->MenuState.Initialized += 2;
|
|
||||||
GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
|
|
||||||
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
|
|
||||||
InitCommunication (ZOQFOTPIK_CONVERSATION);
|
|
||||||
pSolarSysState->MenuState.Initialized -= 2;
|
|
||||||
if (!(GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)))
|
|
||||||
{
|
|
||||||
GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LoadStdLanderFont (&pSolarSysState->SysInfo.PlanetInfo);
|
|
||||||
pSolarSysState->PlanetSideFrame[1] =
|
|
||||||
CaptureDrawable (
|
|
||||||
LoadGraphic (RUINS_MASK_PMAP_ANIM)
|
|
||||||
);
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =
|
|
||||||
CaptureStringTable (
|
|
||||||
LoadStringTable (RUINS_STRTAB)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
GenerateRandomIP (control);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -832,7 +832,9 @@ CheckObjectCollision (COUNT index)
|
|||||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] |=
|
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] |=
|
||||||
(1L << which_node);
|
(1L << which_node);
|
||||||
pSolarSysState->CurNode = (COUNT)~0;
|
pSolarSysState->CurNode = (COUNT)~0;
|
||||||
(*pSolarSysState->GenFunc) ((BYTE)(scan + GENERATE_MINERAL));
|
callGenerateForScanType (pSolarSysState,
|
||||||
|
pSolarSysState->pOrbitalDesc,
|
||||||
|
&pSolarSysState->CurNode, scan);
|
||||||
|
|
||||||
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] &
|
if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] &
|
||||||
(1L << which_node)))
|
(1L << which_node)))
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialise the surface graphics, and start the planet music.
|
// Initialise the surface graphics, and start the planet music.
|
||||||
// Called from the GENERATE_ORBITAL case of an IP generation function
|
// Called from the GenerateFunctions.generateOribital() function
|
||||||
// (when orbit is entered; either from IP, or from loading a saved game)
|
// (when orbit is entered; either from IP, or from loading a saved game)
|
||||||
// and when "starmap" is selected from orbit and then cancelled;
|
// and when "starmap" is selected from orbit and then cancelled;
|
||||||
// also after in-orbit comm and after defeating planet guards in combat.
|
// also after in-orbit comm and after defeating planet guards in combat.
|
||||||
@@ -148,8 +148,8 @@ LoadPlanet (FRAME SurfDefFrame)
|
|||||||
if (pSolarSysState->MenuState.flash_task == 0)
|
if (pSolarSysState->MenuState.flash_task == 0)
|
||||||
{
|
{
|
||||||
// The "rotate planets" task is not initialised yet.
|
// The "rotate planets" task is not initialised yet.
|
||||||
// This means the call to LoadPlanet is made from a
|
// This means the call to LoadPlanet is made from some
|
||||||
// GENERATE_ORBITAL case of an IP generation function.
|
// GenerateFunctions.generateOribital() function.
|
||||||
PLANET_DESC *pPlanetDesc;
|
PLANET_DESC *pPlanetDesc;
|
||||||
|
|
||||||
StopMusic ();
|
StopMusic ();
|
||||||
|
|||||||
@@ -19,9 +19,6 @@
|
|||||||
#ifndef _PLANETS_H
|
#ifndef _PLANETS_H
|
||||||
#define _PLANETS_H
|
#define _PLANETS_H
|
||||||
|
|
||||||
#include "../menustat.h"
|
|
||||||
#include "../units.h"
|
|
||||||
|
|
||||||
#define END_INTERPLANETARY START_INTERPLANETARY
|
#define END_INTERPLANETARY START_INTERPLANETARY
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -50,33 +47,6 @@ enum
|
|||||||
#define MAP_WIDTH SIS_SCREEN_WIDTH
|
#define MAP_WIDTH SIS_SCREEN_WIDTH
|
||||||
#define MAP_HEIGHT (75 - SAFE_Y)
|
#define MAP_HEIGHT (75 - SAFE_Y)
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
GENERATE_PLANETS = 0,
|
|
||||||
// Layout of planets within a solar system.
|
|
||||||
GENERATE_MOONS,
|
|
||||||
// Layout of moons around a planet.
|
|
||||||
GENERATE_ORBITAL,
|
|
||||||
// Characteristics of words (planets and moons).
|
|
||||||
|
|
||||||
INIT_NPCS,
|
|
||||||
// Ships in the solar system, the first time it is accessed.
|
|
||||||
REINIT_NPCS,
|
|
||||||
// Ships in the solar system, every next time it is accessed.
|
|
||||||
UNINIT_NPCS,
|
|
||||||
// When leaving the solar system.
|
|
||||||
|
|
||||||
GENERATE_MINERAL,
|
|
||||||
// Minerals on the planet surface.
|
|
||||||
GENERATE_ENERGY,
|
|
||||||
// Energy sources on the planet surface.
|
|
||||||
GENERATE_LIFE,
|
|
||||||
// Bio on the planet surface.
|
|
||||||
|
|
||||||
GENERATE_NAME
|
|
||||||
// Name of a planet.
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
BIOLOGICAL_DISASTER = 0,
|
BIOLOGICAL_DISASTER = 0,
|
||||||
@@ -95,6 +65,7 @@ enum
|
|||||||
LANDER_RETURNS,
|
LANDER_RETURNS,
|
||||||
LANDER_DESTROYED
|
LANDER_DESTROYED
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_SCROUNGED 50 /* max lander can hold */
|
#define MAX_SCROUNGED 50 /* max lander can hold */
|
||||||
|
|
||||||
#define SCALE_RADIUS(r) ((r) << 6)
|
#define SCALE_RADIUS(r) ((r) << 6)
|
||||||
@@ -113,7 +84,27 @@ enum
|
|||||||
#define MIN_MOON_RADIUS 35
|
#define MIN_MOON_RADIUS 35
|
||||||
#define MOON_DELTA 20
|
#define MOON_DELTA 20
|
||||||
|
|
||||||
typedef struct planet_desc
|
#define MAX_SUNS 1
|
||||||
|
#define MAX_PLANETS 16
|
||||||
|
#define MAX_MOONS 4
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct planet_desc PLANET_DESC;
|
||||||
|
typedef struct star_desc STAR_DESC;
|
||||||
|
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 "plandata.h"
|
||||||
|
#include "sundata.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct planet_desc
|
||||||
{
|
{
|
||||||
DWORD rand_seed;
|
DWORD rand_seed;
|
||||||
|
|
||||||
@@ -126,27 +117,22 @@ typedef struct planet_desc
|
|||||||
COUNT NextIndex;
|
COUNT NextIndex;
|
||||||
STAMP image;
|
STAMP image;
|
||||||
|
|
||||||
struct planet_desc *pPrevDesc;
|
PLANET_DESC *pPrevDesc;
|
||||||
} PLANET_DESC;
|
// The Sun or planet that this world is orbiting around.
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct
|
struct star_desc
|
||||||
{
|
{
|
||||||
POINT star_pt;
|
POINT star_pt;
|
||||||
BYTE Type, Index;
|
BYTE Type;
|
||||||
BYTE Prefix, Postfix;
|
BYTE Index;
|
||||||
} STAR_DESC;
|
BYTE Prefix;
|
||||||
|
BYTE Postfix;
|
||||||
#define MAX_SUNS 1
|
};
|
||||||
#define MAX_PLANETS 16
|
|
||||||
#define MAX_MOONS 4
|
|
||||||
|
|
||||||
#include "elemdata.h"
|
|
||||||
#include "plandata.h"
|
|
||||||
#include "sundata.h"
|
|
||||||
|
|
||||||
typedef void (*PLAN_GEN_FUNC) (BYTE control);
|
typedef void (*PLAN_GEN_FUNC) (BYTE control);
|
||||||
|
|
||||||
typedef struct planet_orbit
|
struct planet_orbit
|
||||||
{
|
{
|
||||||
FRAME TopoZoomFrame;
|
FRAME TopoZoomFrame;
|
||||||
// 4x scaled topo image for planet-side
|
// 4x scaled topo image for planet-side
|
||||||
@@ -167,11 +153,11 @@ typedef struct planet_orbit
|
|||||||
// temp RGBA data for whatever transforms (nuked often)
|
// temp RGBA data for whatever transforms (nuked often)
|
||||||
FRAME WorkFrame;
|
FRAME WorkFrame;
|
||||||
// any extra frame workspace (for dynamic objects)
|
// any extra frame workspace (for dynamic objects)
|
||||||
} PLANET_ORBIT;
|
};
|
||||||
|
|
||||||
// See doc/devel/generate for information on how this structure is
|
// See doc/devel/generate for information on how this structure is
|
||||||
// filled.
|
// filled.
|
||||||
typedef struct solarsys_state
|
struct solarsys_state
|
||||||
{
|
{
|
||||||
MENU_STATE MenuState;
|
MENU_STATE MenuState;
|
||||||
|
|
||||||
@@ -179,12 +165,12 @@ typedef struct solarsys_state
|
|||||||
PLANET_DESC SunDesc[MAX_SUNS];
|
PLANET_DESC SunDesc[MAX_SUNS];
|
||||||
PLANET_DESC PlanetDesc[MAX_PLANETS];
|
PLANET_DESC PlanetDesc[MAX_PLANETS];
|
||||||
// Description of the planets in the system.
|
// Description of the planets in the system.
|
||||||
// Only defined after a call to GenFunc with GENERATE_PLANETS
|
// Only defined after a call to (*genFuncs)->generatePlanets()
|
||||||
// as its argument, and overwritten by subsequent calls.
|
// and overwritten by subsequent calls.
|
||||||
PLANET_DESC MoonDesc[MAX_MOONS];
|
PLANET_DESC MoonDesc[MAX_MOONS];
|
||||||
// Description of the moons orbiting the planet pointed to
|
// Description of the moons orbiting the planet pointed to
|
||||||
// by pBaseDesc.
|
// by pBaseDesc.
|
||||||
// Only defined after a call to GenFunc with GENERATE_MOONS
|
// Only defined after a call to (*genFuncs)->generateMoons()
|
||||||
// as its argument, and overwritten by subsequent calls.
|
// as its argument, and overwritten by subsequent calls.
|
||||||
PLANET_DESC *pBaseDesc;
|
PLANET_DESC *pBaseDesc;
|
||||||
PLANET_DESC *pOrbitalDesc;
|
PLANET_DESC *pOrbitalDesc;
|
||||||
@@ -196,8 +182,10 @@ typedef struct solarsys_state
|
|||||||
// PlanetDesc[PlanetDesc[i].NextIndex] is the next planet
|
// PlanetDesc[PlanetDesc[i].NextIndex] is the next planet
|
||||||
// after PlanetDesc[i] in the ordering.
|
// after PlanetDesc[i] in the ordering.
|
||||||
|
|
||||||
BYTE turn_counter, turn_wait;
|
BYTE turn_counter;
|
||||||
BYTE thrust_counter, max_ship_speed;
|
BYTE turn_wait;
|
||||||
|
BYTE thrust_counter;
|
||||||
|
BYTE max_ship_speed;
|
||||||
|
|
||||||
STRING XlatRef;
|
STRING XlatRef;
|
||||||
STRINGPTR XlatPtr;
|
STRINGPTR XlatPtr;
|
||||||
@@ -206,23 +194,27 @@ typedef struct solarsys_state
|
|||||||
SYSTEM_INFO SysInfo;
|
SYSTEM_INFO SysInfo;
|
||||||
|
|
||||||
COUNT CurNode;
|
COUNT CurNode;
|
||||||
PLAN_GEN_FUNC GenFunc;
|
const GenerateFunctions *genFuncs;
|
||||||
// Function to call to fill in various parts of this structure.
|
// Functions to call to fill in various parts of this structure.
|
||||||
// See doc/devel/generate.
|
// See generate.h, doc/devel/generate
|
||||||
|
|
||||||
FRAME PlanetSideFrame[6];
|
FRAME PlanetSideFrame[6];
|
||||||
UWORD Tint_rgb;
|
UWORD Tint_rgb;
|
||||||
UBYTE PauseRotate;
|
UBYTE PauseRotate;
|
||||||
FRAME TopoFrame;
|
FRAME TopoFrame;
|
||||||
PLANET_ORBIT Orbit;
|
PLANET_ORBIT Orbit;
|
||||||
} SOLARSYS_STATE;
|
};
|
||||||
|
|
||||||
extern SOLARSYS_STATE *pSolarSysState;
|
extern SOLARSYS_STATE *pSolarSysState;
|
||||||
extern MUSIC_REF SpaceMusic;
|
extern MUSIC_REF SpaceMusic;
|
||||||
|
|
||||||
bool currentWorldIsPlanet (void);
|
bool worldIsPlanet (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world);
|
||||||
bool currentPlanetIndex (void);
|
bool worldIsMoon (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world);
|
||||||
bool currentMoonIndex (void);
|
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);
|
||||||
|
|
||||||
extern void LoadPlanet (FRAME SurfDefFrame);
|
extern void LoadPlanet (FRAME SurfDefFrame);
|
||||||
extern void DrawPlanet (int x, int y, int dy, unsigned int rgb);
|
extern void DrawPlanet (int x, int y, int dy, unsigned int rgb);
|
||||||
@@ -233,7 +225,6 @@ extern void FreeLanderFont (PLANET_INFO *info);
|
|||||||
extern void ExploreSolarSys (void);
|
extern void ExploreSolarSys (void);
|
||||||
extern void DrawStarBackGround (BOOLEAN ForPlanet);
|
extern void DrawStarBackGround (BOOLEAN ForPlanet);
|
||||||
extern void XFormIPLoc (POINT *pIn, POINT *pOut, BOOLEAN ToDisplay);
|
extern void XFormIPLoc (POINT *pIn, POINT *pOut, BOOLEAN ToDisplay);
|
||||||
extern void GenerateRandomIP (BYTE control);
|
|
||||||
extern PLAN_GEN_FUNC GenerateIP (BYTE Index);
|
extern PLAN_GEN_FUNC GenerateIP (BYTE Index);
|
||||||
extern void DrawSystem (SIZE radius, BOOLEAN IsInnerSystem);
|
extern void DrawSystem (SIZE radius, BOOLEAN IsInnerSystem);
|
||||||
extern void DrawOval (RECT *pRect, BYTE num_off_pixels);
|
extern void DrawOval (RECT *pRect, BYTE num_off_pixels);
|
||||||
|
|||||||
@@ -43,6 +43,8 @@
|
|||||||
#include "libs/mathlib.h"
|
#include "libs/mathlib.h"
|
||||||
#include "libs/memlib.h"
|
#include "libs/memlib.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
static POINT cursorLoc;
|
static POINT cursorLoc;
|
||||||
static POINT mapOrigin;
|
static POINT mapOrigin;
|
||||||
@@ -1026,7 +1028,6 @@ static void
|
|||||||
DrawMatchedStarName (TEXTENTRY_STATE *pTES)
|
DrawMatchedStarName (TEXTENTRY_STATE *pTES)
|
||||||
{
|
{
|
||||||
STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam;
|
STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam;
|
||||||
MENU_STATE *pMS = pSS->pMS;
|
|
||||||
UNICODE buf[STAR_SEARCH_BUFSIZE] = "";
|
UNICODE buf[STAR_SEARCH_BUFSIZE] = "";
|
||||||
SIZE ExPos = 0;
|
SIZE ExPos = 0;
|
||||||
SIZE CurPos = -1;
|
SIZE CurPos = -1;
|
||||||
@@ -1109,7 +1110,6 @@ static BOOLEAN
|
|||||||
OnStarNameChange (TEXTENTRY_STATE *pTES)
|
OnStarNameChange (TEXTENTRY_STATE *pTES)
|
||||||
{
|
{
|
||||||
STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam;
|
STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam;
|
||||||
MENU_STATE *pMS = pSS->pMS;
|
|
||||||
COUNT flags;
|
COUNT flags;
|
||||||
BOOLEAN ret = TRUE;
|
BOOLEAN ret = TRUE;
|
||||||
|
|
||||||
@@ -1154,7 +1154,6 @@ static BOOLEAN
|
|||||||
OnStarNameFrame (TEXTENTRY_STATE *pTES)
|
OnStarNameFrame (TEXTENTRY_STATE *pTES)
|
||||||
{
|
{
|
||||||
STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam;
|
STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam;
|
||||||
MENU_STATE *pMS = pSS->pMS;
|
|
||||||
|
|
||||||
if (PulsedInputState.menu[KEY_MENU_NEXT])
|
if (PulsedInputState.menu[KEY_MENU_NEXT])
|
||||||
{ // search for next match
|
{ // search for next match
|
||||||
|
|||||||
@@ -904,6 +904,27 @@ DrawScannedStuff (COUNT y, BYTE CurState)
|
|||||||
SetContextForeGroundColor (OldColor);
|
SetContextForeGroundColor (OldColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
callGenerateForScanType (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||||
|
COUNT *node, BYTE scanType)
|
||||||
|
{
|
||||||
|
switch (scanType)
|
||||||
|
{
|
||||||
|
case MINERAL_SCAN:
|
||||||
|
return (*solarSys->genFuncs->generateMinerals) (
|
||||||
|
solarSys, world, node);
|
||||||
|
case ENERGY_SCAN:
|
||||||
|
return (*solarSys->genFuncs->generateEnergy) (
|
||||||
|
solarSys, world, node);
|
||||||
|
case BIOLOGICAL_SCAN:
|
||||||
|
return (*solarSys->genFuncs->generateLife) (
|
||||||
|
solarSys, world, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert (false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOLEAN
|
static BOOLEAN
|
||||||
DoScan (MENU_STATE *pMS)
|
DoScan (MENU_STATE *pMS)
|
||||||
{
|
{
|
||||||
@@ -1020,7 +1041,9 @@ DoScan (MENU_STATE *pMS)
|
|||||||
t.CharCount = (COUNT)~0;
|
t.CharCount = (COUNT)~0;
|
||||||
|
|
||||||
pSolarSysState->CurNode = (COUNT)~0;
|
pSolarSysState->CurNode = (COUNT)~0;
|
||||||
(*pSolarSysState->GenFunc) ((BYTE)(min_scan + GENERATE_MINERAL));
|
callGenerateForScanType (pSolarSysState,
|
||||||
|
pSolarSysState->pOrbitalDesc, &pSolarSysState->CurNode,
|
||||||
|
min_scan);
|
||||||
pMS->delta_item = (SIZE)pSolarSysState->CurNode;
|
pMS->delta_item = (SIZE)pSolarSysState->CurNode;
|
||||||
t.pStr = GAME_STRING (SCAN_STRING_BASE + min_scan);
|
t.pStr = GAME_STRING (SCAN_STRING_BASE + min_scan);
|
||||||
|
|
||||||
@@ -1243,7 +1266,8 @@ GeneratePlanetSide (void)
|
|||||||
NUM_SCANDOT_TRANSITIONS * (scan - ENERGY_SCAN));
|
NUM_SCANDOT_TRANSITIONS * (scan - ENERGY_SCAN));
|
||||||
|
|
||||||
pSolarSysState->CurNode = (COUNT)~0;
|
pSolarSysState->CurNode = (COUNT)~0;
|
||||||
(*pSolarSysState->GenFunc) ((BYTE)(scan + GENERATE_MINERAL));
|
callGenerateForScanType (pSolarSysState,
|
||||||
|
pSolarSysState->pOrbitalDesc, &pSolarSysState->CurNode, scan);
|
||||||
|
|
||||||
num_nodes = pSolarSysState->CurNode;
|
num_nodes = pSolarSysState->CurNode;
|
||||||
while (num_nodes--)
|
while (num_nodes--)
|
||||||
@@ -1262,7 +1286,9 @@ GeneratePlanetSide (void)
|
|||||||
LockElement (hNodeElement, &NodeElementPtr);
|
LockElement (hNodeElement, &NodeElementPtr);
|
||||||
|
|
||||||
pSolarSysState->CurNode = num_nodes;
|
pSolarSysState->CurNode = num_nodes;
|
||||||
(*pSolarSysState->GenFunc) ((BYTE)(scan + GENERATE_MINERAL));
|
callGenerateForScanType (pSolarSysState,
|
||||||
|
pSolarSysState->pOrbitalDesc, &pSolarSysState->CurNode,
|
||||||
|
scan);
|
||||||
|
|
||||||
NodeElementPtr->scan_node = MAKE_WORD (scan, num_nodes + 1);
|
NodeElementPtr->scan_node = MAKE_WORD (scan, num_nodes + 1);
|
||||||
NodeElementPtr->playerNr = PS_NON_PLAYER;
|
NodeElementPtr->playerNr = PS_NON_PLAYER;
|
||||||
|
|||||||
@@ -19,28 +19,34 @@
|
|||||||
#ifndef _SCAN_H
|
#ifndef _SCAN_H
|
||||||
#define _SCAN_H
|
#define _SCAN_H
|
||||||
|
|
||||||
|
typedef struct scan_desc SCAN_DESC;
|
||||||
|
typedef struct scan_block SCAN_BLOCK;
|
||||||
|
|
||||||
#include "libs/compiler.h"
|
#include "libs/compiler.h"
|
||||||
#include "libs/gfxlib.h"
|
#include "libs/gfxlib.h"
|
||||||
|
#include "planets.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
struct scan_desc
|
||||||
{
|
{
|
||||||
POINT start;
|
POINT start;
|
||||||
COUNT start_dot;
|
COUNT start_dot;
|
||||||
COUNT num_dots;
|
COUNT num_dots;
|
||||||
COUNT dots_per_semi;
|
COUNT dots_per_semi;
|
||||||
} SCAN_DESC;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct scan_block
|
||||||
{
|
{
|
||||||
POINT *line_base;
|
POINT *line_base;
|
||||||
COUNT num_scans;
|
COUNT num_scans;
|
||||||
COUNT num_same_scans;
|
COUNT num_same_scans;
|
||||||
SCAN_DESC *scan_base;
|
SCAN_DESC *scan_base;
|
||||||
} SCAN_BLOCK;
|
};
|
||||||
|
|
||||||
extern void RepairBackRect (RECT *pRect);
|
extern void RepairBackRect (RECT *pRect);
|
||||||
extern void GeneratePlanetSide (void);
|
extern void GeneratePlanetSide (void);
|
||||||
|
extern bool callGenerateForScanType (SOLARSYS_STATE *solarSys,
|
||||||
|
PLANET_DESC *world, COUNT *node, BYTE scanType);
|
||||||
|
|
||||||
extern void RedrawSurfaceScan (const POINT *newLoc);
|
extern void RedrawSurfaceScan (const POINT *newLoc);
|
||||||
|
|
||||||
|
|||||||
+67
-205
@@ -24,6 +24,7 @@
|
|||||||
#include "../encount.h"
|
#include "../encount.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
#include "../gamestr.h"
|
#include "../gamestr.h"
|
||||||
|
#include "../gendef.h"
|
||||||
#include "../globdata.h"
|
#include "../globdata.h"
|
||||||
#include "../sis.h"
|
#include "../sis.h"
|
||||||
#include "../init.h"
|
#include "../init.h"
|
||||||
@@ -47,7 +48,10 @@
|
|||||||
|
|
||||||
|
|
||||||
SOLARSYS_STATE *pSolarSysState;
|
SOLARSYS_STATE *pSolarSysState;
|
||||||
FRAME SISIPFrame, SunFrame, OrbitalFrame, SpaceJunkFrame;
|
FRAME SISIPFrame;
|
||||||
|
FRAME SunFrame;
|
||||||
|
FRAME OrbitalFrame;
|
||||||
|
FRAME SpaceJunkFrame;
|
||||||
COLORMAP OrbitalCMap;
|
COLORMAP OrbitalCMap;
|
||||||
COLORMAP SunCMap;
|
COLORMAP SunCMap;
|
||||||
MUSIC_REF SpaceMusic;
|
MUSIC_REF SpaceMusic;
|
||||||
@@ -71,73 +75,61 @@ BYTE draw_sys_flags = DRAW_STARS | DRAW_PLANETS | DRAW_ORBITS
|
|||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
currentWorldIsPlanet (void) {
|
worldIsPlanet (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world)
|
||||||
return pSolarSysState->pOrbitalDesc->pPrevDesc == pSolarSysState->SunDesc;
|
{
|
||||||
|
return world->pPrevDesc == solarSys->SunDesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
currentPlanetIndex (void) {
|
worldIsMoon (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world)
|
||||||
return (currentWorldIsPlanet ()) ?
|
{
|
||||||
(pSolarSysState->pOrbitalDesc - pSolarSysState->PlanetDesc) :
|
return world->pPrevDesc != solarSys->SunDesc;
|
||||||
pSolarSysState->pOrbitalDesc->pPrevDesc -
|
|
||||||
pSolarSysState->PlanetDesc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the planet index of the world. If the world is a moon, then
|
||||||
|
// this is the index of the planet it is orbiting.
|
||||||
|
COUNT
|
||||||
|
planetIndex (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world)
|
||||||
|
{
|
||||||
|
const PLANET_DESC *planet = worldIsPlanet (solarSys, world) ?
|
||||||
|
world : world->pPrevDesc;
|
||||||
|
return planet - solarSys->PlanetDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
COUNT
|
||||||
|
moonIndex (const SOLARSYS_STATE *solarSys, const PLANET_DESC *moon)
|
||||||
|
{
|
||||||
|
assert (!worldIsPlanet (solarSys, moon));
|
||||||
|
return moon - solarSys->MoonDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test whether 'world' is the planetI-th planet, and if moonI is not
|
||||||
|
// set to MATCH_PLANET, also whether 'world' is the moonI-th moon.
|
||||||
bool
|
bool
|
||||||
currentMoonIndex (void) {
|
matchWorld (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world,
|
||||||
assert (!currentWorldIsPlanet ());
|
BYTE planetI, BYTE moonI)
|
||||||
return (pSolarSysState->pOrbitalDesc - pSolarSysState->MoonDesc);
|
{
|
||||||
|
// Check whether we have the right planet.
|
||||||
|
if (planetIndex (solarSys, world) != planetI)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (moonI == MATCH_PLANET)
|
||||||
|
{
|
||||||
|
// Only test whether we are at the planet.
|
||||||
|
if (!worldIsPlanet (solarSys, world))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Test whether the moon matches too
|
||||||
|
if (!worldIsMoon (solarSys, world))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (moonIndex (solarSys, world) != moonI)
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NB. This function modifies the RNG state.
|
return true;
|
||||||
static void
|
|
||||||
GeneratePlanets (SOLARSYS_STATE *system)
|
|
||||||
{
|
|
||||||
COUNT i;
|
|
||||||
PLANET_DESC *planet;
|
|
||||||
|
|
||||||
for (i = system->SunDesc[0].NumPlanets,
|
|
||||||
planet = &system->PlanetDesc[0]; i; --i, ++planet)
|
|
||||||
{
|
|
||||||
DWORD rand_val;
|
|
||||||
BYTE byte_val;
|
|
||||||
BYTE num_moons;
|
|
||||||
BYTE type;
|
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
|
||||||
byte_val = LOBYTE (rand_val);
|
|
||||||
|
|
||||||
num_moons = 0;
|
|
||||||
type = PlanData[planet->data_index & ~PLANET_SHIELDED].Type;
|
|
||||||
switch (PLANSIZE (type))
|
|
||||||
{
|
|
||||||
case LARGE_ROCKY_WORLD:
|
|
||||||
if (byte_val < 0x00FF * 25 / 100)
|
|
||||||
{
|
|
||||||
if (byte_val < 0x00FF * 5 / 100)
|
|
||||||
++num_moons;
|
|
||||||
++num_moons;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GAS_GIANT:
|
|
||||||
if (byte_val < 0x00FF * 90 / 100)
|
|
||||||
{
|
|
||||||
if (byte_val < 0x00FF * 75 / 100)
|
|
||||||
{
|
|
||||||
if (byte_val < 0x00FF * 50 / 100)
|
|
||||||
{
|
|
||||||
if (byte_val < 0x00FF * 25 / 100)
|
|
||||||
++num_moons;
|
|
||||||
++num_moons;
|
|
||||||
}
|
|
||||||
++num_moons;
|
|
||||||
}
|
|
||||||
++num_moons;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
planet->NumPlanets = num_moons;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -159,8 +151,8 @@ GenerateMoons (void)
|
|||||||
pCurDesc = pSolarSysState->pBaseDesc;
|
pCurDesc = pSolarSysState->pBaseDesc;
|
||||||
old_seed = TFB_SeedRandom (pCurDesc->rand_seed);
|
old_seed = TFB_SeedRandom (pCurDesc->rand_seed);
|
||||||
|
|
||||||
(*pSolarSysState->GenFunc) (GENERATE_NAME);
|
(*pSolarSysState->genFuncs->generateName) (pSolarSysState, pCurDesc);
|
||||||
(*pSolarSysState->GenFunc) (GENERATE_MOONS);
|
(*pSolarSysState->genFuncs->generateMoons) (pSolarSysState, pCurDesc);
|
||||||
|
|
||||||
facing = NORMALIZE_FACING (ANGLE_TO_FACING (
|
facing = NORMALIZE_FACING (ANGLE_TO_FACING (
|
||||||
ARCTAN (pCurDesc->location.x, pCurDesc->location.y)));
|
ARCTAN (pCurDesc->location.x, pCurDesc->location.y)));
|
||||||
@@ -286,7 +278,8 @@ sortPlanetPositions (void)
|
|||||||
static void
|
static void
|
||||||
initSolarSysSISCharacteristics (void)
|
initSolarSysSISCharacteristics (void)
|
||||||
{
|
{
|
||||||
BYTE i, num_thrusters;
|
BYTE i;
|
||||||
|
BYTE num_thrusters;
|
||||||
|
|
||||||
num_thrusters = 0;
|
num_thrusters = 0;
|
||||||
for (i = 0; i < NUM_DRIVE_SLOTS; ++i)
|
for (i = 0; i < NUM_DRIVE_SLOTS; ++i)
|
||||||
@@ -348,7 +341,7 @@ LoadSolarSys (void)
|
|||||||
pCurDesc->image.origin = pCurDesc->location;
|
pCurDesc->image.origin = pCurDesc->location;
|
||||||
pCurDesc->image.frame = SunFrame;
|
pCurDesc->image.frame = SunFrame;
|
||||||
|
|
||||||
(*pSolarSysState->GenFunc) (GENERATE_PLANETS);
|
(*pSolarSysState->genFuncs->generatePlanets) (pSolarSysState);
|
||||||
if (GET_GAME_STATE (PLANETARY_CHANGE))
|
if (GET_GAME_STATE (PLANETARY_CHANGE))
|
||||||
{
|
{
|
||||||
PutPlanetInfo ();
|
PutPlanetInfo ();
|
||||||
@@ -1426,7 +1419,8 @@ StartGroups:
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetPlanetInfo ();
|
GetPlanetInfo ();
|
||||||
(*pSolarSysState->GenFunc) (GENERATE_ORBITAL);
|
(*pSolarSysState->genFuncs->generateOrbital) (pSolarSysState,
|
||||||
|
pSolarSysState->pOrbitalDesc);
|
||||||
LastActivity &= ~(CHECK_LOAD | CHECK_RESTART);
|
LastActivity &= ~(CHECK_LOAD | CHECK_RESTART);
|
||||||
if ((GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD |
|
if ((GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD |
|
||||||
START_ENCOUNTER)) || GLOBAL_SIS (CrewEnlisted) == (COUNT)~0
|
START_ENCOUNTER)) || GLOBAL_SIS (CrewEnlisted) == (COUNT)~0
|
||||||
@@ -1435,8 +1429,8 @@ StartGroups:
|
|||||||
|
|
||||||
if (pSolarSysState->MenuState.flash_task == 0)
|
if (pSolarSysState->MenuState.flash_task == 0)
|
||||||
{
|
{
|
||||||
/* Note! This implies that our GenFunc was a
|
/* Note! This implies that our generateOrbital function started
|
||||||
conversation; that is, that this is a homeworld */
|
a conversation; that is, that this is a homeworld */
|
||||||
SetTransitionSource (NULL);
|
SetTransitionSource (NULL);
|
||||||
LoadSolarSys ();
|
LoadSolarSys ();
|
||||||
ValidateOrbits ();
|
ValidateOrbits ();
|
||||||
@@ -1490,7 +1484,7 @@ InitSolarSys (void)
|
|||||||
|
|
||||||
if (Reentry)
|
if (Reentry)
|
||||||
{
|
{
|
||||||
(*pSolarSysState->GenFunc) (REINIT_NPCS);
|
(*pSolarSysState->genFuncs->reinitNpcs) ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1499,7 +1493,7 @@ InitSolarSys (void)
|
|||||||
GLOBAL (BattleGroupRef) = 0;
|
GLOBAL (BattleGroupRef) = 0;
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
ReinitQueue (&GLOBAL (ip_group_q));
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
||||||
(*pSolarSysState->GenFunc) (INIT_NPCS);
|
(*pSolarSysState->genFuncs->initNpcs) ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSolarSysState->MenuState.Initialized == 0)
|
if (pSolarSysState->MenuState.Initialized == 0)
|
||||||
@@ -1569,7 +1563,7 @@ endInterPlanetary (void)
|
|||||||
{
|
{
|
||||||
// These are game state changing ops and so cannot be
|
// These are game state changing ops and so cannot be
|
||||||
// called once another game has been loaded!
|
// called once another game has been loaded!
|
||||||
(*pSolarSysState->GenFunc) (UNINIT_NPCS);
|
(*pSolarSysState->genFuncs->uninitNpcs) ();
|
||||||
SET_GAME_STATE (USED_BROADCASTER, 0);
|
SET_GAME_STATE (USED_BROADCASTER, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1629,140 +1623,8 @@ UninitSolarSys (void)
|
|||||||
pSolarSysState->pBaseDesc =
|
pSolarSysState->pBaseDesc =
|
||||||
closestPlanetInterPlanetary (&GLOBAL (ShipStamp.origin));
|
closestPlanetInterPlanetary (&GLOBAL (ShipStamp.origin));
|
||||||
|
|
||||||
(*pSolarSysState->GenFunc) (GENERATE_NAME);
|
(*pSolarSysState->genFuncs->generateName) (
|
||||||
}
|
pSolarSysState, pSolarSysState->pBaseDesc);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
GenerateOrbital (void) {
|
|
||||||
COUNT i;
|
|
||||||
DWORD rand_val;
|
|
||||||
|
|
||||||
#ifdef DEBUG_SOLARSYS
|
|
||||||
if (currentWorldIsPlanet ())
|
|
||||||
{
|
|
||||||
log_add (log_Debug, "Planet index = %d", currentPlanetIndex ());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log_add (log_Debug, "Planet index = %d, Moon index = %d",
|
|
||||||
currentPlanetIndex (), currentMoonIndex ());
|
|
||||||
}
|
|
||||||
#endif /* DEBUG_SOLARSYS */
|
|
||||||
rand_val = DoPlanetaryAnalysis (&pSolarSysState->SysInfo,
|
|
||||||
pSolarSysState->pOrbitalDesc);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[BIOLOGICAL_SCAN] = rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
rand_val = GenerateLifeForms (&pSolarSysState->SysInfo, &i);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[MINERAL_SCAN] = rand_val;
|
|
||||||
i = (COUNT)~0;
|
|
||||||
GenerateMineralDeposits (&pSolarSysState->SysInfo, &i);
|
|
||||||
|
|
||||||
pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN] = rand_val;
|
|
||||||
LoadPlanet (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_yehat_rebellion (void)
|
|
||||||
{
|
|
||||||
HIPGROUP hGroup, hNextGroup;
|
|
||||||
|
|
||||||
// XXX: Is there a better way to do this? I could not find one.
|
|
||||||
// When you talk to a Yehat ship (YEHAT_SHIP) and start the rebellion,
|
|
||||||
// there is no battle following the comm. There is *never* a battle in
|
|
||||||
// an encounter with Rebels, but the group race_id (YEHAT_REBEL_SHIP)
|
|
||||||
// is different from Royalists (YEHAT_SHIP). There is *always* a battle
|
|
||||||
// in an encounter with Royalists.
|
|
||||||
// TRANSLATION: "If the civil war has not started yet, or the player
|
|
||||||
// battled a ship -- bail."
|
|
||||||
if (!GET_GAME_STATE (YEHAT_CIVIL_WAR) || EncounterRace >= 0)
|
|
||||||
return; // not this time
|
|
||||||
|
|
||||||
// Send Yehat groups to flee the system, but only if the player
|
|
||||||
// has actually talked to a ship.
|
|
||||||
for (hGroup = GetHeadLink (&GLOBAL (ip_group_q)); hGroup;
|
|
||||||
hGroup = hNextGroup)
|
|
||||||
{
|
|
||||||
IP_GROUP *GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
hNextGroup = _GetSuccLink (GroupPtr);
|
|
||||||
// IGNORE_FLAGSHIP was set in ipdisp.c:ip_group_collision()
|
|
||||||
// during a collision with the flagship.
|
|
||||||
if (GroupPtr->race_id == YEHAT_SHIP
|
|
||||||
&& (GroupPtr->task & IGNORE_FLAGSHIP))
|
|
||||||
{
|
|
||||||
GroupPtr->task &= REFORM_GROUP;
|
|
||||||
GroupPtr->task |= FLEE | IGNORE_FLAGSHIP;
|
|
||||||
GroupPtr->dest_loc = 0;
|
|
||||||
}
|
|
||||||
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenerateRandomIP (BYTE control)
|
|
||||||
{
|
|
||||||
switch (control)
|
|
||||||
{
|
|
||||||
case INIT_NPCS:
|
|
||||||
if (!GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP))
|
|
||||||
{
|
|
||||||
GLOBAL (BattleGroupRef) = 0;
|
|
||||||
BuildGroups ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case REINIT_NPCS:
|
|
||||||
GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
|
|
||||||
// This is not a great place to do the Yehat rebellion check, but
|
|
||||||
// since you can start the rebellion in any star system (not just
|
|
||||||
// the Homeworld), I could not find a better place for it.
|
|
||||||
// At least it is better than where it was originally.
|
|
||||||
check_yehat_rebellion ();
|
|
||||||
break;
|
|
||||||
case UNINIT_NPCS:
|
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
|
||||||
ReinitQueue (&GLOBAL (npc_built_ship_q));
|
|
||||||
ReinitQueue (&GLOBAL (ip_group_q));
|
|
||||||
break;
|
|
||||||
case GENERATE_MINERAL:
|
|
||||||
GenerateMineralDeposits (&pSolarSysState->SysInfo,
|
|
||||||
&pSolarSysState->CurNode);
|
|
||||||
break;
|
|
||||||
case GENERATE_ENERGY:
|
|
||||||
pSolarSysState->CurNode = 0;
|
|
||||||
break;
|
|
||||||
case GENERATE_LIFE:
|
|
||||||
GenerateLifeForms (&pSolarSysState->SysInfo,
|
|
||||||
&pSolarSysState->CurNode);
|
|
||||||
break;
|
|
||||||
case GENERATE_ORBITAL:
|
|
||||||
{
|
|
||||||
GenerateOrbital ();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_NAME:
|
|
||||||
{
|
|
||||||
COUNT i = pSolarSysState->pBaseDesc - pSolarSysState->PlanetDesc;
|
|
||||||
utf8StringCopy (GLOBAL_SIS (PlanetName),
|
|
||||||
sizeof (GLOBAL_SIS (PlanetName)),
|
|
||||||
GAME_STRING (PLANET_NUMBER_BASE + (9 + 7) + i));
|
|
||||||
SET_GAME_STATE (BATTLE_PLANET,
|
|
||||||
pSolarSysState->PlanetDesc[i].data_index);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GENERATE_MOONS:
|
|
||||||
FillOrbits (pSolarSysState,
|
|
||||||
pSolarSysState->pBaseDesc->NumPlanets,
|
|
||||||
&pSolarSysState->MoonDesc[0], FALSE);
|
|
||||||
break;
|
|
||||||
case GENERATE_PLANETS:
|
|
||||||
{
|
|
||||||
FillOrbits (pSolarSysState,
|
|
||||||
(BYTE)~0, &pSolarSysState->PlanetDesc[0], FALSE);
|
|
||||||
GeneratePlanets (pSolarSysState);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2031,7 +1893,7 @@ ExploreSolarSys (void)
|
|||||||
|
|
||||||
memset (pSolarSysState, 0, sizeof (*pSolarSysState));
|
memset (pSolarSysState, 0, sizeof (*pSolarSysState));
|
||||||
|
|
||||||
SolarSysState.GenFunc = GenerateIP (CurStarDescPtr->Index);
|
SolarSysState.genFuncs = getGenerateFunctions (CurStarDescPtr->Index);
|
||||||
|
|
||||||
InitSolarSys ();
|
InitSolarSys ();
|
||||||
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
||||||
|
|||||||
+2
-1
@@ -688,7 +688,8 @@ RetrySave:
|
|||||||
|
|
||||||
SaveRaceQueue (fh, &GLOBAL (avail_race_q));
|
SaveRaceQueue (fh, &GLOBAL (avail_race_q));
|
||||||
// START_INTERPLANETARY is only set when saving from Homeworld
|
// START_INTERPLANETARY is only set when saving from Homeworld
|
||||||
// encounter screen. When the game is loaded, GENERATE_ORBITAL will
|
// encounter screen. When the game is loaded, the
|
||||||
|
// GenerateOrbitalFunction for the current star system
|
||||||
// create the encounter anew and populate the npc queue.
|
// create the encounter anew and populate the npc queue.
|
||||||
if (!(GLOBAL (CurrentActivity) & START_INTERPLANETARY))
|
if (!(GLOBAL (CurrentActivity) & START_INTERPLANETARY))
|
||||||
{
|
{
|
||||||
|
|||||||
+41
-32
@@ -28,6 +28,7 @@
|
|||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "gamestr.h"
|
#include "gamestr.h"
|
||||||
#include "gameev.h"
|
#include "gameev.h"
|
||||||
|
#include "gendef.h"
|
||||||
#include "globdata.h"
|
#include "globdata.h"
|
||||||
#include "planets/lifeform.h"
|
#include "planets/lifeform.h"
|
||||||
#include "races.h"
|
#include "races.h"
|
||||||
@@ -635,10 +636,10 @@ starRecurse (STAR_DESC *star, void *arg)
|
|||||||
SolarSysState.SunDesc[0].location.x = 0;
|
SolarSysState.SunDesc[0].location.x = 0;
|
||||||
SolarSysState.SunDesc[0].location.y = 0;
|
SolarSysState.SunDesc[0].location.y = 0;
|
||||||
//SolarSysState.SunDesc[0].radius = MIN_ZOOM_RADIUS;
|
//SolarSysState.SunDesc[0].radius = MIN_ZOOM_RADIUS;
|
||||||
SolarSysState.GenFunc = GenerateIP (star->Index);
|
SolarSysState.genFuncs = getGenerateFunctions (star->Index);
|
||||||
|
|
||||||
pSolarSysState = &SolarSysState;
|
pSolarSysState = &SolarSysState;
|
||||||
(*pSolarSysState->GenFunc) (GENERATE_PLANETS);
|
(*SolarSysState.genFuncs->generatePlanets) (&SolarSysState);
|
||||||
|
|
||||||
if (universeRecurseArg->systemFuncPre != NULL)
|
if (universeRecurseArg->systemFuncPre != NULL)
|
||||||
{
|
{
|
||||||
@@ -666,8 +667,8 @@ starRecurse (STAR_DESC *star, void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system,
|
planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system, PLANET_DESC *planet,
|
||||||
PLANET_DESC *planet, void *arg)
|
void *arg)
|
||||||
{
|
{
|
||||||
UniverseRecurseArg *universeRecurseArg = (UniverseRecurseArg *) arg;
|
UniverseRecurseArg *universeRecurseArg = (UniverseRecurseArg *) arg;
|
||||||
|
|
||||||
@@ -681,10 +682,10 @@ planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system,
|
|||||||
{
|
{
|
||||||
system->pOrbitalDesc = planet;
|
system->pOrbitalDesc = planet;
|
||||||
DoPlanetaryAnalysis (&system->SysInfo, planet);
|
DoPlanetaryAnalysis (&system->SysInfo, planet);
|
||||||
// When GenerateRandomIP is used as GenFunc,
|
// When GenerateDefaultFunctions is used as genFuncs,
|
||||||
// GENERATE_ORBITAL will also call DoPlanetaryAnalysis,
|
// generateOrbital will also call DoPlanetaryAnalysis,
|
||||||
// but with other GenFuncs this is not guaranteed.
|
// but with other GenerateFunctions this is not guaranteed.
|
||||||
(*system->GenFunc) (GENERATE_ORBITAL);
|
(*system->genFuncs->generateOrbital) (system, planet);
|
||||||
(*universeRecurseArg->planetFuncPre) (
|
(*universeRecurseArg->planetFuncPre) (
|
||||||
planet, universeRecurseArg->arg);
|
planet, universeRecurseArg->arg);
|
||||||
}
|
}
|
||||||
@@ -693,7 +694,7 @@ planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system,
|
|||||||
{
|
{
|
||||||
DWORD oldSeed = TFB_SeedRandom (planet->rand_seed);
|
DWORD oldSeed = TFB_SeedRandom (planet->rand_seed);
|
||||||
|
|
||||||
(*system->GenFunc) (GENERATE_MOONS);
|
(*system->genFuncs->generateMoons) (system, planet);
|
||||||
|
|
||||||
forAllMoons (star, system, planet, moonRecurse,
|
forAllMoons (star, system, planet, moonRecurse,
|
||||||
(void *) universeRecurseArg);
|
(void *) universeRecurseArg);
|
||||||
@@ -705,10 +706,10 @@ planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system,
|
|||||||
{
|
{
|
||||||
system->pOrbitalDesc = planet;
|
system->pOrbitalDesc = planet;
|
||||||
DoPlanetaryAnalysis (&system->SysInfo, planet);
|
DoPlanetaryAnalysis (&system->SysInfo, planet);
|
||||||
// When GenerateRandomIP is used as GenFunc,
|
// When GenerateDefaultFunctions is used as genFuncs,
|
||||||
// GENERATE_ORBITAL will also call DoPlanetaryAnalysis,
|
// generateOrbital will also call DoPlanetaryAnalysis,
|
||||||
// but with other GenFuncs this is not guaranteed.
|
// but with other GenerateFunctions this is not guaranteed.
|
||||||
(*system->GenFunc) (GENERATE_ORBITAL);
|
(*system->genFuncs->generateOrbital) (system, planet);
|
||||||
(*universeRecurseArg->planetFuncPost) (
|
(*universeRecurseArg->planetFuncPost) (
|
||||||
planet, universeRecurseArg->arg);
|
planet, universeRecurseArg->arg);
|
||||||
}
|
}
|
||||||
@@ -730,10 +731,10 @@ moonRecurse (STAR_DESC *star, SOLARSYS_STATE *system, PLANET_DESC *planet,
|
|||||||
{
|
{
|
||||||
system->pOrbitalDesc = moon;
|
system->pOrbitalDesc = moon;
|
||||||
DoPlanetaryAnalysis (&system->SysInfo, moon);
|
DoPlanetaryAnalysis (&system->SysInfo, moon);
|
||||||
// When GenerateRandomIP is used as GenFunc,
|
// When GenerateDefaultFunctions is used as genFuncs,
|
||||||
// GENERATE_ORBITAL will also call DoPlanetaryAnalysis,
|
// generateOrbital will also call DoPlanetaryAnalysis,
|
||||||
// but with other GenFuncs this is not guaranteed.
|
// but with other GenerateFunctions this is not guaranteed.
|
||||||
(*system->GenFunc) (GENERATE_ORBITAL);
|
(*system->genFuncs->generateOrbital) (system, moon);
|
||||||
(*universeRecurseArg->moonFunc) (
|
(*universeRecurseArg->moonFunc) (
|
||||||
moon, universeRecurseArg->arg);
|
moon, universeRecurseArg->arg);
|
||||||
}
|
}
|
||||||
@@ -974,7 +975,8 @@ dumpPlanetCallback (const PLANET_DESC *planet, void *arg)
|
|||||||
void
|
void
|
||||||
dumpPlanet (FILE *out, const PLANET_DESC *planet)
|
dumpPlanet (FILE *out, const PLANET_DESC *planet)
|
||||||
{
|
{
|
||||||
(*pSolarSysState->GenFunc) (GENERATE_NAME);
|
(*pSolarSysState->genFuncs->generateName) (
|
||||||
|
pSolarSysState, (PLANET_DESC *) planet);
|
||||||
fprintf (out, "- %-37s %s\n", GLOBAL_SIS (PlanetName),
|
fprintf (out, "- %-37s %s\n", GLOBAL_SIS (PlanetName),
|
||||||
planetTypeString (planet->data_index & ~PLANET_SHIELDED));
|
planetTypeString (planet->data_index & ~PLANET_SHIELDED));
|
||||||
dumpWorld (out, planet);
|
dumpWorld (out, planet);
|
||||||
@@ -1056,14 +1058,16 @@ calculateBioValue (const SOLARSYS_STATE *system, const PLANET_DESC *world)
|
|||||||
assert (system->pOrbitalDesc == world);
|
assert (system->pOrbitalDesc == world);
|
||||||
|
|
||||||
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
||||||
(*system->GenFunc) (GENERATE_LIFE);
|
(*system->genFuncs->generateLife) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
numBio = system->CurNode;
|
numBio = system->CurNode;
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
for (i = 0; i < numBio; i++)
|
for (i = 0; i < numBio; i++)
|
||||||
{
|
{
|
||||||
((SOLARSYS_STATE *) system)->CurNode = i;
|
((SOLARSYS_STATE *) system)->CurNode = i;
|
||||||
(*system->GenFunc) (GENERATE_LIFE);
|
(*system->genFuncs->generateLife) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
result += BIO_CREDIT_VALUE * LONIBBLE (CreatureData[
|
result += BIO_CREDIT_VALUE * LONIBBLE (CreatureData[
|
||||||
system->SysInfo.PlanetInfo.CurType].ValueAndHitPoints);
|
system->SysInfo.PlanetInfo.CurType].ValueAndHitPoints);
|
||||||
}
|
}
|
||||||
@@ -1071,8 +1075,8 @@ calculateBioValue (const SOLARSYS_STATE *system, const PLANET_DESC *world)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
generateBioIndex(const SOLARSYS_STATE *system,
|
generateBioIndex(const SOLARSYS_STATE *system, const PLANET_DESC *world,
|
||||||
const PLANET_DESC *world, COUNT bio[])
|
COUNT bio[])
|
||||||
{
|
{
|
||||||
COUNT numBio;
|
COUNT numBio;
|
||||||
COUNT i;
|
COUNT i;
|
||||||
@@ -1080,7 +1084,8 @@ generateBioIndex(const SOLARSYS_STATE *system,
|
|||||||
assert (system->pOrbitalDesc == world);
|
assert (system->pOrbitalDesc == world);
|
||||||
|
|
||||||
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
||||||
(*system->GenFunc) (GENERATE_LIFE);
|
(*system->genFuncs->generateLife) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
numBio = system->CurNode;
|
numBio = system->CurNode;
|
||||||
|
|
||||||
for (i = 0; i < NUM_CREATURE_TYPES + NUM_SPECIAL_CREATURE_TYPES; i++)
|
for (i = 0; i < NUM_CREATURE_TYPES + NUM_SPECIAL_CREATURE_TYPES; i++)
|
||||||
@@ -1089,14 +1094,14 @@ generateBioIndex(const SOLARSYS_STATE *system,
|
|||||||
for (i = 0; i < numBio; i++)
|
for (i = 0; i < numBio; i++)
|
||||||
{
|
{
|
||||||
((SOLARSYS_STATE *) system)->CurNode = i;
|
((SOLARSYS_STATE *) system)->CurNode = i;
|
||||||
(*system->GenFunc) (GENERATE_LIFE);
|
(*system->genFuncs->generateLife) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
bio[system->SysInfo.PlanetInfo.CurType]++;
|
bio[system->SysInfo.PlanetInfo.CurType]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
COUNT
|
COUNT
|
||||||
calculateMineralValue (const SOLARSYS_STATE *system,
|
calculateMineralValue (const SOLARSYS_STATE *system, const PLANET_DESC *world)
|
||||||
const PLANET_DESC *world)
|
|
||||||
{
|
{
|
||||||
COUNT result;
|
COUNT result;
|
||||||
COUNT numDeposits;
|
COUNT numDeposits;
|
||||||
@@ -1105,14 +1110,16 @@ calculateMineralValue (const SOLARSYS_STATE *system,
|
|||||||
assert (system->pOrbitalDesc == world);
|
assert (system->pOrbitalDesc == world);
|
||||||
|
|
||||||
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
||||||
(*system->GenFunc) (GENERATE_MINERAL);
|
(*system->genFuncs->generateMinerals) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
numDeposits = system->CurNode;
|
numDeposits = system->CurNode;
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
for (i = 0; i < numDeposits; i++)
|
for (i = 0; i < numDeposits; i++)
|
||||||
{
|
{
|
||||||
((SOLARSYS_STATE *) system)->CurNode = i;
|
((SOLARSYS_STATE *) system)->CurNode = i;
|
||||||
(*system->GenFunc) (GENERATE_MINERAL);
|
(*system->genFuncs->generateMinerals) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
result += HIBYTE (system->SysInfo.PlanetInfo.CurDensity) *
|
result += HIBYTE (system->SysInfo.PlanetInfo.CurDensity) *
|
||||||
GLOBAL (ElementWorth[ElementCategory (
|
GLOBAL (ElementWorth[ElementCategory (
|
||||||
system->SysInfo.PlanetInfo.CurType)]);
|
system->SysInfo.PlanetInfo.CurType)]);
|
||||||
@@ -1121,8 +1128,8 @@ calculateMineralValue (const SOLARSYS_STATE *system,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
generateMineralIndex(const SOLARSYS_STATE *system,
|
generateMineralIndex(const SOLARSYS_STATE *system, const PLANET_DESC *world,
|
||||||
const PLANET_DESC *world, COUNT minerals[])
|
COUNT minerals[])
|
||||||
{
|
{
|
||||||
COUNT numDeposits;
|
COUNT numDeposits;
|
||||||
COUNT i;
|
COUNT i;
|
||||||
@@ -1130,7 +1137,8 @@ generateMineralIndex(const SOLARSYS_STATE *system,
|
|||||||
assert (system->pOrbitalDesc == world);
|
assert (system->pOrbitalDesc == world);
|
||||||
|
|
||||||
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
((SOLARSYS_STATE *) system)->CurNode = (COUNT)~0;
|
||||||
(*system->GenFunc) (GENERATE_MINERAL);
|
(*system->genFuncs->generateMinerals) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
numDeposits = system->CurNode;
|
numDeposits = system->CurNode;
|
||||||
|
|
||||||
for (i = 0; i < NUM_ELEMENT_CATEGORIES; i++)
|
for (i = 0; i < NUM_ELEMENT_CATEGORIES; i++)
|
||||||
@@ -1139,7 +1147,8 @@ generateMineralIndex(const SOLARSYS_STATE *system,
|
|||||||
for (i = 0; i < numDeposits; i++)
|
for (i = 0; i < numDeposits; i++)
|
||||||
{
|
{
|
||||||
((SOLARSYS_STATE *) system)->CurNode = i;
|
((SOLARSYS_STATE *) system)->CurNode = i;
|
||||||
(*system->GenFunc) (GENERATE_MINERAL);
|
(*system->genFuncs->generateMinerals) ((SOLARSYS_STATE *) system,
|
||||||
|
(PLANET_DESC *) world, &((SOLARSYS_STATE *) system)->CurNode);
|
||||||
minerals[ElementCategory(system->SysInfo.PlanetInfo.CurType)] +=
|
minerals[ElementCategory(system->SysInfo.PlanetInfo.CurType)] +=
|
||||||
HIBYTE (system->SysInfo.PlanetInfo.CurDensity);
|
HIBYTE (system->SysInfo.PlanetInfo.CurDensity);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
#define UQM_MAJOR_VERSION_S "0"
|
#define UQM_MAJOR_VERSION_S "0"
|
||||||
#define UQM_MINOR_VERSION 6
|
#define UQM_MINOR_VERSION 6
|
||||||
#define UQM_MINOR_VERSION_S "6"
|
#define UQM_MINOR_VERSION_S "6"
|
||||||
#define UQM_PATCH_VERSION 7
|
#define UQM_PATCH_VERSION 8
|
||||||
#define UQM_PATCH_VERSION_S "7"
|
#define UQM_PATCH_VERSION_S "8"
|
||||||
#define UQM_EXTRA_VERSION ""
|
#define UQM_EXTRA_VERSION ""
|
||||||
/* The final version is interpreted as:
|
/* The final version is interpreted as:
|
||||||
* printf ("%d.%d.%d%s", UQM_MAJOR_VERSION, UQM_MINOR_VERSION,
|
* printf ("%d.%d.%d%s", UQM_MAJOR_VERSION, UQM_MINOR_VERSION,
|
||||||
|
|||||||
Reference in New Issue
Block a user