diff --git a/sc2/ChangeLog b/sc2/ChangeLog index e66308034..79c44bd3c 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ Changes towards version 0.7: +- Refactored universe generation - SvdB - Comm animation processing rewrite, bugs fixed - Alex - Added graphics context debugging function - SvdB - Thread down-throttling and game sleep when inactive (currently disabled), diff --git a/sc2/doc/devel/generate b/sc2/doc/devel/generate index 3b7dff3a5..1adf15263 100644 --- a/sc2/doc/devel/generate +++ b/sc2/doc/devel/generate @@ -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 to a solar system dependant generation function. This function is of type PLAN_GEN_FUNC, which is a typedef to diff --git a/sc2/doc/devel/orggenerate b/sc2/doc/devel/orggenerate new file mode 100644 index 000000000..fce22071c --- /dev/null +++ b/sc2/doc/devel/orggenerate @@ -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. + + diff --git a/sc2/src/uqm/encount.h b/sc2/src/uqm/encount.h index 664883ea8..b3e628065 100644 --- a/sc2/src/uqm/encount.h +++ b/sc2/src/uqm/encount.h @@ -19,6 +19,9 @@ #ifndef _ENCOUNT_H #define _ENCOUNT_H +typedef struct brief_ship_info BRIEF_SHIP_INFO; +typedef struct encounter ENCOUNTER; + // XXX: temporary, for CONVERSATION #include "commglue.h" #include "displist.h" @@ -33,7 +36,7 @@ typedef HLINK HENCOUNTER; #define ONE_SHOT_ENCOUNTER (1 << 7) #define ENCOUNTER_REFORMING (1 << 6) -typedef struct +struct brief_ship_info { // The only field actually used right now is crew_level BYTE race_id; @@ -41,9 +44,9 @@ typedef struct COUNT max_crew; BYTE max_energy; -} BRIEF_SHIP_INFO; +}; -typedef struct +struct encounter { // LINK elements; must be first HENCOUNTER pred, succ; @@ -58,7 +61,7 @@ typedef struct BRIEF_SHIP_INFO ShipList[MAX_HYPER_SHIPS]; SDWORD log_x, log_y; -} ENCOUNTER; +}; #define AllocEncounter() AllocLink (&GLOBAL (encounter_q)) #define PutEncounter(h) PutQueue (&GLOBAL (encounter_q), h) diff --git a/sc2/src/uqm/gendef.c b/sc2/src/uqm/gendef.c index d06cf3c41..2e39f590e 100644 --- a/sc2/src/uqm/gendef.c +++ b/sc2/src/uqm/gendef.c @@ -17,26 +17,54 @@ */ #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) { case SOL_DEFINED: - GenFunc = GenerateSOL; - break; + return &generateSolFunctions; case SHOFIXTI_DEFINED: - GenFunc = GenerateShofixti; - break; + return &generateShofixtiFunctions; case START_COLONY_DEFINED: - GenFunc = GenerateColony; - break; + return &generateColonyFunctions; case SPATHI_DEFINED: - GenFunc = GenerateSpathi; - break; + return &generateSpathiFunctions; case MELNORME0_DEFINED: case MELNORME1_DEFINED: case MELNORME2_DEFINED: @@ -46,86 +74,64 @@ GenerateIP (BYTE Index) case MELNORME6_DEFINED: case MELNORME7_DEFINED: case MELNORME8_DEFINED: - GenFunc = GenerateMelnorme; - break; + return &generateMelnormeFunctions; case TALKING_PET_DEFINED: - GenFunc = GenerateTalkingPet; - break; + return &generateTalkingPetFunctions; case CHMMR_DEFINED: - GenFunc = GenerateChmmr; - break; + return &generateChmmrFunctions; case SYREEN_DEFINED: + return &generateSyreenFunctions; case MYCON_TRAP_DEFINED: - GenFunc = GenerateSyreen; - break; + return &generateTrapFunctions; case BURVIXESE_DEFINED: - GenFunc = GenerateBurvixes; - break; + return &generateBurvixeseFunctions; case SLYLANDRO_DEFINED: - GenFunc = GenerateSlylandro; - break; + return &generateSlylandroFunctions; case DRUUGE_DEFINED: - GenFunc = GenerateDruuge; - break; + return &generateDruugeFunctions; case BOMB_DEFINED: case UTWIG_DEFINED: - GenFunc = GenerateUtwig; - break; + return &generateUtwigFunctions; case AQUA_HELIX_DEFINED: case THRADD_DEFINED: - GenFunc = GenerateThradd; - break; + return &generateThraddashFunctions; case SUN_DEVICE_DEFINED: case MYCON_DEFINED: case EGG_CASE0_DEFINED: case EGG_CASE1_DEFINED: case EGG_CASE2_DEFINED: - GenFunc = GenerateMycon; - break; + return &generateMyconFunctions; case ANDROSYNTH_DEFINED: + return &generateAndrosynthFunctions; case TAALO_PROTECTOR_DEFINED: case ORZ_DEFINED: - GenFunc = GenerateOrz; - break; + return &generateOrzFunctions; case SHIP_VAULT_DEFINED: - GenFunc = GenerateShipVault; - break; + return &generateVaultFunctions; case URQUAN_WRECK_DEFINED: - GenFunc = GenerateUrquanWreck; - break; + return &generateWreckFunctions; case MAIDENS_DEFINED: case VUX_BEAST_DEFINED: case VUX_DEFINED: - GenFunc = GenerateVUX; - break; + return &generateVuxFunctions; case SAMATRA_DEFINED: - GenFunc = GenerateSamatra; - break; + return &generateSaMatraFunctions; case ZOQFOT_DEFINED: + return &generateZoqFotPikFunctions; case ZOQ_SCOUT_DEFINED: - GenFunc = GenerateZoqFotPik; - break; + return &generateZoqFotPikScoutFunctions; case YEHAT_DEFINED: - GenFunc = GenerateYehat; - break; + return &generateYehatFunctions; case PKUNK_DEFINED: - GenFunc = GeneratePkunk; - break; + return &generatePkunkFunctions; case SUPOX_DEFINED: - GenFunc = GenerateSupox; - break; + return &generateSupoxFunctions; case RAINBOW_DEFINED: - GenFunc = GenerateRainbow; - break; + return &generateRainbowWorldFunctions; case ILWRATH_DEFINED: - GenFunc = GenerateIlwrath; - break; + return &generateIlwrathFunctions; default: - GenFunc = GenerateRandomIP; - break; + return &generateDefaultFunctions; } - - return (GenFunc); } - diff --git a/sc2/src/uqm/gendef.h b/sc2/src/uqm/gendef.h new file mode 100644 index 000000000..c763130c8 --- /dev/null +++ b/sc2/src/uqm/gendef.h @@ -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 */ + diff --git a/sc2/src/uqm/load.c b/sc2/src/uqm/load.c index ccecdd187..998d26ee7 100644 --- a/sc2/src/uqm/load.c +++ b/sc2/src/uqm/load.c @@ -568,7 +568,8 @@ LoadGame (COUNT which_game, SUMMARY_DESC *SummPtr) LoadRaceQueue (fh, &GLOBAL (avail_race_q)); // 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. if (!(NextActivity & START_INTERPLANETARY)) { diff --git a/sc2/src/uqm/melee.c b/sc2/src/uqm/melee.c index d473c046c..2992fb63e 100644 --- a/sc2/src/uqm/melee.c +++ b/sc2/src/uqm/melee.c @@ -852,6 +852,8 @@ InitMelee (MELEE_STATE *pMS) r.corner.x = r.corner.y = 0; RedrawMeleeFrame (); + + (void) pMS; } static void diff --git a/sc2/src/uqm/planets/Makeinfo b/sc2/src/uqm/planets/Makeinfo index 9c6eea9f9..2a8d1fe48 100644 --- a/sc2/src/uqm/planets/Makeinfo +++ b/sc2/src/uqm/planets/Makeinfo @@ -1,7 +1,4 @@ -uqm_CFILES="calc.c cargo.c devices.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 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 +uqm_SUBDIRS="generate" +uqm_CFILES="calc.c cargo.c devices.c gentopo.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" diff --git a/sc2/src/uqm/planets/genburv.c b/sc2/src/uqm/planets/genburv.c deleted file mode 100644 index 9bbb6d0b2..000000000 --- a/sc2/src/uqm/planets/genburv.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genchmmr.c b/sc2/src/uqm/planets/genchmmr.c deleted file mode 100644 index df3020817..000000000 --- a/sc2/src/uqm/planets/genchmmr.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/gencol.c b/sc2/src/uqm/planets/gencol.c deleted file mode 100644 index 566f200ad..000000000 --- a/sc2/src/uqm/planets/gencol.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/gendru.c b/sc2/src/uqm/planets/gendru.c deleted file mode 100644 index 9571bb5c8..000000000 --- a/sc2/src/uqm/planets/gendru.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/generate.h b/sc2/src/uqm/planets/generate.h new file mode 100644 index 000000000..a6cb0d7a8 --- /dev/null +++ b/sc2/src/uqm/planets/generate.h @@ -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 */ + diff --git a/sc2/src/uqm/planets/generate/Makeinfo b/sc2/src/uqm/planets/generate/Makeinfo new file mode 100644 index 000000000..16dc6fec2 --- /dev/null +++ b/sc2/src/uqm/planets/generate/Makeinfo @@ -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" diff --git a/sc2/src/uqm/planets/genall.h b/sc2/src/uqm/planets/generate/genall.h similarity index 89% rename from sc2/src/uqm/planets/genall.h rename to sc2/src/uqm/planets/generate/genall.h index eb15d2fe0..2175c453d 100644 --- a/sc2/src/uqm/planets/genall.h +++ b/sc2/src/uqm/planets/generate/genall.h @@ -17,11 +17,10 @@ #ifndef _GENALL_H #define _GENALL_H -#include "planets.h" +#include "gendefault.h" +#include "types.h" +#include "../generate.h" #include "libs/compiler.h" -#include "../globdata.h" -#include "../nameref.h" -#include "../resinst.h" #endif /* _GENALL_H */ diff --git a/sc2/src/uqm/planets/generate/genand.c b/sc2/src/uqm/planets/generate/genand.c new file mode 100644 index 000000000..b914c6817 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genand.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genburv.c b/sc2/src/uqm/planets/generate/genburv.c new file mode 100644 index 000000000..423a71921 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genburv.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genchmmr.c b/sc2/src/uqm/planets/generate/genchmmr.c new file mode 100644 index 000000000..f5cf2d516 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genchmmr.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/gencol.c b/sc2/src/uqm/planets/generate/gencol.c new file mode 100644 index 000000000..1f36d861e --- /dev/null +++ b/sc2/src/uqm/planets/generate/gencol.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/gendefault.c b/sc2/src/uqm/planets/generate/gendefault.c new file mode 100644 index 000000000..af7d052d9 --- /dev/null +++ b/sc2/src/uqm/planets/generate/gendefault.c @@ -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); + } +} + + diff --git a/sc2/src/uqm/planets/generate/gendefault.h b/sc2/src/uqm/planets/generate/gendefault.h new file mode 100644 index 000000000..ea2c3fa2a --- /dev/null +++ b/sc2/src/uqm/planets/generate/gendefault.h @@ -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 */ + diff --git a/sc2/src/uqm/planets/generate/gendru.c b/sc2/src/uqm/planets/generate/gendru.c new file mode 100644 index 000000000..6d4b9e008 --- /dev/null +++ b/sc2/src/uqm/planets/generate/gendru.c @@ -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 + + +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; +} + diff --git a/sc2/src/uqm/planets/generate/genilw.c b/sc2/src/uqm/planets/generate/genilw.c new file mode 100644 index 000000000..6f723f021 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genilw.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genmel.c b/sc2/src/uqm/planets/generate/genmel.c new file mode 100644 index 000000000..e2a0b2e15 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genmel.c @@ -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); +} + diff --git a/sc2/src/uqm/planets/generate/genmyc.c b/sc2/src/uqm/planets/generate/genmyc.c new file mode 100644 index 000000000..a8e5ccd1a --- /dev/null +++ b/sc2/src/uqm/planets/generate/genmyc.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genorz.c b/sc2/src/uqm/planets/generate/genorz.c new file mode 100644 index 000000000..1b5fb2642 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genorz.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genpet.c b/sc2/src/uqm/planets/generate/genpet.c new file mode 100644 index 000000000..db1f64502 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genpet.c @@ -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); + } +} + diff --git a/sc2/src/uqm/planets/generate/genpku.c b/sc2/src/uqm/planets/generate/genpku.c new file mode 100644 index 000000000..eb563749f --- /dev/null +++ b/sc2/src/uqm/planets/generate/genpku.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genrain.c b/sc2/src/uqm/planets/generate/genrain.c new file mode 100644 index 000000000..7ea639db4 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genrain.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/gensam.c b/sc2/src/uqm/planets/generate/gensam.c new file mode 100644 index 000000000..d8cb82b72 --- /dev/null +++ b/sc2/src/uqm/planets/generate/gensam.c @@ -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; + } +} + diff --git a/sc2/src/uqm/planets/generate/genshof.c b/sc2/src/uqm/planets/generate/genshof.c new file mode 100644 index 000000000..a9e3ced3c --- /dev/null +++ b/sc2/src/uqm/planets/generate/genshof.c @@ -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); +} + diff --git a/sc2/src/uqm/planets/generate/gensly.c b/sc2/src/uqm/planets/generate/gensly.c new file mode 100644 index 000000000..a7a16b3ed --- /dev/null +++ b/sc2/src/uqm/planets/generate/gensly.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/gensol.c b/sc2/src/uqm/planets/generate/gensol.c new file mode 100644 index 000000000..1cd237ce9 --- /dev/null +++ b/sc2/src/uqm/planets/generate/gensol.c @@ -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); +} + diff --git a/sc2/src/uqm/planets/generate/genspa.c b/sc2/src/uqm/planets/generate/genspa.c new file mode 100644 index 000000000..9c87bcd95 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genspa.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/gensup.c b/sc2/src/uqm/planets/generate/gensup.c new file mode 100644 index 000000000..07e6c95c0 --- /dev/null +++ b/sc2/src/uqm/planets/generate/gensup.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/gensyr.c b/sc2/src/uqm/planets/generate/gensyr.c new file mode 100644 index 000000000..d33526642 --- /dev/null +++ b/sc2/src/uqm/planets/generate/gensyr.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genthrad.c b/sc2/src/uqm/planets/generate/genthrad.c new file mode 100644 index 000000000..57c68aa70 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genthrad.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/gentrap.c b/sc2/src/uqm/planets/generate/gentrap.c new file mode 100644 index 000000000..25e1fdd48 --- /dev/null +++ b/sc2/src/uqm/planets/generate/gentrap.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genutw.c b/sc2/src/uqm/planets/generate/genutw.c new file mode 100644 index 000000000..7d8ed1c11 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genutw.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genvault.c b/sc2/src/uqm/planets/generate/genvault.c new file mode 100644 index 000000000..02c4842ae --- /dev/null +++ b/sc2/src/uqm/planets/generate/genvault.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genvux.c b/sc2/src/uqm/planets/generate/genvux.c new file mode 100644 index 000000000..e3210cfec --- /dev/null +++ b/sc2/src/uqm/planets/generate/genvux.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genwreck.c b/sc2/src/uqm/planets/generate/genwreck.c new file mode 100644 index 000000000..456f43ba4 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genwreck.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genyeh.c b/sc2/src/uqm/planets/generate/genyeh.c new file mode 100644 index 000000000..3337e5b83 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genyeh.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genzfpscout.c b/sc2/src/uqm/planets/generate/genzfpscout.c new file mode 100644 index 000000000..9b40730dc --- /dev/null +++ b/sc2/src/uqm/planets/generate/genzfpscout.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/generate/genzoq.c b/sc2/src/uqm/planets/generate/genzoq.c new file mode 100644 index 000000000..a621664d5 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genzoq.c @@ -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; +} + diff --git a/sc2/src/uqm/planets/genilw.c b/sc2/src/uqm/planets/genilw.c deleted file mode 100644 index 1e06c1623..000000000 --- a/sc2/src/uqm/planets/genilw.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genmel.c b/sc2/src/uqm/planets/genmel.c deleted file mode 100644 index b02a48a01..000000000 --- a/sc2/src/uqm/planets/genmel.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/genmyc.c b/sc2/src/uqm/planets/genmyc.c deleted file mode 100644 index 27264d76d..000000000 --- a/sc2/src/uqm/planets/genmyc.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genorz.c b/sc2/src/uqm/planets/genorz.c deleted file mode 100644 index 0807487cf..000000000 --- a/sc2/src/uqm/planets/genorz.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/genpet.c b/sc2/src/uqm/planets/genpet.c deleted file mode 100644 index f1a85659f..000000000 --- a/sc2/src/uqm/planets/genpet.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genpku.c b/sc2/src/uqm/planets/genpku.c deleted file mode 100644 index 2869492f1..000000000 --- a/sc2/src/uqm/planets/genpku.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genrain.c b/sc2/src/uqm/planets/genrain.c deleted file mode 100644 index 62a859693..000000000 --- a/sc2/src/uqm/planets/genrain.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/gensam.c b/sc2/src/uqm/planets/gensam.c deleted file mode 100644 index e6f8ec253..000000000 --- a/sc2/src/uqm/planets/gensam.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genshof.c b/sc2/src/uqm/planets/genshof.c deleted file mode 100644 index 40b30d4c3..000000000 --- a/sc2/src/uqm/planets/genshof.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/gensly.c b/sc2/src/uqm/planets/gensly.c deleted file mode 100644 index 461b42477..000000000 --- a/sc2/src/uqm/planets/gensly.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/gensol.c b/sc2/src/uqm/planets/gensol.c deleted file mode 100644 index 55976cce8..000000000 --- a/sc2/src/uqm/planets/gensol.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/genspa.c b/sc2/src/uqm/planets/genspa.c deleted file mode 100644 index 5ad25e300..000000000 --- a/sc2/src/uqm/planets/genspa.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/gensup.c b/sc2/src/uqm/planets/gensup.c deleted file mode 100644 index 276745515..000000000 --- a/sc2/src/uqm/planets/gensup.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/gensyr.c b/sc2/src/uqm/planets/gensyr.c deleted file mode 100644 index 694bd5fb6..000000000 --- a/sc2/src/uqm/planets/gensyr.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genthrad.c b/sc2/src/uqm/planets/genthrad.c deleted file mode 100644 index 3b326ffe1..000000000 --- a/sc2/src/uqm/planets/genthrad.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genutw.c b/sc2/src/uqm/planets/genutw.c deleted file mode 100644 index 1d9c8d865..000000000 --- a/sc2/src/uqm/planets/genutw.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/genvault.c b/sc2/src/uqm/planets/genvault.c deleted file mode 100644 index d4007a1a8..000000000 --- a/sc2/src/uqm/planets/genvault.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/genvux.c b/sc2/src/uqm/planets/genvux.c deleted file mode 100644 index e115f96a3..000000000 --- a/sc2/src/uqm/planets/genvux.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genwreck.c b/sc2/src/uqm/planets/genwreck.c deleted file mode 100644 index 08e41dc7a..000000000 --- a/sc2/src/uqm/planets/genwreck.c +++ /dev/null @@ -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; - } -} - - diff --git a/sc2/src/uqm/planets/genyeh.c b/sc2/src/uqm/planets/genyeh.c deleted file mode 100644 index 910b37b5a..000000000 --- a/sc2/src/uqm/planets/genyeh.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/genzoq.c b/sc2/src/uqm/planets/genzoq.c deleted file mode 100644 index d9db2a300..000000000 --- a/sc2/src/uqm/planets/genzoq.c +++ /dev/null @@ -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; - } -} - diff --git a/sc2/src/uqm/planets/lander.c b/sc2/src/uqm/planets/lander.c index 30c630228..2512be674 100644 --- a/sc2/src/uqm/planets/lander.c +++ b/sc2/src/uqm/planets/lander.c @@ -832,7 +832,9 @@ CheckObjectCollision (COUNT index) pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] |= (1L << which_node); pSolarSysState->CurNode = (COUNT)~0; - (*pSolarSysState->GenFunc) ((BYTE)(scan + GENERATE_MINERAL)); + callGenerateForScanType (pSolarSysState, + pSolarSysState->pOrbitalDesc, + &pSolarSysState->CurNode, scan); if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] & (1L << which_node))) diff --git a/sc2/src/uqm/planets/planets.c b/sc2/src/uqm/planets/planets.c index 9db3cfbe5..8ddc05bfb 100644 --- a/sc2/src/uqm/planets/planets.c +++ b/sc2/src/uqm/planets/planets.c @@ -119,7 +119,7 @@ DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode) } // 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) // and when "starmap" is selected from orbit and then cancelled; // 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) { // The "rotate planets" task is not initialised yet. - // This means the call to LoadPlanet is made from a - // GENERATE_ORBITAL case of an IP generation function. + // This means the call to LoadPlanet is made from some + // GenerateFunctions.generateOribital() function. PLANET_DESC *pPlanetDesc; StopMusic (); diff --git a/sc2/src/uqm/planets/planets.h b/sc2/src/uqm/planets/planets.h index 290ae44fe..ee9fc5ff5 100644 --- a/sc2/src/uqm/planets/planets.h +++ b/sc2/src/uqm/planets/planets.h @@ -19,9 +19,6 @@ #ifndef _PLANETS_H #define _PLANETS_H -#include "../menustat.h" -#include "../units.h" - #define END_INTERPLANETARY START_INTERPLANETARY enum @@ -50,33 +47,6 @@ enum #define MAP_WIDTH SIS_SCREEN_WIDTH #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 { BIOLOGICAL_DISASTER = 0, @@ -95,6 +65,7 @@ enum LANDER_RETURNS, LANDER_DESTROYED }; + #define MAX_SCROUNGED 50 /* max lander can hold */ #define SCALE_RADIUS(r) ((r) << 6) @@ -113,7 +84,27 @@ enum #define MIN_MOON_RADIUS 35 #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; @@ -126,27 +117,22 @@ typedef struct planet_desc COUNT NextIndex; STAMP image; - struct planet_desc *pPrevDesc; -} PLANET_DESC; + PLANET_DESC *pPrevDesc; + // The Sun or planet that this world is orbiting around. +}; -typedef struct +struct star_desc { POINT star_pt; - BYTE Type, Index; - BYTE Prefix, Postfix; -} STAR_DESC; - -#define MAX_SUNS 1 -#define MAX_PLANETS 16 -#define MAX_MOONS 4 - -#include "elemdata.h" -#include "plandata.h" -#include "sundata.h" + BYTE Type; + BYTE Index; + BYTE Prefix; + BYTE Postfix; +}; typedef void (*PLAN_GEN_FUNC) (BYTE control); -typedef struct planet_orbit +struct planet_orbit { FRAME TopoZoomFrame; // 4x scaled topo image for planet-side @@ -167,11 +153,11 @@ typedef struct planet_orbit // temp RGBA data for whatever transforms (nuked often) FRAME WorkFrame; // any extra frame workspace (for dynamic objects) -} PLANET_ORBIT; +}; // See doc/devel/generate for information on how this structure is // filled. -typedef struct solarsys_state +struct solarsys_state { MENU_STATE MenuState; @@ -179,12 +165,12 @@ typedef struct solarsys_state PLANET_DESC SunDesc[MAX_SUNS]; PLANET_DESC PlanetDesc[MAX_PLANETS]; // Description of the planets in the system. - // Only defined after a call to GenFunc with GENERATE_PLANETS - // as its argument, and overwritten by subsequent calls. + // Only defined after a call to (*genFuncs)->generatePlanets() + // and overwritten by subsequent calls. PLANET_DESC MoonDesc[MAX_MOONS]; // Description of the moons orbiting the planet pointed to // by pBaseDesc. - // Only defined after a call to GenFunc with GENERATE_MOONS + // Only defined after a call to (*genFuncs)->generateMoons() // as its argument, and overwritten by subsequent calls. PLANET_DESC *pBaseDesc; PLANET_DESC *pOrbitalDesc; @@ -196,8 +182,10 @@ typedef struct solarsys_state // PlanetDesc[PlanetDesc[i].NextIndex] is the next planet // after PlanetDesc[i] in the ordering. - BYTE turn_counter, turn_wait; - BYTE thrust_counter, max_ship_speed; + BYTE turn_counter; + BYTE turn_wait; + BYTE thrust_counter; + BYTE max_ship_speed; STRING XlatRef; STRINGPTR XlatPtr; @@ -206,23 +194,27 @@ typedef struct solarsys_state SYSTEM_INFO SysInfo; COUNT CurNode; - PLAN_GEN_FUNC GenFunc; - // Function to call to fill in various parts of this structure. - // See doc/devel/generate. + const GenerateFunctions *genFuncs; + // Functions to call to fill in various parts of this structure. + // See generate.h, doc/devel/generate FRAME PlanetSideFrame[6]; UWORD Tint_rgb; UBYTE PauseRotate; FRAME TopoFrame; PLANET_ORBIT Orbit; -} SOLARSYS_STATE; +}; extern SOLARSYS_STATE *pSolarSysState; extern MUSIC_REF SpaceMusic; -bool currentWorldIsPlanet (void); -bool currentPlanetIndex (void); -bool currentMoonIndex (void); +bool worldIsPlanet (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world); +bool worldIsMoon (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world); +COUNT planetIndex (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world); +COUNT moonIndex (const SOLARSYS_STATE *solarSys, const PLANET_DESC *moon); +#define MATCH_PLANET ((BYTE) -1) +bool matchWorld (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world, + BYTE planetI, BYTE moonI); extern void LoadPlanet (FRAME SurfDefFrame); 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 DrawStarBackGround (BOOLEAN ForPlanet); extern void XFormIPLoc (POINT *pIn, POINT *pOut, BOOLEAN ToDisplay); -extern void GenerateRandomIP (BYTE control); extern PLAN_GEN_FUNC GenerateIP (BYTE Index); extern void DrawSystem (SIZE radius, BOOLEAN IsInnerSystem); extern void DrawOval (RECT *pRect, BYTE num_off_pixels); diff --git a/sc2/src/uqm/planets/pstarmap.c b/sc2/src/uqm/planets/pstarmap.c index ea2ec52e0..c78a01c06 100644 --- a/sc2/src/uqm/planets/pstarmap.c +++ b/sc2/src/uqm/planets/pstarmap.c @@ -43,6 +43,8 @@ #include "libs/mathlib.h" #include "libs/memlib.h" +#include + static POINT cursorLoc; static POINT mapOrigin; @@ -1026,7 +1028,6 @@ static void DrawMatchedStarName (TEXTENTRY_STATE *pTES) { STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam; - MENU_STATE *pMS = pSS->pMS; UNICODE buf[STAR_SEARCH_BUFSIZE] = ""; SIZE ExPos = 0; SIZE CurPos = -1; @@ -1109,7 +1110,6 @@ static BOOLEAN OnStarNameChange (TEXTENTRY_STATE *pTES) { STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam; - MENU_STATE *pMS = pSS->pMS; COUNT flags; BOOLEAN ret = TRUE; @@ -1154,7 +1154,6 @@ static BOOLEAN OnStarNameFrame (TEXTENTRY_STATE *pTES) { STAR_SEARCH_STATE *pSS = (STAR_SEARCH_STATE *) pTES->CbParam; - MENU_STATE *pMS = pSS->pMS; if (PulsedInputState.menu[KEY_MENU_NEXT]) { // search for next match diff --git a/sc2/src/uqm/planets/scan.c b/sc2/src/uqm/planets/scan.c index 2e13251a6..e3422cf87 100644 --- a/sc2/src/uqm/planets/scan.c +++ b/sc2/src/uqm/planets/scan.c @@ -904,6 +904,27 @@ DrawScannedStuff (COUNT y, BYTE CurState) 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 DoScan (MENU_STATE *pMS) { @@ -1020,7 +1041,9 @@ DoScan (MENU_STATE *pMS) t.CharCount = (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; t.pStr = GAME_STRING (SCAN_STRING_BASE + min_scan); @@ -1243,7 +1266,8 @@ GeneratePlanetSide (void) NUM_SCANDOT_TRANSITIONS * (scan - ENERGY_SCAN)); pSolarSysState->CurNode = (COUNT)~0; - (*pSolarSysState->GenFunc) ((BYTE)(scan + GENERATE_MINERAL)); + callGenerateForScanType (pSolarSysState, + pSolarSysState->pOrbitalDesc, &pSolarSysState->CurNode, scan); num_nodes = pSolarSysState->CurNode; while (num_nodes--) @@ -1262,7 +1286,9 @@ GeneratePlanetSide (void) LockElement (hNodeElement, &NodeElementPtr); 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->playerNr = PS_NON_PLAYER; diff --git a/sc2/src/uqm/planets/scan.h b/sc2/src/uqm/planets/scan.h index fc035c947..43cedac38 100644 --- a/sc2/src/uqm/planets/scan.h +++ b/sc2/src/uqm/planets/scan.h @@ -19,28 +19,34 @@ #ifndef _SCAN_H #define _SCAN_H +typedef struct scan_desc SCAN_DESC; +typedef struct scan_block SCAN_BLOCK; + #include "libs/compiler.h" #include "libs/gfxlib.h" +#include "planets.h" -typedef struct +struct scan_desc { POINT start; COUNT start_dot; COUNT num_dots; COUNT dots_per_semi; -} SCAN_DESC; +}; -typedef struct +struct scan_block { POINT *line_base; COUNT num_scans; COUNT num_same_scans; SCAN_DESC *scan_base; -} SCAN_BLOCK; +}; extern void RepairBackRect (RECT *pRect); extern void GeneratePlanetSide (void); +extern bool callGenerateForScanType (SOLARSYS_STATE *solarSys, + PLANET_DESC *world, COUNT *node, BYTE scanType); extern void RedrawSurfaceScan (const POINT *newLoc); diff --git a/sc2/src/uqm/planets/solarsys.c b/sc2/src/uqm/planets/solarsys.c index ced8acc9f..1381c2fda 100644 --- a/sc2/src/uqm/planets/solarsys.c +++ b/sc2/src/uqm/planets/solarsys.c @@ -24,6 +24,7 @@ #include "../encount.h" #include "../races.h" #include "../gamestr.h" +#include "../gendef.h" #include "../globdata.h" #include "../sis.h" #include "../init.h" @@ -47,7 +48,10 @@ SOLARSYS_STATE *pSolarSysState; -FRAME SISIPFrame, SunFrame, OrbitalFrame, SpaceJunkFrame; +FRAME SISIPFrame; +FRAME SunFrame; +FRAME OrbitalFrame; +FRAME SpaceJunkFrame; COLORMAP OrbitalCMap; COLORMAP SunCMap; MUSIC_REF SpaceMusic; @@ -71,73 +75,61 @@ BYTE draw_sys_flags = DRAW_STARS | DRAW_PLANETS | DRAW_ORBITS bool -currentWorldIsPlanet (void) { - return pSolarSysState->pOrbitalDesc->pPrevDesc == pSolarSysState->SunDesc; -} - -bool -currentPlanetIndex (void) { - return (currentWorldIsPlanet ()) ? - (pSolarSysState->pOrbitalDesc - pSolarSysState->PlanetDesc) : - pSolarSysState->pOrbitalDesc->pPrevDesc - - pSolarSysState->PlanetDesc; -} - -bool -currentMoonIndex (void) { - assert (!currentWorldIsPlanet ()); - return (pSolarSysState->pOrbitalDesc - pSolarSysState->MoonDesc); -} - -// NB. This function modifies the RNG state. -static void -GeneratePlanets (SOLARSYS_STATE *system) +worldIsPlanet (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world) { - COUNT i; - PLANET_DESC *planet; + return world->pPrevDesc == solarSys->SunDesc; +} - for (i = system->SunDesc[0].NumPlanets, - planet = &system->PlanetDesc[0]; i; --i, ++planet) +bool +worldIsMoon (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world) +{ + return world->pPrevDesc != solarSys->SunDesc; +} + +// 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 +matchWorld (const SOLARSYS_STATE *solarSys, const PLANET_DESC *world, + BYTE planetI, BYTE moonI) +{ + // Check whether we have the right planet. + if (planetIndex (solarSys, world) != planetI) + return false; + + if (moonI == MATCH_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; + // 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; + } + + return true; } static void @@ -159,8 +151,8 @@ GenerateMoons (void) pCurDesc = pSolarSysState->pBaseDesc; old_seed = TFB_SeedRandom (pCurDesc->rand_seed); - (*pSolarSysState->GenFunc) (GENERATE_NAME); - (*pSolarSysState->GenFunc) (GENERATE_MOONS); + (*pSolarSysState->genFuncs->generateName) (pSolarSysState, pCurDesc); + (*pSolarSysState->genFuncs->generateMoons) (pSolarSysState, pCurDesc); facing = NORMALIZE_FACING (ANGLE_TO_FACING ( ARCTAN (pCurDesc->location.x, pCurDesc->location.y))); @@ -286,7 +278,8 @@ sortPlanetPositions (void) static void initSolarSysSISCharacteristics (void) { - BYTE i, num_thrusters; + BYTE i; + BYTE num_thrusters; num_thrusters = 0; for (i = 0; i < NUM_DRIVE_SLOTS; ++i) @@ -348,7 +341,7 @@ LoadSolarSys (void) pCurDesc->image.origin = pCurDesc->location; pCurDesc->image.frame = SunFrame; - (*pSolarSysState->GenFunc) (GENERATE_PLANETS); + (*pSolarSysState->genFuncs->generatePlanets) (pSolarSysState); if (GET_GAME_STATE (PLANETARY_CHANGE)) { PutPlanetInfo (); @@ -1426,7 +1419,8 @@ StartGroups: } GetPlanetInfo (); - (*pSolarSysState->GenFunc) (GENERATE_ORBITAL); + (*pSolarSysState->genFuncs->generateOrbital) (pSolarSysState, + pSolarSysState->pOrbitalDesc); LastActivity &= ~(CHECK_LOAD | CHECK_RESTART); if ((GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD | START_ENCOUNTER)) || GLOBAL_SIS (CrewEnlisted) == (COUNT)~0 @@ -1435,8 +1429,8 @@ StartGroups: if (pSolarSysState->MenuState.flash_task == 0) { - /* Note! This implies that our GenFunc was a - conversation; that is, that this is a homeworld */ + /* Note! This implies that our generateOrbital function started + a conversation; that is, that this is a homeworld */ SetTransitionSource (NULL); LoadSolarSys (); ValidateOrbits (); @@ -1490,7 +1484,7 @@ InitSolarSys (void) if (Reentry) { - (*pSolarSysState->GenFunc) (REINIT_NPCS); + (*pSolarSysState->genFuncs->reinitNpcs) (); } else { @@ -1499,7 +1493,7 @@ InitSolarSys (void) GLOBAL (BattleGroupRef) = 0; ReinitQueue (&GLOBAL (ip_group_q)); ReinitQueue (&GLOBAL (npc_built_ship_q)); - (*pSolarSysState->GenFunc) (INIT_NPCS); + (*pSolarSysState->genFuncs->initNpcs) (); } if (pSolarSysState->MenuState.Initialized == 0) @@ -1569,7 +1563,7 @@ endInterPlanetary (void) { // These are game state changing ops and so cannot be // called once another game has been loaded! - (*pSolarSysState->GenFunc) (UNINIT_NPCS); + (*pSolarSysState->genFuncs->uninitNpcs) (); SET_GAME_STATE (USED_BROADCASTER, 0); } } @@ -1629,140 +1623,8 @@ UninitSolarSys (void) pSolarSysState->pBaseDesc = closestPlanetInterPlanetary (&GLOBAL (ShipStamp.origin)); - (*pSolarSysState->GenFunc) (GENERATE_NAME); - } - } -} - -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; + (*pSolarSysState->genFuncs->generateName) ( + pSolarSysState, pSolarSysState->pBaseDesc); } } } @@ -2031,7 +1893,7 @@ ExploreSolarSys (void) memset (pSolarSysState, 0, sizeof (*pSolarSysState)); - SolarSysState.GenFunc = GenerateIP (CurStarDescPtr->Index); + SolarSysState.genFuncs = getGenerateFunctions (CurStarDescPtr->Index); InitSolarSys (); SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT); diff --git a/sc2/src/uqm/save.c b/sc2/src/uqm/save.c index 9823b5b1a..2e60eb612 100644 --- a/sc2/src/uqm/save.c +++ b/sc2/src/uqm/save.c @@ -688,7 +688,8 @@ RetrySave: SaveRaceQueue (fh, &GLOBAL (avail_race_q)); // 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. if (!(GLOBAL (CurrentActivity) & START_INTERPLANETARY)) { diff --git a/sc2/src/uqm/uqmdebug.c b/sc2/src/uqm/uqmdebug.c index f8632a6c7..8508f200c 100644 --- a/sc2/src/uqm/uqmdebug.c +++ b/sc2/src/uqm/uqmdebug.c @@ -28,6 +28,7 @@ #include "status.h" #include "gamestr.h" #include "gameev.h" +#include "gendef.h" #include "globdata.h" #include "planets/lifeform.h" #include "races.h" @@ -635,10 +636,10 @@ starRecurse (STAR_DESC *star, void *arg) SolarSysState.SunDesc[0].location.x = 0; SolarSysState.SunDesc[0].location.y = 0; //SolarSysState.SunDesc[0].radius = MIN_ZOOM_RADIUS; - SolarSysState.GenFunc = GenerateIP (star->Index); + SolarSysState.genFuncs = getGenerateFunctions (star->Index); pSolarSysState = &SolarSysState; - (*pSolarSysState->GenFunc) (GENERATE_PLANETS); + (*SolarSysState.genFuncs->generatePlanets) (&SolarSysState); if (universeRecurseArg->systemFuncPre != NULL) { @@ -666,8 +667,8 @@ starRecurse (STAR_DESC *star, void *arg) } static void -planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system, - PLANET_DESC *planet, void *arg) +planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system, PLANET_DESC *planet, + void *arg) { UniverseRecurseArg *universeRecurseArg = (UniverseRecurseArg *) arg; @@ -681,10 +682,10 @@ planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system, { system->pOrbitalDesc = planet; DoPlanetaryAnalysis (&system->SysInfo, planet); - // When GenerateRandomIP is used as GenFunc, - // GENERATE_ORBITAL will also call DoPlanetaryAnalysis, - // but with other GenFuncs this is not guaranteed. - (*system->GenFunc) (GENERATE_ORBITAL); + // When GenerateDefaultFunctions is used as genFuncs, + // generateOrbital will also call DoPlanetaryAnalysis, + // but with other GenerateFunctions this is not guaranteed. + (*system->genFuncs->generateOrbital) (system, planet); (*universeRecurseArg->planetFuncPre) ( planet, universeRecurseArg->arg); } @@ -693,7 +694,7 @@ planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system, { DWORD oldSeed = TFB_SeedRandom (planet->rand_seed); - (*system->GenFunc) (GENERATE_MOONS); + (*system->genFuncs->generateMoons) (system, planet); forAllMoons (star, system, planet, moonRecurse, (void *) universeRecurseArg); @@ -705,10 +706,10 @@ planetRecurse (STAR_DESC *star, SOLARSYS_STATE *system, { system->pOrbitalDesc = planet; DoPlanetaryAnalysis (&system->SysInfo, planet); - // When GenerateRandomIP is used as GenFunc, - // GENERATE_ORBITAL will also call DoPlanetaryAnalysis, - // but with other GenFuncs this is not guaranteed. - (*system->GenFunc) (GENERATE_ORBITAL); + // When GenerateDefaultFunctions is used as genFuncs, + // generateOrbital will also call DoPlanetaryAnalysis, + // but with other GenerateFunctions this is not guaranteed. + (*system->genFuncs->generateOrbital) (system, planet); (*universeRecurseArg->planetFuncPost) ( planet, universeRecurseArg->arg); } @@ -730,10 +731,10 @@ moonRecurse (STAR_DESC *star, SOLARSYS_STATE *system, PLANET_DESC *planet, { system->pOrbitalDesc = moon; DoPlanetaryAnalysis (&system->SysInfo, moon); - // When GenerateRandomIP is used as GenFunc, - // GENERATE_ORBITAL will also call DoPlanetaryAnalysis, - // but with other GenFuncs this is not guaranteed. - (*system->GenFunc) (GENERATE_ORBITAL); + // When GenerateDefaultFunctions is used as genFuncs, + // generateOrbital will also call DoPlanetaryAnalysis, + // but with other GenerateFunctions this is not guaranteed. + (*system->genFuncs->generateOrbital) (system, moon); (*universeRecurseArg->moonFunc) ( moon, universeRecurseArg->arg); } @@ -974,7 +975,8 @@ dumpPlanetCallback (const PLANET_DESC *planet, void *arg) void 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), planetTypeString (planet->data_index & ~PLANET_SHIELDED)); dumpWorld (out, planet); @@ -1053,17 +1055,19 @@ calculateBioValue (const SOLARSYS_STATE *system, const PLANET_DESC *world) COUNT numBio; COUNT i; - assert(system->pOrbitalDesc == world); + assert (system->pOrbitalDesc == world); ((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; result = 0; for (i = 0; i < numBio; 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[ system->SysInfo.PlanetInfo.CurType].ValueAndHitPoints); } @@ -1071,16 +1075,17 @@ calculateBioValue (const SOLARSYS_STATE *system, const PLANET_DESC *world) } void -generateBioIndex(const SOLARSYS_STATE *system, - const PLANET_DESC *world, COUNT bio[]) +generateBioIndex(const SOLARSYS_STATE *system, const PLANET_DESC *world, + COUNT bio[]) { COUNT numBio; COUNT i; - assert(system->pOrbitalDesc == world); + assert (system->pOrbitalDesc == world); ((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; for (i = 0; i < NUM_CREATURE_TYPES + NUM_SPECIAL_CREATURE_TYPES; i++) @@ -1089,30 +1094,32 @@ generateBioIndex(const SOLARSYS_STATE *system, for (i = 0; i < numBio; 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]++; } } COUNT -calculateMineralValue (const SOLARSYS_STATE *system, - const PLANET_DESC *world) +calculateMineralValue (const SOLARSYS_STATE *system, const PLANET_DESC *world) { COUNT result; COUNT numDeposits; COUNT i; - assert(system->pOrbitalDesc == world); + assert (system->pOrbitalDesc == world); ((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; result = 0; for (i = 0; i < numDeposits; 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) * GLOBAL (ElementWorth[ElementCategory ( system->SysInfo.PlanetInfo.CurType)]); @@ -1121,16 +1128,17 @@ calculateMineralValue (const SOLARSYS_STATE *system, } void -generateMineralIndex(const SOLARSYS_STATE *system, - const PLANET_DESC *world, COUNT minerals[]) +generateMineralIndex(const SOLARSYS_STATE *system, const PLANET_DESC *world, + COUNT minerals[]) { COUNT numDeposits; COUNT i; - assert(system->pOrbitalDesc == world); + assert (system->pOrbitalDesc == world); ((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; for (i = 0; i < NUM_ELEMENT_CATEGORIES; i++) @@ -1139,7 +1147,8 @@ generateMineralIndex(const SOLARSYS_STATE *system, for (i = 0; i < numDeposits; 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)] += HIBYTE (system->SysInfo.PlanetInfo.CurDensity); } diff --git a/sc2/src/uqmversion.h b/sc2/src/uqmversion.h index 6953d4cf5..fe12d49ec 100644 --- a/sc2/src/uqmversion.h +++ b/sc2/src/uqmversion.h @@ -21,8 +21,8 @@ #define UQM_MAJOR_VERSION_S "0" #define UQM_MINOR_VERSION 6 #define UQM_MINOR_VERSION_S "6" -#define UQM_PATCH_VERSION 7 -#define UQM_PATCH_VERSION_S "7" +#define UQM_PATCH_VERSION 8 +#define UQM_PATCH_VERSION_S "8" #define UQM_EXTRA_VERSION "" /* The final version is interpreted as: * printf ("%d.%d.%d%s", UQM_MAJOR_VERSION, UQM_MINOR_VERSION,