1 //Copyright Paul Reiche, Fred Ford. 1992-2002
2 
3 /*
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  */
18 
19 #include "genall.h"
20 #include "../lander.h"
21 #include "../planets.h"
22 #include "../../build.h"
23 #include "../../comm.h"
24 #include "../../gendef.h"
25 #include "../../starmap.h"
26 #include "../../globdata.h"
27 #include "../../ipdisp.h"
28 #include "../../nameref.h"
29 #include "../../setup.h"
30 #include "../../state.h"
31 #include "libs/mathlib.h"
32 
33 
34 static bool GenerateOrz_generatePlanets (SOLARSYS_STATE *solarSys);
35 static bool GenerateOrz_generateOrbital (SOLARSYS_STATE *solarSys,
36 		PLANET_DESC *world);
37 static COUNT GenerateOrz_generateEnergy (const SOLARSYS_STATE *,
38 		const PLANET_DESC *world, COUNT whichNode, NODE_INFO *);
39 static bool GenerateOrz_pickupEnergy (SOLARSYS_STATE *solarSys,
40 		PLANET_DESC *world, COUNT whichNode);
41 
42 
43 const GenerateFunctions generateOrzFunctions = {
44 	/* .initNpcs         = */ GenerateDefault_initNpcs,
45 	/* .reinitNpcs       = */ GenerateDefault_reinitNpcs,
46 	/* .uninitNpcs       = */ GenerateDefault_uninitNpcs,
47 	/* .generatePlanets  = */ GenerateOrz_generatePlanets,
48 	/* .generateMoons    = */ GenerateDefault_generateMoons,
49 	/* .generateName     = */ GenerateDefault_generateName,
50 	/* .generateOrbital  = */ GenerateOrz_generateOrbital,
51 	/* .generateMinerals = */ GenerateDefault_generateMinerals,
52 	/* .generateEnergy   = */ GenerateOrz_generateEnergy,
53 	/* .generateLife     = */ GenerateDefault_generateLife,
54 	/* .pickupMinerals   = */ GenerateDefault_pickupMinerals,
55 	/* .pickupEnergy     = */ GenerateOrz_pickupEnergy,
56 	/* .pickupLife       = */ GenerateDefault_pickupLife,
57 };
58 
59 
60 static bool
GenerateOrz_generatePlanets(SOLARSYS_STATE * solarSys)61 GenerateOrz_generatePlanets (SOLARSYS_STATE *solarSys)
62 {
63 	COUNT angle;
64 
65 	GenerateDefault_generatePlanets (solarSys);
66 
67 	if (CurStarDescPtr->Index == ORZ_DEFINED)
68 	{
69 		solarSys->PlanetDesc[0].data_index = WATER_WORLD;
70 		solarSys->PlanetDesc[0].radius = EARTH_RADIUS * 156L / 100;
71 		solarSys->PlanetDesc[0].NumPlanets = 0;
72 		angle = ARCTAN (solarSys->PlanetDesc[0].location.x,
73 				solarSys->PlanetDesc[0].location.y);
74 		solarSys->PlanetDesc[0].location.x =
75 				COSINE (angle, solarSys->PlanetDesc[0].radius);
76 		solarSys->PlanetDesc[0].location.y =
77 				SINE (angle, solarSys->PlanetDesc[0].radius);
78 	}
79 
80 	return true;
81 }
82 
83 static bool
GenerateOrz_generateOrbital(SOLARSYS_STATE * solarSys,PLANET_DESC * world)84 GenerateOrz_generateOrbital (SOLARSYS_STATE *solarSys, PLANET_DESC *world)
85 {
86 	if ((CurStarDescPtr->Index == ORZ_DEFINED
87 			&& matchWorld (solarSys, world, 0, MATCH_PLANET))
88 			|| (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED
89 			&& matchWorld (solarSys, world, 1, 2)
90 			&& !GET_GAME_STATE (TAALO_PROTECTOR)))
91 	{
92 		COUNT i;
93 
94 		if ((CurStarDescPtr->Index == ORZ_DEFINED
95 				|| !GET_GAME_STATE (TAALO_UNPROTECTED))
96 				&& StartSphereTracking (ORZ_SHIP))
97 		{
98 			NotifyOthers (ORZ_SHIP, IPNL_ALL_CLEAR);
99 			PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
100 			ReinitQueue (&GLOBAL (ip_group_q));
101 			assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
102 
103 			if (CurStarDescPtr->Index == ORZ_DEFINED)
104 			{
105 				CloneShipFragment (ORZ_SHIP,
106 						&GLOBAL (npc_built_ship_q), INFINITE_FLEET);
107 				SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
108 			}
109 			else
110 			{
111 				for (i = 0; i < 14; ++i)
112 				{
113 					CloneShipFragment (ORZ_SHIP,
114 							&GLOBAL (npc_built_ship_q), 0);
115 				}
116 				SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
117 			}
118 			GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
119 			InitCommunication (ORZ_CONVERSATION);
120 
121 			if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))
122 				return true;
123 
124 			{
125 				BOOLEAN OrzSurvivors;
126 
127 				OrzSurvivors = GetHeadLink (&GLOBAL (npc_built_ship_q))
128 						&& (CurStarDescPtr->Index == ORZ_DEFINED
129 						|| !GET_GAME_STATE (TAALO_UNPROTECTED));
130 
131 				GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;
132 				ReinitQueue (&GLOBAL (npc_built_ship_q));
133 				GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP);
134 
135 				if (OrzSurvivors)
136 					return true;
137 
138 				RepairSISBorder ();
139 			}
140 		}
141 
142 		SET_GAME_STATE (TAALO_UNPROTECTED, 1);
143 		if (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED)
144 		{
145 			LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
146 			solarSys->PlanetSideFrame[1] =
147 					CaptureDrawable (
148 					LoadGraphic (TAALO_DEVICE_MASK_PMAP_ANIM));
149 			solarSys->SysInfo.PlanetInfo.DiscoveryString =
150 					CaptureStringTable (
151 					LoadStringTable (TAALO_DEVICE_STRTAB));
152 		}
153 		else
154 		{
155 			LoadStdLanderFont (&solarSys->SysInfo.PlanetInfo);
156 			solarSys->PlanetSideFrame[1] =
157 					CaptureDrawable (LoadGraphic (RUINS_MASK_PMAP_ANIM));
158 			solarSys->SysInfo.PlanetInfo.DiscoveryString =
159 					CaptureStringTable (LoadStringTable (RUINS_STRTAB));
160 		}
161 	}
162 
163 	GenerateDefault_generateOrbital (solarSys, world);
164 
165 	return true;
166 }
167 
168 static COUNT
GenerateOrz_generateEnergy(const SOLARSYS_STATE * solarSys,const PLANET_DESC * world,COUNT whichNode,NODE_INFO * info)169 GenerateOrz_generateEnergy (const SOLARSYS_STATE *solarSys,
170 		const PLANET_DESC *world, COUNT whichNode, NODE_INFO *info)
171 {
172 	if (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED
173 			&& matchWorld (solarSys, world, 1, 2))
174 	{
175 		// This check is redundant since the retrieval bit will keep the
176 		// node from showing up again
177 		if (GET_GAME_STATE (TAALO_PROTECTOR))
178 		{	// already picked up
179 			return 0;
180 		}
181 
182 		return GenerateDefault_generateArtifact (solarSys, whichNode, info);
183 	}
184 
185 	if (CurStarDescPtr->Index == ORZ_DEFINED
186 			&& matchWorld (solarSys, world, 0, MATCH_PLANET))
187 	{
188 		return GenerateDefault_generateRuins (solarSys, whichNode, info);
189 	}
190 
191 	return 0;
192 }
193 
194 static bool
GenerateOrz_pickupEnergy(SOLARSYS_STATE * solarSys,PLANET_DESC * world,COUNT whichNode)195 GenerateOrz_pickupEnergy (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
196 		COUNT whichNode)
197 {
198 	if (CurStarDescPtr->Index == TAALO_PROTECTOR_DEFINED
199 			&& matchWorld (solarSys, world, 1, 2))
200 	{
201 		assert (!GET_GAME_STATE (TAALO_PROTECTOR) && whichNode == 0);
202 
203 		GenerateDefault_landerReport (solarSys);
204 		SetLanderTakeoff ();
205 
206 		SET_GAME_STATE (TAALO_PROTECTOR, 1);
207 		SET_GAME_STATE (TAALO_PROTECTOR_ON_SHIP, 1);
208 
209 		return true; // picked up
210 	}
211 
212 	if (CurStarDescPtr->Index == ORZ_DEFINED
213 			&& matchWorld (solarSys, world, 0, MATCH_PLANET))
214 	{
215 		// Standard ruins report
216 		GenerateDefault_landerReportCycle (solarSys);
217 		return false;
218 	}
219 
220 	(void) whichNode;
221 	return false;
222 }
223