Freeciv-3.3: /fast/freeciv/nightly/main/common/spaceship.c Source File

Freeciv-3.3

Loading...
Searching...
No Matches
spaceship.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18/* utility */
19#include "shared.h" /* TRUE, FALSE */
20
21#include "spaceship.h"
22
23 const struct sship_part_info structurals_info[NUM_SS_STRUCTURALS] = {
24 {19, 13, -1}, /* -1 means none required */
25 {19, 15, 0},
26 {19, 11, 0},
27 {19, 17, 1},
28 {19, 9, 2},
29 {19, 19, 3},
30 {17, 9, 4},
31 {17, 19, 5},
32 {21, 11, 2},
33 {21, 17, 3},
34 {15, 9, 6},
35 {15, 19, 7},
36 {23, 11, 8},
37 {23, 17, 9},
38 {13, 9, 10},
39 {13, 19, 11},
40 {11, 9, 14},
41 {11, 19, 15},
42 { 9, 9, 16},
43 { 9, 19, 17},
44 { 7, 9, 18},
45 { 7, 19, 19},
46 {19, 7, 4},
47 {19, 21, 5},
48 {19, 5, 22},
49 {19, 23, 23},
50 {21, 5, 24},
51 {21, 23, 25},
52 {23, 5, 26},
53 {23, 23, 27},
54 { 5, 9, 20},
55 { 5, 19, 21}
56};
57
58 const struct sship_part_info components_info[NUM_SS_COMPONENTS] = {
59 {21, 13, 0},
60 {24, 13, 12},
61 {21, 15, 1},
62 {24, 15, 13},
63 {21, 9, 8}, /* or 4 */
64 {24, 9, 12},
65 {21, 19, 9}, /* or 5 */
66 {24, 19, 13},
67 {21, 7, 22},
68 {24, 7, 28},
69 {21, 21, 23},
70 {24, 21, 29},
71 {21, 3, 26},
72 {24, 3, 28},
73 {21, 25, 27},
74 {24, 25, 29}
75};
76
77 const struct sship_part_info modules_info[NUM_SS_MODULES] = {
78 {16, 12, 0},
79 {16, 16, 1},
80 {14, 6, 10},
81 {12, 16, 15},
82 {12, 12, 14},
83 {14, 22, 11},
84 { 8, 12, 18},
85 { 8, 16, 19},
86 { 6, 6, 20},
87 { 4, 16, 31},
88 { 4, 12, 30},
89 { 6, 22, 21}
90};
91
92/*******************************************************************/
96 void spaceship_init(struct player_spaceship *ship)
97{
98 ship->structurals = ship->components = ship->modules = 0;
99 BV_CLR_ALL(ship->structure);
100 ship->fuel = ship->propulsion = 0;
101 ship->habitation = ship->life_support = ship->solar_panels = 0;
102 ship->state = SSHIP_NONE;
103 ship->launch_year = 9999;
104
105 ship->population = ship->mass = 0;
106 ship->support_rate = ship->energy_rate =
107 ship->success_rate = ship->travel_time = 0.0;
108}
109
110/*******************************************************************/
113 int num_spaceship_structurals_placed(const struct player_spaceship *ship)
114{
115 int i;
116 int num = 0;
117
118 for (i = 0; i < NUM_SS_STRUCTURALS; i++) {
119 if (BV_ISSET(ship->structure, i)) {
120 num++;
121 }
122 }
123
124 return num;
125}
126
127/*******************************************************************/
130 bool next_spaceship_component(struct player *pplayer,
131 struct player_spaceship *ship,
132 struct spaceship_component *fill)
133{
134 fc_assert_ret_val(fill != NULL, FALSE);
135
136 if (ship->modules > (ship->habitation + ship->life_support
137 + ship->solar_panels)) {
138 /* "nice" governments prefer to keep success 100%;
139 * others build habitation first (for score?) (Thanks Massimo.)
140 */
141 fill->type =
142 (ship->habitation == 0) ? SSHIP_PLACE_HABITATION :
143 (ship->life_support == 0) ? SSHIP_PLACE_LIFE_SUPPORT :
144 (ship->solar_panels == 0) ? SSHIP_PLACE_SOLAR_PANELS :
145 ((ship->habitation < ship->life_support)
146 && (ship->solar_panels*2 >= ship->habitation + ship->life_support + 1))
147 ? SSHIP_PLACE_HABITATION :
148 (ship->solar_panels*2 < ship->habitation + ship->life_support)
149 ? SSHIP_PLACE_SOLAR_PANELS :
150 (ship->life_support < ship->habitation)
151 ? SSHIP_PLACE_LIFE_SUPPORT :
152 ((ship->life_support <= ship->habitation)
153 && (ship->solar_panels * 2 >= ship->habitation + ship->life_support + 1))
154 ? SSHIP_PLACE_LIFE_SUPPORT :
155 SSHIP_PLACE_SOLAR_PANELS;
156
157 if (fill->type == SSHIP_PLACE_HABITATION) {
158 fill->num = ship->habitation + 1;
159 } else if (fill->type == SSHIP_PLACE_LIFE_SUPPORT) {
160 fill->num = ship->life_support + 1;
161 } else {
162 fill->num = ship->solar_panels + 1;
163 }
164 fc_assert(fill->num <= NUM_SS_MODULES / 3);
165
166 return TRUE;
167 }
168 if (ship->components > ship->fuel + ship->propulsion) {
169 if (ship->fuel <= ship->propulsion) {
170 fill->type = SSHIP_PLACE_FUEL;
171 fill->num = ship->fuel + 1;
172 } else {
173 fill->type = SSHIP_PLACE_PROPULSION;
174 fill->num = ship->propulsion + 1;
175 }
176 return TRUE;
177 }
178 if (ship->structurals > num_spaceship_structurals_placed(ship)) {
179 /* Want to choose which structurals are most important.
180 Else we first want to connect one of each type of module,
181 then all placed components, pairwise, then any remaining
182 modules, or else finally in numerical order.
183 */
184 int req = -1;
185 int i;
186
187 if (!BV_ISSET(ship->structure, 0)) {
188 /* if we don't have the first structural, place that! */
189 fill->type = SSHIP_PLACE_STRUCTURAL;
190 fill->num = 0;
191 return TRUE;
192 }
193
194 if (ship->habitation >= 1
195 && !BV_ISSET(ship->structure, modules_info[0].required)) {
196 req = modules_info[0].required;
197 } else if (ship->life_support >= 1
198 && !BV_ISSET(ship->structure, modules_info[1].required)) {
199 req = modules_info[1].required;
200 } else if (ship->solar_panels >= 1
201 && !BV_ISSET(ship->structure, modules_info[2].required)) {
202 req = modules_info[2].required;
203 } else {
204 for (i = 0; i < NUM_SS_COMPONENTS; i++) {
205 if ((i % 2 == 0 && ship->fuel > (i/2))
206 || (i % 2 == 1 && ship->propulsion > (i/2))) {
207 if (!BV_ISSET(ship->structure, components_info[i].required)) {
208 req = components_info[i].required;
209 break;
210 }
211 }
212 }
213 }
214 if (req == -1) {
215 for (i = 0; i < NUM_SS_MODULES; i++) {
216 if ((i % 3 == 0 && ship->habitation > (i/3))
217 || (i % 3 == 1 && ship->life_support > (i/3))
218 || (i % 3 == 2 && ship->solar_panels > (i/3))) {
219 if (!BV_ISSET(ship->structure, modules_info[i].required)) {
220 req = modules_info[i].required;
221 break;
222 }
223 }
224 }
225 }
226 if (req == -1) {
227 for (i = 0; i < NUM_SS_STRUCTURALS; i++) {
228 if (!BV_ISSET(ship->structure, i)) {
229 req = i;
230 break;
231 }
232 }
233 }
234 /* sanity: */
235 fc_assert(req != -1);
236 fc_assert(!BV_ISSET(ship->structure, req));
237
238 /* Now we want to find a structural we can build which leads to req.
239 This loop should bottom out, because everything leads back to s0,
240 and we made sure above that we do s0 first.
241 */
242 while (!BV_ISSET(ship->structure, structurals_info[req].required)) {
243 req = structurals_info[req].required;
244 }
245 fill->type = SSHIP_PLACE_STRUCTURAL;
246 fill->num = req;
247
248 return TRUE;
249 }
250
251 return FALSE;
252}
BV_CLR_ALL
#define BV_CLR_ALL(bv)
Definition bitvector.h:95
BV_ISSET
#define BV_ISSET(bv, bit)
Definition bitvector.h:78
incite_cost
char * incite_cost
Definition comments.c:74
SSHIP_PLACE_PROPULSION
@ SSHIP_PLACE_PROPULSION
Definition fc_types.h:1280
SSHIP_PLACE_STRUCTURAL
@ SSHIP_PLACE_STRUCTURAL
Definition fc_types.h:1278
SSHIP_PLACE_LIFE_SUPPORT
@ SSHIP_PLACE_LIFE_SUPPORT
Definition fc_types.h:1282
SSHIP_PLACE_SOLAR_PANELS
@ SSHIP_PLACE_SOLAR_PANELS
Definition fc_types.h:1283
SSHIP_PLACE_FUEL
@ SSHIP_PLACE_FUEL
Definition fc_types.h:1279
SSHIP_PLACE_HABITATION
@ SSHIP_PLACE_HABITATION
Definition fc_types.h:1281
fc_assert
#define fc_assert(condition)
Definition log.h:176
fc_assert_ret_val
#define fc_assert_ret_val(condition, val)
Definition log.h:194
shared.h
num_spaceship_structurals_placed
int num_spaceship_structurals_placed(const struct player_spaceship *ship)
Definition spaceship.c:113
next_spaceship_component
bool next_spaceship_component(struct player *pplayer, struct player_spaceship *ship, struct spaceship_component *fill)
Definition spaceship.c:130
spaceship_init
void spaceship_init(struct player_spaceship *ship)
Definition spaceship.c:96
structurals_info
const struct sship_part_info structurals_info[NUM_SS_STRUCTURALS]
Definition spaceship.c:23
modules_info
const struct sship_part_info modules_info[NUM_SS_MODULES]
Definition spaceship.c:77
components_info
const struct sship_part_info components_info[NUM_SS_COMPONENTS]
Definition spaceship.c:58
spaceship.h
NUM_SS_MODULES
#define NUM_SS_MODULES
Definition spaceship.h:89
NUM_SS_COMPONENTS
#define NUM_SS_COMPONENTS
Definition spaceship.h:88
NUM_SS_STRUCTURALS
#define NUM_SS_STRUCTURALS
Definition spaceship.h:87
SSHIP_NONE
@ SSHIP_NONE
Definition spaceship.h:84
player_spaceship
Definition spaceship.h:94
player
Definition player.h:249
spaceship_component
Definition spaceship.h:132
spaceship_component::type
enum spaceship_place_type type
Definition spaceship.h:133
spaceship_component::num
int num
Definition spaceship.h:134
sship_part_info
Definition spaceship.h:119
sship_part_info::required
int required
Definition spaceship.h:121
TRUE
#define TRUE
Definition support.h:46
FALSE
#define FALSE
Definition support.h:47