5 #include "gb/GB_racegen.h" 14 #include "gb/GB_server.h" 15 #include "gb/buffers.h" 17 #include "gb/files_shl.h" 18 #include "gb/globals.h" 22 #include "gb/racegen.h" 24 #include "gb/shipdata.h" 26 #include "gb/sql/sql.h" 27 #include "gb/tweakables.h" 28 #include "gb/utils/rand.h" 32 PlanetType::EARTH, PlanetType::FOREST, PlanetType::DESERT,
33 PlanetType::WATER, PlanetType::MARS, PlanetType::ICEBALL,
34 PlanetType::GASGIANT};
70 if ((Playernum == 1) && (race_info.priv_type !=
P_GOD)) {
71 sprintf(race_info.rejection,
72 "The first race enrolled must have God privileges.\n");
76 sprintf(race_info.rejection,
77 "There are already %d players; No more allowed.\n",
MAXPLAYERS - 1);
83 star_arena = (startype *)malloc(Sdata.numstars *
sizeof(startype));
84 for (star = 0; star < Sdata.numstars; star++) {
85 Stars[star] = &star_arena[star];
89 printf(
"Looking for %s..", planet_print_name[race_info.home_planet_type]);
93 for (i = 0; i < Sdata.numstars; i++) indirect[i] = i;
94 last_star_left = Sdata.numstars - 1;
95 while (last_star_left >= 0) {
96 i = int_rand(0, last_star_left);
103 if ((Stars[star]->numplanets < 2) || Stars[star]->inhabited[0] ||
104 Stars[star]->inhabited[1]) {
107 for (pnum = 0; pnum < Stars[star]->numplanets; pnum++) {
109 if ((planet.type == ppref) && (planet.conditions[
RTEMP] >= -200) &&
110 (planet.conditions[
RTEMP] <= 100))
116 indirect[i] = indirect[last_star_left--];
121 printf(
" failed!\n");
122 sprintf(race_info.rejection,
123 "Didn't find any free %s; choose another home planet type.\n",
124 planet_print_name[race_info.home_planet_type]);
130 auto race =
new Race;
131 bzero(race,
sizeof(Race));
133 race->Playernum = Playernum;
134 race->God = (race_info.priv_type ==
P_GOD);
135 race->Guest = (race_info.priv_type ==
P_GUEST);
136 strcpy(race->name, race_info.name);
137 strcpy(race->password, race_info.password);
139 strcpy(race->governor[0].password,
"0");
140 race->governor[0].homelevel = race->governor[0].deflevel =
141 ScopeLevel::LEVEL_PLAN;
142 race->governor[0].homesystem = race->governor[0].defsystem = star;
143 race->governor[0].homeplanetnum = race->governor[0].defplanetnum = pnum;
145 race->governor[0].toggle.highlight = Playernum;
146 race->governor[0].toggle.inverse = 1;
147 race->governor[0].toggle.color = 0;
148 race->governor[0].active = 1;
150 for (i = 0; i <=
OTHER; i++) race->conditions[i] = planet.conditions[i];
155 for (j=0; j<=OTHER; j++)
156 race->conditions[j] = planet->conditions[j]
157 + int_rand(round_rand(-planet->conditions[j]*2.0),
158 round_rand(planet->conditions[j]*2.0) ) ;
163 if ((i == Playernum) || (Playernum == 1) || race->God)
164 race->translate[i - 1] = 100;
166 race->translate[i - 1] = 1;
173 race->discoveries[i] = 0;
177 race->allied[0] = race->allied[1] = 0;
178 race->atwar[0] = race->atwar[1] = 0;
179 for (i=0; i<MAXPLAYERS; i++)
185 race->absorb = race_info.attr[
ABSORB];
186 race->collective_iq = race_info.attr[
COL_IQ];
187 race->Metamorph = (race_info.race_type ==
R_METAMORPH);
188 race->pods = race_info.attr[
PODS];
190 race->fighters = race_info.attr[
FIGHT];
191 if (race_info.attr[
COL_IQ] == 1.0)
192 race->IQ_limit = race_info.attr[
A_IQ];
194 race->IQ = race_info.attr[
A_IQ];
195 race->number_sexes = race_info.attr[
SEXES];
197 race->fertilize = race_info.attr[
FERT] * 100;
199 race->adventurism = race_info.attr[
ADVENT];
200 race->birthrate = race_info.attr[
BIRTH];
201 race->mass = race_info.attr[
MASS];
202 race->metabolism = race_info.attr[
METAB];
207 race->likes[i] = race_info.compat[i] / 100.0;
208 if ((100 == race_info.compat[i]) &&
209 (1.0 == planet_compat_cov[race_info.home_planet_type][i]))
219 if (smap.get(x, y).condition == race->likesbest)
break;
221 auto § = smap.get(x, y);
222 sect.owner = Playernum;
223 sect.race = Playernum;
224 sect.popn = planet.popn = race->number_sexes;
227 sect.troops = planet.troops = 0;
232 sigaddset(&block, SIGHUP);
233 sigaddset(&block, SIGTERM);
234 sigaddset(&block, SIGINT);
235 sigaddset(&block, SIGQUIT);
236 sigaddset(&block, SIGSTOP);
237 sigaddset(&block, SIGTSTP);
238 sigprocmask(SIG_BLOCK, &block, &mask);
244 bzero(&s,
sizeof(s));
246 race->Gov_ship = shipno;
247 planet.ships = shipno;
250 s.type = ShipType::OTYPE_GOV;
251 s.xpos = Stars[star]->xpos + planet.xpos;
252 s.ypos = Stars[star]->ypos + planet.ypos;
263 s.build_type = ShipType::OTYPE_GOV;
264 s.armor = Shipdata[ShipType::OTYPE_GOV][ABIL_ARMOR];
266 s.primary = Shipdata[ShipType::OTYPE_GOV][ABIL_GUNS];
267 s.primtype = Shipdata[ShipType::OTYPE_GOV][ABIL_PRIMARY];
268 s.secondary = Shipdata[ShipType::OTYPE_GOV][ABIL_GUNS];
269 s.sectype = Shipdata[ShipType::OTYPE_GOV][ABIL_SECONDARY];
270 s.max_crew = Shipdata[ShipType::OTYPE_GOV][ABIL_MAXCREW];
271 s.max_destruct = Shipdata[ShipType::OTYPE_GOV][ABIL_DESTCAP];
272 s.max_resource = Shipdata[ShipType::OTYPE_GOV][ABIL_CARGO];
273 s.max_fuel = Shipdata[ShipType::OTYPE_GOV][ABIL_FUELCAP];
274 s.max_speed = Shipdata[ShipType::OTYPE_GOV][ABIL_SPEED];
275 s.build_cost = Shipdata[ShipType::OTYPE_GOV][ABIL_COST];
278 sprintf(s.shipclass,
"Standard");
281 s.popn = Shipdata[s.type][ABIL_MAXCREW];
283 s.mass = s.base_mass + Shipdata[s.type][ABIL_MAXCREW] * race->mass;
284 s.destruct = s.resource = 0;
292 s.whatorbits = ScopeLevel::LEVEL_PLAN;
293 s.whatdest = ScopeLevel::LEVEL_PLAN;
312 planet.info[Playernum - 1].numsectsowned = 1;
314 planet.info[Playernum - 1].explored = 1;
321 #ifdef STARTING_INVENTORY 324 planet.info[Playernum - 1].resource += (START_RES - START_MESO_RES_DIFF);
326 planet.info[Playernum - 1].resource += START_RES;
328 planet.info[Playernum - 1].fuel += START_FUEL;
329 planet.info[Playernum - 1].destruct += START_DES;
340 setbit(Stars[star]->explored, Playernum);
341 setbit(Stars[star]->inhabited, Playernum);
342 Stars[star]->AP[Playernum - 1] = 5;
345 sigprocmask(SIG_SETMASK, &mask,
nullptr);
347 printf(
"Player %d (%s) created on sector %d,%d on %s/%s.\n", Playernum,
348 race_info.name, x, y, Stars[star]->name, Stars[star]->pnames[pnum]);
static const PlanetType planet_translate[N_HOME_PLANET_TYPES]
Planet getplanet(const starnum_t star, const planetnum_t pnum)
void PermuteSects(const Planet &planet)
void warn(const player_t, const governor_t, const std::string &)
void putsector(const Sector &s, const Planet &p, const int x, const int y)
bool notify(const player_t, const governor_t, const std::string &)
#define FIRST_SECTOR_TYPE
void putstar(startype *s, starnum_t snum)
void getsdata(struct stardata *S)
void putplanet(const Planet &p, startype *star, const int pnum)
#define STATUS_UNENROLLABLE
void getstar(startype **s, int star)
#define N_HOME_PLANET_TYPES
SectorMap getsmap(const Planet &p)
int Getxysect(const Planet &p, int *x, int *y, int r)
int maxsupport(const Race *r, const Sector &s, const double c, const int toxic)