Energy and some bio generation code refactoring: generation funcs perform all action neccessary upon energy node pickup, Fwiffo hacks removed, duplicated code made into funcs; fixes bugs 1118/1028

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3583 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2011-04-23 20:59:25 +00:00
parent c74faa3b1c
commit fe993fd752
28 changed files with 308 additions and 307 deletions
+1
View File
@@ -1,4 +1,5 @@
Changes towards version 0.7: Changes towards version 0.7:
- Fixed Syreen Vault lander report infinite loop (bug #1118) - Alex
- Same captain names are used on both net sides (bug #989) - Alex - Same captain names are used on both net sides (bug #989) - Alex
- Fixed sync loss in netplay games having duplicate ships (bug #1081) - Alex - Fixed sync loss in netplay games having duplicate ships (bug #1081) - Alex
- Fixed loading of melee.cfg (bug #1099) - Alex - Fixed loading of melee.cfg (bug #1099) - Alex
+19 -33
View File
@@ -120,45 +120,31 @@ GenerateAndrosynth_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world
return true; return true;
} }
static bool
onRuinPickedUp (SOLARSYS_STATE *solarSys, COUNT whichNode)
{
PLANET_INFO *planetInfo = &solarSys->SysInfo.PlanetInfo;
// Ruins previously visited are marked in the upper 16 bits
if (isNodeRetrieved (planetInfo, ENERGY_SCAN, whichNode + 16))
return false; // already visited this ruin before, no report
setNodeRetrieved (planetInfo, ENERGY_SCAN, whichNode + 16);
// We set the retrieved bit manually here and need to indicate
// the change to the solar system state functions
SET_GAME_STATE (PLANETARY_CHANGE, 1);
return true; // give whatever report is next
}
static bool static bool
GenerateAndrosynth_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, GenerateAndrosynth_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode) COUNT *whichNode)
{ {
if (matchWorld (solarSys, world, 1, MATCH_PLANET)) if (matchWorld (solarSys, world, 1, MATCH_PLANET))
{ {
COUNT i; GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, onRuinPickedUp);
GenerateRandomRuins (&solarSys->SysInfo, 0, whichNode);
for (i = 0; i < 16; ++i)
{
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i))
{
// Retrieval status is cleared to keep the node on the map
setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i);
// Ruins previously visited are marked in the upper 16 bits
if (!isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN,
i + 16))
{
SET_GAME_STATE (PLANETARY_CHANGE, 1);
setNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN,
i + 16);
if (solarSys->SysInfo.PlanetInfo.DiscoveryString)
{
UnbatchGraphics ();
DoDiscoveryReport (MenuSounds);
BatchGraphics ();
// Advance to the next report
solarSys->SysInfo.PlanetInfo.DiscoveryString =
SetRelStringTableIndex (
solarSys->SysInfo.PlanetInfo.DiscoveryString,
1);
}
}
}
}
return true; return true;
} }
+7 -12
View File
@@ -17,6 +17,7 @@
*/ */
#include "genall.h" #include "genall.h"
#include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h" #include "../scan.h"
#include "../../globdata.h" #include "../../globdata.h"
@@ -139,11 +140,10 @@ static bool
GenerateBurvixese_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, GenerateBurvixese_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode) COUNT *whichNode)
{ {
DWORD old_rand;
if (matchWorld (solarSys, world, 0, MATCH_PLANET)) if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
@@ -155,22 +155,17 @@ GenerateBurvixese_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
return true; return true;
} }
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
SET_GAME_STATE (BURVIXESE_BROADCASTERS, 1); SET_GAME_STATE (BURVIXESE_BROADCASTERS, 1);
SET_GAME_STATE (BURV_BROADCASTERS_ON_SHIP, 1); SET_GAME_STATE (BURV_BROADCASTERS_ON_SHIP, 1);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
+96
View File
@@ -16,12 +16,15 @@
#include "genall.h" #include "genall.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h"
#include "../lander.h"
#include "../../encount.h" #include "../../encount.h"
#include "../../gamestr.h" #include "../../gamestr.h"
#include "../../globdata.h" #include "../../globdata.h"
#include "../../grpinfo.h" #include "../../grpinfo.h"
#include "../../races.h" #include "../../races.h"
#include "../../state.h" #include "../../state.h"
#include "../../sounds.h"
#include "libs/mathlib.h" #include "libs/mathlib.h"
@@ -191,6 +194,99 @@ GenerateDefault_generateLife (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
return true; return true;
} }
bool
GenerateDefault_generateArtifact (SOLARSYS_STATE *solarSys, COUNT *whichNode)
{
// Generate an energy node at a random location
GenerateRandomNodes (&solarSys->SysInfo, ENERGY_SCAN, 1, 0, whichNode);
return true;
}
bool
GenerateDefault_generateRuins (SOLARSYS_STATE *solarSys, COUNT *whichNode)
{
// Generate a standard spread of city ruins of a destroyed civilization
GenerateRandomNodes (&solarSys->SysInfo, ENERGY_SCAN, NUM_RACE_RUINS,
0, whichNode);
return true;
}
bool
GenerateDefault_pickupRuins (SOLARSYS_STATE *solarSys,
PickupRuinCallback callback)
{
PLANET_INFO *planetInfo = &solarSys->SysInfo.PlanetInfo;
COUNT i;
for (i = 0; i < NUM_RACE_RUINS; ++i)
{
if (!isNodeRetrieved (planetInfo, ENERGY_SCAN, i))
continue;
// Retrieval status is cleared to keep the node on the map
setNodeNotRetrieved (planetInfo, ENERGY_SCAN, i);
if (callback && !callback (solarSys, i))
continue; // no lander report wanted
// Some ruins have more than one lander report, like when
// you fish artifacts out of the ruins.
GenerateDefault_landerReportCycle (solarSys);
}
return true;
}
static inline void
runLanderReport (void)
{
UnbatchGraphics ();
DoDiscoveryReport (MenuSounds);
BatchGraphics ();
}
bool
GenerateDefault_landerReport (SOLARSYS_STATE *solarSys)
{
PLANET_INFO *planetInfo = &solarSys->SysInfo.PlanetInfo;
if (!planetInfo->DiscoveryString)
return false;
runLanderReport ();
// XXX: A non-cycling report is given only once and has to be deleted
// in some circumstances (like the Syreen Vault). It does not
// hurt to simply delete it in all cases. Nothing should rely on
// the presence of DiscoveryString, but the Syreen Vault and the
// Mycon Egg Cases rely on its absence.
DestroyStringTable (ReleaseStringTable (planetInfo->DiscoveryString));
planetInfo->DiscoveryString = 0;
return true;
}
bool
GenerateDefault_landerReportCycle (SOLARSYS_STATE *solarSys)
{
PLANET_INFO *planetInfo = &solarSys->SysInfo.PlanetInfo;
if (!planetInfo->DiscoveryString)
return false;
runLanderReport ();
// Advance to the next report
planetInfo->DiscoveryString = SetRelStringTableIndex (
planetInfo->DiscoveryString, 1);
// If our discovery strings have cycled, we're done
if (GetStringTableIndex (planetInfo->DiscoveryString) == 0)
{
DestroyStringTable (ReleaseStringTable (planetInfo->DiscoveryString));
planetInfo->DiscoveryString = 0;
}
return true;
}
// NB. This function modifies the RNG state. // NB. This function modifies the RNG state.
static void static void
+11
View File
@@ -38,6 +38,17 @@ bool GenerateDefault_generateEnergy (SOLARSYS_STATE *solarSys,
bool GenerateDefault_generateLife (SOLARSYS_STATE *solarSys, bool GenerateDefault_generateLife (SOLARSYS_STATE *solarSys,
PLANET_DESC *world, COUNT *whichNode); PLANET_DESC *world, COUNT *whichNode);
// Ruin callback returns 'true' if a lander report should be given
typedef bool (*PickupRuinCallback)(SOLARSYS_STATE *solarSys,
COUNT whichNode);
bool GenerateDefault_generateArtifact (SOLARSYS_STATE *, COUNT *whichNode);
bool GenerateDefault_generateRuins (SOLARSYS_STATE *, COUNT *whichNode);
bool GenerateDefault_pickupRuins (SOLARSYS_STATE *, PickupRuinCallback);
bool GenerateDefault_landerReport (SOLARSYS_STATE *);
bool GenerateDefault_landerReportCycle (SOLARSYS_STATE *);
extern const GenerateFunctions generateDefaultFunctions; extern const GenerateFunctions generateDefaultFunctions;
#endif /* GENDEFAULT_H */ #endif /* GENDEFAULT_H */
+17 -20
View File
@@ -19,7 +19,6 @@
#include "genall.h" #include "genall.h"
#include "../lander.h" #include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h"
#include "../../build.h" #include "../../build.h"
#include "../../comm.h" #include "../../comm.h"
#include "../../globdata.h" #include "../../globdata.h"
@@ -114,11 +113,13 @@ GenerateDruuge_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
CaptureStringTable ( CaptureStringTable (
LoadStringTable (DRUUGE_RUINS_STRTAB)); LoadStringTable (DRUUGE_RUINS_STRTAB));
if (GET_GAME_STATE (ROSY_SPHERE)) if (GET_GAME_STATE (ROSY_SPHERE))
{ // Already picked up Rosy Sphere, skip the report
solarSys->SysInfo.PlanetInfo.DiscoveryString = solarSys->SysInfo.PlanetInfo.DiscoveryString =
SetAbsStringTableIndex ( SetAbsStringTableIndex (
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1); solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
} }
} }
}
GenerateDefault_generateOrbital (solarSys, world); GenerateDefault_generateOrbital (solarSys, world);
@@ -126,34 +127,30 @@ GenerateDruuge_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
} }
static bool static bool
GenerateDruuge_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, onRuinPickedUp (SOLARSYS_STATE *solarSys, COUNT whichNode)
COUNT *whichNode)
{ {
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{
COUNT i;
COUNT type;
type = GET_GAME_STATE (ROSY_SPHERE) ? 1 : 0;
GenerateRandomRuins (&solarSys->SysInfo, type, whichNode);
for (i = 0; i < 16; ++i)
{
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i))
{
// Retrieval status is cleared to keep the node on the map
setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i);
if (!GET_GAME_STATE (ROSY_SPHERE)) if (!GET_GAME_STATE (ROSY_SPHERE))
{ { // Just picked up the Rosy Sphere from a ruin
SetLanderTakeoff (); SetLanderTakeoff ();
SET_GAME_STATE (ROSY_SPHERE, 1); SET_GAME_STATE (ROSY_SPHERE, 1);
SET_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1); SET_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1);
} }
}
(void) solarSys;
(void) whichNode;
return true; // give whatever report is next
} }
static bool
GenerateDruuge_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode)
{
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{
GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, onRuinPickedUp);
return true; return true;
} }
+2 -1
View File
@@ -123,7 +123,8 @@ GenerateIlwrath_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
if (matchWorld (solarSys, world, 0, MATCH_PLANET)) if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
+9 -20
View File
@@ -17,6 +17,7 @@
*/ */
#include "genall.h" #include "genall.h"
#include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h" #include "../scan.h"
#include "../../build.h" #include "../../build.h"
@@ -185,8 +186,6 @@ static bool
GenerateMycon_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, GenerateMycon_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode) COUNT *whichNode)
{ {
DWORD old_rand;
if (CurStarDescPtr->Index == SUN_DEVICE_DEFINED if (CurStarDescPtr->Index == SUN_DEVICE_DEFINED
&& matchWorld (solarSys, world, 0, MATCH_PLANET)) && matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
@@ -196,23 +195,18 @@ GenerateMycon_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
return true; return true;
} }
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
SET_GAME_STATE (SUN_DEVICE, 1); SET_GAME_STATE (SUN_DEVICE, 1);
SET_GAME_STATE (SUN_DEVICE_ON_SHIP, 1); SET_GAME_STATE (SUN_DEVICE_ON_SHIP, 1);
SET_GAME_STATE (MYCON_VISITS, 0); SET_GAME_STATE (MYCON_VISITS, 0);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
@@ -230,14 +224,7 @@ GenerateMycon_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
return true; return true;
} }
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
@@ -253,9 +240,11 @@ GenerateMycon_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
SET_GAME_STATE (EGG_CASE2_ON_SHIP, 1); SET_GAME_STATE (EGG_CASE2_ON_SHIP, 1);
break; break;
} }
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
+7 -12
View File
@@ -17,6 +17,7 @@
*/ */
#include "genall.h" #include "genall.h"
#include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h" #include "../scan.h"
#include "../../build.h" #include "../../build.h"
@@ -165,8 +166,6 @@ static bool
GenerateOrz_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, GenerateOrz_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode) COUNT *whichNode)
{ {
DWORD old_rand;
if (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED if (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED
&& matchWorld (solarSys, world, 1, 2)) && matchWorld (solarSys, world, 1, 2))
{ {
@@ -176,29 +175,25 @@ GenerateOrz_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
return true; return true;
} }
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
SET_GAME_STATE (TAALO_PROTECTOR, 1); SET_GAME_STATE (TAALO_PROTECTOR, 1);
SET_GAME_STATE (TAALO_PROTECTOR_ON_SHIP, 1); SET_GAME_STATE (TAALO_PROTECTOR_ON_SHIP, 1);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
if (CurStarDescPtr->Index == ORZ_DEFINED if (CurStarDescPtr->Index == ORZ_DEFINED
&& matchWorld (solarSys, world, 0, MATCH_PLANET)) && matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
+2 -1
View File
@@ -160,7 +160,8 @@ GenerateTalkingPet_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
if (matchWorld (solarSys, world, 0, MATCH_PLANET)) if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
+17 -20
View File
@@ -19,7 +19,6 @@
#include "genall.h" #include "genall.h"
#include "../lander.h" #include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h"
#include "../../build.h" #include "../../build.h"
#include "../../comm.h" #include "../../comm.h"
#include "../../globdata.h" #include "../../globdata.h"
@@ -105,45 +104,43 @@ GeneratePkunk_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
solarSys->SysInfo.PlanetInfo.DiscoveryString = solarSys->SysInfo.PlanetInfo.DiscoveryString =
CaptureStringTable (LoadStringTable (PKUNK_RUINS_STRTAB)); CaptureStringTable (LoadStringTable (PKUNK_RUINS_STRTAB));
if (GET_GAME_STATE (CLEAR_SPINDLE)) if (GET_GAME_STATE (CLEAR_SPINDLE))
{ // Already picked up the Clear Spindle, skip the report
solarSys->SysInfo.PlanetInfo.DiscoveryString = solarSys->SysInfo.PlanetInfo.DiscoveryString =
SetAbsStringTableIndex ( SetAbsStringTableIndex (
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1); solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
} }
} }
}
GenerateDefault_generateOrbital (solarSys, world); GenerateDefault_generateOrbital (solarSys, world);
return true; return true;
} }
static bool static bool
GeneratePkunk_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, onRuinPickedUp (SOLARSYS_STATE *solarSys, COUNT whichNode)
COUNT *whichNode)
{ {
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{
COUNT i;
COUNT type;
type = GET_GAME_STATE (CLEAR_SPINDLE) ? 1 : 0;
GenerateRandomRuins (&solarSys->SysInfo, type, whichNode);
for (i = 0; i < 16; ++i)
{
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i))
{
// Retrieval status is cleared to keep the node on the map
setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i);
if (!GET_GAME_STATE (CLEAR_SPINDLE)) if (!GET_GAME_STATE (CLEAR_SPINDLE))
{ { // Just picked up the Clear Spindle from a ruin
SetLanderTakeoff (); SetLanderTakeoff ();
SET_GAME_STATE (CLEAR_SPINDLE, 1); SET_GAME_STATE (CLEAR_SPINDLE, 1);
SET_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1); SET_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1);
} }
}
(void) solarSys;
(void) whichNode;
return true; // give whatever report is next
} }
static bool
GeneratePkunk_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode)
{
if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{
GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, onRuinPickedUp);
return true; return true;
} }
+12 -6
View File
@@ -524,18 +524,23 @@ GenerateSol_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
solarSys->SysInfo.PlanetInfo.CurPt.x = 20; solarSys->SysInfo.PlanetInfo.CurPt.x = 20;
solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT - 8; solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT - 8;
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 2;
*whichNode = 1; // only matters when count is requested *whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ { // Ran into Fwiffo on Pluto
SET_GAME_STATE (FOUND_PLUTO_SPATHI, 1);
// Retrieval status is cleared to keep the node on the map // Retrieval status is cleared to keep the node on the map
// while the lander is taking off. FOUND_PLUTO_SPATHI bit // while the lander is taking off. FOUND_PLUTO_SPATHI bit
// will keep the node from showing up on subsequent visits. // will keep the node from showing up on subsequent visits.
setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0); setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0);
#define FWIFFO_FRAGS 8
if (!KillLanderCrewSeq (FWIFFO_FRAGS, ONE_SECOND / 20))
return true; // lander probably died
SET_GAME_STATE (FOUND_PLUTO_SPATHI, 1);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff (); SetLanderTakeoff ();
} }
@@ -553,8 +558,6 @@ GenerateSol_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
solarSys->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH * 3 / 4; solarSys->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH * 3 / 4;
solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 1 / 4; solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 1 / 4;
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested *whichNode = 1; // only matters when count is requested
@@ -562,6 +565,9 @@ GenerateSol_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
SET_GAME_STATE (MOONBASE_DESTROYED, 1); SET_GAME_STATE (MOONBASE_DESTROYED, 1);
SET_GAME_STATE (MOONBASE_ON_SHIP, 1); SET_GAME_STATE (MOONBASE_ON_SHIP, 1);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
return true; return true;
+5 -11
View File
@@ -18,6 +18,7 @@
#include "genall.h" #include "genall.h"
#include "../lifeform.h" #include "../lifeform.h"
#include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h" #include "../scan.h"
#include "../../build.h" #include "../../build.h"
@@ -196,30 +197,23 @@ GenerateSpathi_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
if (matchWorld (solarSys, world, 0, 0)) if (matchWorld (solarSys, world, 0, 0))
{ {
DWORD old_rand;
if (GET_GAME_STATE (UMGAH_BROADCASTERS)) if (GET_GAME_STATE (UMGAH_BROADCASTERS))
{ // already picked up { // already picked up
*whichNode = 0; *whichNode = 0;
return true; return true;
} }
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
SET_GAME_STATE (UMGAH_BROADCASTERS, 1); SET_GAME_STATE (UMGAH_BROADCASTERS, 1);
SET_GAME_STATE (UMGAH_BROADCASTERS_ON_SHIP, 1); SET_GAME_STATE (UMGAH_BROADCASTERS_ON_SHIP, 1);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
+20 -25
View File
@@ -19,7 +19,6 @@
#include "genall.h" #include "genall.h"
#include "../lander.h" #include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h"
#include "../../build.h" #include "../../build.h"
#include "../../comm.h" #include "../../comm.h"
#include "../../globdata.h" #include "../../globdata.h"
@@ -104,8 +103,8 @@ GenerateSupox_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM)); CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
solarSys->SysInfo.PlanetInfo.DiscoveryString = solarSys->SysInfo.PlanetInfo.DiscoveryString =
CaptureStringTable (LoadStringTable (RUINS_STRTAB)); CaptureStringTable (LoadStringTable (RUINS_STRTAB));
if (!GET_GAME_STATE (ULTRON_CONDITION)) if (GET_GAME_STATE (ULTRON_CONDITION))
{ { // Already picked up the Ultron, skip the report
solarSys->SysInfo.PlanetInfo.DiscoveryString = solarSys->SysInfo.PlanetInfo.DiscoveryString =
SetAbsStringTableIndex ( SetAbsStringTableIndex (
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1); solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
@@ -118,34 +117,30 @@ GenerateSupox_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
return true; return true;
} }
static bool
onRuinPickedUp (SOLARSYS_STATE *solarSys, COUNT whichNode)
{
if (!GET_GAME_STATE (ULTRON_CONDITION))
{ // Just picked up the Ultron from a ruin
SetLanderTakeoff ();
SET_GAME_STATE (ULTRON_CONDITION, 1);
}
(void) solarSys;
(void) whichNode;
return true; // give whatever report is next
}
static bool static bool
GenerateSupox_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, GenerateSupox_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode) COUNT *whichNode)
{ {
if (matchWorld (solarSys, world, 0, MATCH_PLANET)) if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
COUNT i; GenerateDefault_generateRuins (solarSys, whichNode);
COUNT type; GenerateDefault_pickupRuins (solarSys, onRuinPickedUp);
type = GET_GAME_STATE (ULTRON_CONDITION) ? 1 : 0;
GenerateRandomRuins (&solarSys->SysInfo, type, whichNode);
for (i = 0; i < 16; ++i)
{
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i))
{
// Retrieval status is cleared to keep the node on the map
setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, i);
if (!GET_GAME_STATE (ULTRON_CONDITION))
{
SetLanderTakeoff ();
SET_GAME_STATE (ULTRON_CONDITION, 1);
}
}
}
return true; return true;
} }
+7 -12
View File
@@ -17,6 +17,7 @@
*/ */
#include "genall.h" #include "genall.h"
#include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h" #include "../scan.h"
#include "../../build.h" #include "../../build.h"
@@ -158,12 +159,11 @@ static bool
GenerateThraddash_generateEnergy (SOLARSYS_STATE *solarSys, GenerateThraddash_generateEnergy (SOLARSYS_STATE *solarSys,
PLANET_DESC *world, COUNT *whichNode) PLANET_DESC *world, COUNT *whichNode)
{ {
DWORD old_rand;
if (CurStarDescPtr->Index == THRADD_DEFINED if (CurStarDescPtr->Index == THRADD_DEFINED
&& matchWorld (solarSys, world, 0, MATCH_PLANET)) && matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
@@ -176,14 +176,7 @@ GenerateThraddash_generateEnergy (SOLARSYS_STATE *solarSys,
return true; return true;
} }
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
@@ -191,9 +184,11 @@ GenerateThraddash_generateEnergy (SOLARSYS_STATE *solarSys,
SET_GAME_STATE (AQUA_HELIX, 1); SET_GAME_STATE (AQUA_HELIX, 1);
SET_GAME_STATE (AQUA_HELIX_ON_SHIP, 1); SET_GAME_STATE (AQUA_HELIX_ON_SHIP, 1);
SET_GAME_STATE (HELIX_UNPROTECTED, 1); SET_GAME_STATE (HELIX_UNPROTECTED, 1);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
+7 -12
View File
@@ -17,6 +17,7 @@
*/ */
#include "genall.h" #include "genall.h"
#include "../lander.h"
#include "../planets.h" #include "../planets.h"
#include "../scan.h" #include "../scan.h"
#include "../../build.h" #include "../../build.h"
@@ -209,12 +210,11 @@ static bool
GenerateUtwig_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world, GenerateUtwig_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
COUNT *whichNode) COUNT *whichNode)
{ {
DWORD old_rand;
if (CurStarDescPtr->Index == UTWIG_DEFINED if (CurStarDescPtr->Index == UTWIG_DEFINED
&& matchWorld (solarSys, world, 0, MATCH_PLANET)) && matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
@@ -227,14 +227,7 @@ GenerateUtwig_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
return true; return true;
} }
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
@@ -243,9 +236,11 @@ GenerateUtwig_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
SET_GAME_STATE (DRUUGE_MANNER, 1); SET_GAME_STATE (DRUUGE_MANNER, 1);
SET_GAME_STATE (DRUUGE_VISITS, 0); SET_GAME_STATE (DRUUGE_VISITS, 0);
SET_GAME_STATE (DRUUGE_HOME_VISITS, 0); SET_GAME_STATE (DRUUGE_HOME_VISITS, 0);
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
+16 -18
View File
@@ -80,42 +80,40 @@ GenerateVault_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
if (matchWorld (solarSys, world, 0, 0)) if (matchWorld (solarSys, world, 0, 0))
{ {
DWORD old_rand; PLANET_INFO *planetInfo = &solarSys->SysInfo.PlanetInfo;
old_rand = TFB_SeedRandom ( GenerateDefault_generateArtifact (solarSys, whichNode);
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo); if (isNodeRetrieved (planetInfo, ENERGY_SCAN, 0))
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
if (!GET_GAME_STATE (SHIP_VAULT_UNLOCKED))
solarSys->SysInfo.PlanetInfo.CurType = 0;
else
solarSys->SysInfo.PlanetInfo.CurType = 1;
// This node is always present, even after it is "picked up".
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
// Retrieval status is cleared to keep the node on the map // Retrieval status is cleared to keep the node on the map
setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0); setNodeNotRetrieved (planetInfo, ENERGY_SCAN, 0);
if (GET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP)) if (GET_GAME_STATE (SHIP_VAULT_UNLOCKED))
{ // Give the final report, "omg empty" and whatnot
GenerateDefault_landerReportCycle (solarSys);
}
else if (GET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP))
{ {
GenerateDefault_landerReportCycle (solarSys);
SetLanderTakeoff (); SetLanderTakeoff ();
SET_GAME_STATE (SHIP_VAULT_UNLOCKED, 1); SET_GAME_STATE (SHIP_VAULT_UNLOCKED, 1);
SET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 0); SET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 0);
SET_GAME_STATE (SYREEN_HOME_VISITS, 0); SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
} }
else if (!GET_GAME_STATE (KNOW_SYREEN_VAULT)) else
{
GenerateDefault_landerReport (solarSys);
if (!GET_GAME_STATE (KNOW_SYREEN_VAULT))
{ {
SET_GAME_STATE (KNOW_SYREEN_VAULT, 1); SET_GAME_STATE (KNOW_SYREEN_VAULT, 1);
SET_GAME_STATE (SYREEN_HOME_VISITS, 0); SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
} }
} }
}
TFB_SeedRandom (old_rand);
return true; return true;
} }
+6 -6
View File
@@ -218,13 +218,14 @@ GenerateVux_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
solarSys->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH / 3; solarSys->SysInfo.PlanetInfo.CurPt.x = MAP_WIDTH / 3;
solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 5 / 8; solarSys->SysInfo.PlanetInfo.CurPt.y = MAP_HEIGHT * 5 / 8;
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
solarSys->SysInfo.PlanetInfo.CurType = 0;
*whichNode = 1; // only matters when count is requested *whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
GenerateDefault_landerReport (solarSys);
SetLanderTakeoff ();
SET_GAME_STATE (SHOFIXTI_MAIDENS, 1); SET_GAME_STATE (SHOFIXTI_MAIDENS, 1);
SET_GAME_STATE (MAIDENS_ON_SHIP, 1); SET_GAME_STATE (MAIDENS_ON_SHIP, 1);
} }
@@ -235,7 +236,8 @@ GenerateVux_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
if (CurStarDescPtr->Index == VUX_DEFINED if (CurStarDescPtr->Index == VUX_DEFINED
&& matchWorld (solarSys, world, 0, MATCH_PLANET)) && matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
@@ -300,9 +302,7 @@ GenerateVux_generateLife (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, BIOLOGICAL_SCAN, 0) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, BIOLOGICAL_SCAN, 0)
&& !GET_GAME_STATE (VUX_BEAST)) && !GET_GAME_STATE (VUX_BEAST))
{ // Picked up Zex' Beauty { // Picked up Zex' Beauty
UnbatchGraphics (); GenerateDefault_landerReport (solarSys);
DoDiscoveryReport (MenuSounds);
BatchGraphics ();
SetLanderTakeoff (); SetLanderTakeoff ();
SET_GAME_STATE (VUX_BEAST, 1); SET_GAME_STATE (VUX_BEAST, 1);
+4 -16
View File
@@ -57,7 +57,7 @@ GenerateWreck_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
solarSys->SysInfo.PlanetInfo.DiscoveryString = solarSys->SysInfo.PlanetInfo.DiscoveryString =
CaptureStringTable (LoadStringTable (WRECK_STRTAB)); CaptureStringTable (LoadStringTable (WRECK_STRTAB));
if (GET_GAME_STATE (PORTAL_KEY)) if (GET_GAME_STATE (PORTAL_KEY))
{ { // Already picked it up, skip the first report
solarSys->SysInfo.PlanetInfo.DiscoveryString = solarSys->SysInfo.PlanetInfo.DiscoveryString =
SetAbsStringTableIndex ( SetAbsStringTableIndex (
solarSys->SysInfo.PlanetInfo.DiscoveryString, 1); solarSys->SysInfo.PlanetInfo.DiscoveryString, 1);
@@ -74,26 +74,15 @@ GenerateWreck_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
if (matchWorld (solarSys, world, 6, MATCH_PLANET)) if (matchWorld (solarSys, world, 6, MATCH_PLANET))
{ {
DWORD old_rand; GenerateDefault_generateArtifact (solarSys, whichNode);
old_rand = TFB_SeedRandom (
solarSys->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]);
GenerateRandomLocation (&solarSys->SysInfo);
solarSys->SysInfo.PlanetInfo.CurDensity = 0;
if (!GET_GAME_STATE (PORTAL_KEY))
solarSys->SysInfo.PlanetInfo.CurType = 0;
else
solarSys->SysInfo.PlanetInfo.CurType = 1;
// This node is always present, even after it is "picked up".
*whichNode = 1; // only matters when count is requested
if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0)) if (isNodeRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0))
{ {
// Retrieval status is cleared to keep the node on the map // Retrieval status is cleared to keep the node on the map
setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0); setNodeNotRetrieved (&solarSys->SysInfo.PlanetInfo, ENERGY_SCAN, 0);
GenerateDefault_landerReportCycle (solarSys);
if (!GET_GAME_STATE (PORTAL_KEY)) if (!GET_GAME_STATE (PORTAL_KEY))
{ {
SetLanderTakeoff (); SetLanderTakeoff ();
@@ -103,7 +92,6 @@ GenerateWreck_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
} }
} }
TFB_SeedRandom (old_rand);
return true; return true;
} }
+2 -1
View File
@@ -113,7 +113,8 @@ GenerateYehat_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
if (matchWorld (solarSys, world, 0, MATCH_PLANET)) if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
+2 -1
View File
@@ -143,7 +143,8 @@ GenerateZoqFotPik_generateEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
{ {
if (matchWorld (solarSys, world, 0, MATCH_PLANET)) if (matchWorld (solarSys, world, 0, MATCH_PLANET))
{ {
GenerateRandomRuins (&solarSys->SysInfo, 1, whichNode); GenerateDefault_generateRuins (solarSys, whichNode);
GenerateDefault_pickupRuins (solarSys, NULL);
return true; return true;
} }
+22 -49
View File
@@ -745,39 +745,7 @@ CheckObjectCollision (COUNT index)
} }
else if (scan == ENERGY_SCAN) else if (scan == ENERGY_SCAN)
{ {
if (ElementPtr->mass_points == 1) // noop; handled by generation funcs, see below
{
#define FWIFFO_FRAGS 8
DWORD TimeIn;
int i;
/* Ran into Spathi on Pluto */
TimeIn = GetTimeCounter ();
for (i = 0; i < FWIFFO_FRAGS && crew_left; ++i)
{
DeltaLanderCrew (-1, LANDER_INJURED);
SleepThreadUntil (TimeIn + ONE_SECOND / 20);
TimeIn = GetTimeCounter();
}
}
if (crew_left
&& pSolarSysState->SysInfo.PlanetInfo.DiscoveryString
&& CurStarDescPtr->Index != ANDROSYNTH_DEFINED)
{
UnbatchGraphics ();
DoDiscoveryReport (MenuSounds);
BatchGraphics ();
}
if (ElementPtr->mass_points == 0)
{
DestroyStringTable (ReleaseStringTable (
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString
));
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString = 0;
UnlockElement (hElement);
continue;
}
} }
else if (scan == BIOLOGICAL_SCAN && ElementPtr->hit_points) else if (scan == BIOLOGICAL_SCAN && ElementPtr->hit_points)
{ {
@@ -865,24 +833,11 @@ CheckObjectCollision (COUNT index)
pSolarSysState->pOrbitalDesc, pSolarSysState->pOrbitalDesc,
&allNodes, scan); &allNodes, scan);
if (!isNodeRetrieved (&pSolarSysState->SysInfo.PlanetInfo, scan, // Generation func above may reset the retrieved status bit
// to keep the node on the map
if (isNodeRetrieved (&pSolarSysState->SysInfo.PlanetInfo, scan,
which_node)) which_node))
{ {
/* If our discovery strings have cycled, we're done */
if (GetStringTableIndex (
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString) == 0)
{
if (DestroyStringTable (ReleaseStringTable (
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString
)))
pSolarSysState->SysInfo.PlanetInfo.DiscoveryString = 0;
}
}
else
{
if (NumRetrieved && scan == ENERGY_SCAN)
pPSD->InTransit = TRUE;
SET_GAME_STATE (PLANETARY_CHANGE, 1); SET_GAME_STATE (PLANETARY_CHANGE, 1);
ElementPtr->state_flags |= DISAPPEARING; ElementPtr->state_flags |= DISAPPEARING;
} }
@@ -1892,6 +1847,24 @@ SetLanderTakeoff (void)
planetSideDesc->InTransit = TRUE; planetSideDesc->InTransit = TRUE;
} }
// Returns whether the lander is still alive at the end of the sequence
bool
KillLanderCrewSeq (COUNT numKilled, DWORD period)
{
TimeCount TimeOut;
COUNT i;
TimeOut = GetTimeCounter ();
for (i = 0; i < numKilled && crew_left; ++i)
{
TimeOut += period;
DeltaLanderCrew (-1, LANDER_INJURED);
SleepThreadUntil (TimeOut);
}
return crew_left > 0;
}
void void
PlanetSide (POINT planetLoc) PlanetSide (POINT planetLoc)
{ {
+1
View File
@@ -67,6 +67,7 @@ extern void FreeLanderData (void);
extern void object_animation (ELEMENT *ElementPtr); extern void object_animation (ELEMENT *ElementPtr);
extern void SetLanderTakeoff (void); extern void SetLanderTakeoff (void);
extern bool KillLanderCrewSeq (COUNT numKilled, DWORD period);
// ELEMENT.playerNr constants // ELEMENT.playerNr constants
enum enum
+1 -3
View File
@@ -293,9 +293,7 @@ typedef struct
// NUM_CREATURE_TYPES is an Evil One // NUM_CREATURE_TYPES is an Evil One
// NUM_CREATURE_TYPES + 1 is a Brainbox Bulldozer // NUM_CREATURE_TYPES + 1 is a Brainbox Bulldozer
// NUM_CREATURE_TYPES + 2 is Zex' Beauty // NUM_CREATURE_TYPES + 2 is Zex' Beauty
// For energy: 0 - Liftoff on collision // For energy: undefined
// 1 - No liftoff on collision
// 2 - (special case) Fwiffo
STRING DiscoveryString; STRING DiscoveryString;
FONT LanderFont; FONT LanderFont;
+2
View File
@@ -82,6 +82,8 @@ enum
// XXX: -9 to match the original, but why? I have no idea // XXX: -9 to match the original, but why? I have no idea
#define PLANET_ORG_Y ((SCAN_SCREEN_HEIGHT - 9) / 2) #define PLANET_ORG_Y ((SCAN_SCREEN_HEIGHT - 9) / 2)
#define NUM_RACE_RUINS 16
typedef struct planet_desc PLANET_DESC; typedef struct planet_desc PLANET_DESC;
typedef struct star_desc STAR_DESC; typedef struct star_desc STAR_DESC;
typedef struct planet_orbit PLANET_ORBIT; typedef struct planet_orbit PLANET_ORBIT;
-10
View File
@@ -1396,16 +1396,6 @@ GeneratePlanetSide (void)
NodeElementPtr->preprocess_func = object_animation; NodeElementPtr->preprocess_func = object_animation;
if (scan == ENERGY_SCAN) if (scan == ENERGY_SCAN)
{ {
if (pSolarSysState->SysInfo.PlanetInfo.CurType == 1)
{
NodeElementPtr->mass_points = 0;
}
else if (pSolarSysState->SysInfo.PlanetInfo.CurType == 2)
{
// Special case: Fwiffo
NodeElementPtr->mass_points = 1;
}
else
NodeElementPtr->mass_points = MAX_SCROUNGED; NodeElementPtr->mass_points = MAX_SCROUNGED;
DisplayArray[NodeElementPtr->PrimIndex].Object.Stamp.frame = DisplayArray[NodeElementPtr->PrimIndex].Object.Stamp.frame =
pSolarSysState->PlanetSideFrame[1]; pSolarSysState->PlanetSideFrame[1];
-1
View File
@@ -46,7 +46,6 @@ extern DWORD GenerateLifeForms (SYSTEM_INFO *SysInfoPtr, COUNT *pwhich_life);
extern void GenerateRandomLocation (SYSTEM_INFO *); extern void GenerateRandomLocation (SYSTEM_INFO *);
extern DWORD GenerateRandomNodes (SYSTEM_INFO *, COUNT scan, COUNT numNodes, extern DWORD GenerateRandomNodes (SYSTEM_INFO *, COUNT scan, COUNT numNodes,
COUNT type, COUNT *whichNode); COUNT type, COUNT *whichNode);
extern DWORD GenerateRandomRuins (SYSTEM_INFO *, COUNT type, COUNT *whichNode);
#define DWARF_ELEMENT_DENSITY 1 #define DWARF_ELEMENT_DENSITY 1
#define GIANT_ELEMENT_DENSITY 3 #define GIANT_ELEMENT_DENSITY 3
+2 -6
View File
@@ -268,7 +268,9 @@ GenerateRandomNodes (SYSTEM_INFO *SysInfoPtr, COUNT scan, COUNT numNodes,
for (i = 0; i < numNodes; ++i) for (i = 0; i < numNodes; ++i)
{ {
GenerateRandomLocation (SysInfoPtr); GenerateRandomLocation (SysInfoPtr);
// CurType is irrelevant for energy nodes
SysInfoPtr->PlanetInfo.CurType = type; SysInfoPtr->PlanetInfo.CurType = type;
// CurDensity is irrelevant for energy and bio nodes
SysInfoPtr->PlanetInfo.CurDensity = 0; SysInfoPtr->PlanetInfo.CurDensity = 0;
if (i >= *whichNode) if (i >= *whichNode)
@@ -279,9 +281,3 @@ GenerateRandomNodes (SYSTEM_INFO *SysInfoPtr, COUNT scan, COUNT numNodes,
return (TFB_SeedRandom (old_rand)); return (TFB_SeedRandom (old_rand));
} }
DWORD
GenerateRandomRuins (SYSTEM_INFO *SysInfoPtr, COUNT type, COUNT *whichNode)
{
return GenerateRandomNodes (SysInfoPtr, ENERGY_SCAN, 16, type, whichNode);
}