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