1 //---------------------------------------------------------------------------
2 #include "stdafx.h"
3
4 #include <cassert>
5
6 #include <algorithm>
7 using std::min;
8 using std::max;
9
10 #include <stdexcept> // needed for Android at least
11
12 #include <sstream>
13
14 #include "sector.h"
15 #include "game.h"
16 #include "utils.h"
17 #include "gamestate.h"
18 #include "panel.h"
19 #include "gui.h"
20 #include "player.h"
21 #include "screen.h"
22 #include "image.h"
23 #include "sound.h"
24 #include "tutorial.h"
25
26 //---------------------------------------------------------------------------
27
28 const int offset_fortress_x_c = 150;
29 const int offset_fortress_y_c = 14;
30 //const int offset_fortress_x_c = 100;
31 //const int offset_fortress_y_c = 50;
32 const int offset_mine_x_c = 32;
33 const int offset_mine_y_c = 14;
34 const int offset_factory_x_c = 32;
35 const int offset_factory_y_c = 96;
36 const int offset_lab_x_c = 150;
37 const int offset_lab_y_c = 96;
38
39 /*const int DEFENDER_DIR_S = 0;
40 const int DEFENDER_DIR_N = 1;
41 const int DEFENDER_DIR_E = 2;
42 const int DEFENDER_DIR_W = 3;*/
43
isAirUnit(int epoch)44 bool isAirUnit(int epoch) {
45 ASSERT_S_EPOCH(epoch);
46 if( epoch == n_epochs_c || epoch < 6 ) {
47 return false;
48 }
49 return true;
50 }
51
defenceNeedsMan(int epoch)52 bool defenceNeedsMan(int epoch) {
53 ASSERT_EPOCH(epoch);
54 if( epoch == nuclear_epoch_c || epoch == laser_epoch_c ) {
55 return false;
56 }
57 return true;
58 }
59
Particle()60 Particle::Particle() : xpos(0.0f), ypos(0.0f), birth_time(0) {
61 this->birth_time = game_g->getGameTime();
62 }
63
draw(int xpos,int ypos) const64 void ParticleSystem::draw(int xpos, int ypos) const {
65 for(vector<Particle>::const_iterator iter = particles.begin(); iter != particles.end(); ++iter) {
66 this->image->draw(xpos + (int)iter->getX(), ypos + (int)iter->getY(), size, size);
67 }
68 }
69
SmokeParticleSystem(const Image * image)70 SmokeParticleSystem::SmokeParticleSystem(const Image *image) : ParticleSystem(image),
71 birth_rate(0.0f), life_exp(225), last_emit_time(0), move_x(0.0f), move_y(-6.667f) {
72 this->last_emit_time = game_g->getGameTime();
73 }
74
setBirthRate(float birth_rate)75 void SmokeParticleSystem::setBirthRate(float birth_rate) {
76 this->birth_rate = birth_rate;
77 }
78
update()79 void SmokeParticleSystem::update() {
80 // expire old particles
81 int time_now = game_g->getGameTime();
82 for(int i=particles.size()-1;i>=0;i--) { // count backwards in case of deletion
83 if( time_now >= particles.at(i).getBirthTime() + life_exp ) {
84 // for performance, we reorder and reduce the length by 1 (as the order of the particles shouldn't matter)
85 particles[i] = particles[particles.size()-1];
86 particles.resize(particles.size()-1);
87 }
88 }
89
90 int real_loop_time = game_g->getLoopTime();
91 //LOG("%d\n", real_loop_time);
92 // update particles
93 for(int i=particles.size()-1;i>=0;i--) { // count backwards in case of deletion
94 //const float xspeed = 0.01f;
95 const float xspeed = 0.015f;
96 //const float yspeed = 0.05f;
97 const float yspeed = 0.03f;
98 float xpos = particles.at(i).getX();
99 float ypos = particles.at(i).getY();
100 float ydiff = real_loop_time * yspeed;
101 float xdiff = real_loop_time * xspeed;
102 if( rand() % 2 == 0 ) {
103 xdiff = - xdiff;
104 }
105 //xpos += xdiff;
106 //ypos -= ydiff;
107 float real_xdiff = ydiff * move_x - xdiff * move_y;
108 float real_ydiff = ydiff * move_y + xdiff * move_x;
109 xpos += real_xdiff;
110 ypos += real_ydiff;
111 /*if( ypos < 0 ) {
112 // kill
113 // for performance, we reorder and reduce the length by 1 (as the order of the particles shouldn't matter)
114 particles[i] = particles[particles.size()-1];
115 particles.resize(particles.size()-1);
116 //LOG("resize to %d\n", particles.size());
117 }
118 else*/ {
119 particles.at(i).setPos(xpos, ypos);
120 }
121 }
122
123 // emit new particles
124 int accumulated_time = game_g->getGameTime() - this->last_emit_time;
125 int new_particles = (int)(this->birth_rate * accumulated_time);
126 new_particles = min(1, new_particles); // helps make rate more steady
127 this->last_emit_time += (int)(1.0f/birth_rate * new_particles);
128 if( new_particles > 0 ) {
129 //LOG("%d new particles (total will be %d)\n", new_particles, particles.size() + new_particles);
130 for(int i=0;i<new_particles;i++) {
131 Particle particle;
132 particles.push_back(particle);
133 }
134 }
135 if( this->birth_rate == 0.0f ) {
136 this->last_emit_time = game_g->getGameTime(); // prevent a big buildup of time when smoke system isn't active
137 }
138 }
139
Army(PlayingGameState * gamestate,Sector * sector,int player)140 Army::Army(PlayingGameState *gamestate, Sector *sector, int player) :
141 player(player), sector(sector), gamestate(gamestate)
142 {
143 ASSERT_PLAYER(player);
144 this->empty();
145 }
146
getTotal() const147 int Army::getTotal() const {
148 ASSERT_PLAYER(this->player);
149 int n = 0;
150 for(int i=0;i<n_epochs_c+1;i++)
151 n += soldiers[i];
152 return n;
153 }
154
getTotalMen() const155 int Army::getTotalMen() const {
156 ASSERT_PLAYER(this->player);
157 int n = 0;
158 for(int i=0;i<n_epochs_c+1;i++) {
159 int n_men = ( i==n_epochs_c ? 1 : game_g->invention_weapons[i]->getNMen() );
160 n += soldiers[i] * n_men;
161 }
162 return n;
163 }
164
any(bool include_unarmed) const165 bool Army::any(bool include_unarmed) const {
166 ASSERT_PLAYER(this->player);
167 int until = include_unarmed ? n_epochs_c : n_epochs_c-1;
168 for(int i=0;i<=until;i++) {
169 if( soldiers[i] > 0 )
170 return true;
171 }
172 return false;
173 }
174
getStrength() const175 int Army::getStrength() const {
176 ASSERT_PLAYER(this->player);
177 int n = 0;
178 for(int i=0;i<=n_epochs_c;i++) {
179 if( soldiers[i] > 0 ) {
180 ASSERT(i != nuclear_epoch_c);
181 n += getIndividualStrength(i) * soldiers[i];
182 }
183 }
184 return n;
185 }
186
getBombardStrength() const187 int Army::getBombardStrength() const {
188 ASSERT_PLAYER(this->player);
189 int n = 0;
190 for(int i=0;i<=n_epochs_c;i++) {
191 if( soldiers[i] > 0 )
192 n += getIndividualBombardStrength(i) * soldiers[i];
193 }
194 return n;
195 }
196
add(int i,int n)197 void Army::add(int i,int n) {
198 ASSERT_PLAYER(this->player);
199 ASSERT_S_EPOCH(i);
200 ASSERT(n > 0);
201 ASSERT( !this->sector->isNuked() );
202 this->soldiers[i] += n;
203 }
204
add(Army * army)205 void Army::add(Army *army) {
206 ASSERT_PLAYER(this->player);
207 ASSERT_PLAYER(army->player);
208 bool any = false;
209 for(int i=0;i<=n_epochs_c;i++) {
210 ASSERT(army->soldiers[i] >= 0);
211 any = any || army->soldiers[i] > 0;
212 this->soldiers[i] += army->soldiers[i];
213 army->soldiers[i] = 0;
214 }
215 if( any && ( this->sector == gamestate->getCurrentSector() || army->getSector() == gamestate->getCurrentSector() ) ) {
216 ASSERT( !this->sector->isNuked() );
217 //((PlayingGameState *)gamestate)->refreshSoldiers(true);
218 gamestate->refreshSoldiers(true);
219 }
220 }
221
remove(int i,int n)222 void Army::remove(int i,int n) {
223 ASSERT_PLAYER(this->player);
224 ASSERT_S_EPOCH(i);
225 ASSERT(n > 0);
226 this->soldiers[i] -= n;
227 ASSERT(this->soldiers[i] >= 0);
228 }
229
kill(int index)230 void Army::kill(int index) {
231 ASSERT_PLAYER(this->player);
232 bool done = false;
233 int saved_index = index;
234 for(int i=0;i<=n_epochs_c && !done;i++) {
235 if( index < soldiers[i] ) {
236 soldiers[i]--;
237 done = true;
238 if( this->sector == gamestate->getCurrentSector() ) {
239 //((PlayingGameState *)gamestate)->n_deaths[player][i]++;
240 //((PlayingGameState *)gamestate)->registerDeath(player, i);
241 gamestate->registerDeath(player, i);
242 }
243 }
244 index -= soldiers[i];
245 }
246 if( !done ) {
247 LOG("###can't kill index %d in army (total %d)\n",saved_index,this->getTotal());
248 ASSERT(0);
249 }
250 if( this->sector == gamestate->getCurrentSector() ) {
251 //((PlayingGameState *)gamestate)->refreshSoldiers(true);
252 gamestate->refreshSoldiers(true);
253 }
254 //((PlayingGameState *)gamestate)->getGamePanel()->refreshShutdown();
255 gamestate->getGamePanel()->refreshShutdown();
256 }
257
canLeaveSafely() const258 bool Army::canLeaveSafely() const {
259 bool any_enemy_attackers = false;
260 for(int i=0;i<n_players_c && !any_enemy_attackers;i++) {
261 if( i != this->player && !Player::isAlliance(i, this->player) )
262 any_enemy_attackers = this->sector->getArmy(i)->any(true);
263 }
264 //if( n_enemy_attackers > 0 || ( src_sector->player != -1 && src_sector->player != a_player ) ) {
265 //if( any_enemy_attackers || ( src_sector->player != -1 && src_sector->player != a_player ) ) {
266 if( this->sector->getPlayer() != this->player && ( any_enemy_attackers || ( this->sector->getPlayer() != -1 && !Player::isAlliance(this->sector->getPlayer(), this->player) ) ) ) {
267 return false;
268 }
269 return true;
270 }
271
retreat(bool only_air)272 void Army::retreat(bool only_air) {
273 if( game_g->getTutorial() != NULL && !game_g->getTutorial()->allowRetreatLoss() ) {
274 return;
275 }
276 for(int i=0;i<=n_epochs_c;i++) {
277 //if( only_air && ( i < air_epoch_c || i == n_epochs_c ) ) {
278 if( this->soldiers[i] > 0 ) {
279 if( only_air && !isAirUnit( i ) ) {
280 ; // don't do land units
281 }
282 else {
283 //this->soldiers[i] *= 0.6;
284 this->soldiers[i] = (int)(this->soldiers[i] * 0.6);
285 }
286 }
287 }
288 }
289
getIndividualStrength(int i) const290 int Army::getIndividualStrength(int i) const {
291 return getIndividualStrength(this->player, i);
292 }
293
getIndividualStrength(int player,int i)294 int Army::getIndividualStrength(int player, int i) {
295 ASSERT_S_EPOCH(i);
296 ASSERT_PLAYER(player);
297 int str = 0;
298 if( i == n_epochs_c && game_g->getStartEpoch() != end_epoch_c ) {
299 // unarmed
300 if( player == PlayerType::PLAYER_RED )
301 str = 2;
302 else
303 str = 1;
304 }
305 else if( i == nuclear_epoch_c )
306 str = 0;
307 else {
308 str = 1;
309 for(int j=0;j<=i;j++)
310 str *= 2;
311 //int n_men = invention_weapons[i]->n_men;
312 //str = 2 * (i+1) * n_men;
313 //str *= n_men;
314 }
315 return str;
316 }
317
getIndividualBombardStrength(int i)318 int Army::getIndividualBombardStrength(int i) {
319 ASSERT_S_EPOCH(i);
320 int str = 0;
321 if( game_g->getStartEpoch() == end_epoch_c ) {
322 str = 1;
323 }
324 else if( i != n_epochs_c ) {
325 // only armed men cause damage
326 /*int n_men = invention_weapons[i]->n_men;
327 str = (i+1) * n_men;*/
328 //str = i+1;
329 str = i - game_g->getStartEpoch() + 1;
330 /*str = 1;
331 for(int j=0;j<i;j++)
332 str *= 2;
333 str *= n_men;*/
334 }
335 return str;
336 }
337
saveState(stringstream & stream) const338 void Army::saveState(stringstream &stream) const {
339 // caller should write the <Army> ... </Army> enclosing tags
340 for(int i=0;i<=n_epochs_c;i++) {
341 stream << "<soldiers epoch=\"" << i << "\" n=\"" << this->soldiers[i] << "\"/>\n";
342 }
343 }
344
loadStateParseXMLNode(const TiXmlNode * parent)345 void Army::loadStateParseXMLNode(const TiXmlNode *parent) {
346 if( parent == NULL ) {
347 return;
348 }
349 bool read_children = true;
350
351 switch( parent->Type() ) {
352 case TiXmlNode::TINYXML_DOCUMENT:
353 break;
354 case TiXmlNode::TINYXML_ELEMENT:
355 {
356 const char *element_name = parent->Value();
357 const TiXmlElement *element = parent->ToElement();
358 const TiXmlAttribute *attribute = element->FirstAttribute();
359 if( strcmp(element_name, "army") == 0 ) {
360 // handled entirely by caller
361 }
362 else if( strcmp(element_name, "stored_army") == 0 ) {
363 // handled entirely by caller
364 }
365 else if( strcmp(element_name, "soldiers") == 0 ) {
366 int epoch = -1;
367 int n = -1;
368 while( attribute != NULL ) {
369 const char *attribute_name = attribute->Name();
370 if( strcmp(attribute_name, "epoch") == 0 ) {
371 epoch = atoi(attribute->Value());
372 }
373 else if( strcmp(attribute_name, "n") == 0 ) {
374 n = atoi(attribute->Value());
375 }
376 else {
377 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
378 LOG("unknown army/soldiers attribute: %s\n", attribute_name);
379 ASSERT(false);
380 }
381 attribute = attribute->Next();
382 }
383 if( epoch == -1 || n == -1 ) {
384 throw std::runtime_error("soldiers missing attributes");
385 }
386 else if( epoch < 0 || epoch > n_epochs_c ) {
387 throw std::runtime_error("soldiers invalid epoch");
388 }
389 this->soldiers[epoch] = n;
390 }
391 else {
392 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
393 LOG("unknown army tag: %s\n", element_name);
394 ASSERT(false);
395 }
396 }
397 break;
398 case TiXmlNode::TINYXML_COMMENT:
399 break;
400 case TiXmlNode::TINYXML_UNKNOWN:
401 break;
402 case TiXmlNode::TINYXML_TEXT:
403 {
404 }
405 break;
406 case TiXmlNode::TINYXML_DECLARATION:
407 break;
408 }
409
410 for(const TiXmlNode *child=parent->FirstChild();child!=NULL && read_children;child=child->NextSibling()) {
411 loadStateParseXMLNode(child);
412 }
413 }
414
Element(const char * name,Id id,Type type)415 Element::Element(const char *name,Id id,Type type) {
416 //strcpy(this->name,name);
417 this->name = name;
418 this->id = id;
419 this->type = type;
420 }
421
~Element()422 Element::~Element() {
423 }
424
getImage() const425 Image *Element::getImage() const {
426 return game_g->icon_elements[this->id];
427 }
428
Design(Invention * invention,bool ergonomically_terrific)429 Design::Design(Invention *invention,bool ergonomically_terrific) {
430 this->invention = invention;
431 this->ergonomically_terrific = ergonomically_terrific;
432 this->save_id = -1;
433 for(int i=0;i<N_ID;i++)
434 this->cost[i] = 0;
435 //invention->designs->add(this);
436 //invention->designs->push_back(this);
437 invention->addDesign(this);
438 };
439
Invention(const char * name,Type type,int epoch)440 Invention::Invention(const char *name,Type type,int epoch) {
441 ASSERT_ANY_EPOCH(epoch);
442 //strcpy(this->name,name);
443 this->name = name;
444 this->type = type;
445 this->epoch = epoch;
446 }
447
~Invention()448 Invention::~Invention() {
449 for(size_t i=0;i<designs.size();i++) {
450 Design *design = designs.at(i);
451 delete design;
452 }
453 }
454
getImage() const455 Image *Invention::getImage() const {
456 if( this->type == SHIELD )
457 return game_g->icon_shields[this->epoch - game_g->getStartEpoch()];
458 else if( this->type == DEFENCE )
459 return game_g->icon_defences[this->epoch];
460 else if( this->type == WEAPON )
461 return game_g->icon_weapons[this->epoch];
462 return NULL;
463 }
464
addDesign(Design * design)465 void Invention::addDesign(Design *design) {
466 ASSERT( design->getInvention() == this );
467 ASSERT( design->getSaveId() == -1 );
468 design->setSaveId( designs.size() );
469 this->designs.push_back(design);
470 }
471
findDesign(int save_id) const472 Design *Invention::findDesign(int save_id) const {
473 for(vector<Design *>::const_iterator iter = designs.begin(); iter != designs.end(); ++iter) {
474 Design *design = *iter;
475 if( design->getSaveId() == save_id ) {
476 return design;
477 }
478 }
479 return NULL;
480 }
481
482 /*void Invention::addDesign(Design *design) {
483 this->designs->add(design);
484 }*/
485
getInvention(Invention::Type type,int epoch)486 Invention *Invention::getInvention(Invention::Type type,int epoch) {
487 ASSERT_EPOCH(epoch);
488 Invention *invention = NULL;
489 if( type == SHIELD )
490 invention = game_g->invention_shields[epoch];
491 else if( type == DEFENCE )
492 invention = game_g->invention_defences[epoch];
493 else if( type == WEAPON )
494 invention = game_g->invention_weapons[epoch];
495 ASSERT(invention != NULL);
496 return invention;
497 }
498
Building(PlayingGameState * gamestate,Sector * sector,Type type)499 Building::Building(PlayingGameState *gamestate, Sector *sector, Type type) :
500 type(type), sector(sector), health(0), max_health(0), pos_x(0), pos_y(0), n_turrets(0), building_button(NULL), gamestate(gamestate)
501 {
502 //LOG("Building::Building(Sector [%d: %d, %d], Type %d)\n", sector->getPlayer(), sector->getXPos(), sector->getYPos(), type);
503 Rect2D turret_pos[max_building_turrets_c];
504
505 if( this->type == BUILDING_TOWER )
506 this->max_health = 150;
507 else
508 this->max_health = 100;
509 this->health = this->max_health;
510 this->n_turrets = 0;
511 for(int i=0;i<max_building_turrets_c;i++) {
512 this->turret_man[i] = -1;
513 this->turret_man_frame[i] = 0;
514 }
515
516 if( this->type == BUILDING_TOWER ) {
517 this->pos_x = offset_fortress_x_c;
518 this->pos_y = offset_fortress_y_c;
519 this->n_turrets = 4;
520 if( game_g->isUsingOldGfx() ) {
521 turret_pos[0].set(0, 0, 15, 12);
522 turret_pos[1].set(27, 0, 15, 12);
523 turret_pos[2].set(0, 24, 15, 12);
524 turret_pos[3].set(27, 24, 15, 12);
525 }
526 else {
527 turret_pos[0].set(1, -2, 15, 14);
528 turret_pos[1].set(28, -2, 15, 14);
529 turret_pos[2].set(1, 22, 15, 15);
530 turret_pos[3].set(28, 22, 15, 15);
531 }
532 }
533 else if( this->type == BUILDING_MINE ) {
534 this->pos_x = offset_mine_x_c;
535 this->pos_y = offset_mine_y_c;
536 this->n_turrets = 2;
537 if( game_g->isUsingOldGfx() ) {
538 turret_pos[0].set(0, 17, 15, 12);
539 turret_pos[1].set(27, 17, 15, 12);
540 }
541 else {
542 turret_pos[0].set(2, 17, 16, 16);
543 turret_pos[1].set(25, 17, 16, 16);
544 }
545 }
546 else if( this->type == BUILDING_FACTORY ) {
547 this->pos_x = offset_factory_x_c;
548 this->pos_y = offset_factory_y_c;
549 this->n_turrets = 3;
550 if( game_g->isUsingOldGfx() ) {
551 turret_pos[0].set(1, 9, 15, 12);
552 turret_pos[1].set(33, 9, 15, 12);
553 turret_pos[2].set(16, 26, 15, 12);
554 }
555 else {
556 turret_pos[0].set(0, 7, 16, 15);
557 turret_pos[1].set(31, 7, 16, 15);
558 turret_pos[2].set(15, 29, 16, 15);
559 }
560 }
561 else if( this->type == BUILDING_LAB ) {
562 this->pos_x = offset_lab_x_c;
563 this->pos_y = offset_lab_y_c;
564 this->n_turrets = 1;
565 if( game_g->isUsingOldGfx() ) {
566 turret_pos[0].set(10, 4, 15, 12);
567 }
568 else {
569 turret_pos[0].set(10, 6, 16, 16);
570 }
571 }
572 ASSERT(this->n_turrets != 0);
573
574 building_button = NULL;
575 if( this->type == BUILDING_TOWER ) {
576 building_button = new PanelPage(offset_land_x_c + this->pos_x, offset_land_y_c + this->pos_y, 58, 60);
577 building_button->setSurviveOwner(true);
578 }
579
580 for(int j=0;j<this->n_turrets;j++) {
581 Rect2D rect = turret_pos[j];
582 turret_buttons[j] = new PanelPage(offset_land_x_c + this->pos_x + rect.x, offset_land_y_c + this->pos_y + rect.y, rect.w, rect.h);
583 //turret_buttons[j]->setInfoLMB("place a defender here");
584 turret_buttons[j]->setSurviveOwner(true);
585 }
586 if( sector == gamestate->getCurrentSector() ) {
587 //((PlayingGameState *)gamestate)->addBuilding(this);
588 gamestate->addBuilding(this);
589 }
590 //LOG("Building::Building done\n");
591 }
592
~Building()593 Building::~Building() {
594 //LOG("Building::~Building()\n");
595 for(int i=0;i<this->n_turrets;i++) {
596 delete turret_buttons[i];
597 }
598 if( building_button != NULL )
599 delete building_button;
600 //LOG("Building::~Building done\n");
601 }
602
getImages()603 Image **Building::getImages() {
604 Image **images = NULL;
605 if( type == BUILDING_TOWER )
606 images = game_g->fortress;
607 else if( type == BUILDING_MINE )
608 images = game_g->mine;
609 else if( type == BUILDING_FACTORY )
610 images = game_g->factory;
611 else if( type == BUILDING_LAB )
612 images = game_g->lab;
613 ASSERT(images != NULL);
614 return images;
615 }
616
rotateDefenders()617 void Building::rotateDefenders() {
618 for(int i=0;i<this->n_turrets;i++) {
619 this->turret_man_frame[i] = rand();
620 }
621 /*if( this->type == BUILDING_TOWER ) {
622 this->turret_mandir[0] = ( rand() % 2 ) == 0 ? DEFENDER_DIR_W : DEFENDER_DIR_N;
623 this->turret_mandir[1] = ( rand() % 2 ) == 0 ? DEFENDER_DIR_E : DEFENDER_DIR_N;
624 this->turret_mandir[2] = ( rand() % 2 ) == 0 ? DEFENDER_DIR_W : DEFENDER_DIR_S;
625 this->turret_mandir[3] = ( rand() % 2 ) == 0 ? DEFENDER_DIR_E : DEFENDER_DIR_S;
626 }
627 else if( this->type == BUILDING_MINE ) {
628 this->turret_mandir[0] = ( rand() % 2 ) == 0 ? DEFENDER_DIR_W : DEFENDER_DIR_S;
629 this->turret_mandir[1] = ( rand() % 2 ) == 0 ? DEFENDER_DIR_E : DEFENDER_DIR_S;
630 }
631 else if( this->type == BUILDING_FACTORY ) {
632 int r0 = rand() % 3;
633 this->turret_mandir[0] = r0 == 0 ? DEFENDER_DIR_W : r0 == 1 ? DEFENDER_DIR_S : DEFENDER_DIR_N;
634 int r1 = rand() % 3;
635 this->turret_mandir[1] = r1 == 0 ? DEFENDER_DIR_E : r1 == 1 ? DEFENDER_DIR_S : DEFENDER_DIR_N;
636 int r2 = rand() % 3;
637 this->turret_mandir[2] = r2 == 0 ? DEFENDER_DIR_W : r2 == 1 ? DEFENDER_DIR_E : DEFENDER_DIR_S;
638 }
639 else if( this->type == BUILDING_LAB ) {
640 int r0 = rand() % 4;
641 if( r0 == 0 )
642 this->turret_mandir[0] = DEFENDER_DIR_N;
643 else if( r0 == 1 )
644 this->turret_mandir[0] = DEFENDER_DIR_E;
645 else if( r0 == 2 )
646 this->turret_mandir[0] = DEFENDER_DIR_S;
647 else if( r0 == 3 )
648 this->turret_mandir[0] = DEFENDER_DIR_W;
649 else {
650 ASSERT(false);
651 }
652 }
653 else {
654 ASSERT(false);
655 }*/
656 }
657
getDefenderStrength() const658 int Building::getDefenderStrength() const {
659 int n = 0;
660 for(int i=0;i<n_turrets;i++) {
661 if( turret_man[i] != -1 )
662 n += Army::getIndividualStrength( sector->getPlayer(), turret_man[i] );
663 }
664 //n *= 2;
665 n *= 4;
666 return n;
667 }
668
killIthDefender(int i)669 void Building::killIthDefender(int i) {
670 turret_man[i] = -1;
671 if( gamestate->getCurrentSector() == this->sector ) {
672 int xpos = this->turret_buttons[i]->getLeft();
673 int ypos = this->turret_buttons[i]->getTop();
674 //((PlayingGameState *)gamestate)->deathEffect(xpos, ypos - 4);
675 gamestate->deathEffect(xpos, ypos - 4);
676 }
677 }
678
killDefender(int index)679 void Building::killDefender(int index) {
680 for(int i=0;i<n_turrets;i++) {
681 if( turret_man[i] != -1 ) {
682 if( index == 0 ) {
683 killIthDefender(i);
684 break;
685 }
686 index--;
687 }
688 }
689 }
690
getTurretMan(int turret) const691 int Building::getTurretMan(int turret) const {
692 ASSERT( turret >= 0 && turret < this->n_turrets );
693 return this->turret_man[turret];
694 }
695
getTurretManFrame(int turret) const696 int Building::getTurretManFrame(int turret) const {
697 ASSERT( turret >= 0 && turret < this->n_turrets );
698 ASSERT( this->turret_man[turret] != -1 );
699 return this->turret_man_frame[turret];
700 }
701
getTurretButton(int turret) const702 PanelPage *Building::getTurretButton(int turret) const {
703 ASSERT( turret >= 0 && turret < this->n_turrets );
704 return this->turret_buttons[turret];
705 }
706
clearTurretMan(int turret)707 void Building::clearTurretMan(int turret) {
708 ASSERT( turret >= 0 && turret < this->n_turrets );
709 this->turret_man[turret] = -1;
710 }
711
setTurretMan(int turret,int epoch)712 void Building::setTurretMan(int turret, int epoch) {
713 ASSERT( turret >= 0 && turret < this->n_turrets );
714 this->turret_man[turret] = epoch;
715 }
716
saveState(stringstream & stream) const717 void Building::saveState(stringstream &stream) const {
718 stream << "<building ";
719 stream << "building_id=\"" << type << "\" ";
720 stream << "health=\"" << health << "\" ";
721 stream << ">\n";
722 for(int i=0;i<max_building_turrets_c;i++) {
723 stream << "<turret_soldier turret_id=\"" << i << "\" epoch=\"" << turret_man[i] <<"\"/>\n";
724 }
725 stream << "</building>\n";
726 }
727
loadStateParseXMLNode(const TiXmlNode * parent)728 void Building::loadStateParseXMLNode(const TiXmlNode *parent) {
729 if( parent == NULL ) {
730 return;
731 }
732 bool read_children = true;
733
734 switch( parent->Type() ) {
735 case TiXmlNode::TINYXML_DOCUMENT:
736 break;
737 case TiXmlNode::TINYXML_ELEMENT:
738 {
739 const char *element_name = parent->Value();
740 const TiXmlElement *element = parent->ToElement();
741 const TiXmlAttribute *attribute = element->FirstAttribute();
742 if( strcmp(element_name, "building") == 0 ) {
743 while( attribute != NULL ) {
744 const char *attribute_name = attribute->Name();
745 if( strcmp(attribute_name, "building_id") == 0 ) {
746 // handled by caller
747 }
748 else if( strcmp(attribute_name, "health") == 0 ) {
749 health = atoi(attribute->Value());
750 }
751 else {
752 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
753 LOG("unknown building/building attribute: %s\n", attribute_name);
754 ASSERT(false);
755 }
756 attribute = attribute->Next();
757 }
758 }
759 else if( strcmp(element_name, "turret_soldier") == 0 ) {
760 int turret_id = -1;
761 int epoch = -1;
762 while( attribute != NULL ) {
763 const char *attribute_name = attribute->Name();
764 if( strcmp(attribute_name, "turret_id") == 0 ) {
765 turret_id = atoi(attribute->Value());
766 }
767 else if( strcmp(attribute_name, "epoch") == 0 ) {
768 epoch = atoi(attribute->Value());
769 }
770 else {
771 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
772 LOG("unknown building/turret_soldier attribute: %s\n", attribute_name);
773 ASSERT(false);
774 }
775 attribute = attribute->Next();
776 }
777 if( turret_id == -1 ) { // epoch allowed to be -1
778 throw std::runtime_error("turret_soldier missing attributes");
779 }
780 else if( turret_id < 0 || turret_id >= max_building_turrets_c ) {
781 throw std::runtime_error("turret_soldier invalid turret_id");
782 }
783 else if( epoch < -1 || epoch >= n_epochs_c ) {
784 throw std::runtime_error("turret_soldier invalid epoch");
785 }
786 this->turret_man[turret_id] = epoch;
787 }
788 else {
789 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
790 LOG("unknown building tag: %s\n", element_name);
791 ASSERT(false);
792 }
793 }
794 break;
795 case TiXmlNode::TINYXML_COMMENT:
796 break;
797 case TiXmlNode::TINYXML_UNKNOWN:
798 break;
799 case TiXmlNode::TINYXML_TEXT:
800 {
801 }
802 break;
803 case TiXmlNode::TINYXML_DECLARATION:
804 break;
805 }
806
807 for(const TiXmlNode *child=parent->FirstChild();child!=NULL && read_children;child=child->NextSibling()) {
808 loadStateParseXMLNode(child);
809 }
810 }
811
Sector(PlayingGameState * gamestate,int epoch,int xpos,int ypos,MapColour map_colour)812 Sector::Sector(PlayingGameState *gamestate, int epoch, int xpos, int ypos, MapColour map_colour) :
813 xpos(xpos), ypos(ypos), epoch(epoch), player(PLAYER_NONE), is_shutdown(false), nuked(false),
814 nuke_by_player(-1), nuke_time(-1),
815 nuke_defence_animation(false), nuke_defence_time(-1), nuke_defence_x(0), nuke_defence_y(0),
816 population(0), n_designers(0), n_workers(0), n_famount(0),
817 current_design(NULL), current_manufacture(NULL),
818 researched(0), researched_lasttime(-1), manufactured(0), manufactured_lasttime(-1), growth_lasttime(-1), mined_lasttime(-1), built_lasttime(-1),
819 assembled_army(NULL), stored_army(NULL), smokeParticleSystem(NULL), jetParticleSystem(NULL), nukeParticleSystem(NULL), nukeDefenceParticleSystem(NULL),
820 gamestate(gamestate)
821 {
822 //LOG("Sector::Sector(%d,%d,%d)\n",epoch,xpos,ypos);
823 ASSERT_EPOCH(epoch);
824
825 for(int i=0;i<N_ID;i++) {
826 this->elements[i] = 0;
827 }
828 for(int i=0;i<n_players_c;i++) {
829 this->armies[i] = new Army(gamestate, this, i);
830 }
831
832 // rocks etc
833 int n_clutter = game_g->icon_clutter.size() > 0 ? (1 + rand() % 4) : 0;
834 for(int i=0;i<n_clutter;i++) {
835 int land_width = game_g->land[(int)map_colour]->getScaledWidth() - 32;
836 int land_height = game_g->land[(int)map_colour]->getScaledHeight() - 32;
837 int xpos = offset_land_x_c + rand() % land_width;
838 int ypos = offset_land_y_c + rand() % land_height;
839 Image **image_ptr = &game_g->icon_clutter[rand() % game_g->icon_clutter.size()];
840 Feature *feature = new Feature(image_ptr, 1, xpos, ypos);
841 this->features.push_back(feature);
842 }
843 // trees (should be after clutter, so they are drawn over them if overlapping)
844 int cx = offset_land_x_c + 16;
845 for(;;) {
846 int treetype = rand() % 3;
847 if( treetype == 2 )
848 treetype = 3;
849 //Image *image = icon_trees[treetype];
850 Image *image = game_g->icon_trees[treetype][0];
851 cx += rand() % 16;
852 if( cx + image->getScaledWidth() > offset_land_x_c + land_width_c )
853 break;
854 //int ypos = offset_land_y_c - image->getScaledHeight() + 12 + rand() % 12;
855 int ypos = offset_land_y_c - image->getScaledHeight() + 16 + rand() % 8;
856 //Feature *feature = new Feature(icon_trees[treetype], cx, ypos);
857 Feature *feature = new Feature(game_g->icon_trees[treetype], n_tree_frames_c, cx, ypos);
858 //Feature *feature = new Feature(image, cx, ypos);
859 this->features.push_back(feature);
860 cx += image->getScaledWidth() - 8;
861 }
862 cx = offset_land_x_c + 16;
863 for(;;) {
864 int treetype = rand() % 3;
865 if( treetype == 2 )
866 treetype = 3;
867 Image *image = game_g->icon_trees[treetype][0];
868 cx += rand() % 32;
869 if( cx + image->getScaledWidth() > offset_land_x_c + land_width_c )
870 break;
871 int ypos = offset_land_y_c + game_g->land[(int)map_colour]->getScaledHeight() - image->getScaledHeight() - 8 - rand() % 4;
872 Feature *feature = new Feature(game_g->icon_trees[treetype], n_tree_frames_c, cx, ypos);
873 feature->setAtFront(true);
874 this->features.push_back(feature);
875 cx += image->getScaledWidth() - 8;
876 }
877
878 if( game_g->smoke_image != NULL ) {
879 this->smokeParticleSystem = new SmokeParticleSystem(game_g->smoke_image);
880
881 this->jetParticleSystem = new SmokeParticleSystem(game_g->smoke_image);
882 this->jetParticleSystem->setMove(10.0f, 10.0f);
883 this->jetParticleSystem->setBirthRate(1.667f);
884 this->jetParticleSystem->setLifeExp(90);
885 this->jetParticleSystem->setSize(0.5f);
886
887 this->nukeParticleSystem = new SmokeParticleSystem(game_g->smoke_image);
888 this->nukeParticleSystem->setMove(10.0f, -10.0f);
889 this->nukeParticleSystem->setBirthRate(1.667f);
890 this->nukeParticleSystem->setLifeExp(90);
891 this->nukeParticleSystem->setSize(0.5f);
892
893 this->nukeDefenceParticleSystem = new SmokeParticleSystem(game_g->smoke_image);
894 this->nukeDefenceParticleSystem->setMove(0.0f, 10.0f);
895 this->nukeDefenceParticleSystem->setBirthRate(1.667f);
896 this->nukeDefenceParticleSystem->setLifeExp(90);
897 this->nukeDefenceParticleSystem->setSize(0.5f);
898 }
899
900 initTowerStuff();
901 }
902
initTowerStuff()903 void Sector::initTowerStuff() {
904 //LOG("Sector::initTowerStuff() [%d, %d]\n", xpos, ypos);
905 this->player = PLAYER_NONE;
906 this->is_shutdown = false;
907 //this->shutdown_player = -1;
908 this->population = 0;
909 this->n_designers = 0;
910 this->n_famount = 0;
911 for(int i=0;i<N_BUILDINGS;i++) {
912 this->n_builders[i] = 0;
913 this->buildings[i] = NULL;
914 }
915 this->current_design = NULL;
916 this->researched = 0;
917 this->researched_lasttime = -1;
918 this->current_manufacture = NULL;
919 this->manufactured = 0;
920 this->manufactured_lasttime = -1;
921 this->growth_lasttime = -1;
922 this->mined_lasttime = -1;
923 for(int i=0;i<n_players_c;i++)
924 this->built_towers[i] = 0;
925 for(int i=0;i<N_BUILDINGS;i++)
926 this->built[i] = 0;
927 this->built_lasttime = -1;
928 for(int i=0;i<3;i++) {
929 for(int j=0;j<n_epochs_c;j++) {
930 this->inventions_known[i][j] = false;
931 //this->inventions_known[i][j] = true;
932 }
933 }
934 this->designs.clear();
935 for(int i=0;i<N_ID;i++) {
936 this->n_miners[i] = 0;
937 this->elementstocks[i] = 0;
938 this->partial_elementstocks[i] = 0;
939 }
940
941 //this->assembled_army = new Army(this, this->getPlayer());
942 //this->stored_army = new Army(this, this->getPlayer());
943 this->assembled_army = NULL;
944 this->stored_army = NULL;
945 for(int i=0;i<n_epochs_c;i++)
946 this->stored_defenders[i] = 0;
947 for(int i=0;i<4;i++)
948 this->stored_shields[i] = 0;
949
950 //this->n_workers = 0;
951 this->setWorkers(0); // call to also set the particle system rate; must be done after setting the buildings to NULL
952 }
953
~Sector()954 Sector::~Sector() {
955 //LOG("Sector::~Sector() [%d: %d, %d]\n", player, xpos, ypos);
956 for(size_t i=0;i<this->features.size();i++) {
957 Feature *feature = (Feature *)this->features.at(i);
958 delete feature;
959 }
960
961 for(unsigned int i=0;i<N_BUILDINGS;i++) {
962 if(this->buildings[i] != NULL )
963 delete this->buildings[i];
964 }
965 if( this->assembled_army != NULL )
966 delete this->assembled_army;
967 if( this->stored_army != NULL )
968 delete this->stored_army;
969 for(int i=0;i<n_players_c;i++)
970 delete this->armies[i];
971
972 if( smokeParticleSystem != NULL ) {
973 delete smokeParticleSystem;
974 }
975 if( jetParticleSystem != NULL ) {
976 delete jetParticleSystem;
977 }
978 if( nukeParticleSystem != NULL ) {
979 delete nukeParticleSystem;
980 }
981 if( nukeDefenceParticleSystem != NULL ) {
982 delete nukeDefenceParticleSystem;
983 }
984 }
985
createTower(int player,int population)986 void Sector::createTower(int player,int population) {
987 //LOG("Sector::createTower(%d,%d) [%d, %d]\n", player, population, xpos, ypos);
988 ASSERT( !nuked );
989 this->player = player;
990 this->assembled_army = new Army(gamestate, this, this->getPlayer());
991 this->stored_army = new Army(gamestate, this, this->getPlayer());
992 this->population = population;
993 this->buildings[BUILDING_TOWER] = new Building(gamestate, this, BUILDING_TOWER);
994 }
995
destroyTower(bool nuked,int client_player)996 void Sector::destroyTower(bool nuked, int client_player) {
997 LOG("Sector::destroyTower(%d) [%d: %d, %d]\n", nuked, player, xpos, ypos);
998 ASSERT_PLAYER(this->player);
999 if( !nuked ) {
1000 this->evacuate();
1001 }
1002 /*delete this->buildings[BUILDING_TOWER];
1003 this->buildings[BUILDING_TOWER] = NULL;*/
1004 for(int i=0;i<N_BUILDINGS;i++) {
1005 if(this->buildings[i] != NULL) {
1006 delete this->buildings[i];
1007 this->buildings[i] = NULL;
1008 }
1009 }
1010
1011 delete this->assembled_army;
1012 this->assembled_army = NULL;
1013 delete this->stored_army;
1014 this->stored_army = NULL;
1015
1016 int this_player = this->player; // keep a copy
1017
1018 initTowerStuff();
1019 if( this == gamestate->getCurrentSector() ) {
1020 gamestate->getGamePanel()->setPage(GamePanel::STATE_SECTORCONTROL);
1021 gamestate->getGamePanel()->setup();
1022 }
1023 gamestate->getGamePanel()->refreshShutdown();
1024
1025 if( nuked || game_g->playerAlive(this_player) ) {
1026 // player has other sectors
1027 if( game_g->isDemo() ) {
1028 }
1029 else if( this_player == client_player ) {
1030 if( nuked )
1031 playSample(game_g->s_weve_been_nuked);
1032 else
1033 playSample(game_g->s_sector_destroyed);
1034 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
1035 gamestate->setFlashingSquare(this->xpos, this->ypos);
1036 }
1037 else if( ( nuked && nuke_by_player == client_player ) || ( !nuked && this->getArmy(client_player)->getTotal() > 0 ) ) {
1038 if( nuked && nuke_by_player == client_player )
1039 playSample(game_g->s_weve_nuked_them);
1040 else
1041 playSample(game_g->s_conquered);
1042 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
1043 gamestate->setFlashingSquare(this->xpos, this->ypos);
1044 }
1045 }
1046 // game win/lose is handled in main game loop now
1047 LOG("Sector::destroyTower() exit\n");
1048 }
1049
destroyBuilding(Type building_type,int client_player)1050 void Sector::destroyBuilding(Type building_type,int client_player) {
1051 this->destroyBuilding(building_type, false, client_player);
1052 }
1053
destroyBuilding(Type building_type,bool silent,int client_player)1054 void Sector::destroyBuilding(Type building_type,bool silent,int client_player) {
1055 LOG("Sector::destroyBuilding(%d) [%d: %d, %d]\n", building_type, player, xpos, ypos);
1056 ASSERT( buildings[(int)building_type] != NULL );
1057 if( this == gamestate->getCurrentSector() && !silent ) {
1058 playSample(game_g->s_buildingdestroyed, SOUND_CHANNEL_FX);
1059 }
1060 if( building_type == BUILDING_TOWER ) {
1061 this->destroyTower(false, client_player);
1062 return;
1063 }
1064 else if( building_type == BUILDING_MINE ) {
1065 if( this->player == client_player && !silent ) {
1066 playSample(game_g->s_mine_destroyed);
1067 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
1068 gamestate->setFlashingSquare(this->xpos, this->ypos);
1069 }
1070 for(int i=0;i<N_ID;i++) {
1071 /*
1072 // n.b., we kill the open pit element miners too, as the mine supersedes the open pit mine
1073 this->population -= this->n_miners[i];
1074 */
1075 this->n_miners[i] = 0;
1076 }
1077 /*if( this->population < 0 ) {
1078 // shouldn't happen!
1079 this->population = 0;
1080 }*/
1081 }
1082 else if( building_type == BUILDING_FACTORY ) {
1083 if( this->player == client_player && !silent ) {
1084 playSample(game_g->s_factory_destroyed);
1085 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
1086 gamestate->setFlashingSquare(this->xpos, this->ypos);
1087 }
1088 /*this->population -= this->n_workers;
1089 if( this->population < 0 ) {
1090 // shouldn't happen!
1091 this->population = 0;
1092 }*/
1093 this->setWorkers(0); // call to also set the particle system rate
1094 this->current_manufacture = NULL; // so the player can't try to set workers again!
1095 }
1096 else if( building_type == BUILDING_LAB ) {
1097 if( this->player == client_player && !silent ) {
1098 playSample(game_g->s_lab_destroyed);
1099 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
1100 gamestate->setFlashingSquare(this->xpos, this->ypos);
1101 }
1102 if( this->current_design != NULL && this->current_design->getInvention()->getEpoch() > lab_epoch_c ) {
1103 // for pre-lab epoch designs, we can imagine the designers can work without being in the lab...
1104 /*this->population -= this->n_designers;
1105 if( this->population < 0 ) {
1106 // shouldn't happen!
1107 this->population = 0;
1108 }*/
1109 this->setDesigners(0);
1110 this->current_design = NULL; // so the player can't try to set designers again!
1111 }
1112 }
1113 else {
1114 ASSERT(0);
1115 }
1116
1117 // also return defenders
1118 for(int j=0;j<this->buildings[(int)building_type]->getNTurrets();j++) {
1119 if( this->buildings[(int)building_type]->getTurretMan(j) != -1 )
1120 this->returnDefender(this->buildings[(int)building_type], j);
1121 }
1122
1123 delete this->buildings[(int)building_type];
1124 this->buildings[(int)building_type] = NULL;
1125 this->built[(int)building_type] = 0;
1126
1127 if( this == gamestate->getCurrentSector() && this->player == client_player ) {
1128 gamestate->getGamePanel()->refresh();
1129 }
1130 }
1131
canShutdown() const1132 bool Sector::canShutdown() const {
1133 //ASSERT( !this->is_shutdown );
1134 if( this->is_shutdown )
1135 return false;
1136
1137 if( this->getEpoch() == n_epochs_c-1 && game_g->getStartEpoch() != end_epoch_c ) // in 2100AD
1138 {
1139 for(int y=0;y<map_height_c;y++) {
1140 for(int x=0;x<map_width_c;x++) {
1141 //if( game_g->getMap()->sector_at[x][y] ) {
1142 if( game_g->getMap()->isSectorAt(x, y) ) {
1143 const Sector *sector = game_g->getMap()->getSector(x, y);
1144 if( ( sector != gamestate->getCurrentSector() && sector->getPlayer() == this->getPlayer() )
1145 || sector->getArmy(this->getPlayer())->any(true) ) {
1146 return true;
1147 }
1148 }
1149 }
1150 }
1151 }
1152 return false;
1153 }
1154
shutdown(int client_player)1155 void Sector::shutdown(int client_player) {
1156 LOG("Sector::shutdown [%d: %d, %d]\n", player, xpos, ypos);
1157 ASSERT_PLAYER( this->player );
1158 ASSERT( this->player != -1 );
1159 ASSERT( !this->is_shutdown );
1160 /*this->shutdown_player = this->player;
1161 this->player = -1;*/
1162 for(int i=0;i<N_BUILDINGS;i++) {
1163 if( this->buildings[i] != NULL ) {
1164 for(int j=0;j<this->buildings[i]->getNTurrets();j++) {
1165 if( this->buildings[i]->getTurretMan(j) != -1 )
1166 this->returnDefender(this->buildings[i], j);
1167 }
1168 }
1169 if( i != BUILDING_TOWER && this->buildings[i] != NULL )
1170 this->destroyBuilding((Type)i, true, client_player);
1171 }
1172
1173 this->is_shutdown = true;
1174 if( this == gamestate->getCurrentSector() ) {
1175 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
1176 gamestate->reset();
1177 }
1178 }
1179
getBuilding(Type type) const1180 Building *Sector::getBuilding(Type type) const {
1181 //LOG("Sector::getBuilding(%d)\n",type);
1182 return this->buildings[type];
1183 }
1184
getNDefenders() const1185 int Sector::getNDefenders() const {
1186 //LOG("Sector::getNDefenders()\n");
1187 int n = 0;
1188 for(int i=0;i<N_BUILDINGS;i++) {
1189 if( this->buildings[i] != NULL )
1190 n += buildings[i]->getNDefenders();
1191 }
1192 return n;
1193 }
1194
getNDefenders(int type) const1195 int Sector::getNDefenders(int type) const {
1196 int n = 0;
1197 for(int i=0;i<N_BUILDINGS;i++) {
1198 if( this->buildings[i] != NULL )
1199 n += buildings[i]->getNDefenders(type);
1200 }
1201 return n;
1202 }
1203
getDefenderStrength() const1204 int Sector::getDefenderStrength() const {
1205 //LOG("Sector::getDefenderStrength()\n");
1206 int n = 0;
1207 for(int i=0;i<N_BUILDINGS;i++) {
1208 if( this->buildings[i] != NULL )
1209 n += buildings[i]->getDefenderStrength();
1210 }
1211 return n;
1212 }
1213
killDefender(int index)1214 void Sector::killDefender(int index) {
1215 LOG("Sector::killDefender(%d) [%d: %d, %d]\n", index, player, xpos, ypos);
1216 for(int i=0;i<N_BUILDINGS;i++) {
1217 if( this->buildings[i] != NULL ) {
1218 if( index < buildings[i]->getNDefenders() ) {
1219 buildings[i]->killDefender(index);
1220 break;
1221 }
1222 index -= buildings[i]->getNDefenders();
1223 }
1224 }
1225 }
1226
canBuild(Type type) const1227 bool Sector::canBuild(Type type) const {
1228 //LOG("Sector::canBuild(%d)\n",type);
1229 if( game_g->getStartEpoch() == end_epoch_c )
1230 return false;
1231
1232 if( getBuilding(type) != NULL )
1233 return false;
1234
1235 if( type == BUILDING_MINE ) {
1236 return this->epoch >= mine_epoch_c;
1237 }
1238 if( type == BUILDING_FACTORY ) {
1239 return this->epoch >= factory_epoch_c;
1240 }
1241 if( type == BUILDING_LAB ) {
1242 return this->epoch >= lab_epoch_c;
1243 }
1244
1245 return false;
1246 }
1247
canMine(Id id) const1248 bool Sector::canMine(Id id) const {
1249 ASSERT_ELEMENT_ID(id);
1250 //LOG("Sector::canMine(%d)\n",id);
1251 if( !this->anyElements(id) )
1252 return false;
1253
1254 if( game_g->elements[id]->getType() == Element::GATHERABLE )
1255 return true;
1256 else if( game_g->elements[id]->getType() == Element::OPENPITMINE )
1257 return ( this->epoch >= 1 );
1258 else if( game_g->elements[id]->getType() == Element::DEEPMINE )
1259 return (this->buildings[BUILDING_MINE] != NULL);
1260
1261 // error
1262 LOG("###Didn't expect element id %d of type %d\n",id,game_g->elements[id]->getType());
1263 ASSERT(0);
1264 return false;
1265 }
1266
canBuildDesign(Invention::Type type,int epoch) const1267 Design *Sector::canBuildDesign(Invention::Type type,int epoch) const {
1268 //LOG("Sector::canBuildDesign(%d,%d)\n",type,epoch);
1269 ASSERT_EPOCH(epoch);
1270 if(epoch < game_g->getStartEpoch() || epoch > game_g->getStartEpoch() + 3 )
1271 return NULL; // can't build this
1272 if( epoch >= factory_epoch_c && this->getBuilding(BUILDING_FACTORY) == NULL )
1273 return NULL; // need a factory for this
1274
1275 Invention *invention = Invention::getInvention(type, epoch);
1276 ASSERT(invention != NULL);
1277 Design *best_design = NULL;
1278 for(size_t i=0;i<this->designs.size() && best_design==NULL;i++) {
1279 Design *design = this->designs.at(i);
1280 // design should be non-NULL, but to satisfy VS Code Analysis...
1281 if( design == NULL )
1282 continue;
1283 if( design->getInvention() != invention )
1284 continue;
1285 bool ok = canBuildDesign(design);
1286 if( ok )
1287 best_design = design;
1288 }
1289 return best_design;
1290 }
1291
canBuildDesign(Design * design) const1292 bool Sector::canBuildDesign(Design *design) const {
1293 //LOG("Sector::canBuildDesign(%d)\n",design);
1294 if( design->getInvention()->getEpoch() >= factory_epoch_c && this->getBuilding(BUILDING_FACTORY) == NULL )
1295 return false; // need a factory for this
1296
1297 bool ok = true;
1298 for(int j=0;j<N_ID && ok;j++) {
1299 if( design->getCost((Id)j) > this->elementstocks[j] ) {
1300 // not enough elements
1301 ok = false;
1302 }
1303 }
1304 return ok;
1305 }
1306
canEverBuildDesign(Design * design) const1307 bool Sector::canEverBuildDesign(Design *design) const {
1308 //LOG("Sector::canBuildDesign(%d)\n",design);
1309 bool ok = true;
1310 for(int j=0;j<N_ID && ok;j++) {
1311 if( design->getCost((Id)j) > this->elementstocks[j] + this->elements[j] ) {
1312 // not enough elements
1313 ok = false;
1314 }
1315 }
1316 return ok;
1317 }
1318
autoTrashDesigns()1319 void Sector::autoTrashDesigns() {
1320 for(size_t i=0;i<this->designs.size();) {
1321 Design *design = this->designs.at(i);
1322 if( !canEverBuildDesign(design) ) {
1323 // trash
1324 this->trashDesign(design);
1325 // don't increment i, as this will remove the design
1326 }
1327 else {
1328 i++;
1329 }
1330 }
1331 }
1332
tryMiningMore() const1333 bool Sector::tryMiningMore() const {
1334 // todo: only check elements we can mine (we might not be able to advance to that epoch)
1335 for(int i=0;i<N_ID;i++) {
1336 //Element *element = game_g->elements[i];
1337 if( this->elements[i] > 0 &&
1338 this->elementstocks[i] < 6 * element_multiplier_c
1339 //( element->type != Element::GATHERABLE || this->elementstocks[i] < max_gatherables_stored_c * element_multiplier_c )
1340 ) {
1341 // if there are less than 6 of this element, and we can mine more, then do so
1342 return true;
1343 }
1344 }
1345 return false;
1346 }
1347
usedUp() const1348 bool Sector::usedUp() const {
1349 // a sector is used up iff:
1350 // we have no weapon designs (they are all trashed)
1351 // we can't design anything new
1352 // a lab could be built, but it hasn't been built
1353 // there are no more element stocks to mine
1354 // a mine could be built, but it hasn't been built
1355 /*if( this->designs->size() > 0 )
1356 return false;*/
1357 if( this->canBuild(BUILDING_LAB) ) {
1358 // should try building a lab
1359 return false;
1360 }
1361 if( this->canBuild(BUILDING_MINE) ) {
1362 // should try building a mine
1363 return false;
1364 }
1365 for(size_t i=0;i<this->designs.size();i++) {
1366 Design *design = this->designs.at(i);
1367 if( design->getInvention()->getType() == Invention::WEAPON )
1368 return false;
1369 }
1370 for(int i=0;i<n_epochs_c;i++) {
1371 if( this->canResearch(Invention::WEAPON, i) )
1372 return false;
1373 if( this->canResearch(Invention::DEFENCE, i) )
1374 return false;
1375 if( this->canResearch(Invention::SHIELD, i) )
1376 return false;
1377 }
1378 if( tryMiningMore() ) {
1379 return false;
1380 }
1381 return true;
1382 }
1383
cheat(int client_player)1384 void Sector::cheat(int client_player) {
1385 if( this->canBuild(BUILDING_MINE) ) {
1386 this->buildBuilding(BUILDING_MINE);
1387 }
1388 if( this->canBuild(BUILDING_FACTORY) ) {
1389 this->buildBuilding(BUILDING_FACTORY);
1390 }
1391 if( this->canBuild(BUILDING_LAB) ) {
1392 this->buildBuilding(BUILDING_LAB);
1393 }
1394 for(int i=0;i<N_ID;i++) {
1395 while( this->canMine((Id)i) && this->anyElements((Id)i) ) {
1396 this->mineElement(client_player, (Id)i);
1397 }
1398 }
1399 for(int i=0;i<n_epochs_c;i++) {
1400 Design *design = this->canResearch(Invention::WEAPON, i);
1401 if( design != NULL ) {
1402 this->setCurrentDesign(design);
1403 this->invent(client_player);
1404 }
1405 design = this->canResearch(Invention::DEFENCE, i);
1406 if( design != NULL ) {
1407 this->setCurrentDesign(design);
1408 this->invent(client_player);
1409 }
1410 design = this->canResearch(Invention::SHIELD, i);
1411 if( design != NULL ) {
1412 this->setCurrentDesign(design);
1413 this->invent(client_player);
1414 }
1415 }
1416 }
1417
knownDesign(Invention::Type type,int epoch) const1418 Design *Sector::knownDesign(Invention::Type type,int epoch) const {
1419 //LOG("Sector::knownDesign(%d,%d)\n",type,epoch);
1420 ASSERT_EPOCH(epoch);
1421 Invention *invention = Invention::getInvention(type, epoch);
1422 ASSERT(invention != NULL);
1423 Design *best_design = NULL;
1424 for(size_t i=0;i<this->designs.size() && best_design==NULL;i++) {
1425 Design *design = this->designs.at(i);
1426 // design should be non-NULL, but to satisfy VS Code Analysis...
1427 if( design == NULL )
1428 continue;
1429 if( design->getInvention() == invention ) {
1430 //ASSERT( best_design == NULL );
1431 best_design = design;
1432 }
1433 }
1434 return best_design;
1435 }
1436
bestDesign(Invention::Type type,int epoch) const1437 Design *Sector::bestDesign(Invention::Type type,int epoch) const {
1438 //LOG("Sector::bestDesign(%d,%d)\n",type,epoch);
1439 ASSERT_EPOCH(epoch);
1440 Invention *invention = Invention::getInvention(type, epoch);
1441 ASSERT(invention != NULL);
1442 Design *best_design = NULL;
1443 // todo: prefer gatherables; prefer more elements (eg, 0.5 wood + 0.5 bone is preferred over 1 wood or 1 bone);
1444 for(size_t i=0;i<invention->getNDesigns();i++) {
1445 //Design *design = (Design *)invention->designs->elementAt(i);
1446 Design *design = invention->getDesign(i);
1447 bool ok = true;
1448 if( game_g->isPrefDisallowNukes() && ( type == Invention::DEFENCE || type == Invention::WEAPON ) && epoch == nuclear_epoch_c ) {
1449 ok = false;
1450 }
1451 for(int j=0;j<N_ID && ok;j++) {
1452 if( design->getCost((Id)j) > this->elementstocks[j] ) {
1453 // not enough elements
1454 ok = false;
1455 }
1456 }
1457 if( ok ) {
1458 if( best_design == NULL )
1459 best_design = design;
1460 else if( design->isErgonomicallyTerrific() )
1461 best_design = design;
1462 }
1463 }
1464 return best_design;
1465 }
1466
trashDesign(Invention * invention)1467 void Sector::trashDesign(Invention *invention) {
1468 LOG("Sector::trashDesign(%d) [%d: %d, %d]\n", invention, player, xpos, ypos);
1469 this->inventions_known[ invention->getType() ][ invention->getEpoch() ] = false;
1470 for(size_t i=0;i<this->designs.size();i++) {
1471 Design *design = this->designs.at(i);
1472 if( design->getInvention() == invention ) {
1473 this->designs.erase(this->designs.begin() + i);
1474 break;
1475 }
1476 }
1477 if( this == gamestate->getCurrentSector() ) {
1478 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
1479 gamestate->getGamePanel()->refresh();
1480 }
1481 }
1482
trashDesign(Design * design)1483 void Sector::trashDesign(Design *design) {
1484 LOG("Sector::trashDesign(%d) [%d: %d, %d]\n", design, player, xpos, ypos);
1485 this->inventions_known[ design->getInvention()->getType() ][ design->getInvention()->getEpoch() ] = false;
1486 for(size_t i=0;i<this->designs.size();i++) {
1487 Design *this_design = this->designs.at(i);
1488 if( this_design == design ) {
1489 this->designs.erase(this->designs.begin() + i);
1490 break;
1491 }
1492 }
1493 if( this == gamestate->getCurrentSector() ) {
1494 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
1495 gamestate->getGamePanel()->refresh();
1496 }
1497 }
1498
nukeSector(Sector * source)1499 bool Sector::nukeSector(Sector *source) {
1500 LOG("Sector::nuke(%d) [%d: %d, %d]\n", source, player, xpos, ypos);
1501 ASSERT( source->player != -1 );
1502 ASSERT( this->player != source->player );
1503 ASSERT( this->player == -1 || !Player::isAlliance( this->player, source->player ) );
1504 if( isBeingNuked() ) {
1505 ASSERT( this->nuke_time != -1 );
1506 return false;
1507 }
1508
1509 // we still start the timer, even if a laser will shoot it
1510 this->nuke_by_player = source->player;
1511 this->nuke_time = game_g->getGameTime();
1512
1513 if( this->getActivePlayer() != -1 ) {
1514 // nuke defences
1515 bool done = false;
1516 for(int i=0;i<N_BUILDINGS && !done;i++) {
1517 if( this->buildings[i] != NULL ) {
1518 for(int j=0;j<this->buildings[i]->getNTurrets() && !done;j++) {
1519 if( this->buildings[i]->getTurretMan(j) == nuclear_epoch_c ) {
1520 ASSERT( !this->nuke_defence_animation );
1521 this->nuke_defence_animation = true;
1522 this->nuke_defence_time = game_g->getGameTime();
1523 this->nuke_defence_x = this->buildings[i]->getTurretButton(j)->getLeft();
1524 this->nuke_defence_y = this->buildings[i]->getTurretButton(j)->getTop();
1525 this->buildings[i]->clearTurretMan(j);
1526 source->nukeSector(this);
1527 done = true;
1528 }
1529 }
1530 }
1531 }
1532 }
1533
1534 return true;
1535 }
1536
canResearch(Invention::Type type,int epoch) const1537 Design *Sector::canResearch(Invention::Type type,int epoch) const {
1538 //LOG("Sector::canResearch(%d,%d)\n",type,epoch);
1539 ASSERT_EPOCH(epoch);
1540 if( epoch < game_g->getStartEpoch() || epoch > game_g->getStartEpoch() + 3 )
1541 return NULL; // can't research this
1542 if( epoch > lab_epoch_c && this->getBuilding(BUILDING_LAB) == NULL )
1543 return NULL; // need a lab for this
1544
1545 if( this->inventionKnown(type, epoch) )
1546 return NULL; // already know it, so can't research it again
1547
1548 return this->bestDesign(type, epoch);
1549 }
1550
getNDesigns() const1551 int Sector::getNDesigns() const {
1552 //LOG("Sector::getNDesigns()\n");
1553 return this->designs.size();
1554 }
1555
consumeStocks(Design * design)1556 void Sector::consumeStocks(Design *design) {
1557 // disable logging, performance issue on mobile devices (Symbian)
1558 //LOG("Sector::consumeStocks(%d) [%d: %d, %d]\n", design, player, xpos, ypos);
1559 for(int j=0;j<N_ID;j++) {
1560 // we should have enough elements here!
1561 ASSERT(this->elementstocks[j] >= design->getCost((Id)j));
1562 this->reduceElementStocks((Id)j, design->getCost((Id)j));
1563 }
1564 if( this == gamestate->getCurrentSector() ) {
1565 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
1566 gamestate->getGamePanel()->refresh();
1567 }
1568 }
1569
buildDesign()1570 void Sector::buildDesign() {
1571 //LOG("Sector::buildDesign(%d : %s) [%d: %d, %d]\n", this->current_manufacture, this->current_manufacture->getInvention()->getName(), player, xpos, ypos);
1572 /*#ifdef _DEBUG
1573 LOG("### Sector::buildDesign a\n");
1574 game_g->getMap()->checkSectors();
1575 #endif*/
1576 Invention *invention = this->current_manufacture->getInvention();
1577 if( invention->getType() == Invention::WEAPON ) {
1578 this->getStoredArmy()->add(invention->getEpoch(), 1);
1579 }
1580 else if( invention->getType() == Invention::DEFENCE ) {
1581 this->stored_defenders[invention->getEpoch()]++;
1582 }
1583 else if( invention->getType() == Invention::SHIELD ) {
1584 int shield = invention->getEpoch() - game_g->getStartEpoch();
1585 ASSERT_SHIELD(shield);
1586 this->stored_shields[shield]++;
1587 }
1588 else {
1589 ASSERT(0);
1590 }
1591 /*#ifdef _DEBUG
1592 //LOG("### Sector::buildDesign b\n");
1593 game_g->getMap()->checkSectors();
1594 #endif*/
1595 }
1596
assembleArmy(int epoch,int n)1597 bool Sector::assembleArmy(int epoch,int n) {
1598 //LOG("Sector::assembleArmy(%d,%d)\n",epoch,n);
1599 ASSERT_EPOCH(epoch);
1600 int n_population = this->getPopulation();
1601 int n_spare = this->getAvailablePopulation();
1602 int n_men = game_g->invention_weapons[epoch]->getNMen() * n;
1603 if( n_spare < n_men ) {
1604 n = 1;
1605 n_men = game_g->invention_weapons[epoch]->getNMen() * n;
1606 }
1607 if( n_spare < n_men )
1608 return false;
1609
1610 int n_make = this->getStoredArmy()->getSoldiers(epoch);
1611 if( n_make > n ) {
1612 n_make = n;
1613 }
1614 while( n_make < n ) {
1615 if( epoch >= factory_epoch_c )
1616 break;
1617 // make a new one?
1618 Design *design = this->canBuildDesign(Invention::WEAPON, epoch);
1619 if( design == NULL )
1620 break;
1621 this->consumeStocks(design);
1622 this->getStoredArmy()->add(epoch, 1);
1623 n_make++;
1624 }
1625 if( n_make > 0 ) {
1626 this->getAssembledArmy()->add(epoch, n_make);
1627 this->getStoredArmy()->remove(epoch, n_make);
1628 n_men = game_g->invention_weapons[epoch]->getNMen() * n_make;
1629 this->setPopulation( n_population - n_men );
1630 }
1631 return (n_make == n);
1632 }
1633
deployDefender(Building * building,int turret,int epoch)1634 bool Sector::deployDefender(Building *building,int turret,int epoch) {
1635 //LOG("Sector::deployDefender(%d,%d,%d) [%d: %d, %d]\n", building->type, turret, epoch, player, xpos, ypos);
1636 ASSERT_EPOCH(epoch);
1637 int n_population = this->getPopulation();
1638 int n_spare = this->getAvailablePopulation();
1639
1640 bool need_new_man = false;
1641 if( building->getTurretMan(turret) == -1 && defenceNeedsMan(epoch) ) {
1642 // need a new man
1643 if( n_spare <= 0 )
1644 return false;
1645 else
1646 need_new_man = true;
1647 }
1648
1649 if( this->stored_defenders[epoch] == 0 ) {
1650 if( epoch >= factory_epoch_c ) {
1651 return false;
1652 }
1653 // not enough - try to make one
1654 Design *design = this->canBuildDesign(Invention::DEFENCE, epoch);
1655 if( design == NULL )
1656 return false;
1657 this->consumeStocks(design);
1658 this->stored_defenders[epoch]++;
1659 }
1660
1661 LOG("deploying a new defender(%d,%d,%d) [%d: %d, %d]\n", building->getType(), turret, epoch, player, xpos, ypos);
1662 if( building->getTurretMan(turret) != -1 ) {
1663 // return current defender to stocks
1664 this->stored_defenders[ building->getTurretMan(turret) ]++;
1665 }
1666 this->stored_defenders[epoch]--;
1667 building->setTurretMan(turret, epoch);
1668 if( need_new_man )
1669 this->setPopulation( n_population - 1 );
1670 return true;
1671 }
1672
returnDefender(Building * building,int turret)1673 void Sector::returnDefender(Building *building,int turret) {
1674 LOG("Sector::returnDefender(%d,%d) [%d: %d, %d]\n", building->getType(), turret, player, xpos, ypos);
1675 ASSERT( building->getTurretMan(turret) != -1 );
1676 if( defenceNeedsMan( building->getTurretMan(turret) ) ) {
1677 int n_population = this->getPopulation();
1678 this->setPopulation( n_population + 1 );
1679 }
1680 this->stored_defenders[ building->getTurretMan(turret) ]++;
1681 building->clearTurretMan(turret);
1682 }
1683
getStoredDefenders(int epoch) const1684 int Sector::getStoredDefenders(int epoch) const {
1685 //LOG("Sector::getStoredDefenders(%d)\n",epoch);
1686 ASSERT_EPOCH(epoch);
1687 return this->stored_defenders[epoch];
1688 }
1689
useShield(Building * building,int shield)1690 bool Sector::useShield(Building *building,int shield) {
1691 ASSERT_SHIELD(shield);
1692 if( this->stored_shields[shield] == 0 ) {
1693 if( game_g->getStartEpoch() + shield >= factory_epoch_c )
1694 return false;
1695 // not enough - try to make one
1696 Design *design = this->canBuildDesign(Invention::SHIELD, game_g->getStartEpoch() + shield);
1697 if( design == NULL )
1698 return false; // can't make a new one
1699 this->consumeStocks(design);
1700 this->stored_shields[shield]++;
1701 }
1702 LOG("-> Use Shield %d on building %d type %d\n", shield, building, building->getType());
1703 //building->addHealth( 10 * ( shield + 1 ) );
1704 building->addHealth( 5 * ( shield + 1 ) );
1705 this->stored_shields[shield]--;
1706 return true;
1707 }
1708
getStoredShields(int shield) const1709 int Sector::getStoredShields(int shield) const {
1710 ASSERT_SHIELD(shield);
1711 return this->stored_shields[shield];
1712 }
1713
getDefenceStrength() const1714 float Sector::getDefenceStrength() const {
1715 //LOG("Sector::getDefenceStrength() [%d: %d, %d]\n", player, xpos, ypos);
1716 ASSERT_PLAYER(player);
1717 float str = 0.0f;
1718 if( game_g->getStartEpoch() == end_epoch_c ) {
1719 str = 4.0f;
1720 }
1721 else {
1722 //str = ( this->epoch - game_g->getStartEpoch() ) + 1;
1723 str = 1.0f;
1724 }
1725 if( this->player == PlayerType::PLAYER_BLUE ) {
1726 str *= 1.25f;
1727 }
1728 return str;
1729 }
1730
doCombat(int client_player)1731 void Sector::doCombat(int client_player) {
1732 //LOG("Sector::doCombat()\n");
1733 int looptime = game_g->getLoopTime();
1734
1735 /*int army_strengths[n_players_c];
1736 int n_armies = 0;
1737 for(i=0;i<n_players_c;i++) {
1738 army_strengths[i] = this->getArmy(i)->getStrength();
1739 if( army_strengths[i] > 0 )
1740 n_armies++;
1741 }
1742 if( n_armies == 2 ) {
1743 Army *friendly = this->getArmy(human_player);
1744 Army *enemy = this->getArmy(enemy_player);
1745 }*/
1746 bool died[n_players_c];
1747 //int random = rand () % RAND_MAX;
1748 for(int i=0;i<n_players_c;i++) {
1749 died[i] = false;
1750 Army *army = this->getArmy(i);
1751 int this_strength = army->getStrength();
1752 int this_total = army->getTotal();
1753 //LOG(">>> %d , %d\n", this_strength, this_total);
1754 if( this->player == i ) {
1755 this_total += this->getNDefenders();
1756 this_strength += this->getDefenderStrength();
1757 }
1758 //LOG(" %d , %d\n", this_strength, this_total);
1759 if( this_total > 0 ) {
1760 int enemy_strength = 0;
1761 for(int j=0;j<n_players_c;j++) {
1762 if( i != j && !Player::isAlliance(i,j) ) {
1763 enemy_strength += this->getArmy(j)->getStrength();
1764 if( this->player == j ) {
1765 enemy_strength += this->getDefenderStrength();
1766 }
1767 }
1768 }
1769 if( enemy_strength > 0 ) {
1770 //int death_rate = ( combat_rate_c * gameticks_per_hour_c * this_strength ) / enemy_strength;
1771 //int death_rate = ( combat_rate_c * gameticks_per_hour_c ) / enemy_strength;
1772 //int death_rate = ( combat_rate_c * gameticks_per_hour_c * this_strength ) / ( enemy_total * enemy_strength );
1773 // need to use floats, to avoid possible overflow!!!
1774 // lower death rate is faster - which is why we divide by the enemy strength
1775 // but we multiply by the average strength of a soldier, because we need to convert a loss in terms of strength to a loss in terms of soldier numbers
1776 // consider if we have: A=1*100 vs B=100*1 - we want this to be an even battle. But that means B should lose soldiers on average at 100 times the rate of A, in order for it to be even
1777 // see docs/combat_logic.txt for more examples
1778 float death_rate = ((float)this_strength) / ((float)this_total);
1779 death_rate = death_rate * ((float)(combat_rate_c * gameticks_per_hour_c)) / ((float)enemy_strength);
1780 int prob = poisson((int)death_rate, looptime);
1781 int random = rand() % RAND_MAX;
1782 if( random <= prob ) {
1783 // soldier has died
1784 died[i] = true;
1785 }
1786 }
1787 }
1788 }
1789 for(int i=0;i<n_players_c;i++) {
1790 if( died[i] ) {
1791 Army *army = this->getArmy(i);
1792 int this_total = army->getTotal();
1793 if( this->player == i )
1794 this_total += this->getNDefenders();
1795
1796 int die = rand() % this_total;
1797 if( die < army->getTotal() ) {
1798 army->kill(die);
1799 }
1800 else {
1801 // kill a defender
1802 this->killDefender(die - army->getTotal());
1803 }
1804 }
1805 }
1806
1807 // damage to buildings
1808 if( this->player != -1 ) {
1809 int bombard = 0;
1810 for(int i=0;i<n_players_c;i++) {
1811 if( this->player != i && !Player::isAlliance(this->player, i) ) {
1812 bombard += this->getArmy(i)->getBombardStrength();
1813 }
1814 }
1815 if( bombard > 0 ) {
1816 int bombard_rate = ( bombard_rate_c * gameticks_per_hour_c ) / bombard;
1817 bombard_rate = (int)(bombard_rate * this->getDefenceStrength());
1818 int prob = poisson(bombard_rate, looptime);
1819 int random = rand() % RAND_MAX;
1820 if( random <= prob ) {
1821 // caused some damage
1822 int n_buildings = 0;
1823 for(int i=0;i<N_BUILDINGS;i++) {
1824 if( this->buildings[i] != NULL )
1825 n_buildings++;
1826 }
1827 ASSERT( n_buildings > 0 );
1828 int b = rand() % n_buildings;
1829 for(int i=0;i<N_BUILDINGS;i++) {
1830 Building *building = this->buildings[i];
1831 if( building != NULL ) {
1832 if( b == 0 ) {
1833 building->addHealth(-1);
1834 #ifdef _DEBUG
1835 // disable in Release mode as possible performance issue on mobile devices (Symbian)
1836 LOG("Sector [%d: %d, %d] caused some damage on building %d, type %d, %d remaining\n", player, xpos, ypos, building, building->getType(), building->getHealth());
1837 #endif
1838 if( building->getHealth() <= 0 ) {
1839 // destroy building
1840 destroyBuilding((Type)i, client_player);
1841 }
1842 else if( this->player == client_player && building->getHealth() == 10 && building->getType() == BUILDING_TOWER ) {
1843 playSample(game_g->s_tower_critical);
1844 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
1845 gamestate->setFlashingSquare(this->xpos, this->ypos);
1846 }
1847 break;
1848 }
1849 b--;
1850 }
1851 }
1852 }
1853 }
1854 }
1855 }
1856
doPlayer(int client_player)1857 void Sector::doPlayer(int client_player) {
1858 //LOG("Sector::doPlayer()\n");
1859 // stuff for sectors owned by a player
1860
1861 // n.b., only update the particle systems that are specific to sectors owned by a player
1862 if( this->smokeParticleSystem != NULL ) {
1863 this->smokeParticleSystem->update();
1864 }
1865
1866 if( game_g->getGameMode() == GAMEMODE_MULTIPLAYER_CLIENT ) {
1867 // rest of function is for game logic done by server
1868 return;
1869 }
1870
1871 int time = game_g->getGameTime();
1872 int looptime = game_g->getLoopTime();
1873
1874 if( this->current_design != NULL ) {
1875 if( this->researched_lasttime == -1 )
1876 this->researched_lasttime = time;
1877 while( time - this->researched_lasttime > gameticks_per_hour_c ) {
1878 this->researched += this->getDesigners();
1879 this->researched_lasttime += gameticks_per_hour_c;
1880 }
1881 int cost = this->getInventionCost();
1882 if( this->researched > cost ) {
1883 //LOG("Sector [%d: %d, %d] has made a %s\n", player, xpos, ypos, this->current_design->getInvention()->getName());
1884 this->invent(client_player);
1885 }
1886 }
1887
1888 if( this->current_manufacture != NULL ) {
1889 if( this->manufactured_lasttime == -1 )
1890 this->manufactured_lasttime = time;
1891 if( this->manufactured == 0 && this->getWorkers() > 0 ) {
1892 if( !this->canBuildDesign( this->current_manufacture ) ) {
1893 // not enough elements
1894 // therefore production run completed
1895 if( this->player == client_player ) {
1896 playSample(game_g->s_fcompleted);
1897 gamestate->setFlashingSquare(this->xpos, this->ypos);
1898 }
1899 this->setCurrentManufacture(NULL);
1900 if( this == gamestate->getCurrentSector() ) {
1901 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
1902 gamestate->getGamePanel()->refresh();
1903 }
1904 }
1905 else {
1906 this->consumeStocks( this->current_manufacture );
1907 }
1908 }
1909 }
1910 // a new if statement, as production run may have ended due to lack of elements
1911 if( this->current_manufacture != NULL ) {
1912 while( time - this->manufactured_lasttime > gameticks_per_hour_c ) {
1913 this->manufactured += this->getWorkers();
1914 this->manufactured_lasttime += gameticks_per_hour_c;
1915 }
1916 if( this->manufactured == 0 && this->getWorkers() > 0 ) {
1917 this->manufactured++; // a bit hacky; just to avoid consuming stocks again
1918 }
1919 int cost = this->getManufactureCost();
1920 if( this->manufactured > cost ) {
1921 this->buildDesign();
1922 this->manufactured = 0;
1923 if( this->n_famount != infinity_c )
1924 this->setFAmount( this->n_famount - 1 );
1925 if( this->n_famount == 0 ) {
1926 // production run completed
1927 //LOG("production run completed\n");
1928 if( this->player == client_player ) {
1929 playSample(game_g->s_fcompleted);
1930 gamestate->setFlashingSquare(this->xpos, this->ypos);
1931 }
1932 this->setCurrentManufacture(NULL);
1933 }
1934 if( this == gamestate->getCurrentSector() ) {
1935 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
1936 gamestate->getGamePanel()->refresh();
1937 }
1938 }
1939 }
1940
1941 bool new_stocks = false;
1942 for(int i=0;i<N_ID;i++) {
1943 if( this->elements[i] == 0 ) {
1944 continue; // no more of this element
1945 }
1946 Element *element = game_g->elements[i];
1947 if( element->getType() != Element::GATHERABLE || this->elementstocks[i] < max_gatherables_stored_c * element_multiplier_c )
1948 {
1949 int n_gatherers = 0;
1950 if( element->getType() == Element::GATHERABLE ) {
1951 n_gatherers = n_gatherable_rate_c;
1952 }
1953 else
1954 n_gatherers = this->getMiners((Id)i);
1955 this->partial_elementstocks[i] += element_multiplier_c * n_gatherers * looptime;
1956 while( this->partial_elementstocks[i] > mine_rate_c * gameticks_per_hour_c ) {
1957 new_stocks = true;
1958 this->partial_elementstocks[i] -= mine_rate_c * gameticks_per_hour_c;
1959 if( this->mineElement(client_player, (Id)i) ) {
1960 break;
1961 }
1962 }
1963 }
1964 }
1965 if( new_stocks && this == gamestate->getCurrentSector() ) {
1966 /*((PlayingGameState *)gamestate)->getGamePanel()->refreshCanDesign();
1967 ((PlayingGameState *)gamestate)->getGamePanel()->refreshDesignInventions();
1968 //((PlayingGameState *)gamestate)->getGamePanel()->refreshDeployInventions();
1969 ((PlayingGameState *)gamestate)->getGamePanel()->refreshManufactureInventions();*/
1970
1971 gamestate->getGamePanel()->refreshCanDesign();
1972 gamestate->getGamePanel()->refreshDesignInventions();
1973 gamestate->getGamePanel()->refreshManufactureInventions();
1974 }
1975
1976 if( this->built_lasttime == -1 )
1977 this->built_lasttime = time;
1978 while( time - this->built_lasttime > gameticks_per_hour_c ) {
1979 for(int i=0;i<N_BUILDINGS;i++) {
1980 this->built[i] += this->getBuilders((Type)i);
1981 }
1982 this->built_lasttime += gameticks_per_hour_c;
1983 }
1984 for(int i=0;i<N_BUILDINGS;i++) {
1985 int cost = getBuildingCost((Type)i, this->player);
1986 if( this->built[i] > cost ) {
1987 this->buildBuilding((Type)i);
1988 }
1989 }
1990
1991 if( this->growth_lasttime == -1 )
1992 this->growth_lasttime = time;
1993 else if( game_g->getTutorial() != NULL && !game_g->getTutorial()->aiAllowGrowth() && !game_g->players[this->player]->isHuman() ) {
1994 // don't allow growth
1995 }
1996 else if( this->getSparePopulation() > 0 ) {
1997 int spare_pop = this->getSparePopulation();
1998 if( spare_pop > max_grow_population_c/2 ) {
1999 spare_pop = max_grow_population_c - spare_pop;
2000 spare_pop = max(spare_pop, 0);
2001 }
2002 if( spare_pop > 0 ) {
2003 int delay = ( growth_rate_c * gameticks_per_hour_c ) / spare_pop;
2004 if( time - this->growth_lasttime > delay ) {
2005 int old_pop = this->population;
2006 if( this->getSparePopulation() < max_grow_population_c )
2007 this->population++;
2008 this->growth_lasttime = time;
2009 int births = this->population - old_pop;
2010 if( births > 0 ) {
2011 game_g->players[this->player]->registerBirths(births);
2012 }
2013 }
2014 }
2015 }
2016 }
2017
getNukePos(int * nuke_x,int * nuke_y) const2018 void Sector::getNukePos(int *nuke_x, int *nuke_y) const {
2019 ASSERT( this->isBeingNuked() );
2020 *nuke_x = -1;
2021 *nuke_y = -1;
2022 if( this->isBeingNuked() ) {
2023 ASSERT( nuke_time != -1 );
2024 float alpha = ((float)( game_g->getGameTime() - nuke_time )) / (float)nuke_delay_c;
2025 ASSERT( alpha >= 0.0 );
2026 if( alpha > 1.0 )
2027 alpha = 1.0;
2028 int sx = offset_land_x_c+176, sy = offset_land_y_c-18;
2029 int ex = offset_land_x_c+64, ey = offset_land_y_c+94;
2030 *nuke_x = (int)(alpha * ex + (1.0 - alpha) * sx);
2031 *nuke_y = (int)(alpha * ey + (1.0 - alpha) * sy);
2032 }
2033 }
2034
update(int client_player)2035 void Sector::update(int client_player) {
2036 //LOG("Sector::update()\n");
2037 if( game_g->getGameMode() != GAMEMODE_MULTIPLAYER_CLIENT ) {
2038 this->doCombat(client_player);
2039 }
2040
2041 // update particle systems (that aren't done in doPlayer())
2042 if( this->jetParticleSystem != NULL ) {
2043 this->jetParticleSystem->update();
2044 }
2045 if( this->nukeParticleSystem != NULL ) {
2046 this->nukeParticleSystem->update();
2047 }
2048 if( this->nukeDefenceParticleSystem != NULL ) {
2049 this->nukeDefenceParticleSystem->update();
2050 }
2051
2052 if( this->player != -1 ) {
2053 if( !this->is_shutdown )
2054 this->doPlayer(client_player); // still call for clients, to update particle system
2055 }
2056 else if( game_g->getGameMode() != GAMEMODE_MULTIPLAYER_CLIENT ) {
2057 int time = game_g->getGameTime();
2058 int n_players_in_sector = 0;
2059 int player_in_sector = -1;
2060 for(int i=0;i<n_players_c;i++) {
2061 //if( this->getArmy(i)->getTotal() > 0 ) {
2062 if( this->getArmy(i)->any(true) ) {
2063 player_in_sector = i;
2064 n_players_in_sector++;
2065 }
2066 }
2067
2068 // build new tower?
2069 if( game_g->getTutorial() != NULL && game_g->getTutorial()->getCard() != NULL && !game_g->getTutorial()->getCard()->playerAllowBuildTower() ) {
2070 // don't allow building new tower
2071 }
2072 else if( n_players_in_sector == 1 ) {
2073 if( this->built_lasttime == -1 )
2074 this->built_lasttime = time;
2075 while( time - this->built_lasttime > gameticks_per_hour_c ) {
2076 this->built_towers[player_in_sector] += this->getArmy(player_in_sector)->getTotal();
2077 this->built_lasttime += gameticks_per_hour_c;
2078 }
2079
2080 int cost = getBuildingCost(BUILDING_TOWER, player_in_sector);
2081 if( this->built_towers[player_in_sector] > cost ) {
2082 /*if( ((PlayingGameState *)gamestate)->getSelectedArmy() == this->getArmy(player_in_sector) ) {
2083 ((PlayingGameState *)gamestate)->clearSelectedArmy();
2084 }*/
2085 if( gamestate->getSelectedArmy() == this->getArmy(player_in_sector) ) {
2086 gamestate->clearSelectedArmy();
2087 }
2088 this->createTower(player_in_sector, 0);
2089 this->returnArmy();
2090 if( this == gamestate->getCurrentSector() ) {
2091 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2092 gamestate->getGamePanel()->refresh();
2093 }
2094 }
2095 }
2096 }
2097
2098 if( game_g->getGameMode() == GAMEMODE_MULTIPLAYER_CLIENT ) {
2099 return;
2100 }
2101 // rest of function is done by server
2102
2103 if( this->nuke_by_player != -1 ) {
2104 ASSERT( this->nuke_time != -1 );
2105 if( game_g->getGameTime() >= this->nuke_time + nuke_delay_c ) {
2106 this->nuked = true;
2107
2108 if( this->getActivePlayer() != -1 ) {
2109 // lasers
2110 for(int i=0;i<N_BUILDINGS && nuked;i++) {
2111 if( this->buildings[i] != NULL ) {
2112 for(int j=0;j<this->buildings[i]->getNTurrets() && nuked;j++) {
2113 if( this->buildings[i]->getTurretMan(j) == laser_epoch_c ) {
2114 //this->buildings[i]->turret_man[j] = -1;
2115 this->buildings[i]->killIthDefender(j);
2116 this->nuked = false;
2117 if( this == gamestate->getCurrentSector() ) {
2118 if( game_g->explosions[0] != NULL ) {
2119 int w = game_g->explosions[0]->getScaledWidth();
2120 int h = game_g->explosions[0]->getScaledHeight();
2121 gamestate->explosionEffect( buildings[i]->getTurretButton(j)->getXCentre() - w/2, buildings[i]->getTurretButton(j)->getYCentre() - h/2);
2122 int nuke_x = -1, nuke_y = -1;
2123 this->getNukePos(&nuke_x, &nuke_y);
2124 Image *nuke_image = game_g->nukes[this->nuke_by_player][1];
2125 gamestate->explosionEffect( nuke_x + nuke_image->getScaledWidth()/2 - w/2, nuke_y + nuke_image->getScaledHeight()/2 - h/2);
2126 }
2127 }
2128 }
2129 }
2130 }
2131 }
2132 }
2133
2134 if( this->nuked ) {
2135 playSample(game_g->s_explosion, SOUND_CHANNEL_FX);
2136 game_g->s_explosion->setVolume(0.25f); // needed so we can hear speech sample over the explosion
2137 if( this->getActivePlayer() != -1 ) {
2138 this->destroyTower(true, client_player);
2139 }
2140 for(int i=0;i<n_players_c;i++) {
2141 this->armies[i]->empty();
2142 }
2143 // replace tree icons with burnt tree, and delete other features
2144 for(vector<Feature *>::iterator iter = this->features.begin(); iter != this->features.end();) {
2145 Feature *feature = *iter;
2146 const Image *image = feature->getImage(0);
2147 // bit of a hacky way of finding trees...
2148 bool is_tree = false;
2149 for(int i=0;i<n_trees_c && !is_tree;i++) {
2150 if( image == game_g->icon_trees[i][0] ) {
2151 is_tree = true;
2152 }
2153 }
2154 if( is_tree ) {
2155 feature->setImage(game_g->icon_trees[2], 1);
2156 ++iter;
2157 }
2158 else {
2159 iter = features.erase(iter);
2160 }
2161 }
2162 // now add some new features
2163 int n_clutter = game_g->icon_clutter_nuked.size() > 0 ? (1 + rand() % 4) : 0;
2164 for(int i=0;i<n_clutter;i++) {
2165 int land_width = game_g->land[0]->getScaledWidth() - 32;
2166 int land_height = game_g->land[0]->getScaledHeight() - 32;
2167 int xpos = offset_land_x_c + rand() % land_width;
2168 int ypos = offset_land_y_c + rand() % land_height;
2169 Image **image_ptr = &game_g->icon_clutter_nuked[rand() % game_g->icon_clutter_nuked.size()];
2170 Feature *feature = new Feature(image_ptr, 1, xpos, ypos);
2171 this->features.push_back(feature);
2172 }
2173 if( this == gamestate->getCurrentSector() ) {
2174 //((PlayingGameState *)gamestate)->refreshSoldiers(true);
2175 //((PlayingGameState *)gamestate)->whiteFlash();
2176 gamestate->refreshSoldiers(true);
2177 gamestate->whiteFlash();
2178 }
2179 if( this->isShutdown() ) {
2180 // shutdown sectors are never marked as "nuked"
2181 this->nuked = false;
2182 }
2183 }
2184
2185 this->nuke_by_player = -1;
2186 this->nuke_time = -1;
2187 this->nuke_defence_animation = false;
2188 }
2189 }
2190 }
2191
mineElement(int client_player,Id i)2192 bool Sector::mineElement(int client_player, Id i) {
2193 Element *element = game_g->elements[(int)i];
2194 ASSERT( this->elements[(int)i] > 0 );
2195 this->elementstocks[(int)i]++;
2196 this->elements[(int)i]--;
2197 if( this->elements[(int)i] == 0 ) {
2198 if( element->getType() != Element::GATHERABLE )
2199 this->setMiners(i, 0);
2200 LOG("Sector [%d: %d, %d] running out of element %d : %s\n", player, xpos, ypos, (int)i, game_g->elements[(int)i]->getName());
2201 if( this->player == client_player ) {
2202 playSample(game_g->s_running_out_of_elements);
2203 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
2204 gamestate->setFlashingSquare(this->xpos, this->ypos);
2205 }
2206 return true;
2207 }
2208 return false;
2209 }
2210
invent(int client_player)2211 void Sector::invent(int client_player) {
2212 ASSERT(current_design != NULL);
2213 bool done_sound = false;
2214 if( this->player != client_player )
2215 done_sound = true;
2216 ASSERT( !this->inventions_known[ current_design->getInvention()->getType() ][ current_design->getInvention()->getEpoch() ] );
2217 this->inventions_known[ current_design->getInvention()->getType() ][ current_design->getInvention()->getEpoch() ] = true;
2218 this->designs.push_back( current_design );
2219
2220 if( this->epoch < game_g->getStartEpoch() + 3 && epoch < n_epochs_c-1 ) {
2221 //int levels[4] = {0, 0, 0, 0};
2222 int score = 0;
2223 for(int i=0;i<3;i++) {
2224 int val = 1;
2225 for(int j=0;j<4;j++) {
2226 if( game_g->getStartEpoch()+j < n_epochs_c ) {
2227 if( this->inventions_known[i][game_g->getStartEpoch()+j] ) {
2228 //levels[j]++;
2229 score += val;
2230 }
2231 }
2232 val *= 2;
2233 }
2234 }
2235 score = ( score + 3 ) / 3;
2236 int new_epoch = game_g->getStartEpoch();
2237 while( score > 1 ) {
2238 new_epoch++;
2239 score /= 2;
2240 }
2241 if( new_epoch > this->epoch ) {
2242 // advance a tech level!
2243 this->epoch = new_epoch;
2244 LOG("Sector [%d: %d, %d] has advanced to tech level %d\n", player, xpos, ypos, epoch);
2245 if( !done_sound ) {
2246 playSample(game_g->s_advanced_tech);
2247 done_sound = true;
2248 }
2249 }
2250 }
2251 if( this == gamestate->getCurrentSector() ) {
2252 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2253 gamestate->getGamePanel()->refresh();
2254 }
2255 if( !done_sound ) {
2256 if( current_design->isErgonomicallyTerrific() )
2257 playSample(game_g->s_ergo);
2258 else
2259 playSample(game_g->s_design_is_ready);
2260 }
2261 if( this->player == client_player ) {
2262 //((PlayingGameState *)gamestate)->setFlashingSquare(this->xpos, this->ypos);
2263 gamestate->setFlashingSquare(this->xpos, this->ypos);
2264 }
2265 this->setCurrentDesign(NULL);
2266 }
2267
buildBuilding(Type type)2268 void Sector::buildBuilding(Type type) {
2269 LOG("Sector [%d: %d, %d] has built building type %d\n", player, xpos, ypos, (int)type);
2270 this->setBuilders(type, 0);
2271 this->built[(int)type] = 0;
2272 if( type == BUILDING_MINE ) {
2273 this->buildings[BUILDING_MINE] = new Building(gamestate, this, BUILDING_MINE);
2274 }
2275 else if( type == BUILDING_FACTORY ) {
2276 this->buildings[BUILDING_FACTORY] = new Building(gamestate, this, BUILDING_FACTORY);
2277 }
2278 else if( type == BUILDING_LAB ) {
2279 this->buildings[BUILDING_LAB] = new Building(gamestate, this, BUILDING_LAB);
2280 }
2281 else {
2282 // error
2283 LOG("###Didn't expect completion of building type %d\n", (int)type);
2284 ASSERT(0);
2285 }
2286 updateForNewBuilding(type);
2287 if( this == gamestate->getCurrentSector() ) {
2288 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2289 //((PlayingGameState *)gamestate)->addBuilding( this->buildings[(Type)i] ); // now done in Building constructor
2290 gamestate->getGamePanel()->refresh();
2291 }
2292 }
2293
updateForNewBuilding(Type type)2294 void Sector::updateForNewBuilding(Type type) {
2295 if( type == BUILDING_FACTORY ) {
2296 this->updateWorkers(); // call to also set the particle system rate (calling updateWorkers() instead of setWorkers(0), so this doesn't reset n_workers when loading saved state)
2297 }
2298 }
2299
getInventionCost() const2300 int Sector::getInventionCost() const {
2301 //LOG("Sector::getInventionCost()\n");
2302 const int factor_c = 12;
2303 int diff = this->current_design->getInvention()->getEpoch() - this->epoch;
2304 int cost = -1;
2305
2306 if( diff == -3 )
2307 cost = factor_c * DESIGNTIME_M3;
2308 else if( diff == -2 )
2309 cost = factor_c * DESIGNTIME_M2;
2310 else if( diff == -1 )
2311 cost = factor_c * DESIGNTIME_M1;
2312 else if( diff == 0 )
2313 cost = factor_c * DESIGNTIME_0;
2314 else if( diff == 1 )
2315 cost = factor_c * DESIGNTIME_1;
2316 else if( diff == 2 )
2317 cost = factor_c * DESIGNTIME_2;
2318 else if( diff == 3 )
2319 cost = factor_c * DESIGNTIME_3;
2320
2321 ASSERT(cost != -1);
2322 if( this->current_design->isErgonomicallyTerrific() )
2323 cost /= 2;
2324 return cost;
2325 }
2326
getManufactureCost() const2327 int Sector::getManufactureCost() const {
2328 //LOG("Sector::getManufactureCost()\n");
2329 const int factor_c = 12;
2330 int diff = this->current_manufacture->getInvention()->getEpoch() - this->epoch;
2331 int cost = -1;
2332
2333 if( diff <= 0 )
2334 cost = factor_c * MANUFACTURETIME_0;
2335 else if( diff == 1 )
2336 cost = factor_c * MANUFACTURETIME_1;
2337 else if( diff == 2 )
2338 cost = factor_c * MANUFACTURETIME_2;
2339 else if( diff == 3 )
2340 cost = factor_c * MANUFACTURETIME_3;
2341
2342 ASSERT(cost != -1);
2343
2344 return cost;
2345 }
2346
getBuildingCost(Type type,int building_player)2347 int Sector::getBuildingCost(Type type, int building_player) {
2348 //LOG("Sector::getBuildingcost(%d)\n",type);
2349 int cost = 0;
2350 if( type == BUILDING_TOWER ) {
2351 cost = hours_per_day_c * BUILDTIME_TOWER;
2352 if( building_player == PlayerType::PLAYER_GREEN ) {
2353 cost = (int)(cost / 2.0f);
2354 }
2355 }
2356 else if( type == BUILDING_MINE )
2357 cost = hours_per_day_c * BUILDTIME_MINE;
2358 else if( type == BUILDING_FACTORY )
2359 cost = hours_per_day_c * BUILDTIME_FACTORY;
2360 else if( type == BUILDING_LAB )
2361 cost = hours_per_day_c * BUILDTIME_LAB;
2362 else {
2363 // error
2364 ASSERT(0);
2365 cost = -1;
2366 }
2367
2368 return cost;
2369 }
2370
setEpoch(int epoch)2371 void Sector::setEpoch(int epoch) {
2372 LOG("Sector::setEpoch(%d) [%d: %d,%d]\n", epoch, player, xpos, ypos);
2373 ASSERT_EPOCH(epoch);
2374 if( this == gamestate->getCurrentSector() ) {
2375 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2376 gamestate->getGamePanel()->refresh();
2377 }
2378 this->epoch = epoch;
2379 }
2380
getEpoch() const2381 int Sector::getEpoch() const {
2382 //LOG("Sector::getEpoch()\n");
2383 /*if( epoch >= n_epochs_c ) {
2384 printf("!!!\n");
2385 }*/
2386 ASSERT_EPOCH(epoch);
2387 return epoch;
2388 }
2389
getBuildingEpoch() const2390 int Sector::getBuildingEpoch() const {
2391 int eph = this->getEpoch();
2392 /*if( this->is_shutdown )
2393 eph = end_epoch_c;
2394 else if( game_g->getStartEpoch() == end_epoch_c )
2395 eph = end_epoch_c;
2396 else if( eph == n_epochs_c-1 )
2397 eph = n_epochs_c-2;*/
2398 if( this->is_shutdown )
2399 eph = n_epochs_c-1;
2400 else if( game_g->getStartEpoch() == end_epoch_c )
2401 eph = n_epochs_c-1;
2402 else if( eph == n_epochs_c-1 )
2403 eph = n_epochs_c-2;
2404 return eph;
2405 }
2406
getPlayer() const2407 int Sector::getPlayer() const {
2408 //LOG("Sector::getPlayer()\n");
2409 return player;
2410 }
2411
getActivePlayer() const2412 int Sector::getActivePlayer() const {
2413 if( this->is_shutdown )
2414 return PLAYER_NONE;
2415 return player;
2416 }
2417
setCurrentDesign(Design * current_design)2418 void Sector::setCurrentDesign(Design *current_design) {
2419 //LOG("Sector::setCurrentDesign(%d : %s) [%d: %d, %d]\n", current_design, current_design==NULL?"NONE":current_design->getInvention()->getName(), player, xpos, ypos);
2420 ASSERT( current_design == NULL || current_design->getInvention()->getEpoch() <= lab_epoch_c || this->getBuilding(BUILDING_LAB ) != NULL );
2421 this->current_design = current_design;
2422 this->n_designers = 0;
2423 this->researched = 0;
2424 this->researched_lasttime = game_g->getGameTime();
2425 if( this == gamestate->getCurrentSector() ) {
2426 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2427 gamestate->getGamePanel()->refresh();
2428 }
2429 }
2430
getCurrentDesign() const2431 const Design *Sector::getCurrentDesign() const {
2432 //LOG("Sector::getCurrentDesign()\n");
2433 return this->current_design;
2434 }
2435
setCurrentManufacture(Design * current_manufacture)2436 void Sector::setCurrentManufacture(Design *current_manufacture) {
2437 //LOG("Sector::setCurrentManufacture(%d : %s) [%d: %d, %d]\n", current_manufacture, current_manufacture==NULL?"NONE":current_manufacture->getInvention()->getName(), player, xpos, ypos);
2438 /*#ifdef _DEBUG
2439 LOG("### Sector::setCurrentManufacture a\n");
2440 game_g->getMap()->checkSectors();
2441 #endif*/
2442 ASSERT( current_manufacture == NULL || this->getBuilding(BUILDING_FACTORY ) != NULL );
2443 ASSERT( current_manufacture == NULL || current_manufacture->getInvention()->getEpoch() >= factory_epoch_c );
2444 this->current_manufacture = current_manufacture;
2445 //this->n_workers = 0;
2446 this->setWorkers(0); // call to also set the particle system rate
2447 this->n_famount = 1;
2448 this->manufactured = 0;
2449 this->manufactured_lasttime = game_g->getGameTime();
2450 /*#ifdef _DEBUG
2451 LOG("### Sector::setCurrentManufacture b\n");
2452 game_g->getMap()->checkSectors();
2453 #endif*/
2454 if( this == gamestate->getCurrentSector() ) {
2455 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2456 gamestate->getGamePanel()->refresh();
2457 }
2458 /*#ifdef _DEBUG
2459 LOG("### Sector::setCurrentManufacture c\n");
2460 game_g->getMap()->checkSectors();
2461 #endif*/
2462 }
2463
getCurrentManufacture() const2464 const Design *Sector::getCurrentManufacture() const {
2465 //LOG("Sector::getCurrentManufature()\n");
2466 return this->current_manufacture;
2467 }
2468
inventionTimeLeft(int * halfdays,int * hours) const2469 void Sector::inventionTimeLeft(int *halfdays,int *hours) const {
2470 //LOG("Sector::inventionTimeLeft()\n");
2471 int cost = this->getInventionCost() - this->researched;
2472 int time = cost / this->getDesigners();
2473 *halfdays = (int)( time / 12 );
2474 *hours = time % 12;
2475 }
2476
manufactureTimeLeft(int * halfdays,int * hours) const2477 void Sector::manufactureTimeLeft(int *halfdays,int *hours) const {
2478 //LOG("Sector::manufactureTimeLeft()\n");
2479 int cost = this->getManufactureCost() - this->manufactured;
2480 int time = cost / this->getWorkers();
2481 *halfdays = (int)( time / 12 );
2482 *hours = time % 12;
2483 }
2484
manufactureTotalTime(int * halfdays,int * hours) const2485 void Sector::manufactureTotalTime(int *halfdays,int *hours) const {
2486 //LOG("Sector::manufactureTotalTime()\n");
2487 int cost = this->getManufactureCost();
2488 int time = cost / this->getWorkers();
2489 *halfdays = (int)( time / 12 );
2490 *hours = time % 12;
2491 }
2492
inventionKnown(Invention::Type type,int epoch) const2493 bool Sector::inventionKnown(Invention::Type type,int epoch) const {
2494 //LOG("Sector::inventionKnown(%d,%d)\n",type,epoch);
2495 ASSERT_EPOCH(epoch);
2496 return this->inventions_known[(int)type][epoch];
2497 }
2498
2499 // Set Elements Remaining
setElements(Id id,int n_elements)2500 void Sector::setElements(Id id,int n_elements) {
2501 ASSERT_ELEMENT_ID(id);
2502 this->elements[(int)id] = n_elements * element_multiplier_c;
2503 }
2504
2505 // Get Elements Remaining
getElements(int * n,int * fraction,Id id) const2506 void Sector::getElements(int *n,int *fraction,Id id) const {
2507 ASSERT_ELEMENT_ID(id);
2508 *n = this->elements[id] / element_multiplier_c;
2509 *fraction = this->elements[(int)id] % element_multiplier_c;
2510 }
2511
anyElements(Id id) const2512 bool Sector::anyElements(Id id) const {
2513 ASSERT_ELEMENT_ID(id);
2514 return this->elements[(int)id] > 0;
2515 }
2516
reduceElementStocks(Id id,int reduce)2517 void Sector::reduceElementStocks(Id id,int reduce) {
2518 // reduce should be already multiplied by element_multiplier_c !
2519 ASSERT_ELEMENT_ID(id);
2520 this->elementstocks[(int)id] -= reduce;
2521 }
2522
getElementStocks(int * n,int * fraction,Id id) const2523 void Sector::getElementStocks(int *n,int *fraction,Id id) const {
2524 ASSERT_ELEMENT_ID(id);
2525 *n = this->elementstocks[(int)id] / element_multiplier_c;
2526 *fraction = this->elementstocks[(int)id] % element_multiplier_c;
2527 }
2528
getTotalElements(int * n,int * fraction,Id id) const2529 void Sector::getTotalElements(int *n,int *fraction,Id id) const {
2530 ASSERT_ELEMENT_ID(id);
2531 int total = this->elements[id] + this->elementstocks[(int)id];
2532 *n = total / element_multiplier_c;
2533 *fraction = total % element_multiplier_c;
2534 }
2535
buildingTowerTimeLeft(int player,int * halfdays,int * hours) const2536 void Sector::buildingTowerTimeLeft(int player,int *halfdays,int *hours) const {
2537 //LOG("Sector::buildingTowerTimeLeft(%d)\n",player);
2538 ASSERT(player != -1);
2539 int cost = getBuildingCost(BUILDING_TOWER, player) - this->built_towers[player];
2540 int n_builders = this->getArmy(player)->getTotal();
2541 ASSERT(n_builders != 0);
2542 int time = cost / n_builders;
2543 *halfdays = (int)( time / 12 );
2544 *hours = time % 12;
2545 }
2546
buildingTimeLeft(Type type,int * halfdays,int * hours) const2547 void Sector::buildingTimeLeft(Type type,int *halfdays,int *hours) const {
2548 //LOG("Sector::buildingTimeLeft(%d)\n",type);
2549 ASSERT(type != BUILDING_TOWER);
2550 int cost = getBuildingCost(type, this->player) - this->built[type];
2551 int n_builders = this->getBuilders(type);
2552 ASSERT(n_builders != 0);
2553 int time = cost / n_builders;
2554 *halfdays = (int)( time / 12 );
2555 *hours = time % 12;
2556 }
2557
setPopulation(int population)2558 void Sector::setPopulation(int population) {
2559 //LOG("Sector::setPopulation(%d)\n",population);
2560 ASSERT(population >= 0);
2561 if( this == gamestate->getCurrentSector() ) {
2562 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2563 gamestate->getGamePanel()->refresh();
2564 }
2565 this->population = population;
2566 }
2567
setDesigners(int n_designers)2568 void Sector::setDesigners(int n_designers) {
2569 //LOG("Sector::setDesigners(%d)\n",n_designers);
2570 ASSERT( n_designers == 0 || this->current_design != NULL );
2571 if( this == gamestate->getCurrentSector() ) {
2572 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2573 gamestate->getGamePanel()->refresh();
2574 }
2575 this->n_designers = n_designers;
2576 }
2577
setWorkers(int n_workers)2578 void Sector::setWorkers(int n_workers) {
2579 //LOG("Sector::setWorkers(%d)\n",n_workers);
2580 ASSERT( n_workers == 0 || this->current_manufacture != NULL );
2581 if( this == gamestate->getCurrentSector() ) {
2582 gamestate->getGamePanel()->refresh();
2583 }
2584 this->n_workers = n_workers;
2585 this->updateWorkers();
2586 }
2587
updateWorkers()2588 void Sector::updateWorkers() {
2589 if( this->smokeParticleSystem != NULL ) {
2590 if( this->getBuilding(BUILDING_FACTORY) == NULL ) {
2591 this->smokeParticleSystem->setBirthRate(0.0f);
2592 }
2593 else if( this->n_workers > 0 ) {
2594 this->smokeParticleSystem->setBirthRate(0.05333f);
2595 }
2596 else {
2597 this->smokeParticleSystem->setBirthRate(0.01333f);
2598 }
2599 }
2600 }
2601
setFAmount(int n_famount)2602 void Sector::setFAmount(int n_famount) {
2603 //LOG("Sector::setFAmount(%d) [%d,%d]\n", n_famount, xpos, ypos);
2604 ASSERT(n_famount <= infinity_c);
2605 ASSERT( this->current_manufacture != NULL );
2606 if( this == gamestate->getCurrentSector() ) {
2607 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2608 gamestate->getGamePanel()->refresh();
2609 }
2610 this->n_famount = n_famount;
2611 }
2612
setMiners(Id id,int n_miners)2613 void Sector::setMiners(Id id,int n_miners) {
2614 //LOG("Sector::setMiners(%d,%d)\n",id,n_miners);
2615 ASSERT_ELEMENT_ID(id);
2616 ASSERT( game_g->elements[id]->getType() != Element::GATHERABLE );
2617 ASSERT( n_miners == 0 || canMine(id) );
2618 if( this == gamestate->getCurrentSector() ) {
2619 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2620 gamestate->getGamePanel()->refresh();
2621 }
2622 this->n_miners[id] = n_miners;
2623 }
2624
setBuilders(Type type,int n_builders)2625 void Sector::setBuilders(Type type,int n_builders) {
2626 //LOG("Sector::setBuilders(%d,%d)\n",type,n_builders);
2627 ASSERT( n_builders == 0 || canBuild(type) );
2628 if( this == gamestate->getCurrentSector() ) {
2629 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2630 gamestate->getGamePanel()->refresh();
2631 }
2632 this->n_builders[type] = n_builders;
2633 }
2634
getPopulation() const2635 int Sector::getPopulation() const {
2636 //LOG("Sector::getPopulation()\n");
2637 return this->population;
2638 }
2639
getSparePopulation() const2640 int Sector::getSparePopulation() const {
2641 //LOG("Sector::getSparePopulation()\n");
2642 int n_spare = this->population;
2643 n_spare -= this->n_designers;
2644 n_spare -= this->n_workers;
2645 for(int i=0;i<N_ID;i++)
2646 n_spare -= this->n_miners[i];
2647 for(int i=0;i<N_BUILDINGS;i++)
2648 n_spare -= this->n_builders[i];
2649 ASSERT( n_spare >= 0 );
2650 ASSERT( n_spare <= this->population );
2651 return n_spare;
2652 }
2653
getAvailablePopulation() const2654 int Sector::getAvailablePopulation() const {
2655 //LOG("Sector::getAvailablePopulation()\n");
2656 return this->getSparePopulation() - 1;
2657 }
2658
getDesigners() const2659 int Sector::getDesigners() const {
2660 //LOG("Sector::getDesigners()\n");
2661 return this->n_designers;
2662 }
2663
getWorkers() const2664 int Sector::getWorkers() const {
2665 //LOG("Sector::getWorkers()\n");
2666 return this->n_workers;
2667 }
2668
getFAmount() const2669 int Sector::getFAmount() const {
2670 //LOG("Sector::getFAmount()\n");
2671 ASSERT(n_famount <= infinity_c);
2672 return this->n_famount;
2673 }
2674
getMiners(Id id) const2675 int Sector::getMiners(Id id) const {
2676 //LOG("Sector::getMiners(%d)\n",id);
2677 ASSERT_ELEMENT_ID(id);
2678 return this->n_miners[id];
2679 }
2680
getBuilders(Type type) const2681 int Sector::getBuilders(Type type) const {
2682 //LOG("Sector::getBuilders(%d)\n",type);
2683 return this->n_builders[type];
2684 }
2685
getArmy(int player) const2686 const Army *Sector::getArmy(int player) const {
2687 ASSERT_PLAYER(player);
2688 return armies[player];
2689 }
2690
getArmy(int player)2691 Army *Sector::getArmy(int player) {
2692 ASSERT_PLAYER(player);
2693 return armies[player];
2694 }
2695
enemiesPresent() const2696 bool Sector::enemiesPresent() const {
2697 //LOG("Sector::enemiesPresent()\n");
2698 return enemiesPresent(this->getPlayer());
2699 }
2700
enemiesPresentWithBombardment() const2701 bool Sector::enemiesPresentWithBombardment() const {
2702 return enemiesPresent(this->getPlayer(), false);
2703 }
2704
enemiesPresent(int player) const2705 bool Sector::enemiesPresent(int player) const {
2706 return enemiesPresent(player, true);
2707 }
2708
enemiesPresent(int player,bool include_unarmed) const2709 bool Sector::enemiesPresent(int player,bool include_unarmed) const {
2710 //LOG("Sector::enemiesPresent(%d)\n",player);
2711 // todo: improve performance
2712 ASSERT( player != -1 );
2713 bool rtn = false;
2714 for(int i=0;i<n_players_c && !rtn;i++) {
2715 if( i != player && !Player::isAlliance(i, player) ) {
2716 if( this->getArmy(i)->any(include_unarmed) ) {
2717 rtn = true;
2718 }
2719 }
2720 }
2721 return rtn;
2722 }
2723
returnAssembledArmy()2724 void Sector::returnAssembledArmy() {
2725 //LOG("Sector::returnAssembledArmy()\n");
2726 ASSERT(assembled_army != NULL);
2727 returnArmy(assembled_army);
2728 if( this == gamestate->getCurrentSector() ) {
2729 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2730 gamestate->getGamePanel()->refresh();
2731 }
2732 }
2733
returnArmy()2734 bool Sector::returnArmy() {
2735 //LOG("Sector::returnArmy() [%d: %d,%d]\n", player, xpos, ypos);
2736 ASSERT( this->player != -1 );
2737 return this->returnArmy( this->getArmy( this->player ) );
2738 }
2739
returnArmy(Army * army)2740 bool Sector::returnArmy(Army *army) {
2741 //LOG("Sector::returnArmy(%d)\n",army);
2742 ASSERT( this->player != -1 );
2743
2744 Sector *src_sector = army->getSector();
2745 bool temp[map_width_c][map_height_c];
2746 game_g->getMap()->canMoveTo(temp, src_sector->xpos, src_sector->ypos, army->getPlayer());
2747 //bool adj = game_g->getMap()->temp[this->xpos][this->ypos];
2748 bool adj = temp[this->xpos][this->ypos];
2749 bool moved_all = true;
2750
2751 if( !army->canLeaveSafely() ) {
2752 // retreat
2753 army->retreat(!adj);
2754 }
2755
2756 for(int i=0;i<=n_epochs_c;i++) {
2757 int n_soldiers = army->getSoldiers(i);
2758 if( n_soldiers > 0 ) {
2759 if( !adj && !isAirUnit( i ) ) {
2760 // can't move
2761 moved_all = false;
2762 }
2763 else {
2764 int n_men = ( i==n_epochs_c ? 1 : game_g->invention_weapons[i]->getNMen() );
2765 this->population += army->getSoldiers(i) * n_men;
2766 if( i != n_epochs_c ) {
2767 // unarmed men are never stored in the stored_army (as not actually a weapon)
2768 this->stored_army->add(i, n_soldiers);
2769 }
2770 army->remove(i, n_soldiers);
2771 }
2772 }
2773 }
2774
2775 if( this == gamestate->getCurrentSector() ) {
2776 //((PlayingGameState *)gamestate)->getGamePanel()->refresh();
2777 gamestate->getGamePanel()->refresh();
2778 gamestate->refreshSoldiers(true);
2779 }
2780 return moved_all;
2781 }
2782
2783 /** Move Army 'army' into this sector.
2784 */
moveArmy(Army * army)2785 bool Sector::moveArmy(Army *army) {
2786 //LOG("Sector::moveArmy(%d,%d)\n",a_player,army);
2787 if( this->isNuked() ) {
2788 return false;
2789 }
2790 Sector *src_sector = army->getSector();
2791 bool temp[map_width_c][map_height_c];
2792 game_g->getMap()->canMoveTo(temp, src_sector->xpos, src_sector->ypos, army->getPlayer());
2793 //bool adj = game_g->getMap()->temp[this->xpos][this->ypos];
2794 bool adj = temp[this->xpos][this->ypos];
2795 bool moved_all = true;
2796 if( !army->canLeaveSafely() ) {
2797 // retreat
2798 army->retreat(!adj);
2799 }
2800
2801 if( this->getArmy(army->getPlayer()) != army ) {
2802 for(int i=0;i<=n_epochs_c;i++) {
2803 int n_soldiers = army->getSoldiers(i);
2804 if( n_soldiers > 0 ) {
2805 if( !adj && !isAirUnit( i ) ) {
2806 moved_all = false;
2807 }
2808 else {
2809 this->getArmy( army->getPlayer() )->add(i, n_soldiers);
2810 army->remove(i, n_soldiers);
2811 }
2812 }
2813 }
2814 }
2815
2816 if( this == gamestate->getCurrentSector() || army->getSector() == gamestate->getCurrentSector() ) {
2817 //((PlayingGameState *)gamestate)->refreshSoldiers(true);
2818 gamestate->refreshSoldiers(true);
2819 }
2820
2821 return moved_all;
2822 }
2823
evacuate()2824 void Sector::evacuate() {
2825 for(int i=0;i<N_BUILDINGS;i++) {
2826 Building *building = this->getBuilding((Type)i);
2827 if( building != NULL ) {
2828 for(int j=0;j<building->getNTurrets();j++) {
2829 if( building->getTurretMan(j) != -1 )
2830 this->returnDefender(building, j);
2831 }
2832 }
2833 this->setBuilders((Type)i, 0);
2834 }
2835 this->setDesigners(0);
2836 this->setWorkers(0);
2837 for(int i=0;i<N_ID;i++) {
2838 this->n_miners[i] = 0;
2839 }
2840
2841 this->assembleAll(true);
2842
2843 this->getArmy(this->getPlayer())->add(this->getAssembledArmy());
2844 }
2845
assembleAll(bool include_unarmed)2846 void Sector::assembleAll(bool include_unarmed) {
2847 for(int i=n_epochs_c-1;i>=game_g->getStartEpoch();i--) {
2848 if( i == nuclear_epoch_c )
2849 continue;
2850 while( this->assembleArmy(i, 1) ) {
2851 }
2852 }
2853
2854 if( include_unarmed ) {
2855 int men = this->getAvailablePopulation();
2856 if( men > 0 ) {
2857 this->getAssembledArmy()->add(n_epochs_c, men);
2858 int n_pop = this->getPopulation() - men;
2859 this->setPopulation(n_pop);
2860 }
2861 }
2862 }
2863
saveState(stringstream & stream) const2864 void Sector::saveState(stringstream &stream) const {
2865 stream << "<sector ";
2866 stream << "x=\"" << xpos << "\" ";
2867 stream << "y=\"" << ypos << "\" ";
2868 stream << "epoch=\"" << epoch << "\" ";
2869 stream << "player=\"" << player << "\" ";
2870 stream << "is_shutdown=\"" << (is_shutdown?1:0) << "\" ";
2871 stream << "nuked=\"" << (nuked?1:0) << "\" ";
2872 stream << "nuke_by_player=\"" << nuke_by_player << "\" ";
2873 stream << "nuke_time=\"" << nuke_time << "\" ";
2874 stream << "nuke_defence_animation=\"" << (nuke_defence_animation?1:0) << "\" ";
2875 stream << "nuke_defence_time=\"" << nuke_defence_time << "\" ";
2876 stream << "nuke_defence_x=\"" << nuke_defence_x << "\" ";
2877 stream << "nuke_defence_y=\"" << nuke_defence_y << "\" ";
2878 stream << "population=\"" << population << "\" ";
2879 stream << "n_designers=\"" << n_designers << "\" ";
2880 stream << "n_workers=\"" << n_workers << "\" ";
2881 stream << "n_famount=\"" << n_famount << "\" ";
2882 stream << "researched=\"" << researched << "\" ";
2883
2884 stream << "researched_lasttime=\"" << researched_lasttime << "\" ";
2885 stream << "manufactured=\"" << manufactured << "\" ";
2886 stream << "manufactured_lasttime=\"" << manufactured_lasttime << "\" ";
2887 stream << "growth_lasttime=\"" << growth_lasttime << "\" ";
2888 stream << "mined_lasttime=\"" << mined_lasttime << "\" ";
2889 stream << "built_lasttime=\"" << built_lasttime << "\" ";
2890 stream << ">\n";
2891
2892 for(int i=0;i<N_ID;i++) {
2893 stream << "<n_miners element_id=\"" << i << "\" n=\"" << n_miners[i] << "\"/>\n";
2894 stream << "<elements element_id=\"" << i << "\" n=\"" << elements[i] << "\"/>\n";
2895 stream << "<elementstocks element_id=\"" << i << "\" n=\"" << elementstocks[i] << "\"/>\n";
2896 stream << "<partial_elementstocks element_id=\"" << i << "\" n=\"" << partial_elementstocks[i] << "\"/>\n";
2897 }
2898 for(int i=0;i<N_BUILDINGS;i++) {
2899 stream << "<n_builders building_id=\"" << i << "\" n=\"" << n_builders[i] << "\"/>\n";
2900 }
2901 if( current_design != NULL ) {
2902 stream << "<current_design invention_type=\"" << current_design->getInvention()->getType() << "\" invention_epoch=\"" << current_design->getInvention()->getEpoch() << "\" design_id=\"" << current_design->getSaveId() << "\"/>\n";
2903 }
2904 if( current_manufacture != NULL ) {
2905 stream << "<current_manufacture invention_type=\"" << current_manufacture->getInvention()->getType() << "\" invention_epoch=\"" << current_manufacture->getInvention()->getEpoch() << "\" design_id=\"" << current_manufacture->getSaveId() << "\"/>\n";
2906 }
2907 for(int i=0;i<n_players_c;i++) {
2908 stream << "<built_towers player_id=\"" << i << "\" n=\"" << built_towers[i] << "\"/>\n";
2909 }
2910 for(int i=0;i<N_BUILDINGS;i++) {
2911 stream << "<built building_id=\"" << i << "\" n=\"" << built[i] << "\"/>\n";
2912 }
2913 for(size_t i=0;i<designs.size();i++) {
2914 const Design *design = designs.at(i);
2915 stream << "<design invention_type=\"" << design->getInvention()->getType() << "\" invention_epoch=\"" << design->getInvention()->getEpoch() << "\" design_id=\"" << design->getSaveId() << "\"/>\n";
2916 }
2917 for(int i=0;i<N_BUILDINGS;i++) {
2918 if( buildings[i] != NULL ) {
2919 buildings[i]->saveState(stream);
2920 }
2921 }
2922 if( stored_army != NULL ) {
2923 stream << "<stored_army>\n";
2924 stored_army->saveState(stream);
2925 stream << "</stored_army>\n";
2926 }
2927 for(int i=0;i<n_players_c;i++) {
2928 if( armies[i] != NULL ) {
2929 stream << "<army player_id=\"" << i << "\">\n";
2930 armies[i]->saveState(stream);
2931 stream << "</army>\n";
2932 }
2933 }
2934 for(int i=0;i<n_epochs_c;i++) {
2935 stream << "<stored_defenders epoch=\"" << i << "\" n=\"" << stored_defenders[i] << "\"/>\n";
2936 }
2937 for(int i=0;i<4;i++) {
2938 stream << "<stored_shields relative_epoch=\"" << i << "\" n=\"" << stored_shields[i] << "\"/>\n";
2939 }
2940
2941 stream << "</sector>\n";
2942 }
2943
loadStateParseXMLDesign(const TiXmlAttribute * attribute)2944 Design *Sector::loadStateParseXMLDesign(const TiXmlAttribute *attribute) {
2945 Invention::Type invention_type = Invention::UNKNOWN_TYPE;
2946 int invention_epoch = -1;
2947 int design_id = -1;
2948 while( attribute != NULL ) {
2949 const char *attribute_name = attribute->Name();
2950 if( strcmp(attribute_name, "invention_type") == 0 ) {
2951 invention_type = static_cast<Invention::Type>(atoi(attribute->Value()));
2952 }
2953 else if( strcmp(attribute_name, "invention_epoch") == 0 ) {
2954 invention_epoch = atoi(attribute->Value());
2955 }
2956 else if( strcmp(attribute_name, "design_id") == 0 ) {
2957 design_id = atoi(attribute->Value());
2958 }
2959 else {
2960 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
2961 LOG("unknown sector/current_design attribute: %s\n", attribute_name);
2962 ASSERT(false);
2963 }
2964 attribute = attribute->Next();
2965 }
2966 if( invention_type == Invention::UNKNOWN_TYPE || invention_type >= Invention::N_TYPES ) {
2967 throw std::runtime_error("current_design invalid type");
2968 }
2969 else if( invention_epoch < 0 || invention_epoch >= n_epochs_c ) {
2970 throw std::runtime_error("current_design invalid epoch");
2971 }
2972 else if( design_id < 0 ) {
2973 throw std::runtime_error("current_design invalid design_id");
2974 }
2975 const Invention *invention = Invention::getInvention(invention_type, invention_epoch);
2976 Design *design = invention->findDesign(design_id);
2977 if( design == NULL ) {
2978 throw std::runtime_error("unknown design");
2979 }
2980 return design;
2981 }
2982
loadStateParseXMLNode(const TiXmlNode * parent)2983 void Sector::loadStateParseXMLNode(const TiXmlNode *parent) {
2984 if( parent == NULL ) {
2985 return;
2986 }
2987 bool read_children = true;
2988
2989 switch( parent->Type() ) {
2990 case TiXmlNode::TINYXML_DOCUMENT:
2991 break;
2992 case TiXmlNode::TINYXML_ELEMENT:
2993 {
2994 const char *element_name = parent->Value();
2995 const TiXmlElement *element = parent->ToElement();
2996 const TiXmlAttribute *attribute = element->FirstAttribute();
2997 if( strcmp(element_name, "sector") == 0 ) {
2998 while( attribute != NULL ) {
2999 const char *attribute_name = attribute->Name();
3000 if( strcmp(attribute_name, "epoch") == 0 ) {
3001 this->epoch = atoi(attribute->Value());
3002 if( epoch < 0 || epoch >= n_epochs_c+1 ) {
3003 throw std::runtime_error("sector invalid epoch");
3004 }
3005 }
3006 else if( strcmp(attribute_name, "x") == 0 ) {
3007 // handled by caller
3008 }
3009 else if( strcmp(attribute_name, "y") == 0 ) {
3010 // handled by caller
3011 }
3012 else if( strcmp(attribute_name, "player") == 0 ) {
3013 this->player = atoi(attribute->Value());
3014 if( player < -1 || player >= n_players_c ) {
3015 throw std::runtime_error("sector invalid player");
3016 }
3017 if( player != -1 ) {
3018 this->assembled_army = new Army(gamestate, this, this->getPlayer());
3019 }
3020 }
3021 else if( strcmp(attribute_name, "is_shutdown") == 0 ) {
3022 this->is_shutdown = atoi(attribute->Value()) == 1;
3023 }
3024 else if( strcmp(attribute_name, "nuked") == 0 ) {
3025 this->nuked = atoi(attribute->Value()) == 1;
3026 }
3027 else if( strcmp(attribute_name, "nuke_by_player") == 0 ) {
3028 this->nuke_by_player = atoi(attribute->Value());
3029 if( nuke_by_player < -1 || nuke_by_player >= n_players_c ) {
3030 throw std::runtime_error("sector invalid nuke_by_player");
3031 }
3032 }
3033 else if( strcmp(attribute_name, "nuke_time") == 0 ) {
3034 this->nuke_time = atoi(attribute->Value());
3035 }
3036 else if( strcmp(attribute_name, "nuke_defence_animation") == 0 ) {
3037 this->nuke_defence_animation = atoi(attribute->Value()) == 1;
3038 }
3039 else if( strcmp(attribute_name, "nuke_defence_time") == 0 ) {
3040 this->nuke_defence_time = atoi(attribute->Value());
3041 }
3042 else if( strcmp(attribute_name, "nuke_defence_x") == 0 ) {
3043 this->nuke_defence_x = atoi(attribute->Value());
3044 }
3045 else if( strcmp(attribute_name, "nuke_defence_y") == 0 ) {
3046 this->nuke_defence_y = atoi(attribute->Value());
3047 }
3048 else if( strcmp(attribute_name, "population") == 0 ) {
3049 this->population = atoi(attribute->Value());
3050 if( population < 0 ) {
3051 throw std::runtime_error("sector invalid population");
3052 }
3053 }
3054 else if( strcmp(attribute_name, "n_designers") == 0 ) {
3055 this->n_designers = atoi(attribute->Value());
3056 if( n_designers < 0 || n_designers > population ) {
3057 throw std::runtime_error("sector invalid n_designers");
3058 }
3059 }
3060 else if( strcmp(attribute_name, "n_workers") == 0 ) {
3061 this->n_workers = atoi(attribute->Value());
3062 if( n_workers < 0 || n_workers > population ) {
3063 throw std::runtime_error("sector invalid n_workers");
3064 }
3065 }
3066 else if( strcmp(attribute_name, "n_famount") == 0 ) {
3067 this->n_famount = atoi(attribute->Value());
3068 }
3069 else if( strcmp(attribute_name, "researched") == 0 ) {
3070 this->researched = atoi(attribute->Value());
3071 }
3072 else if( strcmp(attribute_name, "researched_lasttime") == 0 ) {
3073 this->researched_lasttime = atoi(attribute->Value());
3074 }
3075 else if( strcmp(attribute_name, "manufactured") == 0 ) {
3076 this->manufactured = atoi(attribute->Value());
3077 }
3078 else if( strcmp(attribute_name, "manufactured_lasttime") == 0 ) {
3079 this->manufactured_lasttime = atoi(attribute->Value());
3080 }
3081 else if( strcmp(attribute_name, "growth_lasttime") == 0 ) {
3082 this->growth_lasttime = atoi(attribute->Value());
3083 }
3084 else if( strcmp(attribute_name, "mined_lasttime") == 0 ) {
3085 this->mined_lasttime = atoi(attribute->Value());
3086 }
3087 else if( strcmp(attribute_name, "built_lasttime") == 0 ) {
3088 this->built_lasttime = atoi(attribute->Value());
3089 }
3090 else {
3091 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
3092 LOG("unknown sector/sector attribute: %s\n", attribute_name);
3093 ASSERT(false);
3094 }
3095 attribute = attribute->Next();
3096 }
3097 }
3098 else if( strcmp(element_name, "n_miners") == 0 || strcmp(element_name, "elements") == 0 || strcmp(element_name, "elementstocks") == 0 || strcmp(element_name, "partial_elementstocks") == 0 ) {
3099 int element_id = -1;
3100 int n = -1;
3101 while( attribute != NULL ) {
3102 const char *attribute_name = attribute->Name();
3103 if( strcmp(attribute_name, "element_id") == 0 ) {
3104 element_id = atoi(attribute->Value());
3105 }
3106 else if( strcmp(attribute_name, "n") == 0 ) {
3107 n = atoi(attribute->Value());
3108 }
3109 else {
3110 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
3111 LOG("unknown sector/n_miners/etc attribute: %s\n", attribute_name);
3112 ASSERT(false);
3113 }
3114 attribute = attribute->Next();
3115 }
3116 if( element_id == -1 || n == -1 ) {
3117 throw std::runtime_error("n_miners/elements/partial_elementstocks missing attributes");
3118 }
3119 else if( element_id < 0 || element_id >= N_ID ) {
3120 throw std::runtime_error("n_miners/elements/partial_elementstocks invalid element_id");
3121 }
3122 if( strcmp(element_name, "n_miners") == 0 )
3123 n_miners[element_id] = n;
3124 else if( strcmp(element_name, "elements") == 0 )
3125 elements[element_id] = n;
3126 else if( strcmp(element_name, "elementstocks") == 0 )
3127 elementstocks[element_id] = n;
3128 else if( strcmp(element_name, "partial_elementstocks") == 0 )
3129 partial_elementstocks[element_id] = n;
3130 }
3131 else if( strcmp(element_name, "n_builders") == 0 || strcmp(element_name, "built") == 0 ) {
3132 int building_id = -1;
3133 int n = -1;
3134 while( attribute != NULL ) {
3135 const char *attribute_name = attribute->Name();
3136 if( strcmp(attribute_name, "building_id") == 0 ) {
3137 building_id = atoi(attribute->Value());
3138 }
3139 else if( strcmp(attribute_name, "n") == 0 ) {
3140 n = atoi(attribute->Value());
3141 }
3142 else {
3143 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
3144 LOG("unknown sector/n_builders/etc attribute: %s\n", attribute_name);
3145 ASSERT(false);
3146 }
3147 attribute = attribute->Next();
3148 }
3149 if( building_id == -1 || n == -1 ) {
3150 throw std::runtime_error("n_builders/built missing attributes");
3151 }
3152 else if( building_id < 0 || building_id >= N_BUILDINGS ) {
3153 throw std::runtime_error("n_builders/built invalid building_id");
3154 }
3155 if( strcmp(element_name, "n_builders") == 0 )
3156 n_builders[building_id] = n;
3157 else if( strcmp(element_name, "built") == 0 )
3158 built[building_id] = n;
3159 }
3160 else if( strcmp(element_name, "current_design") == 0 ) {
3161 this->current_design = this->loadStateParseXMLDesign(attribute);
3162 }
3163 else if( strcmp(element_name, "current_manufacture") == 0 ) {
3164 this->current_manufacture = this->loadStateParseXMLDesign(attribute);
3165 }
3166 else if( strcmp(element_name, "design") == 0 ) {
3167 Design *design = this->loadStateParseXMLDesign(attribute);
3168 this->designs.push_back(design);
3169 inventions_known[design->getInvention()->getType()][design->getInvention()->getEpoch()] = true;
3170 }
3171 else if( strcmp(element_name, "built_towers") == 0 ) {
3172 int player_id = -1;
3173 int n = -1;
3174 while( attribute != NULL ) {
3175 const char *attribute_name = attribute->Name();
3176 if( strcmp(attribute_name, "player_id") == 0 ) {
3177 player_id = atoi(attribute->Value());
3178 }
3179 else if( strcmp(attribute_name, "n") == 0 ) {
3180 n = atoi(attribute->Value());
3181 }
3182 else {
3183 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
3184 LOG("unknown sector/built_towers attribute: %s\n", attribute_name);
3185 ASSERT(false);
3186 }
3187 attribute = attribute->Next();
3188 }
3189 if( player_id == -1 || n == -1 ) {
3190 throw std::runtime_error("built_towers missing attributes");
3191 }
3192 else if( player_id < 0 || player_id >= n_players_c ) {
3193 throw std::runtime_error("built_towers invalid player_id");
3194 }
3195 built_towers[player_id] = n;
3196 }
3197 else if( strcmp(element_name, "building") == 0 ) {
3198 int building_id = -1;
3199 while( attribute != NULL ) {
3200 const char *attribute_name = attribute->Name();
3201 if( strcmp(attribute_name, "building_id") == 0 ) {
3202 building_id = atoi(attribute->Value());
3203 }
3204 else {
3205 // everything else handed by sub-function
3206 }
3207 attribute = attribute->Next();
3208 }
3209 if( building_id < 0 || building_id >= N_BUILDINGS ) {
3210 throw std::runtime_error("building invalid building_id");
3211 }
3212 if( buildings[building_id] == NULL ) {
3213 this->buildings[building_id] = new Building(gamestate, this, (Type)building_id);
3214 updateForNewBuilding((Type)building_id);
3215 }
3216 this->buildings[building_id]->loadStateParseXMLNode(parent);
3217 read_children = false;
3218 }
3219 else if( strcmp(element_name, "stored_army") == 0 ) {
3220 if( stored_army == NULL ) {
3221 this->stored_army = new Army(gamestate, this, this->getPlayer());
3222 }
3223 this->stored_army->loadStateParseXMLNode(parent);
3224 read_children = false;
3225 }
3226 else if( strcmp(element_name, "army") == 0 ) {
3227 int player_id = -1;
3228 while( attribute != NULL ) {
3229 const char *attribute_name = attribute->Name();
3230 if( strcmp(attribute_name, "player_id") == 0 ) {
3231 player_id = atoi(attribute->Value());
3232 }
3233 else {
3234 // everything else handed by sub-function
3235 }
3236 attribute = attribute->Next();
3237 }
3238 if( player_id < 0 || player_id >= n_players_c ) {
3239 throw std::runtime_error("army invalid player_id");
3240 }
3241 this->armies[player_id]->loadStateParseXMLNode(parent);
3242 read_children = false;
3243 }
3244 else if( strcmp(element_name, "stored_defenders") == 0 ) {
3245 int epoch = -1;
3246 int n = -1;
3247 while( attribute != NULL ) {
3248 const char *attribute_name = attribute->Name();
3249 if( strcmp(attribute_name, "epoch") == 0 ) {
3250 epoch = atoi(attribute->Value());
3251 }
3252 else if( strcmp(attribute_name, "n") == 0 ) {
3253 n = atoi(attribute->Value());
3254 }
3255 else {
3256 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
3257 LOG("unknown sector/stored_defenders attribute: %s\n", attribute_name);
3258 ASSERT(false);
3259 }
3260 attribute = attribute->Next();
3261 }
3262 if( epoch == -1 || n == -1 ) {
3263 throw std::runtime_error("stored_defenders missing attributes");
3264 }
3265 else if( epoch < 0 || epoch >= n_epochs_c ) {
3266 throw std::runtime_error("stored_defenders invalid epoch");
3267 }
3268 this->stored_defenders[epoch] = n;
3269 }
3270 else if( strcmp(element_name, "stored_shields") == 0 ) {
3271 int relative_epoch = -1;
3272 int n = -1;
3273 while( attribute != NULL ) {
3274 const char *attribute_name = attribute->Name();
3275 if( strcmp(attribute_name, "relative_epoch") == 0 ) {
3276 relative_epoch = atoi(attribute->Value());
3277 }
3278 else if( strcmp(attribute_name, "n") == 0 ) {
3279 n = atoi(attribute->Value());
3280 }
3281 else {
3282 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
3283 LOG("unknown sector/stored_shields attribute: %s\n", attribute_name);
3284 ASSERT(false);
3285 }
3286 attribute = attribute->Next();
3287 }
3288 if( relative_epoch == -1 || n == -1 ) {
3289 throw std::runtime_error("stored_shields missing attributes");
3290 }
3291 else if( relative_epoch < 0 || relative_epoch >= 4 ) {
3292 throw std::runtime_error("stored_shields invalid relative_epoch");
3293 }
3294 this->stored_shields[relative_epoch] = n;
3295 }
3296 else {
3297 // don't throw an error here, to help backwards compatibility, but should throw an error in debug mode in case this is a sign of not loading something that we've saved
3298 LOG("unknown sector tag: %s\n", element_name);
3299 ASSERT(false);
3300 }
3301 }
3302 break;
3303 case TiXmlNode::TINYXML_COMMENT:
3304 break;
3305 case TiXmlNode::TINYXML_UNKNOWN:
3306 break;
3307 case TiXmlNode::TINYXML_TEXT:
3308 {
3309 }
3310 break;
3311 case TiXmlNode::TINYXML_DECLARATION:
3312 break;
3313 }
3314
3315 for(const TiXmlNode *child=parent->FirstChild();child!=NULL && read_children;child=child->NextSibling()) {
3316 loadStateParseXMLNode(child);
3317 }
3318 }
3319
printDebugInfo() const3320 void Sector::printDebugInfo() const {
3321 #ifdef _DEBUG
3322 printf("*** Sector Information ***\n");
3323 if( player == -1 ) {
3324 printf(" No player in this sector\n");
3325 }
3326 else {
3327 printf(" player %d\n", player);
3328 printf(" population %d\n", population);
3329 printf(" designers %d\n", n_designers);
3330 if( current_design != NULL )
3331 printf(" researching %s\n", current_design->getInvention()->getName());
3332 printf(" workers %d\n", n_workers);
3333 if( current_manufacture != NULL )
3334 printf(" manufacturing %s\n", current_manufacture->getInvention()->getName());
3335 for(int i=0;i<N_ID;i++) {
3336 if( this->canMine((Id)i) ) {
3337 Element *element = game_g->elements[i];
3338 if( element->getType() != Element::GATHERABLE )
3339 printf(" mining %s %d\n", element->getName(), this->getMiners((Id)i));
3340 }
3341 }
3342 for(int i=0;i<N_ID;i++) {
3343 int stocks = this->elementstocks[i];
3344 Element *element = game_g->elements[i];
3345 if( stocks > 0 )
3346 printf("stocks of %s: %d\n", element->getName(), stocks);
3347 }
3348 //printf(" \n", );
3349 }
3350 printf("*** End Of Sector Information ***\n");
3351 #endif
3352 }
3353
setupDesigns()3354 bool Design::setupDesigns() {
3355 Design *design = NULL;
3356 Weapon **invention_weapons = game_g->invention_weapons;
3357 Invention **invention_defences = game_g->invention_defences;
3358 Invention **invention_shields = game_g->invention_shields;
3359 // Weapons
3360 // 0 - rock (1.5)
3361 // rock, wood, bone, slate, herbirite, valium, bethlium, parasite, moonlite, aquarium, solarium, aruldite
3362 // ergo: wood, bone
3363 // no mixing ?
3364 // from tips: rock, wood, bone
3365 design = new Design(invention_weapons[0], true);
3366 design->setCost(ROCK, 1.5);
3367 design = new Design(invention_weapons[0], true);
3368 design->setCost(WOOD, 1.5);
3369 design = new Design(invention_weapons[0], true);
3370 design->setCost(BONE, 1.5);
3371 design = new Design(invention_weapons[0], false);
3372 design->setCost(SLATE, 1.5);
3373 design = new Design(invention_weapons[0], false);
3374 design->setCost(HERBIRITE, 1.5);
3375 design = new Design(invention_weapons[0], false);
3376 design->setCost(AQUARIUM, 1.5);
3377 design = new Design(invention_weapons[0], false);
3378 design->setCost(VALIUM, 1.5);
3379 design = new Design(invention_weapons[0], false);
3380 design->setCost(BETHLIUM, 1.5);
3381 design = new Design(invention_weapons[0], false);
3382 design->setCost(PARASITE, 1.5);
3383 design = new Design(invention_weapons[0], false);
3384 design->setCost(MOONLITE, 1.5);
3385 design = new Design(invention_weapons[0], false);
3386 design->setCost(SOLARIUM, 1.5);
3387 design = new Design(invention_weapons[0], false);
3388 design->setCost(ARULDITE, 1.5);
3389 // 1 - catapult (1)
3390 // wood, rock, slate, bone, herbirite, bethlium, parasite, moonlite, onion, solarium, aruldite, aquarium, planetarium
3391 // ergo: wood, bethlium, wood+solarium, rock+aruldite, bone+solarium
3392 // from tips: solarium, aruldite
3393 design = new Design(invention_weapons[1], false);
3394 design->setCost(WOOD, 1);
3395 design = new Design(invention_weapons[1], false);
3396 design->setCost(BONE, 1);
3397 design = new Design(invention_weapons[1], false);
3398 design->setCost(ROCK, 1);
3399 design = new Design(invention_weapons[1], false);
3400 design->setCost(BETHLIUM, 1);
3401 design = new Design(invention_weapons[1], false);
3402 design->setCost(SOLARIUM, 1);
3403 design = new Design(invention_weapons[1], false);
3404 design->setCost(ARULDITE, 1);
3405
3406 design = new Design(invention_weapons[1], false);
3407 design->setCost(WOOD, 0.5);
3408 design->setCost(MOONLITE, 0.5);
3409 design = new Design(invention_weapons[1], true);
3410 design->setCost(WOOD, 0.5);
3411 design->setCost(SOLARIUM, 0.5);
3412 design = new Design(invention_weapons[1], true);
3413 design->setCost(WOOD, 0.5);
3414 design->setCost(BETHLIUM, 0.5);
3415
3416 design = new Design(invention_weapons[1], false);
3417 design->setCost(SLATE, 0.5);
3418 design->setCost(BETHLIUM, 0.5);
3419 design = new Design(invention_weapons[1], false);
3420 design->setCost(MOONLITE, 0.5);
3421 design->setCost(SOLARIUM, 0.5);
3422 design = new Design(invention_weapons[1], false);
3423 design->setCost(SOLARIUM, 0.5);
3424 design->setCost(PARASITE, 0.5);
3425 design = new Design(invention_weapons[1], false);
3426 design->setCost(BETHLIUM, 0.5);
3427 design->setCost(PARASITE, 0.5);
3428 design = new Design(invention_weapons[1], false);
3429 design->setCost(BETHLIUM, 0.5);
3430 design->setCost(HERBIRITE, 0.5);
3431
3432 design = new Design(invention_weapons[1], false);
3433 design->setCost(ROCK, 0.5);
3434 design->setCost(BONE, 0.5);
3435 design = new Design(invention_weapons[1], false);
3436 design->setCost(ROCK, 0.5);
3437 design->setCost(ONION, 0.5);
3438 design = new Design(invention_weapons[1], false);
3439 design->setCost(ROCK, 0.5);
3440 design->setCost(SLATE, 0.5);
3441 design = new Design(invention_weapons[1], false);
3442 design->setCost(BONE, 0.5);
3443 design->setCost(HERBIRITE, 0.5);
3444 design = new Design(invention_weapons[1], false);
3445 design->setCost(BONE, 0.5);
3446 design->setCost(MOONLITE, 0.5);
3447 design = new Design(invention_weapons[1], false);
3448 design->setCost(WOOD, 0.5);
3449 design->setCost(BONE, 0.5);
3450 design = new Design(invention_weapons[1], true);
3451 design->setCost(WOOD, 0.5);
3452 design->setCost(SOLARIUM, 0.5);
3453 design = new Design(invention_weapons[1], true);
3454 design->setCost(BONE, 0.5);
3455 design->setCost(SOLARIUM, 0.5);
3456 design = new Design(invention_weapons[1], true);
3457 design->setCost(ROCK, 0.5);
3458 design->setCost(ARULDITE, 0.5);
3459 design = new Design(invention_weapons[1], false);
3460 design->setCost(SLATE, 0.5);
3461 design->setCost(ARULDITE, 0.5);
3462 design = new Design(invention_weapons[1], false);
3463 design->setCost(BONE, 0.5);
3464 design->setCost(VALIUM, 0.5);
3465 design = new Design(invention_weapons[1], false);
3466 design->setCost(SOLARIUM, 0.5);
3467 design->setCost(VALIUM, 0.5);
3468 design = new Design(invention_weapons[1], false);
3469 design->setCost(WOOD, 0.5);
3470 design->setCost(AQUARIUM, 0.5);
3471 design = new Design(invention_weapons[1], false);
3472 design->setCost(SOLARIUM, 0.5);
3473 design->setCost(AQUARIUM, 0.5);
3474 design = new Design(invention_weapons[1], false);
3475 design->setCost(PLANETARIUM, 0.5);
3476 design->setCost(SOLARIUM, 0.5);
3477 design = new Design(invention_weapons[1], false);
3478 design->setCost(SOLARIUM, 0.5);
3479 design->setCost(ARULDITE, 0.5);
3480 // 2 - pike (1.5)
3481 // rock, wood, slate, bone, moonlite, bethlium, planetarium, solarium, moonlite, parasite, onion, tedium, valium, aruldite, aquarium, herbirite
3482 // ergo: slate, solarium, moonlite, bethlium, slate+aruldite, planetarium+aruldite, planetarium+solarium
3483 // from tips: slate, moonlite, planetarium, bethlium, solarium, aruldite
3484 design = new Design(invention_weapons[2], false);
3485 design->setCost(SLATE, 1.5);
3486 design = new Design(invention_weapons[2], true);
3487 design->setCost(MOONLITE, 0.5);
3488 design->setCost(BETHLIUM, 1);
3489 design = new Design(invention_weapons[2], true);
3490 design->setCost(MOONLITE, 1);
3491 design->setCost(SOLARIUM, 0.5);
3492 design = new Design(invention_weapons[2], false);
3493 design->setCost(SLATE, 0.5);
3494 design->setCost(MOONLITE, 1);
3495 design = new Design(invention_weapons[2], false);
3496 design->setCost(ROCK, 1);
3497 design->setCost(SOLARIUM, 0.5);
3498 design = new Design(invention_weapons[2], false);
3499 design->setCost(MOONLITE, 0.5);
3500 design->setCost(PARASITE, 1);
3501 design = new Design(invention_weapons[2], false);
3502 design->setCost(WOOD, 0.5);
3503 design->setCost(MOONLITE, 1);
3504 design = new Design(invention_weapons[2], false);
3505 design->setCost(WOOD, 1);
3506 design->setCost(BETHLIUM, 0.5);
3507 design = new Design(invention_weapons[2], true);
3508 design->setCost(PLANETARIUM, 1);
3509 design->setCost(SOLARIUM, 0.5);
3510 design = new Design(invention_weapons[2], true);
3511 design->setCost(PLANETARIUM, 1);
3512 design->setCost(ARULDITE, 0.5);
3513 design = new Design(invention_weapons[2], true);
3514 design->setCost(MOONLITE, 1);
3515 design->setCost(ARULDITE, 0.5);
3516 design = new Design(invention_weapons[2], true);
3517 design->setCost(SLATE, 1);
3518 design->setCost(ARULDITE, 0.5);
3519 design = new Design(invention_weapons[2], false);
3520 design->setCost(SOLARIUM, 0.5);
3521 design->setCost(ARULDITE, 1);
3522 design = new Design(invention_weapons[2], false);
3523 design->setCost(ARULDITE, 0.5);
3524 design->setCost(AQUARIUM, 1);
3525 design = new Design(invention_weapons[2], false);
3526 design->setCost(ARULDITE, 1.5);
3527 design = new Design(invention_weapons[2], false);
3528 design->setCost(MOONLITE, 1.5);
3529 design = new Design(invention_weapons[2], false);
3530 design->setCost(BONE, 0.5);
3531 design->setCost(PLANETARIUM, 1);
3532 design = new Design(invention_weapons[2], false);
3533 design->setCost(SLATE, 1);
3534 design->setCost(PLANETARIUM, 0.5);
3535 design = new Design(invention_weapons[2], false);
3536 design->setCost(BONE, 0.5);
3537 design->setCost(MOONLITE, 1);
3538 design = new Design(invention_weapons[2], false);
3539 design->setCost(BETHLIUM, 0.5);
3540 design->setCost(VALIUM, 1);
3541 design = new Design(invention_weapons[2], false);
3542 design->setCost(SOLARIUM, 0.5);
3543 design->setCost(VALIUM, 1);
3544 design = new Design(invention_weapons[2], false);
3545 design->setCost(MOONLITE, 1);
3546 design->setCost(VALIUM, 0.5);
3547 design = new Design(invention_weapons[2], true);
3548 design->setCost(SLATE, 1);
3549 design->setCost(BETHLIUM, 0.5);
3550 design = new Design(invention_weapons[2], true);
3551 design->setCost(SLATE, 1);
3552 design->setCost(SOLARIUM, 0.5);
3553 design = new Design(invention_weapons[2], false);
3554 design->setCost(BONE, 1);
3555 design->setCost(SOLARIUM, 0.5);
3556 design = new Design(invention_weapons[2], true);
3557 design->setCost(PLANETARIUM, 1);
3558 design->setCost(SOLARIUM, 0.5);
3559 design = new Design(invention_weapons[2], false);
3560 design->setCost(BETHLIUM, 1.5);
3561 design = new Design(invention_weapons[2], false);
3562 design->setCost(SOLARIUM, 1.5);
3563 design = new Design(invention_weapons[2], false);
3564 design->setCost(BETHLIUM, 0.5);
3565 design->setCost(PARASITE, 1);
3566 design = new Design(invention_weapons[2], false);
3567 design->setCost(PLANETARIUM, 1.5);
3568 design = new Design(invention_weapons[2], false);
3569 design->setCost(SLATE, 1);
3570 design->setCost(ONION, 0.5);
3571 design = new Design(invention_weapons[2], false);
3572 design->setCost(SOLARIUM, 0.5);
3573 design->setCost(ONION, 1);
3574 design = new Design(invention_weapons[2], false);
3575 design->setCost(MOONLITE, 1);
3576 design->setCost(ONION, 0.5);
3577 design = new Design(invention_weapons[2], false);
3578 design->setCost(SOLARIUM, 0.5);
3579 design->setCost(TEDIUM, 1);
3580 design = new Design(invention_weapons[2], false);
3581 design->setCost(BETHLIUM, 0.5);
3582 design->setCost(AQUARIUM, 1);
3583 design = new Design(invention_weapons[2], false);
3584 design->setCost(MOONLITE, 1);
3585 design->setCost(AQUARIUM, 0.5);
3586 design = new Design(invention_weapons[2], false);
3587 design->setCost(MOONLITE, 1);
3588 design->setCost(PLANETARIUM, 0.5);
3589 design = new Design(invention_weapons[2], false);
3590 design->setCost(BETHLIUM, 0.5);
3591 design->setCost(HERBIRITE, 1);
3592 design = new Design(invention_weapons[2], false);
3593 design->setCost(BONE, 1);
3594 design->setCost(BETHLIUM, 0.5);
3595 // 3 - longbow (2)
3596 // rock, wood, slate, moonlite, bethlium, aruldite, planetarium, herbirite, parasite, solarium, yeridium, marmite, aquarium, moron, tedium
3597 // ergo: slate+bethlium+yeridium
3598 // from tips: yeridium
3599 design = new Design(invention_weapons[3], false);
3600 design->setCost(MOONLITE, 1.5);
3601 design->setCost(BETHLIUM, 0.5);
3602 design = new Design(invention_weapons[3], false);
3603 design->setCost(MOONLITE, 1);
3604 design->setCost(BETHLIUM, 1);
3605 design = new Design(invention_weapons[3], false);
3606 design->setCost(ARULDITE, 2);
3607 design = new Design(invention_weapons[3], false);
3608 design->setCost(SLATE, 1.5);
3609 design->setCost(ARULDITE, 0.5);
3610 design = new Design(invention_weapons[3], false);
3611 design->setCost(MOONLITE, 1);
3612 design->setCost(ARULDITE, 1);
3613 design = new Design(invention_weapons[3], false);
3614 design->setCost(PLANETARIUM, 1);
3615 design->setCost(SOLARIUM, 1);
3616 design = new Design(invention_weapons[3], false);
3617 design->setCost(PLANETARIUM, 1.5);
3618 design->setCost(SOLARIUM, 0.5);
3619 design = new Design(invention_weapons[3], false);
3620 design->setCost(PLANETARIUM, 1);
3621 design->setCost(ARULDITE, 1);
3622 design = new Design(invention_weapons[3], false);
3623 design->setCost(PLANETARIUM, 1.5);
3624 design->setCost(HERBIRITE, 0.5);
3625 design = new Design(invention_weapons[3], false);
3626 design->setCost(SLATE, 1);
3627 design->setCost(BETHLIUM, 1);
3628 design = new Design(invention_weapons[3], false);
3629 design->setCost(SLATE, 1);
3630 design->setCost(BETHLIUM, 0.5);
3631 design->setCost(PARASITE, 0.5);
3632 design = new Design(invention_weapons[3], false);
3633 design->setCost(MOONLITE, 1);
3634 design->setCost(BETHLIUM, 0.5);
3635 design->setCost(PARASITE, 0.5);
3636 design = new Design(invention_weapons[3], false);
3637 design->setCost(BETHLIUM, 0.5);
3638 design->setCost(HERBIRITE, 1.5);
3639 design = new Design(invention_weapons[3], false);
3640 design->setCost(BETHLIUM, 1.5);
3641 design->setCost(HERBIRITE, 0.5);
3642 design = new Design(invention_weapons[3], false);
3643 design->setCost(BETHLIUM, 0.5);
3644 design->setCost(HERBIRITE, 0.5);
3645 design->setCost(PARASITE, 1);
3646 design = new Design(invention_weapons[3], false);
3647 design->setCost(PLANETARIUM, 1);
3648 design->setCost(SOLARIUM, 0.5);
3649 design->setCost(PARASITE, 0.5);
3650 design = new Design(invention_weapons[3], true);
3651 design->setCost(SLATE, 1);
3652 design->setCost(BETHLIUM, 0.5);
3653 design->setCost(YERIDIUM, 0.5);
3654 design = new Design(invention_weapons[3], false);
3655 design->setCost(SLATE, 1);
3656 design->setCost(YERIDIUM, 0.5);
3657 design->setCost(PARASITE, 0.5);
3658 design = new Design(invention_weapons[3], false);
3659 design->setCost(MOONLITE, 1);
3660 design->setCost(SOLARIUM, 1);
3661 design = new Design(invention_weapons[3], false);
3662 design->setCost(SLATE, 1);
3663 design->setCost(SOLARIUM, 1);
3664 design = new Design(invention_weapons[3], false);
3665 design->setCost(WOOD, 0.5);
3666 design->setCost(SLATE, 1);
3667 design->setCost(SOLARIUM, 0.5);
3668 design = new Design(invention_weapons[3], false);
3669 design->setCost(WOOD, 0.5);
3670 design->setCost(PLANETARIUM, 1);
3671 design->setCost(SOLARIUM, 0.5);
3672 design = new Design(invention_weapons[3], false);
3673 design->setCost(BONE, 0.5);
3674 design->setCost(PLANETARIUM, 1);
3675 design->setCost(SOLARIUM, 0.5);
3676 design = new Design(invention_weapons[3], false);
3677 design->setCost(BONE, 0.5);
3678 design->setCost(MOONLITE, 1);
3679 design->setCost(SOLARIUM, 0.5);
3680 design = new Design(invention_weapons[3], false);
3681 design->setCost(ROCK, 0.5);
3682 design->setCost(SLATE, 1);
3683 design->setCost(SOLARIUM, 0.5);
3684 design = new Design(invention_weapons[3], false);
3685 design->setCost(ROCK, 0.5);
3686 design->setCost(SLATE, 1);
3687 design->setCost(ARULDITE, 0.5);
3688 design = new Design(invention_weapons[3], false);
3689 design->setCost(ROCK, 0.5);
3690 design->setCost(MOONLITE, 1);
3691 design->setCost(ARULDITE, 0.5);
3692 design = new Design(invention_weapons[3], false);
3693 design->setCost(WOOD, 0.5);
3694 design->setCost(MOONLITE, 1);
3695 design->setCost(BETHLIUM, 0.5);
3696 design = new Design(invention_weapons[3], false);
3697 design->setCost(BETHLIUM, 0.5);
3698 design->setCost(YERIDIUM, 0.5);
3699 design->setCost(MARMITE, 1);
3700 design = new Design(invention_weapons[3], false);
3701 design->setCost(BETHLIUM, 1.5);
3702 design->setCost(YERIDIUM, 0.5);
3703 design = new Design(invention_weapons[3], false);
3704 design->setCost(BETHLIUM, 0.5);
3705 design->setCost(YERIDIUM, 1.5);
3706 design = new Design(invention_weapons[3], false);
3707 design->setCost(MOONLITE, 1);
3708 design->setCost(YERIDIUM, 1);
3709 design = new Design(invention_weapons[3], false);
3710 design->setCost(MOONLITE, 1.5);
3711 design->setCost(YERIDIUM, 0.5);
3712 design = new Design(invention_weapons[3], false);
3713 design->setCost(BETHLIUM, 0.5);
3714 design->setCost(AQUARIUM, 1.5);
3715 design = new Design(invention_weapons[3], false);
3716 design->setCost(WOOD, 0.5);
3717 design->setCost(SLATE, 1);
3718 design->setCost(HERBIRITE, 0.5);
3719 design = new Design(invention_weapons[3], false);
3720 design->setCost(ROCK, 1);
3721 design->setCost(ARULDITE, 0.5);
3722 design->setCost(HERBIRITE, 0.5);
3723 design = new Design(invention_weapons[3], false);
3724 design->setCost(SOLARIUM, 0.5);
3725 design->setCost(HERBIRITE, 1.5);
3726 design = new Design(invention_weapons[3], false);
3727 design->setCost(SLATE, 1);
3728 design->setCost(HERBIRITE, 1);
3729 design = new Design(invention_weapons[3], false);
3730 design->setCost(SLATE, 1);
3731 design->setCost(YERIDIUM, 1);
3732 design = new Design(invention_weapons[3], false);
3733 design->setCost(ARULDITE, 0.5);
3734 design->setCost(HERBIRITE, 0.5);
3735 design->setCost(MORON, 1);
3736 design = new Design(invention_weapons[3], false);
3737 design->setCost(MOONLITE, 1);
3738 design->setCost(YERIDIUM, 0.5);
3739 design->setCost(MORON, 0.5);
3740 design = new Design(invention_weapons[3], false);
3741 design->setCost(BETHLIUM, 0.5);
3742 design->setCost(YERIDIUM, 0.5);
3743 design->setCost(TEDIUM, 1);
3744 design = new Design(invention_weapons[3], true);
3745 design->setCost(MOONLITE, 1);
3746 design->setCost(BETHLIUM, 0.5);
3747 design->setCost(YERIDIUM, 0.5);
3748 design = new Design(invention_weapons[3], false);
3749 design->setCost(MOONLITE, 1);
3750 design->setCost(YERIDIUM, 0.5);
3751 design->setCost(AQUARIUM, 0.5);
3752 design = new Design(invention_weapons[3], false);
3753 design->setCost(WOOD, 0.5);
3754 design->setCost(PLANETARIUM, 0.5);
3755 design->setCost(YERIDIUM, 1);
3756 design = new Design(invention_weapons[3], false);
3757 design->setCost(WOOD, 0.5);
3758 design->setCost(MOONLITE, 1);
3759 design->setCost(YERIDIUM, 0.5);
3760 design = new Design(invention_weapons[3], false);
3761 design->setCost(MOONLITE, 1);
3762 design->setCost(PLANETARIUM, 0.5);
3763 design->setCost(SOLARIUM, 0.5);
3764 design = new Design(invention_weapons[3], false);
3765 design->setCost(PLANETARIUM, 1.5);
3766 design->setCost(YERIDIUM, 0.5);
3767 // 4 - giant catapult (4.5)
3768 // wood, bone, slate, moonlite, bethlium, solarium, planetarium, aruldite, herbirite, valium, parasite, yeridium, moron, tedium, paladium, aquarium
3769 // ergo: ?
3770 // from tips: planetarium, herbirite, yeridium, aquarium, paladium
3771 design = new Design(invention_weapons[4], false);
3772 design->setCost(MOONLITE, 3.5);
3773 design->setCost(BETHLIUM, 1);
3774 design = new Design(invention_weapons[4], false);
3775 design->setCost(MOONLITE, 3);
3776 design->setCost(BETHLIUM, 1.5);
3777 design = new Design(invention_weapons[4], false);
3778 design->setCost(SLATE, 3.5);
3779 design->setCost(SOLARIUM, 1);
3780 design = new Design(invention_weapons[4], false);
3781 design->setCost(SLATE, 3.5);
3782 design->setCost(BETHLIUM, 1);
3783 design = new Design(invention_weapons[4], false);
3784 design->setCost(SLATE, 3);
3785 design->setCost(ARULDITE, 1.5);
3786 design = new Design(invention_weapons[4], false);
3787 design->setCost(MOONLITE, 3);
3788 design->setCost(SOLARIUM, 1.5);
3789 design = new Design(invention_weapons[4], false);
3790 design->setCost(BONE, 0.5);
3791 design->setCost(MOONLITE, 2.5);
3792 design->setCost(BETHLIUM, 1.5);
3793 design = new Design(invention_weapons[4], false);
3794 design->setCost(BONE, 0.5);
3795 design->setCost(PLANETARIUM, 3);
3796 design->setCost(SOLARIUM, 1);
3797 design = new Design(invention_weapons[4], false);
3798 design->setCost(PLANETARIUM, 3);
3799 design->setCost(ARULDITE, 1.5);
3800 design = new Design(invention_weapons[4], false);
3801 design->setCost(BETHLIUM, 1);
3802 design->setCost(YERIDIUM, 0.5);
3803 design->setCost(MORON, 3);
3804 design = new Design(invention_weapons[4], false);
3805 design->setCost(BETHLIUM, 1);
3806 design->setCost(YERIDIUM, 3.5);
3807 design = new Design(invention_weapons[4], false);
3808 design->setCost(SOLARIUM, 1);
3809 design->setCost(YERIDIUM, 3.5);
3810 design = new Design(invention_weapons[4], false);
3811 design->setCost(BETHLIUM, 1);
3812 design->setCost(YERIDIUM, 0.5);
3813 design->setCost(VALIUM, 3);
3814 design = new Design(invention_weapons[4], false);
3815 design->setCost(WOOD, 0.5);
3816 design->setCost(SLATE, 3);
3817 design->setCost(ARULDITE, 1);
3818 design = new Design(invention_weapons[4], false);
3819 design->setCost(WOOD, 1);
3820 design->setCost(SLATE, 3);
3821 design->setCost(HERBIRITE, 0.5);
3822 design = new Design(invention_weapons[4], false);
3823 design->setCost(WOOD, 3);
3824 design->setCost(SOLARIUM, 1);
3825 design->setCost(YERIDIUM, 0.5);
3826 design = new Design(invention_weapons[4], true);
3827 design->setCost(SLATE, 3);
3828 design->setCost(BETHLIUM, 1);
3829 design->setCost(YERIDIUM, 0.5);
3830 design = new Design(invention_weapons[4], false);
3831 design->setCost(SLATE, 3);
3832 design->setCost(ARULDITE, 1);
3833 design->setCost(AQUARIUM, 0.5);
3834 design = new Design(invention_weapons[4], false);
3835 design->setCost(SLATE, 3);
3836 design->setCost(ARULDITE, 1);
3837 design->setCost(ONION, 0.5);
3838 design = new Design(invention_weapons[4], false);
3839 design->setCost(MOONLITE, 3);
3840 design->setCost(ARULDITE, 1);
3841 design->setCost(MARMITE, 0.5);
3842 design = new Design(invention_weapons[4], false);
3843 design->setCost(MOONLITE, 3);
3844 design->setCost(ARULDITE, 1);
3845 design->setCost(AQUARIUM, 0.5);
3846 design = new Design(invention_weapons[4], false);
3847 design->setCost(MOONLITE, 3);
3848 design->setCost(YERIDIUM, 0.5);
3849 design->setCost(AQUARIUM, 1);
3850 design = new Design(invention_weapons[4], false);
3851 design->setCost(MOONLITE, 3);
3852 design->setCost(YERIDIUM, 0.5);
3853 design->setCost(TEDIUM, 1);
3854 design = new Design(invention_weapons[4], false);
3855 design->setCost(SLATE, 3);
3856 design->setCost(YERIDIUM, 0.5);
3857 design->setCost(PARASITE, 1);
3858 design = new Design(invention_weapons[4], false);
3859 design->setCost(BETHLIUM, 1);
3860 design->setCost(YERIDIUM, 0.5);
3861 design->setCost(PARASITE, 3);
3862 design = new Design(invention_weapons[4], false);
3863 design->setCost(SLATE, 4);
3864 design->setCost(HERBIRITE, 0.5);
3865 design = new Design(invention_weapons[4], false);
3866 design->setCost(SLATE, 3);
3867 design->setCost(HERBIRITE, 1.5);
3868 design = new Design(invention_weapons[4], false);
3869 design->setCost(SOLARIUM, 4);
3870 design->setCost(HERBIRITE, 0.5);
3871 design = new Design(invention_weapons[4], false);
3872 design->setCost(ARULDITE, 1);
3873 design->setCost(HERBIRITE, 3.5);
3874 design = new Design(invention_weapons[4], false);
3875 design->setCost(ARULDITE, 4);
3876 design->setCost(HERBIRITE, 0.5);
3877 design = new Design(invention_weapons[4], false);
3878 design->setCost(PLANETARIUM, 4);
3879 design->setCost(HERBIRITE, 0.5);
3880 design = new Design(invention_weapons[4], false);
3881 design->setCost(PLANETARIUM, 3);
3882 design->setCost(HERBIRITE, 1.5);
3883 design = new Design(invention_weapons[4], false);
3884 design->setCost(PLANETARIUM, 3.5);
3885 design->setCost(SOLARIUM, 1);
3886 design = new Design(invention_weapons[4], false);
3887 design->setCost(PLANETARIUM, 3);
3888 design->setCost(SOLARIUM, 1);
3889 design->setCost(ARULDITE, 0.5);
3890 design = new Design(invention_weapons[4], false);
3891 design->setCost(MOONLITE, 3);
3892 design->setCost(SOLARIUM, 1);
3893 design->setCost(ARULDITE, 0.5);
3894 design = new Design(invention_weapons[4], false);
3895 design->setCost(BETHLIUM, 4);
3896 design->setCost(HERBIRITE, 0.5);
3897 design = new Design(invention_weapons[4], false);
3898 design->setCost(MOONLITE, 4);
3899 design->setCost(HERBIRITE, 0.5);
3900 design = new Design(invention_weapons[4], false);
3901 design->setCost(SLATE, 3);
3902 design->setCost(YERIDIUM, 1.5);
3903 design = new Design(invention_weapons[4], false);
3904 design->setCost(SLATE, 4);
3905 design->setCost(YERIDIUM, 0.5);
3906 design = new Design(invention_weapons[4], false);
3907 design->setCost(MOONLITE, 4);
3908 design->setCost(YERIDIUM, 0.5);
3909 design = new Design(invention_weapons[4], false);
3910 design->setCost(ARULDITE, 1);
3911 design->setCost(YERIDIUM, 3.5);
3912 design = new Design(invention_weapons[4], false);
3913 design->setCost(BETHLIUM, 1);
3914 design->setCost(YERIDIUM, 0.5);
3915 design->setCost(TEDIUM, 3);
3916 design = new Design(invention_weapons[4], false);
3917 design->setCost(MOONLITE, 3);
3918 design->setCost(YERIDIUM, 0.5);
3919 design->setCost(PALADIUM, 1);
3920 design = new Design(invention_weapons[4], false);
3921 design->setCost(MOONLITE, 3);
3922 design->setCost(PLANETARIUM, 0.5);
3923 design->setCost(SOLARIUM, 1);
3924 design = new Design(invention_weapons[4], true);
3925 design->setCost(MOONLITE, 3);
3926 design->setCost(BETHLIUM, 1);
3927 design->setCost(YERIDIUM, 0.5);
3928 design = new Design(invention_weapons[4], false);
3929 design->setCost(SOLARIUM, 3);
3930 design->setCost(ARULDITE, 1);
3931 design->setCost(HERBIRITE, 0.5);
3932 // 5 - cannon (6)
3933 // slate, bone, wood, bethlium, solarium, onion, tedium, aruldite, marmite, valium, planetarium, herbirite, aquarium, yeridium, paladium, moron
3934 // ergo: bethlium, onion, aruldite
3935 // from tips: bethlium, solarium, aruldite
3936 design = new Design(invention_weapons[5], false);
3937 design->setCost(BONE, 1);
3938 design->setCost(BETHLIUM, 5);
3939 design = new Design(invention_weapons[5], false);
3940 design->setCost(BONE, 5);
3941 design->setCost(TEDIUM, 1);
3942 design = new Design(invention_weapons[5], false);
3943 design->setCost(PARASITE, 5);
3944 design->setCost(TEDIUM, 1);
3945 design = new Design(invention_weapons[5], false);
3946 design->setCost(WOOD, 1);
3947 design->setCost(SOLARIUM, 5);
3948 design = new Design(invention_weapons[5], false);
3949 design->setCost(WOOD, 5);
3950 design->setCost(SOLARIUM, 1);
3951 design = new Design(invention_weapons[5], true);
3952 design->setCost(BETHLIUM, 5);
3953 design->setCost(ONION, 1);
3954 design = new Design(invention_weapons[5], true);
3955 design->setCost(BONE, 5);
3956 design->setCost(ONION, 1);
3957 design = new Design(invention_weapons[5], false);
3958 design->setCost(ROCK, 5);
3959 design->setCost(TEDIUM, 1);
3960 design = new Design(invention_weapons[5], false);
3961 design->setCost(ROCK, 1);
3962 design->setCost(BETHLIUM, 5);
3963 design = new Design(invention_weapons[5], false);
3964 design->setCost(ROCK, 1);
3965 design->setCost(ARULDITE, 5);
3966 design = new Design(invention_weapons[5], false);
3967 design->setCost(PLANETARIUM, 4.5);
3968 design->setCost(TEDIUM, 1.5);
3969 design = new Design(invention_weapons[5], true);
3970 design->setCost(ARULDITE, 4);
3971 design->setCost(TEDIUM, 2);
3972 design = new Design(invention_weapons[5], true);
3973 design->setCost(ARULDITE, 5);
3974 design->setCost(ONION, 1);
3975 design = new Design(invention_weapons[5], false);
3976 design->setCost(SOLARIUM, 5);
3977 design->setCost(MORON, 1);
3978 design = new Design(invention_weapons[5], false);
3979 design->setCost(ARULDITE, 5);
3980 design->setCost(HERBIRITE, 1);
3981 design = new Design(invention_weapons[5], false);
3982 design->setCost(ARULDITE, 3);
3983 design->setCost(PALADIUM, 3);
3984 design = new Design(invention_weapons[5], false);
3985 design->setCost(ARULDITE, 5);
3986 design->setCost(MORON, 1);
3987 design = new Design(invention_weapons[5], false);
3988 design->setCost(WOOD, 1);
3989 design->setCost(ARULDITE, 5);
3990 design = new Design(invention_weapons[5], true);
3991 design->setCost(SOLARIUM, 5);
3992 design->setCost(ONION, 1);
3993 design = new Design(invention_weapons[5], false);
3994 design->setCost(PLANETARIUM, 5);
3995 design->setCost(ONION, 1);
3996 design = new Design(invention_weapons[5], false);
3997 design->setCost(HERBIRITE, 3);
3998 design->setCost(ONION, 3);
3999 design = new Design(invention_weapons[5], false);
4000 design->setCost(VALIUM, 5);
4001 design->setCost(ONION, 1);
4002 design = new Design(invention_weapons[5], true);
4003 design->setCost(ONION, 6);
4004 design = new Design(invention_weapons[5], false);
4005 design->setCost(TEDIUM, 6);
4006 design = new Design(invention_weapons[5], false);
4007 design->setCost(SOLARIUM, 6);
4008 design = new Design(invention_weapons[5], false);
4009 design->setCost(ARULDITE, 6);
4010 design = new Design(invention_weapons[5], false);
4011 design->setCost(BETHLIUM, 5);
4012 design->setCost(AQUARIUM, 1);
4013 design = new Design(invention_weapons[5], false);
4014 design->setCost(SOLARIUM, 5);
4015 design->setCost(AQUARIUM, 1);
4016 design = new Design(invention_weapons[5], false);
4017 design->setCost(ARULDITE, 5);
4018 design->setCost(AQUARIUM, 1);
4019 design = new Design(invention_weapons[5], false);
4020 design->setCost(AQUARIUM, 5);
4021 design->setCost(ONION, 1);
4022 design = new Design(invention_weapons[5], false);
4023 design->setCost(BETHLIUM, 5);
4024 design->setCost(MARMITE, 1);
4025 design = new Design(invention_weapons[5], false);
4026 design->setCost(ONION, 1);
4027 design->setCost(MARMITE, 5);
4028 design = new Design(invention_weapons[5], false);
4029 design->setCost(SOLARIUM, 5);
4030 design->setCost(MARMITE, 1);
4031 design = new Design(invention_weapons[5], false);
4032 design->setCost(ARULDITE, 5);
4033 design->setCost(MARMITE, 1);
4034 design = new Design(invention_weapons[5], false);
4035 design->setCost(BETHLIUM, 6);
4036 design = new Design(invention_weapons[5], false);
4037 design->setCost(BETHLIUM, 5);
4038 design->setCost(YERIDIUM, 1);
4039 design = new Design(invention_weapons[5], false);
4040 design->setCost(YERIDIUM, 5);
4041 design->setCost(TEDIUM, 1);
4042 design = new Design(invention_weapons[5], false);
4043 design->setCost(SLATE, 1);
4044 design->setCost(BETHLIUM, 5);
4045 design = new Design(invention_weapons[5], false);
4046 design->setCost(SLATE, 5);
4047 design->setCost(TEDIUM, 1);
4048 design = new Design(invention_weapons[5], false);
4049 design->setCost(PALADIUM, 5);
4050 design->setCost(TEDIUM, 1);
4051 design = new Design(invention_weapons[5], false);
4052 design->setCost(PALADIUM, 5);
4053 design->setCost(ONION, 1);
4054 design = new Design(invention_weapons[5], true);
4055 design->setCost(BETHLIUM, 5);
4056 design->setCost(TEDIUM, 1);
4057 design = new Design(invention_weapons[5], false);
4058 design->setCost(AQUARIUM, 5);
4059 design->setCost(TEDIUM, 1);
4060 design = new Design(invention_weapons[5], false);
4061 design->setCost(ONION, 5);
4062 design->setCost(TEDIUM, 1);
4063 design = new Design(invention_weapons[5], false);
4064 design->setCost(TEDIUM, 1);
4065 design->setCost(MARMITE, 5);
4066 // 6 - biplane (6)
4067 // slate, wood, bethlium, solarium, yeridium, moron, onion, valium, aruldite, paladium, planetarium, tedium, aquarium
4068 // ergo: ?
4069 // from tips: bethlium, solarium, aruldite, onion, tedium, moron
4070 design = new Design(invention_weapons[6], false);
4071 design->setCost(SLATE, 4);
4072 design->setCost(ARULDITE, 1.5);
4073 design->setCost(ONION, 0.5);
4074 design = new Design(invention_weapons[6], false);
4075 design->setCost(WOOD, 4);
4076 design->setCost(ARULDITE, 1.5);
4077 design->setCost(TEDIUM, 0.5);
4078 design = new Design(invention_weapons[6], false);
4079 design->setCost(ROCK, 4);
4080 design->setCost(ARULDITE, 1.5);
4081 design->setCost(TEDIUM, 0.5);
4082 design = new Design(invention_weapons[6], false);
4083 design->setCost(WOOD, 4);
4084 design->setCost(ARULDITE, 1.5);
4085 design->setCost(ONION, 0.5);
4086 design = new Design(invention_weapons[6], false);
4087 design->setCost(SOLARIUM, 1.5);
4088 design->setCost(MORON, 4.5);
4089 design = new Design(invention_weapons[6], true);
4090 design->setCost(BETHLIUM, 1.5);
4091 design->setCost(ONION, 0.5);
4092 design->setCost(MORON, 4);
4093 design = new Design(invention_weapons[6], false);
4094 design->setCost(BETHLIUM, 2);
4095 design->setCost(AQUARIUM, 3.5);
4096 design->setCost(TEDIUM, 0.5);
4097 design = new Design(invention_weapons[6], false);
4098 design->setCost(BETHLIUM, 1.5);
4099 design->setCost(YERIDIUM, 0.5);
4100 design->setCost(MORON, 4);
4101 design = new Design(invention_weapons[6], false);
4102 design->setCost(BETHLIUM, 1.5);
4103 design->setCost(VALIUM, 4);
4104 design->setCost(ONION, 0.5);
4105 design = new Design(invention_weapons[6], false);
4106 design->setCost(SOLARIUM, 1.5);
4107 design->setCost(VALIUM, 4);
4108 design->setCost(ONION, 0.5);
4109 design = new Design(invention_weapons[6], false);
4110 design->setCost(ARULDITE, 1.5);
4111 design->setCost(PALADIUM, 0.5);
4112 design->setCost(MORON, 4);
4113 design = new Design(invention_weapons[6], false);
4114 design->setCost(PLANETARIUM, 4);
4115 design->setCost(SOLARIUM, 1);
4116 design->setCost(TEDIUM, 1);
4117 design = new Design(invention_weapons[6], false);
4118 design->setCost(PLANETARIUM, 4);
4119 design->setCost(ARULDITE, 1.5);
4120 design->setCost(TEDIUM, 0.5);
4121 design = new Design(invention_weapons[6], false);
4122 design->setCost(PLANETARIUM, 4);
4123 design->setCost(ARULDITE, 1.5);
4124 design->setCost(ONION, 0.5);
4125 design = new Design(invention_weapons[6], false);
4126 design->setCost(ARULDITE, 1.5);
4127 design->setCost(MORON, 4);
4128 design->setCost(MARMITE, 0.5);
4129 design = new Design(invention_weapons[6], false);
4130 design->setCost(ARULDITE, 1.5);
4131 design->setCost(TEDIUM, 0.5);
4132 design->setCost(MARMITE, 4);
4133 design = new Design(invention_weapons[6], true);
4134 design->setCost(ARULDITE, 1.5);
4135 design->setCost(TEDIUM, 0.5);
4136 design->setCost(MORON, 4);
4137 design = new Design(invention_weapons[6], false);
4138 design->setCost(ARULDITE, 1.5);
4139 design->setCost(HERBIRITE, 0.5);
4140 design->setCost(MORON, 4);
4141 design = new Design(invention_weapons[6], false);
4142 design->setCost(AQUARIUM, 1.5);
4143 design->setCost(ONION, 0.5);
4144 design->setCost(MORON, 4);
4145 design = new Design(invention_weapons[6], false);
4146 design->setCost(PALADIUM, 1.5);
4147 design->setCost(ONION, 0.5);
4148 design->setCost(MORON, 4);
4149 design = new Design(invention_weapons[6], false);
4150 design->setCost(BETHLIUM, 1.5);
4151 design->setCost(TEDIUM, 4);
4152 design->setCost(YERIDIUM, 0.5);
4153 design = new Design(invention_weapons[6], false);
4154 design->setCost(PLANETARIUM, 4);
4155 design->setCost(BETHLIUM, 1.5);
4156 design->setCost(ONION, 0.5);
4157 design = new Design(invention_weapons[6], false);
4158 design->setCost(BETHLIUM, 5.5);
4159 design->setCost(TEDIUM, 0.5);
4160 design = new Design(invention_weapons[6], false);
4161 design->setCost(TEDIUM, 0.5);
4162 design->setCost(MORON, 5.5);
4163 design = new Design(invention_weapons[6], false);
4164 design->setCost(TEDIUM, 2);
4165 design->setCost(MORON, 4);
4166 design = new Design(invention_weapons[6], false);
4167 design->setCost(SOLARIUM, 1.5);
4168 design->setCost(MORON, 4);
4169 design->setCost(MARMITE, 0.5);
4170 design = new Design(invention_weapons[6], false);
4171 design->setCost(TEDIUM, 0.5);
4172 design->setCost(MORON, 4);
4173 design->setCost(ALIEN, 1.5);
4174 design = new Design(invention_weapons[6], false);
4175 design->setCost(ARULDITE, 1.5);
4176 design->setCost(ONION, 4.5);
4177 design = new Design(invention_weapons[6], false);
4178 design->setCost(ARULDITE, 5.5);
4179 design->setCost(ONION, 0.5);
4180 design = new Design(invention_weapons[6], false);
4181 design->setCost(SOLARIUM, 5.5);
4182 design->setCost(TEDIUM, 0.5);
4183 design = new Design(invention_weapons[6], false);
4184 design->setCost(SOLARIUM, 1.5);
4185 design->setCost(TEDIUM, 4.5);
4186 design = new Design(invention_weapons[6], false);
4187 design->setCost(ARULDITE, 5.5);
4188 design->setCost(TEDIUM, 0.5);
4189 design = new Design(invention_weapons[6], false);
4190 design->setCost(ARULDITE, 1.5);
4191 design->setCost(TEDIUM, 4.5);
4192 design = new Design(invention_weapons[6], false);
4193 design->setCost(ARULDITE, 2.5);
4194 design->setCost(MORON, 3.5);
4195 design = new Design(invention_weapons[6], false);
4196 design->setCost(ONION, 2);
4197 design->setCost(MORON, 4);
4198 design = new Design(invention_weapons[6], false);
4199 design->setCost(BETHLIUM, 5.5);
4200 design->setCost(ONION, 0.5);
4201 // 7 - jet plane (7.5)
4202 // wood, slate, planetarium, onion, aquarium, tedium, marmite, paladium, valium, aruldite, moonlite
4203 // ergo: ?
4204 // from tips: slate, moonlite, planetarium, aquarium, paladium, onion, tedium
4205 design = new Design(invention_weapons[7], false);
4206 design->setCost(WOOD, 0.5);
4207 design->setCost(PALADIUM, 1.5);
4208 design->setCost(TEDIUM, 5.5);
4209 design = new Design(invention_weapons[7], false);
4210 design->setCost(BETHLIUM, 0.5);
4211 design->setCost(PALADIUM, 1.5);
4212 design->setCost(ONION, 5.5);
4213 design = new Design(invention_weapons[7], false);
4214 design->setCost(SLATE, 6);
4215 design->setCost(AQUARIUM, 1.5);
4216 design = new Design(invention_weapons[7], true);
4217 design->setCost(SLATE, 0.5);
4218 design->setCost(AQUARIUM, 1.5);
4219 design->setCost(TEDIUM, 5.5);
4220 design = new Design(invention_weapons[7], false);
4221 design->setCost(SLATE, 0.5);
4222 design->setCost(PARASITE, 1.5);
4223 design->setCost(TEDIUM, 5.5);
4224 design = new Design(invention_weapons[7], true);
4225 design->setCost(MOONLITE, 0.5);
4226 design->setCost(AQUARIUM, 2);
4227 design->setCost(TEDIUM, 5);
4228 design = new Design(invention_weapons[7], false);
4229 design->setCost(MOONLITE, 1);
4230 design->setCost(YERIDIUM, 1.5);
4231 design->setCost(TEDIUM, 5);
4232 design = new Design(invention_weapons[7], false);
4233 design->setCost(SLATE, 0.5);
4234 design->setCost(YERIDIUM, 5.5);
4235 design->setCost(PALADIUM, 1.5);
4236 design = new Design(invention_weapons[7], false);
4237 design->setCost(ARULDITE, 0.5);
4238 design->setCost(AQUARIUM, 1.5);
4239 design->setCost(TEDIUM, 5.5);
4240 design = new Design(invention_weapons[7], false);
4241 design->setCost(PLANETARIUM, 1);
4242 design->setCost(ONION, 6.5);
4243 design = new Design(invention_weapons[7], false);
4244 design->setCost(PLANETARIUM, 2);
4245 design->setCost(ONION, 5.5);
4246 design = new Design(invention_weapons[7], false);
4247 design->setCost(AQUARIUM, 1.5);
4248 design->setCost(TEDIUM, 5.5);
4249 design->setCost(MARMITE, 0.5);
4250 design = new Design(invention_weapons[7], false);
4251 design->setCost(SLATE, 0.5);
4252 design->setCost(ONION, 7);
4253 design = new Design(invention_weapons[7], false);
4254 design->setCost(SLATE, 2);
4255 design->setCost(ONION, 5.5);
4256 design = new Design(invention_weapons[7], false);
4257 design->setCost(SLATE, 0.5);
4258 design->setCost(PALADIUM, 7);
4259 design = new Design(invention_weapons[7], false);
4260 design->setCost(SLATE, 6);
4261 design->setCost(PALADIUM, 1.5);
4262 design = new Design(invention_weapons[7], false);
4263 design->setCost(SLATE, 2);
4264 design->setCost(TEDIUM, 5.5);
4265 design = new Design(invention_weapons[7], false);
4266 design->setCost(MOONLITE, 2);
4267 design->setCost(TEDIUM, 5.5);
4268 design = new Design(invention_weapons[7], false);
4269 design->setCost(MOONLITE, 6);
4270 design->setCost(PALADIUM, 1.5);
4271 design = new Design(invention_weapons[7], false);
4272 design->setCost(PALADIUM, 2);
4273 design->setCost(TEDIUM, 5.5);
4274 design = new Design(invention_weapons[7], false);
4275 design->setCost(ONION, 2);
4276 design->setCost(MARMITE, 5.5);
4277 design = new Design(invention_weapons[7], false);
4278 design->setCost(PLANETARIUM, 0.5);
4279 design->setCost(TEDIUM, 7);
4280 design = new Design(invention_weapons[7], false);
4281 design->setCost(PLANETARIUM, 0.5);
4282 design->setCost(PALADIUM, 7);
4283 design = new Design(invention_weapons[7], false);
4284 design->setCost(PLANETARIUM, 0.5);
4285 design->setCost(AQUARIUM, 7);
4286 design = new Design(invention_weapons[7], false);
4287 design->setCost(PLANETARIUM, 6);
4288 design->setCost(AQUARIUM, 1.5);
4289 design = new Design(invention_weapons[7], false);
4290 design->setCost(PALADIUM, 1.5);
4291 design->setCost(TEDIUM, 6);
4292 design = new Design(invention_weapons[7], false);
4293 design->setCost(PALADIUM, 1.5);
4294 design->setCost(ONION, 6);
4295 design = new Design(invention_weapons[7], false);
4296 design->setCost(PALADIUM, 2);
4297 design->setCost(ONION, 5.5);
4298 design = new Design(invention_weapons[7], true);
4299 design->setCost(PLANETARIUM, 0.5);
4300 design->setCost(PALADIUM, 1.5);
4301 design->setCost(TEDIUM, 5.5);
4302 design = new Design(invention_weapons[7], false);
4303 design->setCost(PLANETARIUM, 0.5);
4304 design->setCost(ARULDITE, 1.5);
4305 design->setCost(TEDIUM, 5.5);
4306 design = new Design(invention_weapons[7], false);
4307 design->setCost(PLANETARIUM, 0.5);
4308 design->setCost(AQUARIUM, 1.5);
4309 design->setCost(MARMITE, 5.5);
4310 design = new Design(invention_weapons[7], false);
4311 design->setCost(MOONLITE, 2);
4312 design->setCost(ONION, 5.5);
4313 design = new Design(invention_weapons[7], false);
4314 design->setCost(AQUARIUM, 2);
4315 design->setCost(ONION, 5.5);
4316 design = new Design(invention_weapons[7], false);
4317 design->setCost(AQUARIUM, 1.5);
4318 design->setCost(ONION, 6);
4319 design = new Design(invention_weapons[7], false);
4320 design->setCost(AQUARIUM, 1.5);
4321 design->setCost(TEDIUM, 6);
4322 design = new Design(invention_weapons[7], false);
4323 design->setCost(AQUARIUM, 2);
4324 design->setCost(TEDIUM, 5.5);
4325 design = new Design(invention_weapons[7], false);
4326 design->setCost(ROCK, 1.5);
4327 design->setCost(SLATE, 0.5);
4328 design->setCost(TEDIUM, 5.5);
4329 design = new Design(invention_weapons[7], false);
4330 design->setCost(SLATE, 0.5);
4331 design->setCost(ARULDITE, 1.5);
4332 design->setCost(ONION, 5.5);
4333 design = new Design(invention_weapons[7], false);
4334 design->setCost(VALIUM, 0.5);
4335 design->setCost(AQUARIUM, 1.5);
4336 design->setCost(ONION, 5.5);
4337 design = new Design(invention_weapons[7], false);
4338 design->setCost(PALADIUM, 1.5);
4339 design->setCost(ONION, 5.5);
4340 design->setCost(MORON, 0.5);
4341 design = new Design(invention_weapons[7], false);
4342 design->setCost(PALADIUM, 1.5);
4343 design->setCost(TEDIUM, 5.5);
4344 design->setCost(MORON, 0.5);
4345 design = new Design(invention_weapons[7], false);
4346 design->setCost(PALADIUM, 1.5);
4347 design->setCost(ONION, 5.5);
4348 design->setCost(TEDIUM, 0.5);
4349 // 8 - nuke (7.5)
4350 // slate, wood, aruldite, paladium, moron, bethlium, marmite, aquarium, tedium, solarium, moonlite, planetarium
4351 // ergo: ?
4352 // from tips: bethlium, solarium, aruldite, aquarium, paladium, marmite
4353 design = new Design(invention_weapons[8], false);
4354 design->setCost(WOOD, 4);
4355 design->setCost(ARULDITE, 0.5);
4356 design->setCost(PALADIUM, 3);
4357 design = new Design(invention_weapons[8], false);
4358 design->setCost(WOOD, 3);
4359 design->setCost(ARULDITE, 1.5);
4360 design->setCost(MARMITE, 3);
4361 design = new Design(invention_weapons[8], false);
4362 design->setCost(WOOD, 3);
4363 design->setCost(BETHLIUM, 0.5);
4364 design->setCost(MARMITE, 4);
4365 design = new Design(invention_weapons[8], false);
4366 design->setCost(WOOD, 0.5);
4367 design->setCost(PALADIUM, 3);
4368 design->setCost(MORON, 4);
4369 design = new Design(invention_weapons[8], false);
4370 design->setCost(ROCK, 0.5);
4371 design->setCost(PALADIUM, 3);
4372 design->setCost(MARMITE, 4);
4373 design = new Design(invention_weapons[8], false);
4374 design->setCost(ROCK, 1.5);
4375 design->setCost(AQUARIUM, 2);
4376 design->setCost(MARMITE, 4);
4377 design = new Design(invention_weapons[8], false);
4378 design->setCost(SLATE, 1.5);
4379 design->setCost(AQUARIUM, 1.5);
4380 design->setCost(MARMITE, 4.5);
4381 design = new Design(invention_weapons[8], false);
4382 design->setCost(PLANETARIUM, 1.5);
4383 design->setCost(AQUARIUM, 2);
4384 design->setCost(MARMITE, 4);
4385 design = new Design(invention_weapons[8], false);
4386 design->setCost(AQUARIUM, 3);
4387 design->setCost(MARMITE, 4.5);
4388 design = new Design(invention_weapons[8], false);
4389 design->setCost(BETHLIUM, 3.5);
4390 design->setCost(MARMITE, 4);
4391 design = new Design(invention_weapons[8], false);
4392 design->setCost(SOLARIUM, 1.5);
4393 design->setCost(PALADIUM, 6);
4394 design = new Design(invention_weapons[8], false);
4395 design->setCost(SOLARIUM, 2.5);
4396 design->setCost(MARMITE, 5);
4397 design = new Design(invention_weapons[8], false);
4398 design->setCost(SOLARIUM, 3.5);
4399 design->setCost(MARMITE, 4);
4400 design = new Design(invention_weapons[8], false);
4401 design->setCost(MOONLITE, 2.5);
4402 design->setCost(SOLARIUM, 1);
4403 design->setCost(MARMITE, 4);
4404 design = new Design(invention_weapons[8], false);
4405 design->setCost(BETHLIUM, 0.5);
4406 design->setCost(SOLARIUM, 2.5);
4407 design->setCost(MARMITE, 4.5);
4408 design = new Design(invention_weapons[8], false);
4409 design->setCost(AQUARIUM, 2);
4410 design->setCost(TEDIUM, 1.5);
4411 design->setCost(MARMITE, 4);
4412 design = new Design(invention_weapons[8], false);
4413 design->setCost(ARULDITE, 2.5);
4414 design->setCost(MARMITE, 5);
4415 design = new Design(invention_weapons[8], false);
4416 design->setCost(ARULDITE, 1.5);
4417 design->setCost(YERIDIUM, 3);
4418 design->setCost(MARMITE, 3);
4419 design = new Design(invention_weapons[8], false);
4420 design->setCost(ARULDITE, 3.5);
4421 design->setCost(MARMITE, 4);
4422 design = new Design(invention_weapons[8], false);
4423 design->setCost(ARULDITE, 2.5);
4424 design->setCost(AQUARIUM, 5);
4425 design = new Design(invention_weapons[8], false);
4426 design->setCost(ARULDITE, 3.5);
4427 design->setCost(AQUARIUM, 4);
4428 design = new Design(invention_weapons[8], false);
4429 design->setCost(ARULDITE, 1.5);
4430 design->setCost(TEDIUM, 2.5);
4431 design->setCost(MARMITE, 3.5);
4432 design = new Design(invention_weapons[8], false);
4433 design->setCost(PALADIUM, 3);
4434 design->setCost(MARMITE, 4.5);
4435 design = new Design(invention_weapons[8], false);
4436 design->setCost(PALADIUM, 2.5);
4437 design->setCost(MARMITE, 5);
4438 design = new Design(invention_weapons[8], false);
4439 design->setCost(ARULDITE, 4.5);
4440 design->setCost(PALADIUM, 3);
4441 design = new Design(invention_weapons[8], false);
4442 design->setCost(ARULDITE, 1.5);
4443 design->setCost(PALADIUM, 6);
4444 design = new Design(invention_weapons[8], false);
4445 design->setCost(BETHLIUM, 1.5);
4446 design->setCost(PALADIUM, 6);
4447 design = new Design(invention_weapons[8], false);
4448 design->setCost(BETHLIUM, 1.5);
4449 design->setCost(AQUARIUM, 6);
4450 design = new Design(invention_weapons[8], false);
4451 design->setCost(BETHLIUM, 4.5);
4452 design->setCost(AQUARIUM, 3);
4453 design = new Design(invention_weapons[8], true);
4454 design->setCost(BETHLIUM, 0.5);
4455 design->setCost(AQUARIUM, 2.5);
4456 design->setCost(MARMITE, 4.5);
4457 design = new Design(invention_weapons[8], true);
4458 design->setCost(ARULDITE, 1.5);
4459 design->setCost(AQUARIUM, 2);
4460 design->setCost(MARMITE, 4);
4461 design = new Design(invention_weapons[8], false);
4462 design->setCost(ARULDITE, 1.5);
4463 design->setCost(PALADIUM, 2.5);
4464 design->setCost(TEDIUM, 3.5);
4465 design = new Design(invention_weapons[8], true);
4466 design->setCost(BETHLIUM, 1);
4467 design->setCost(YERIDIUM, 3);
4468 design->setCost(MARMITE, 3.5);
4469 design = new Design(invention_weapons[8], true);
4470 design->setCost(SOLARIUM, 1.5);
4471 design->setCost(AQUARIUM, 3);
4472 design->setCost(MARMITE, 3);
4473 design = new Design(invention_weapons[8], true);
4474 design->setCost(SOLARIUM, 1.5);
4475 design->setCost(PALADIUM, 2);
4476 design->setCost(MARMITE, 4);
4477 design = new Design(invention_weapons[8], false);
4478 design->setCost(SOLARIUM, 1.5);
4479 design->setCost(VALIUM, 2);
4480 design->setCost(MARMITE, 4);
4481 design = new Design(invention_weapons[8], false);
4482 design->setCost(VALIUM, 1.5);
4483 design->setCost(PALADIUM, 2.5);
4484 design->setCost(MARMITE, 3.5);
4485 design = new Design(invention_weapons[8], false);
4486 design->setCost(BETHLIUM, 1.5);
4487 design->setCost(PALADIUM, 2);
4488 design->setCost(MORON, 4);
4489 design = new Design(invention_weapons[8], false);
4490 design->setCost(BETHLIUM, 1.5);
4491 design->setCost(MARMITE, 3);
4492 design->setCost(ALIEN, 3);
4493 // 9 - saucer (8)
4494 // slate, aquarium, moron, alien, marmite, paladium
4495 // ergo: ?
4496 // from tips: moron, marmite, alien
4497 design = new Design(invention_weapons[9], false);
4498 design->setCost(SLATE, 2.5);
4499 design->setCost(MARMITE, 0.5);
4500 design->setCost(ALIEN, 5);
4501 design = new Design(invention_weapons[9], false);
4502 design->setCost(SOLARIUM, 2.5);
4503 design->setCost(MARMITE, 0.5);
4504 design->setCost(ALIEN, 5);
4505 design = new Design(invention_weapons[9], true);
4506 design->setCost(MORON, 2.5);
4507 design->setCost(MARMITE, 0.5);
4508 design->setCost(ALIEN, 5);
4509 design = new Design(invention_weapons[9], false);
4510 design->setCost(MORON, 7.5);
4511 design->setCost(MARMITE, 0.5);
4512 design = new Design(invention_weapons[9], false);
4513 design->setCost(MORON, 2);
4514 design->setCost(ALIEN, 6);
4515 design = new Design(invention_weapons[9], true);
4516 design->setCost(AQUARIUM, 2.5);
4517 design->setCost(MARMITE, 0.5);
4518 design->setCost(ALIEN, 5);
4519 design = new Design(invention_weapons[9], false);
4520 design->setCost(PALADIUM, 2.5);
4521 design->setCost(MARMITE, 0.5);
4522 design->setCost(ALIEN, 5);
4523 design = new Design(invention_weapons[9], false);
4524 design->setCost(PALADIUM, 5);
4525 design->setCost(MORON, 2.5);
4526 design->setCost(MARMITE, 0.5);
4527 design = new Design(invention_weapons[9], false);
4528 design->setCost(MARMITE, 1);
4529 design->setCost(ALIEN, 7);
4530 design = new Design(invention_weapons[9], false);
4531 design->setCost(MARMITE, 4);
4532 design->setCost(ALIEN, 4);
4533
4534 // Defences
4535 // 0 - stick (1.5)
4536 // wood, bone, rock, slate, planetarium, herbirite, valium, bethlium, parasite, solarium, aquarium
4537 // ergo: slate, planetarium, moonlite
4538 // from tips: slate, moonlite, planetarium
4539 design = new Design(invention_defences[0], false);
4540 design->setCost(WOOD, 1.5);
4541 design = new Design(invention_defences[0], false);
4542 design->setCost(BONE, 1.5);
4543 design = new Design(invention_defences[0], false);
4544 design->setCost(ROCK, 1.5);
4545 design = new Design(invention_defences[0], true);
4546 design->setCost(SLATE, 1.5);
4547 design = new Design(invention_defences[0], false);
4548 design->setCost(SOLARIUM, 1.5);
4549 design = new Design(invention_defences[0], false);
4550 design->setCost(AQUARIUM, 1.5);
4551 design = new Design(invention_defences[0], true);
4552 design->setCost(PLANETARIUM, 1.5);
4553 design = new Design(invention_defences[0], true);
4554 design->setCost(MOONLITE, 1.5);
4555 design = new Design(invention_defences[0], false);
4556 design->setCost(HERBIRITE, 1.5);
4557 design = new Design(invention_defences[0], false);
4558 design->setCost(VALIUM, 1.5);
4559 design = new Design(invention_defences[0], false);
4560 design->setCost(BETHLIUM, 1.5);
4561 design = new Design(invention_defences[0], false);
4562 design->setCost(PARASITE, 1.5);
4563 // 1 - spear (1.5)
4564 // wood, rock, bone, slate, moonlite, planetarium, valium, herbirite, parasite, onion, bethlium, solarium, aquarium, aruldite
4565 // ergo: rock, wood, rock+slate, moonlite, bone+planetarium, wood+planetarium
4566 // from tips: rock, wood, bones, slate, moonlite, planetarium
4567 design = new Design(invention_defences[1], false);
4568 design->setCost(WOOD, 1.5);
4569 design = new Design(invention_defences[1], false);
4570 design->setCost(ROCK, 1.5);
4571 design = new Design(invention_defences[1], true);
4572 design->setCost(BONE, 0.5);
4573 design->setCost(MOONLITE, 1);
4574 design = new Design(invention_defences[1], true);
4575 design->setCost(WOOD, 0.5);
4576 design->setCost(MOONLITE, 1);
4577 design = new Design(invention_defences[1], true);
4578 design->setCost(ROCK, 0.5);
4579 design->setCost(MOONLITE, 1);
4580 design = new Design(invention_defences[1], false);
4581 design->setCost(SLATE, 1);
4582 design->setCost(MOONLITE, 0.5);
4583 design = new Design(invention_defences[1], false);
4584 design->setCost(BONE, 0.5);
4585 design->setCost(SOLARIUM, 1);
4586 design = new Design(invention_defences[1], false);
4587 design->setCost(WOOD, 0.5);
4588 design->setCost(SOLARIUM, 1);
4589 design = new Design(invention_defences[1], false);
4590 design->setCost(WOOD, 0.5);
4591 design->setCost(AQUARIUM, 1);
4592 design = new Design(invention_defences[1], false);
4593 design->setCost(BONE, 1.5);
4594 design = new Design(invention_defences[1], false);
4595 design->setCost(SLATE, 1.5);
4596 design = new Design(invention_defences[1], false);
4597 design->setCost(ROCK, 0.5);
4598 design->setCost(BONE, 1);
4599 design = new Design(invention_defences[1], false);
4600 design->setCost(WOOD, 1.0);
4601 design->setCost(BONE, 0.5);
4602 design = new Design(invention_defences[1], true);
4603 design->setCost(ROCK, 0.5);
4604 design->setCost(SLATE, 1);
4605 design = new Design(invention_defences[1], true);
4606 design->setCost(BONE, 0.5);
4607 design->setCost(PLANETARIUM, 1);
4608 design = new Design(invention_defences[1], true);
4609 design->setCost(WOOD, 0.5);
4610 design->setCost(PLANETARIUM, 1);
4611 design = new Design(invention_defences[1], true);
4612 design->setCost(SLATE, 1);
4613 design->setCost(PLANETARIUM, 0.5);
4614 design = new Design(invention_defences[1], false);
4615 design->setCost(BONE, 0.5);
4616 design->setCost(VALIUM, 1);
4617 design = new Design(invention_defences[1], false);
4618 design->setCost(MOONLITE, 1);
4619 design->setCost(VALIUM, 0.5);
4620 design = new Design(invention_defences[1], false);
4621 design->setCost(BONE, 0.5);
4622 design->setCost(HERBIRITE, 1);
4623 design = new Design(invention_defences[1], false);
4624 design->setCost(SLATE, 1);
4625 design->setCost(PARASITE, 0.5);
4626 design = new Design(invention_defences[1], false);
4627 design->setCost(MOONLITE, 1);
4628 design->setCost(PARASITE, 0.5);
4629 design = new Design(invention_defences[1], false);
4630 design->setCost(PLANETARIUM, 1);
4631 design->setCost(PARASITE, 0.5);
4632 design = new Design(invention_defences[1], false);
4633 design->setCost(PLANETARIUM, 1);
4634 design->setCost(ARULDITE, 0.5);
4635 design = new Design(invention_defences[1], false);
4636 design->setCost(PLANETARIUM, 1);
4637 design->setCost(SOLARIUM, 0.5);
4638 design = new Design(invention_defences[1], false);
4639 design->setCost(SLATE, 1);
4640 design->setCost(ONION, 0.5);
4641 design = new Design(invention_defences[1], false);
4642 design->setCost(MOONLITE, 1.5);
4643 design = new Design(invention_defences[1], false);
4644 design->setCost(BETHLIUM, 0.5);
4645 design->setCost(MOONLITE, 1);
4646 design = new Design(invention_defences[1], false);
4647 design->setCost(MOONLITE, 1);
4648 design->setCost(SOLARIUM, 0.5);
4649 design = new Design(invention_defences[1], false);
4650 design->setCost(PLANETARIUM, 1.5);
4651 // 2 - bow and arrow (1.5)
4652 // wood, rock, slate, bone, moonlite, bethlium, planetarium, herbirite, valium, parasite, tedium
4653 // ergo: ?
4654 // from tips: rock, wood, bones, valium, parasite
4655 design = new Design(invention_defences[2], false);
4656 design->setCost(WOOD, 1);
4657 design->setCost(MOONLITE, 0.5);
4658 design = new Design(invention_defences[2], false);
4659 design->setCost(WOOD, 0.5);
4660 design->setCost(MOONLITE, 1);
4661 design = new Design(invention_defences[2], false);
4662 design->setCost(BONE, 1);
4663 design->setCost(MOONLITE, 0.5);
4664 design = new Design(invention_defences[2], false);
4665 design->setCost(BONE, 0.5);
4666 design->setCost(MOONLITE, 1);
4667 design = new Design(invention_defences[2], false);
4668 design->setCost(ROCK, 0.5);
4669 design->setCost(SLATE, 1);
4670 design = new Design(invention_defences[2], false);
4671 design->setCost(ROCK, 1);
4672 design->setCost(SLATE, 0.5);
4673 design = new Design(invention_defences[2], false);
4674 design->setCost(WOOD, 1);
4675 design->setCost(SLATE, 0.5);
4676 design = new Design(invention_defences[2], false);
4677 design->setCost(ROCK, 0.5);
4678 design->setCost(SLATE, 0.5);
4679 design->setCost(MOONLITE, 0.5);
4680 design = new Design(invention_defences[2], false);
4681 design->setCost(BONE, 0.5);
4682 design->setCost(BETHLIUM, 0.5);
4683 design->setCost(MOONLITE, 0.5);
4684 design = new Design(invention_defences[2], false);
4685 design->setCost(WOOD, 0.5);
4686 design->setCost(BETHLIUM, 0.5);
4687 design->setCost(MOONLITE, 0.5);
4688 design = new Design(invention_defences[2], false);
4689 design->setCost(BONE, 0.5);
4690 design->setCost(PLANETARIUM, 1);
4691 design = new Design(invention_defences[2], false);
4692 design->setCost(WOOD, 1);
4693 design->setCost(PLANETARIUM, 0.5);
4694 design = new Design(invention_defences[2], false);
4695 design->setCost(ROCK, 1);
4696 design->setCost(PLANETARIUM, 0.5);
4697 design = new Design(invention_defences[2], false);
4698 design->setCost(ROCK, 0.5);
4699 design->setCost(BONE, 0.5);
4700 design->setCost(PLANETARIUM, 0.5);
4701 design = new Design(invention_defences[2], false);
4702 design->setCost(ROCK, 0.5);
4703 design->setCost(BONE, 0.5);
4704 design->setCost(VALIUM, 0.5);
4705 design = new Design(invention_defences[2], false);
4706 design->setCost(ROCK, 0.5);
4707 design->setCost(SOLARIUM, 0.5);
4708 design->setCost(VALIUM, 0.5);
4709 design = new Design(invention_defences[2], false);
4710 design->setCost(MOONLITE, 1);
4711 design->setCost(PARASITE, 0.5);
4712 design = new Design(invention_defences[2], false);
4713 design->setCost(MOONLITE, 0.5);
4714 design->setCost(PARASITE, 1);
4715 design = new Design(invention_defences[2], false);
4716 design->setCost(PLANETARIUM, 0.5);
4717 design->setCost(PARASITE, 1);
4718 design = new Design(invention_defences[2], false);
4719 design->setCost(SLATE, 1);
4720 design->setCost(PARASITE, 0.5);
4721 design = new Design(invention_defences[2], false);
4722 design->setCost(ROCK, 1);
4723 design->setCost(MOONLITE, 0.5);
4724 design = new Design(invention_defences[2], false);
4725 design->setCost(ROCK, 0.5);
4726 design->setCost(MOONLITE, 1);
4727 design = new Design(invention_defences[2], false);
4728 design->setCost(BONE, 0.5);
4729 design->setCost(VALIUM, 1);
4730 design = new Design(invention_defences[2], false);
4731 design->setCost(BONE, 1);
4732 design->setCost(VALIUM, 0.5);
4733 design = new Design(invention_defences[2], false);
4734 design->setCost(MOONLITE, 0.5);
4735 design->setCost(VALIUM, 1);
4736 design = new Design(invention_defences[2], false);
4737 design->setCost(BONE, 1);
4738 design->setCost(PLANETARIUM, 0.5);
4739 design = new Design(invention_defences[2], false);
4740 design->setCost(ROCK, 1);
4741 design->setCost(VALIUM, 0.5);
4742 design = new Design(invention_defences[2], false);
4743 design->setCost(MOONLITE, 1);
4744 design->setCost(VALIUM, 0.5);
4745 design = new Design(invention_defences[2], true);
4746 design->setCost(BONE, 0.5);
4747 design->setCost(MOONLITE, 0.5);
4748 design->setCost(VALIUM, 0.5);
4749 design = new Design(invention_defences[2], false);
4750 design->setCost(ROCK, 0.5);
4751 design->setCost(PLANETARIUM, 0.5);
4752 design->setCost(TEDIUM, 0.5);
4753 design = new Design(invention_defences[2], false);
4754 design->setCost(PLANETARIUM, 0.5);
4755 design->setCost(HERBIRITE, 0.5);
4756 design->setCost(VALIUM, 0.5);
4757 design = new Design(invention_defences[2], true);
4758 design->setCost(WOOD, 0.5);
4759 design->setCost(PLANETARIUM, 0.5);
4760 design->setCost(PARASITE, 0.5);
4761 design = new Design(invention_defences[2], true);
4762 design->setCost(WOOD, 0.5);
4763 design->setCost(MOONLITE, 0.5);
4764 design->setCost(PARASITE, 0.5);
4765 // ***
4766 design = new Design(invention_defences[2], false);
4767 design->setCost(ROCK, 0.5);
4768 design->setCost(BONE, 0.5);
4769 design->setCost(PLANETARIUM, 0.5);
4770 // 3 - cauldron (3)
4771 // rock, wood, slate, moonlite, aruldite, herbirite, valium, planetarium, bethlium, parasite, solarium, moron, aquarium, marmite
4772 // ergo: bethlium+valium
4773 // from tips: bethlium, solarium, aruldite, valium, parasite
4774 design = new Design(invention_defences[3], false);
4775 design->setCost(ROCK, 1);
4776 design->setCost(ARULDITE, 2);
4777 design = new Design(invention_defences[3], false);
4778 design->setCost(MOONLITE, 1);
4779 design->setCost(ARULDITE, 2);
4780 design = new Design(invention_defences[3], false);
4781 design->setCost(PLANETARIUM, 1);
4782 design->setCost(ARULDITE, 2);
4783 design = new Design(invention_defences[3], false);
4784 design->setCost(ARULDITE, 3);
4785 design = new Design(invention_defences[3], false);
4786 design->setCost(MOONLITE, 1);
4787 design->setCost(BETHLIUM, 2);
4788 design = new Design(invention_defences[3], false);
4789 design->setCost(BONE, 2);
4790 design->setCost(VALIUM, 1);
4791 design = new Design(invention_defences[3], false);
4792 design->setCost(ROCK, 2);
4793 design->setCost(VALIUM, 1);
4794 design = new Design(invention_defences[3], true);
4795 design->setCost(BETHLIUM, 2);
4796 design->setCost(VALIUM, 1);
4797 design = new Design(invention_defences[3], true);
4798 design->setCost(SOLARIUM, 2);
4799 design->setCost(VALIUM, 1);
4800 design = new Design(invention_defences[3], false);
4801 design->setCost(HERBIRITE, 2);
4802 design->setCost(VALIUM, 1);
4803 design = new Design(invention_defences[3], false);
4804 design->setCost(PLANETARIUM, 1);
4805 design->setCost(SOLARIUM, 2);
4806 design = new Design(invention_defences[3], false);
4807 design->setCost(PLANETARIUM, 2);
4808 design->setCost(VALIUM, 1);
4809 design = new Design(invention_defences[3], false);
4810 design->setCost(AQUARIUM, 2);
4811 design->setCost(VALIUM, 1);
4812 design = new Design(invention_defences[3], false);
4813 design->setCost(VALIUM, 3);
4814 design = new Design(invention_defences[3], false);
4815 design->setCost(SLATE, 1);
4816 design->setCost(BETHLIUM, 2);
4817 design = new Design(invention_defences[3], false);
4818 design->setCost(SLATE, 1);
4819 design->setCost(SOLARIUM, 2);
4820 design = new Design(invention_defences[3], false);
4821 design->setCost(BETHLIUM, 3);
4822 design = new Design(invention_defences[3], false);
4823 design->setCost(SLATE, 2);
4824 design->setCost(PARASITE, 1);
4825 design = new Design(invention_defences[3], true);
4826 design->setCost(BETHLIUM, 2);
4827 design->setCost(PARASITE, 1);
4828 design = new Design(invention_defences[3], true);
4829 design->setCost(ARULDITE, 2);
4830 design->setCost(PARASITE, 1);
4831 design = new Design(invention_defences[3], true);
4832 design->setCost(SOLARIUM, 2);
4833 design->setCost(PARASITE, 1);
4834 design = new Design(invention_defences[3], false);
4835 design->setCost(SOLARIUM, 2);
4836 design->setCost(AQUARIUM, 1);
4837 design = new Design(invention_defences[3], false);
4838 design->setCost(PARASITE, 3);
4839 design = new Design(invention_defences[3], false);
4840 design->setCost(SOLARIUM, 3);
4841 design = new Design(invention_defences[3], false);
4842 design->setCost(WOOD, 1);
4843 design->setCost(SOLARIUM, 2);
4844 design = new Design(invention_defences[3], false);
4845 design->setCost(WOOD, 1);
4846 design->setCost(BETHLIUM, 2);
4847 design = new Design(invention_defences[3], false);
4848 design->setCost(WOOD, 1);
4849 design->setCost(ARULDITE, 2);
4850 design = new Design(invention_defences[3], false);
4851 design->setCost(BONE, 1);
4852 design->setCost(SOLARIUM, 2);
4853 design = new Design(invention_defences[3], false);
4854 design->setCost(BETHLIUM, 1);
4855 design->setCost(SOLARIUM, 2);
4856 design = new Design(invention_defences[3], false);
4857 design->setCost(SOLARIUM, 1);
4858 design->setCost(ARULDITE, 2);
4859 design = new Design(invention_defences[3], false);
4860 design->setCost(BETHLIUM, 2);
4861 design->setCost(ARULDITE, 1);
4862 design = new Design(invention_defences[3], false);
4863 design->setCost(HERBIRITE, 1);
4864 design->setCost(ARULDITE, 2);
4865 design = new Design(invention_defences[3], false);
4866 design->setCost(BETHLIUM, 2);
4867 design->setCost(MORON, 1);
4868 design = new Design(invention_defences[3], false);
4869 design->setCost(ARULDITE, 2);
4870 design->setCost(MORON, 1);
4871 design = new Design(invention_defences[3], false);
4872 design->setCost(ARULDITE, 2);
4873 design->setCost(AQUARIUM, 1);
4874 design = new Design(invention_defences[3], false);
4875 design->setCost(ARULDITE, 2);
4876 design->setCost(ONION, 1);
4877 design = new Design(invention_defences[3], false);
4878 design->setCost(PARASITE, 1);
4879 design->setCost(MARMITE, 2);
4880 design = new Design(invention_defences[3], false);
4881 design->setCost(BETHLIUM, 2);
4882 design->setCost(TEDIUM, 1);
4883 design = new Design(invention_defences[3], false);
4884 design->setCost(BETHLIUM, 2);
4885 design->setCost(ONION, 1);
4886 design = new Design(invention_defences[3], false);
4887 design->setCost(VALIUM, 1);
4888 design->setCost(ONION, 2);
4889 // 4 - crossbow (1.5)
4890 // rock, bone, wood, slate, bethlium, solarium, planetarium, aruldite, tedium, aquarium, paladium, moron, yeridium
4891 // ergo: wood+solarium+paladium, wood+bethlium+aquarium
4892 // from tips: rock, wood, bone, aruldite
4893 design = new Design(invention_defences[4], false);
4894 design->setCost(BONE, 0.5);
4895 design->setCost(BETHLIUM, 1);
4896 design = new Design(invention_defences[4], false);
4897 design->setCost(WOOD, 1);
4898 design->setCost(BETHLIUM, 0.5);
4899 design = new Design(invention_defences[4], false);
4900 design->setCost(WOOD, 1);
4901 design->setCost(AQUARIUM, 0.5);
4902 design = new Design(invention_defences[4], false);
4903 design->setCost(WOOD, 0.5);
4904 design->setCost(AQUARIUM, 1);
4905 design = new Design(invention_defences[4], false);
4906 design->setCost(WOOD, 1);
4907 design->setCost(ARULDITE, 0.5);
4908 design = new Design(invention_defences[4], false);
4909 design->setCost(WOOD, 0.5);
4910 design->setCost(ARULDITE, 1);
4911 design = new Design(invention_defences[4], false);
4912 design->setCost(ROCK, 1);
4913 design->setCost(ARULDITE, 0.5);
4914 design = new Design(invention_defences[4], false);
4915 design->setCost(ROCK, 1);
4916 design->setCost(SOLARIUM, 0.5);
4917 design = new Design(invention_defences[4], false);
4918 design->setCost(ROCK, 0.5);
4919 design->setCost(BETHLIUM, 1);
4920 design = new Design(invention_defences[4], false);
4921 design->setCost(ARULDITE, 1);
4922 design->setCost(AQUARIUM, 0.5);
4923 design = new Design(invention_defences[4], false);
4924 design->setCost(ARULDITE, 0.5);
4925 design->setCost(AQUARIUM, 1);
4926 design = new Design(invention_defences[4], false);
4927 design->setCost(BETHLIUM, 1);
4928 design->setCost(AQUARIUM, 0.5);
4929 design = new Design(invention_defences[4], false);
4930 design->setCost(BONE, 1);
4931 design->setCost(BETHLIUM, 0.5);
4932 design = new Design(invention_defences[4], false);
4933 design->setCost(BONE, 1);
4934 design->setCost(AQUARIUM, 0.5);
4935 design = new Design(invention_defences[4], false);
4936 design->setCost(BONE, 1);
4937 design->setCost(SOLARIUM, 0.5);
4938 design = new Design(invention_defences[4], false);
4939 design->setCost(SOLARIUM, 1);
4940 design->setCost(AQUARIUM, 0.5);
4941 design = new Design(invention_defences[4], false);
4942 design->setCost(BONE, 1);
4943 design->setCost(ARULDITE, 0.5);
4944 design = new Design(invention_defences[4], false);
4945 design->setCost(WOOD, 0.5);
4946 design->setCost(SOLARIUM, 1);
4947 design = new Design(invention_defences[4], false);
4948 design->setCost(WOOD, 0.5);
4949 design->setCost(SLATE, 0.5);
4950 design->setCost(SOLARIUM, 0.5);
4951 design = new Design(invention_defences[4], false);
4952 design->setCost(BONE, 0.5);
4953 design->setCost(MOONLITE, 0.5);
4954 design->setCost(SOLARIUM, 0.5);
4955 design = new Design(invention_defences[4], true);
4956 design->setCost(WOOD, 0.5);
4957 design->setCost(PALADIUM, 0.5);
4958 design->setCost(SOLARIUM, 0.5);
4959 design = new Design(invention_defences[4], true);
4960 design->setCost(WOOD, 0.5);
4961 design->setCost(BETHLIUM, 0.5);
4962 design->setCost(AQUARIUM, 0.5);
4963 design = new Design(invention_defences[4], true);
4964 design->setCost(BONE, 0.5);
4965 design->setCost(ARULDITE, 0.5);
4966 design->setCost(AQUARIUM, 0.5);
4967 design = new Design(invention_defences[4], false);
4968 design->setCost(WOOD, 0.5);
4969 design->setCost(BONE, 0.5);
4970 design->setCost(AQUARIUM, 0.5);
4971 design = new Design(invention_defences[4], false);
4972 design->setCost(WOOD, 0.5);
4973 design->setCost(MOONLITE, 0.5);
4974 design->setCost(AQUARIUM, 0.5);
4975 design = new Design(invention_defences[4], false);
4976 design->setCost(WOOD, 0.5);
4977 design->setCost(HERBIRITE, 0.5);
4978 design->setCost(AQUARIUM, 0.5);
4979 design = new Design(invention_defences[4], false);
4980 design->setCost(BETHLIUM, 0.5);
4981 design->setCost(HERBIRITE, 0.5);
4982 design->setCost(PALADIUM, 0.5);
4983 design = new Design(invention_defences[4], false);
4984 design->setCost(ROCK, 1);
4985 design->setCost(PALADIUM, 0.5);
4986 design = new Design(invention_defences[4], false);
4987 design->setCost(WOOD, 0.5);
4988 design->setCost(PALADIUM, 1);
4989 design = new Design(invention_defences[4], false);
4990 design->setCost(WOOD, 1);
4991 design->setCost(PALADIUM, 0.5);
4992 design = new Design(invention_defences[4], false);
4993 design->setCost(ROCK, 0.5);
4994 design->setCost(PALADIUM, 1);
4995 design = new Design(invention_defences[4], false);
4996 design->setCost(BETHLIUM, 0.5);
4997 design->setCost(PALADIUM, 1);
4998 design = new Design(invention_defences[4], false);
4999 design->setCost(WOOD, 0.5);
5000 design->setCost(ROCK, 0.5);
5001 design->setCost(PALADIUM, 0.5);
5002 design = new Design(invention_defences[4], false);
5003 design->setCost(ROCK, 0.5);
5004 design->setCost(PLANETARIUM, 0.5);
5005 design->setCost(ARULDITE, 0.5);
5006 design = new Design(invention_defences[4], false);
5007 design->setCost(BONE, 0.5);
5008 design->setCost(SOLARIUM, 0.5);
5009 design->setCost(ARULDITE, 0.5);
5010 design = new Design(invention_defences[4], false);
5011 design->setCost(BONE, 0.5);
5012 design->setCost(PLANETARIUM, 0.5);
5013 design->setCost(ARULDITE, 0.5);
5014 design = new Design(invention_defences[4], true);
5015 design->setCost(ROCK, 0.5);
5016 design->setCost(ARULDITE, 0.5);
5017 design->setCost(AQUARIUM, 0.5);
5018 design = new Design(invention_defences[4], false);
5019 design->setCost(WOOD, 0.5);
5020 design->setCost(SOLARIUM, 0.5);
5021 design->setCost(YERIDIUM, 0.5);
5022 design = new Design(invention_defences[4], false);
5023 design->setCost(WOOD, 0.5);
5024 design->setCost(YERIDIUM, 0.5);
5025 design->setCost(AQUARIUM, 0.5);
5026 design = new Design(invention_defences[4], false);
5027 design->setCost(ARULDITE, 0.5);
5028 design->setCost(YERIDIUM, 0.5);
5029 design->setCost(AQUARIUM, 0.5);
5030 design = new Design(invention_defences[4], false);
5031 design->setCost(ROCK, 0.5);
5032 design->setCost(ARULDITE, 0.5);
5033 design->setCost(TEDIUM, 0.5);
5034 design = new Design(invention_defences[4], false);
5035 design->setCost(ROCK, 0.5);
5036 design->setCost(ARULDITE, 0.5);
5037 design->setCost(MORON, 0.5);
5038 design = new Design(invention_defences[4], false);
5039 design->setCost(WOOD, 0.5);
5040 design->setCost(ARULDITE, 0.5);
5041 design->setCost(ONION, 0.5);
5042 design = new Design(invention_defences[4], false);
5043 design->setCost(ROCK, 0.5);
5044 design->setCost(SOLARIUM, 0.5);
5045 design->setCost(VALIUM, 0.5);
5046 // 5 - musket (2)
5047 // wood, bone, slate, moonlite, onion, planetarium, tedium, valium, onion, herbirite, parasite, yeridium
5048 // ergo: ?
5049 // from tips: slate, moonlite, planetarium, valium, parasite
5050 design = new Design(invention_defences[5], false);
5051 design->setCost(MOONLITE, 1.5);
5052 design->setCost(ONION, 0.5);
5053 design = new Design(invention_defences[5], false);
5054 design->setCost(WOOD, 0.5);
5055 design->setCost(SLATE, 1);
5056 design->setCost(ONION, 0.5);
5057 design = new Design(invention_defences[5], false);
5058 design->setCost(BONE, 0.5);
5059 design->setCost(SLATE, 1);
5060 design->setCost(VALIUM, 0.5);
5061 design = new Design(invention_defences[5], false);
5062 design->setCost(SLATE, 1);
5063 design->setCost(BETHLIUM, 0.5);
5064 design->setCost(ONION, 0.5);
5065 design = new Design(invention_defences[5], false);
5066 design->setCost(SLATE, 1);
5067 design->setCost(PARASITE, 1);
5068 design = new Design(invention_defences[5], false);
5069 design->setCost(MOONLITE, 1);
5070 design->setCost(PARASITE, 1);
5071 design = new Design(invention_defences[5], false);
5072 design->setCost(MOONLITE, 1.5);
5073 design->setCost(PARASITE, 0.5);
5074 design = new Design(invention_defences[5], false);
5075 design->setCost(SLATE, 1);
5076 design->setCost(TEDIUM, 1);
5077 design = new Design(invention_defences[5], false);
5078 design->setCost(SLATE, 1);
5079 design->setCost(ONION, 1);
5080 design = new Design(invention_defences[5], false);
5081 design->setCost(SLATE, 1.5);
5082 design->setCost(ONION, 0.5);
5083 design = new Design(invention_defences[5], false);
5084 design->setCost(ROCK, 0.5);
5085 design->setCost(PLANETARIUM, 1);
5086 design->setCost(TEDIUM, 0.5);
5087 design = new Design(invention_defences[5], false);
5088 design->setCost(PLANETARIUM, 1);
5089 design->setCost(TEDIUM, 1);
5090 design = new Design(invention_defences[5], false);
5091 design->setCost(VALIUM, 1.5);
5092 design->setCost(ONION, 0.5);
5093 design = new Design(invention_defences[5], false);
5094 design->setCost(SLATE, 1.5);
5095 design->setCost(VALIUM, 0.5);
5096 design = new Design(invention_defences[5], false);
5097 design->setCost(VALIUM, 1);
5098 design->setCost(TEDIUM, 1);
5099 design = new Design(invention_defences[5], false);
5100 design->setCost(SLATE, 1);
5101 design->setCost(YERIDIUM, 0.5);
5102 design->setCost(PARASITE, 0.5);
5103 design = new Design(invention_defences[5], false);
5104 design->setCost(MOONLITE, 1);
5105 design->setCost(YERIDIUM, 0.5);
5106 design->setCost(TEDIUM, 0.5);
5107 design = new Design(invention_defences[5], false);
5108 design->setCost(YERIDIUM, 1);
5109 design->setCost(PARASITE, 0.5);
5110 design->setCost(TEDIUM, 0.5);
5111 design = new Design(invention_defences[5], false);
5112 design->setCost(PARASITE, 0.5);
5113 design->setCost(TEDIUM, 0.5);
5114 design->setCost(MARMITE, 1);
5115 design = new Design(invention_defences[5], false);
5116 design->setCost(MOONLITE, 1.5);
5117 design->setCost(TEDIUM, 0.5);
5118 design = new Design(invention_defences[5], false);
5119 design->setCost(MOONLITE, 1);
5120 design->setCost(TEDIUM, 1);
5121 design = new Design(invention_defences[5], false);
5122 design->setCost(PLANETARIUM, 1.5);
5123 design->setCost(ONION, 0.5);
5124 design = new Design(invention_defences[5], false);
5125 design->setCost(PLANETARIUM, 1);
5126 design->setCost(ONION, 1);
5127 design = new Design(invention_defences[5], false);
5128 design->setCost(PLANETARIUM, 1);
5129 design->setCost(HERBIRITE, 0.5);
5130 design->setCost(ONION, 0.5);
5131 design = new Design(invention_defences[5], false);
5132 design->setCost(ROCK, 1);
5133 design->setCost(VALIUM, 0.5);
5134 design->setCost(ONION, 0.5);
5135 design = new Design(invention_defences[5], false);
5136 design->setCost(SLATE, 1);
5137 design->setCost(HERBIRITE, 0.5);
5138 design->setCost(VALIUM, 0.5);
5139 design = new Design(invention_defences[5], false);
5140 design->setCost(SLATE, 1);
5141 design->setCost(TEDIUM, 0.5);
5142 design->setCost(MARMITE, 0.5);
5143 // 6 - machine gun (2.5)
5144 // wood, bone, slate, valium, onion, planetarium, solarium, tedium, parasite, marmite, aquarium, yeridium, moonlite
5145 // ergo: ?
5146 // from tips: slate, moonlite, planetarium, valium, parasite, onion, tedium
5147 design = new Design(invention_defences[6], false);
5148 design->setCost(WOOD, 1);
5149 design->setCost(SLATE, 0.5);
5150 design->setCost(ONION, 1);
5151 design = new Design(invention_defences[6], false);
5152 design->setCost(BONE, 0.5);
5153 design->setCost(VALIUM, 1);
5154 design->setCost(ONION, 1);
5155 design = new Design(invention_defences[6], false);
5156 design->setCost(ROCK, 0.5);
5157 design->setCost(VALIUM, 1);
5158 design->setCost(ONION, 1);
5159 design = new Design(invention_defences[6], false);
5160 design->setCost(SLATE, 0.5);
5161 design->setCost(BETHLIUM, 1);
5162 design->setCost(ONION, 1);
5163 design = new Design(invention_defences[6], false);
5164 design->setCost(SLATE, 0.5);
5165 design->setCost(PARASITE, 1);
5166 design->setCost(AQUARIUM, 1);
5167 design = new Design(invention_defences[6], true);
5168 design->setCost(SLATE, 0.5);
5169 design->setCost(PARASITE, 1);
5170 design->setCost(TEDIUM, 1);
5171 design = new Design(invention_defences[6], false);
5172 design->setCost(SLATE, 0.5);
5173 design->setCost(ARULDITE, 1);
5174 design->setCost(TEDIUM, 1);
5175 design = new Design(invention_defences[6], false);
5176 design->setCost(SLATE, 1.5);
5177 design->setCost(PARASITE, 1);
5178 design = new Design(invention_defences[6], false);
5179 design->setCost(MOONLITE, 1.5);
5180 design->setCost(PARASITE, 1);
5181 design = new Design(invention_defences[6], false);
5182 design->setCost(SLATE, 1.5);
5183 design->setCost(VALIUM, 1);
5184 design = new Design(invention_defences[6], false);
5185 design->setCost(SLATE, 0.5);
5186 design->setCost(VALIUM, 2);
5187 design = new Design(invention_defences[6], false);
5188 design->setCost(SLATE, 0.5);
5189 design->setCost(TEDIUM, 2);
5190 design = new Design(invention_defences[6], false);
5191 design->setCost(SLATE, 1.5);
5192 design->setCost(TEDIUM, 1);
5193 design = new Design(invention_defences[6], false);
5194 design->setCost(VALIUM, 1.5);
5195 design->setCost(ONION, 1);
5196 design = new Design(invention_defences[6], false);
5197 design->setCost(VALIUM, 1);
5198 design->setCost(AQUARIUM, 0.5);
5199 design->setCost(ONION, 1);
5200 design = new Design(invention_defences[6], false);
5201 design->setCost(VALIUM, 1.5);
5202 design->setCost(TEDIUM, 1);
5203 design = new Design(invention_defences[6], false);
5204 design->setCost(MOONLITE, 0.5);
5205 design->setCost(AQUARIUM, 1);
5206 design->setCost(TEDIUM, 1);
5207 design = new Design(invention_defences[6], false);
5208 design->setCost(PLANETARIUM, 1.5);
5209 design->setCost(ONION, 1);
5210 design = new Design(invention_defences[6], false);
5211 design->setCost(PLANETARIUM, 0.5);
5212 design->setCost(TEDIUM, 2);
5213 design = new Design(invention_defences[6], false);
5214 design->setCost(PLANETARIUM, 1.5);
5215 design->setCost(TEDIUM, 1);
5216 design = new Design(invention_defences[6], false);
5217 design->setCost(MOONLITE, 0.5);
5218 design->setCost(TEDIUM, 2);
5219 design = new Design(invention_defences[6], false);
5220 design->setCost(MOONLITE, 1.5);
5221 design->setCost(TEDIUM, 1);
5222 design = new Design(invention_defences[6], false);
5223 design->setCost(MOONLITE, 1.5);
5224 design->setCost(ONION, 1);
5225 design = new Design(invention_defences[6], false);
5226 design->setCost(SLATE, 0.5);
5227 design->setCost(ONION, 2);
5228 design = new Design(invention_defences[6], false);
5229 design->setCost(SLATE, 1.5);
5230 design->setCost(ONION, 1);
5231 design = new Design(invention_defences[6], false);
5232 design->setCost(PARASITE, 1.5);
5233 design->setCost(ONION, 1);
5234 design = new Design(invention_defences[6], false);
5235 design->setCost(PARASITE, 1);
5236 design->setCost(TEDIUM, 1.5);
5237 design = new Design(invention_defences[6], false);
5238 design->setCost(PARASITE, 1.5);
5239 design->setCost(TEDIUM, 1);
5240 design = new Design(invention_defences[6], false);
5241 design->setCost(PLANETARIUM, 0.5);
5242 design->setCost(SOLARIUM, 1);
5243 design->setCost(TEDIUM, 1);
5244 design = new Design(invention_defences[6], true);
5245 design->setCost(PLANETARIUM, 0.5);
5246 design->setCost(VALIUM, 1);
5247 design->setCost(TEDIUM, 1);
5248 design = new Design(invention_defences[6], false);
5249 design->setCost(PLANETARIUM, 0.5);
5250 design->setCost(ONION, 1);
5251 design->setCost(MARMITE, 1);
5252 design = new Design(invention_defences[6], false);
5253 design->setCost(PARASITE, 1);
5254 design->setCost(ONION, 1);
5255 design->setCost(MARMITE, 0.5);
5256 design = new Design(invention_defences[6], false);
5257 design->setCost(SLATE, 0.5);
5258 design->setCost(YERIDIUM, 1);
5259 design->setCost(PARASITE, 1);
5260 design = new Design(invention_defences[6], false);
5261 design->setCost(SLATE, 0.5);
5262 design->setCost(HERBIRITE, 1);
5263 design->setCost(PARASITE, 1);
5264 design = new Design(invention_defences[6], false);
5265 design->setCost(SLATE, 0.5);
5266 design->setCost(TEDIUM, 1);
5267 design->setCost(MARMITE, 1);
5268 design = new Design(invention_defences[6], false);
5269 design->setCost(MOONLITE, 0.5);
5270 design->setCost(YERIDIUM, 1);
5271 design->setCost(TEDIUM, 1);
5272 design = new Design(invention_defences[6], false);
5273 design->setCost(ROCK, 1);
5274 design->setCost(SLATE, 0.5);
5275 design->setCost(TEDIUM, 1);
5276 design = new Design(invention_defences[6], false);
5277 design->setCost(MOONLITE, 0.5);
5278 design->setCost(PARASITE, 1);
5279 design->setCost(MARMITE, 1);
5280 design = new Design(invention_defences[6], false);
5281 design->setCost(PARASITE, 1);
5282 design->setCost(TEDIUM, 1);
5283 design->setCost(MARMITE, 0.5);
5284 // 7 - bazooka (3)
5285 // slate, wood, bone, paladium, valium, onion, tedium, moron, marmite, planetarium, yeridium, aruldite, parasite, aquarium, bethlium, solarium
5286 // ergo: ?
5287 // from tips: aquarium, paladium, onion, tedium
5288 design = new Design(invention_defences[7], false);
5289 design->setCost(WOOD, 2);
5290 design->setCost(PALADIUM, 1);
5291 design = new Design(invention_defences[7], false);
5292 design->setCost(ROCK, 2);
5293 design->setCost(PALADIUM, 1);
5294 design = new Design(invention_defences[7], false);
5295 design->setCost(ROCK, 2);
5296 design->setCost(AQUARIUM, 1);
5297 design = new Design(invention_defences[7], false);
5298 design->setCost(WOOD, 2);
5299 design->setCost(AQUARIUM, 1);
5300 design = new Design(invention_defences[7], false);
5301 design->setCost(WOOD, 1);
5302 design->setCost(TEDIUM, 2);
5303 design = new Design(invention_defences[7], false);
5304 design->setCost(BETHLIUM, 2);
5305 design->setCost(PALADIUM, 1);
5306 design = new Design(invention_defences[7], false);
5307 design->setCost(BONE, 1);
5308 design->setCost(ONION, 2);
5309 design = new Design(invention_defences[7], false);
5310 design->setCost(BONE, 1);
5311 design->setCost(TEDIUM, 2);
5312 design = new Design(invention_defences[7], false);
5313 design->setCost(BONE, 2);
5314 design->setCost(AQUARIUM, 1);
5315 design = new Design(invention_defences[7], false);
5316 design->setCost(HERBIRITE, 2);
5317 design->setCost(AQUARIUM, 1);
5318 design = new Design(invention_defences[7], false);
5319 design->setCost(SOLARIUM, 2);
5320 design->setCost(AQUARIUM, 1);
5321 design = new Design(invention_defences[7], false);
5322 design->setCost(SLATE, 1);
5323 design->setCost(ONION, 2);
5324 design = new Design(invention_defences[7], false);
5325 design->setCost(SLATE, 1);
5326 design->setCost(TEDIUM, 2);
5327 design = new Design(invention_defences[7], false);
5328 design->setCost(SLATE, 2);
5329 design->setCost(PALADIUM, 1);
5330 design = new Design(invention_defences[7], false);
5331 design->setCost(PALADIUM, 1);
5332 design->setCost(MARMITE, 2);
5333 design = new Design(invention_defences[7], true);
5334 design->setCost(PALADIUM, 1);
5335 design->setCost(TEDIUM, 2);
5336 design = new Design(invention_defences[7], true);
5337 design->setCost(PALADIUM, 1);
5338 design->setCost(ONION, 2);
5339 design = new Design(invention_defences[7], true);
5340 design->setCost(AQUARIUM, 1);
5341 design->setCost(ONION, 2);
5342 design = new Design(invention_defences[7], false);
5343 design->setCost(VALIUM, 1);
5344 design->setCost(ONION, 2);
5345 design = new Design(invention_defences[7], false);
5346 design->setCost(VALIUM, 2);
5347 design->setCost(PALADIUM, 1);
5348 design = new Design(invention_defences[7], false);
5349 design->setCost(ONION, 3);
5350 design = new Design(invention_defences[7], false);
5351 design->setCost(AQUARIUM, 3);
5352 design = new Design(invention_defences[7], false);
5353 design->setCost(AQUARIUM, 1);
5354 design->setCost(MORON, 2);
5355 design = new Design(invention_defences[7], false);
5356 design->setCost(PALADIUM, 1);
5357 design->setCost(MORON, 2);
5358 design = new Design(invention_defences[7], false);
5359 design->setCost(PALADIUM, 3);
5360 design = new Design(invention_defences[7], false);
5361 design->setCost(TEDIUM, 2);
5362 design->setCost(MARMITE, 1);
5363 design = new Design(invention_defences[7], false);
5364 design->setCost(AQUARIUM, 1);
5365 design->setCost(MARMITE, 2);
5366 design = new Design(invention_defences[7], false);
5367 design->setCost(ONION, 2);
5368 design->setCost(MARMITE, 1);
5369 design = new Design(invention_defences[7], false);
5370 design->setCost(TEDIUM, 3);
5371 design = new Design(invention_defences[7], false);
5372 design->setCost(PLANETARIUM, 1);
5373 design->setCost(TEDIUM, 2);
5374 design = new Design(invention_defences[7], false);
5375 design->setCost(PLANETARIUM, 1);
5376 design->setCost(ONION, 2);
5377 design = new Design(invention_defences[7], false);
5378 design->setCost(YERIDIUM, 2);
5379 design->setCost(PALADIUM, 1);
5380 design = new Design(invention_defences[7], false);
5381 design->setCost(YERIDIUM, 2);
5382 design->setCost(AQUARIUM, 1);
5383 design = new Design(invention_defences[7], false);
5384 design->setCost(YERIDIUM, 1);
5385 design->setCost(TEDIUM, 2);
5386 design = new Design(invention_defences[7], false);
5387 design->setCost(ARULDITE, 1);
5388 design->setCost(ONION, 2);
5389 design = new Design(invention_defences[7], false);
5390 design->setCost(ARULDITE, 2);
5391 design->setCost(AQUARIUM, 1);
5392 design = new Design(invention_defences[7], false);
5393 design->setCost(ARULDITE, 2);
5394 design->setCost(PALADIUM, 1);
5395 design = new Design(invention_defences[7], false);
5396 design->setCost(ARULDITE, 1);
5397 design->setCost(TEDIUM, 2);
5398 design = new Design(invention_defences[7], true);
5399 design->setCost(AQUARIUM, 1);
5400 design->setCost(TEDIUM, 2);
5401 design = new Design(invention_defences[7], false);
5402 design->setCost(AQUARIUM, 1);
5403 design->setCost(PALADIUM, 2);
5404 design = new Design(invention_defences[7], true); // not ergo in Epoch 8, Xtra ???
5405 design->setCost(BETHLIUM, 1);
5406 design->setCost(TEDIUM, 2);
5407 design = new Design(invention_defences[7], false);
5408 design->setCost(MOONLITE, 2);
5409 design->setCost(PALADIUM, 1);
5410 design = new Design(invention_defences[7], false);
5411 design->setCost(PARASITE, 2);
5412 design->setCost(PALADIUM, 1);
5413 design = new Design(invention_defences[7], false);
5414 design->setCost(PARASITE, 1);
5415 design->setCost(TEDIUM, 2);
5416 // 8 - nuclear defence (5.5)
5417 // rock, wood, bone, slate, aruldite, paladium, aquarium, marmite, onion, planetarium, alien, solarium, bethlium, valium
5418 // ergo: ?
5419 // from tips: wood, rock, bone, aquarium, paladium, marmite
5420 design = new Design(invention_defences[8], false);
5421 design->setCost(ROCK, 0.5);
5422 design->setCost(MARMITE, 5);
5423 design = new Design(invention_defences[8], false);
5424 design->setCost(ROCK, 2.5);
5425 design->setCost(MARMITE, 3);
5426 design = new Design(invention_defences[8], true);
5427 design->setCost(ROCK, 0.5);
5428 design->setCost(PALADIUM, 2);
5429 design->setCost(MARMITE, 3);
5430 design = new Design(invention_defences[8], false);
5431 design->setCost(ROCK, 0.5);
5432 design->setCost(YERIDIUM, 2);
5433 design->setCost(MARMITE, 3);
5434 design = new Design(invention_defences[8], false);
5435 design->setCost(ROCK, 0.5);
5436 design->setCost(YERIDIUM, 3);
5437 design->setCost(PALADIUM, 2);
5438 design = new Design(invention_defences[8], false);
5439 design->setCost(ROCK, 0.5);
5440 design->setCost(HERBIRITE, 3);
5441 design->setCost(PALADIUM, 2);
5442 design = new Design(invention_defences[8], false);
5443 design->setCost(WOOD, 0.5);
5444 design->setCost(SLATE, 3);
5445 design->setCost(PALADIUM, 2);
5446 design = new Design(invention_defences[8], false);
5447 design->setCost(WOOD, 0.5);
5448 design->setCost(ARULDITE, 3);
5449 design->setCost(PALADIUM, 2);
5450 design = new Design(invention_defences[8], false);
5451 design->setCost(WOOD, 0.5);
5452 design->setCost(PALADIUM, 2);
5453 design->setCost(TEDIUM, 3);
5454 design = new Design(invention_defences[8], false);
5455 design->setCost(WOOD, 0.5);
5456 design->setCost(YERIDIUM, 3);
5457 design->setCost(PALADIUM, 2);
5458 design = new Design(invention_defences[8], false);
5459 design->setCost(WOOD, 0.5);
5460 design->setCost(VALIUM, 3);
5461 design->setCost(PALADIUM, 2);
5462 design = new Design(invention_defences[8], false);
5463 design->setCost(WOOD, 3.5);
5464 design->setCost(PALADIUM, 2);
5465 design = new Design(invention_defences[8], false);
5466 design->setCost(WOOD, 3.5);
5467 design->setCost(AQUARIUM, 2);
5468 design = new Design(invention_defences[8], false);
5469 design->setCost(BONE, 0.5);
5470 design->setCost(MARMITE, 5);
5471 design = new Design(invention_defences[8], false);
5472 design->setCost(BONE, 2.5);
5473 design->setCost(MARMITE, 3);
5474 design = new Design(invention_defences[8], false);
5475 design->setCost(BONE, 0.5);
5476 design->setCost(SLATE, 2);
5477 design->setCost(MARMITE, 3);
5478 design = new Design(invention_defences[8], false);
5479 design->setCost(BONE, 0.5);
5480 design->setCost(VALIUM, 2);
5481 design->setCost(MARMITE, 3);
5482 design = new Design(invention_defences[8], false);
5483 design->setCost(BONE, 0.5);
5484 design->setCost(TEDIUM, 2);
5485 design->setCost(MARMITE, 3);
5486 design = new Design(invention_defences[8], false);
5487 design->setCost(BONE, 0.5);
5488 design->setCost(PLANETARIUM, 3);
5489 design->setCost(AQUARIUM, 2);
5490 design = new Design(invention_defences[8], false);
5491 design->setCost(SLATE, 0.5);
5492 design->setCost(AQUARIUM, 2);
5493 design->setCost(MARMITE, 3);
5494 design = new Design(invention_defences[8], true);
5495 design->setCost(ROCK, 0.5);
5496 design->setCost(AQUARIUM, 2);
5497 design->setCost(MARMITE, 3);
5498 design = new Design(invention_defences[8], false);
5499 design->setCost(ARULDITE, 0.5);
5500 design->setCost(AQUARIUM, 2);
5501 design->setCost(MARMITE, 3);
5502 design = new Design(invention_defences[8], false);
5503 design->setCost(AQUARIUM, 2.5);
5504 design->setCost(MARMITE, 3);
5505 design = new Design(invention_defences[8], false);
5506 design->setCost(AQUARIUM, 2);
5507 design->setCost(MARMITE, 3.5);
5508 design = new Design(invention_defences[8], false);
5509 design->setCost(AQUARIUM, 2);
5510 design->setCost(ONION, 0.5);
5511 design->setCost(MARMITE, 3);
5512 design = new Design(invention_defences[8], false);
5513 design->setCost(PLANETARIUM, 0.5);
5514 design->setCost(AQUARIUM, 2);
5515 design->setCost(MARMITE, 3);
5516 design = new Design(invention_defences[8], false);
5517 design->setCost(PALADIUM, 2);
5518 design->setCost(MARMITE, 3.5);
5519 design = new Design(invention_defences[8], false);
5520 design->setCost(PALADIUM, 2.5);
5521 design->setCost(MARMITE, 3);
5522 design = new Design(invention_defences[8], false);
5523 design->setCost(PALADIUM, 2);
5524 design->setCost(MARMITE, 3);
5525 design->setCost(ALIEN, 0.5);
5526 design = new Design(invention_defences[8], false);
5527 design->setCost(SOLARIUM, 0.5);
5528 design->setCost(PALADIUM, 2);
5529 design->setCost(MARMITE, 3);
5530 design = new Design(invention_defences[8], false);
5531 design->setCost(BETHLIUM, 0.5);
5532 design->setCost(AQUARIUM, 2);
5533 design->setCost(MARMITE, 3);
5534 design = new Design(invention_defences[8], false);
5535 design->setCost(YERIDIUM, 0.5);
5536 design->setCost(AQUARIUM, 2);
5537 design->setCost(MARMITE, 3);
5538 design = new Design(invention_defences[8], false);
5539 design->setCost(PALADIUM, 2);
5540 design->setCost(MORON, 0.5);
5541 design->setCost(MARMITE, 3);
5542 design = new Design(invention_defences[8], false);
5543 design->setCost(AQUARIUM, 2);
5544 design->setCost(MORON, 0.5);
5545 design->setCost(MARMITE, 3);
5546 design = new Design(invention_defences[8], false);
5547 design->setCost(AQUARIUM, 2);
5548 design->setCost(TEDIUM, 0.5);
5549 design->setCost(MARMITE, 3);
5550 design = new Design(invention_defences[8], false);
5551 design->setCost(WOOD, 0.5);
5552 design->setCost(MOONLITE, 2);
5553 design->setCost(MARMITE, 3);
5554 design = new Design(invention_defences[8], false);
5555 design->setCost(WOOD, 0.5);
5556 design->setCost(VALIUM, 2);
5557 design->setCost(MARMITE, 3);
5558 design = new Design(invention_defences[8], false);
5559 design->setCost(WOOD, 0.5);
5560 design->setCost(MORON, 2);
5561 design->setCost(MARMITE, 3);
5562 design = new Design(invention_defences[8], false);
5563 design->setCost(WOOD, 0.5);
5564 design->setCost(MARMITE, 3);
5565 design->setCost(ALIEN, 2);
5566 design = new Design(invention_defences[8], false);
5567 design->setCost(WOOD, 2.5);
5568 design->setCost(MARMITE, 3);
5569 // 9 - sdi laser (5)
5570 // slate, bethlium, aruldite, moron, alien, solarium, paladium
5571 // ergo: ?
5572 // from tips: moron, alien
5573 design = new Design(invention_defences[9], false);
5574 design->setCost(SLATE, 1.5);
5575 design->setCost(ALIEN, 3.5);
5576 design = new Design(invention_defences[9], false);
5577 design->setCost(SLATE, 3.5);
5578 design->setCost(MORON, 1.5);
5579 design = new Design(invention_defences[9], false);
5580 design->setCost(WOOD, 3.5);
5581 design->setCost(MORON, 1.5);
5582 design = new Design(invention_defences[9], false);
5583 design->setCost(BETHLIUM, 1.5);
5584 design->setCost(ALIEN, 3.5);
5585 design = new Design(invention_defences[9], false);
5586 design->setCost(BETHLIUM, 3.5);
5587 design->setCost(MORON, 1.5);
5588 design = new Design(invention_defences[9], false);
5589 design->setCost(PALADIUM, 3.5);
5590 design->setCost(MORON, 1.5);
5591 design = new Design(invention_defences[9], false);
5592 design->setCost(MORON, 1);
5593 design->setCost(MARMITE, 4);
5594 design = new Design(invention_defences[9], false);
5595 design->setCost(MORON, 5);
5596 design = new Design(invention_defences[9], false);
5597 design->setCost(YERIDIUM, 1.5);
5598 design->setCost(ALIEN, 3.5);
5599 design = new Design(invention_defences[9], false);
5600 design->setCost(ARULDITE, 1.5);
5601 design->setCost(ALIEN, 3.5);
5602 design = new Design(invention_defences[9], false);
5603 design->setCost(ARULDITE, 3.5);
5604 design->setCost(ALIEN, 1.5);
5605 design = new Design(invention_defences[9], false);
5606 design->setCost(SOLARIUM, 1.5);
5607 design->setCost(ALIEN, 3.5);
5608 design = new Design(invention_defences[9], true);
5609 design->setCost(MORON, 1.5);
5610 design->setCost(ALIEN, 3.5);
5611 design = new Design(invention_defences[9], false);
5612 design->setCost(MARMITE, 1.5);
5613 design->setCost(ALIEN, 3.5);
5614 design = new Design(invention_defences[9], false);
5615 design->setCost(ALIEN, 5);
5616
5617 // Shields (all 3 ?)
5618 // from af tips: wood, rock, bones, slate, moonlite, planetarium, bethlium, solarium, aruldite, herbirite, yeridium, aquarium, paladium, moron, marmite, alien
5619 // 0 (9500BC)
5620 design = new Design(invention_shields[0], false);
5621 design->setCost(WOOD, 3);
5622 design = new Design(invention_shields[0], false);
5623 design->setCost(BONE, 3);
5624 design = new Design(invention_shields[0], false);
5625 design->setCost(SLATE, 3);
5626 design = new Design(invention_shields[0], false);
5627 design->setCost(ROCK, 3);
5628 design = new Design(invention_shields[0], false);
5629 design->setCost(PLANETARIUM, 3);
5630 design = new Design(invention_shields[0], false);
5631 design->setCost(MOONLITE, 3);
5632 // 1 (3000BC)
5633 design = new Design(invention_shields[1], false);
5634 design->setCost(WOOD, 3);
5635 design = new Design(invention_shields[1], false);
5636 design->setCost(ROCK, 3);
5637 design = new Design(invention_shields[1], false);
5638 design->setCost(BONE, 3);
5639 design = new Design(invention_shields[1], false);
5640 design->setCost(ROCK, 2);
5641 design->setCost(BONE, 1);
5642 design = new Design(invention_shields[1], false);
5643 design->setCost(ROCK, 1);
5644 design->setCost(SLATE, 2);
5645 design = new Design(invention_shields[1], false);
5646 design->setCost(ROCK, 1);
5647 design->setCost(MOONLITE, 2);
5648 design = new Design(invention_shields[1], false);
5649 design->setCost(WOOD, 1);
5650 design->setCost(BETHLIUM, 2);
5651 design = new Design(invention_shields[1], false);
5652 design->setCost(WOOD, 1);
5653 design->setCost(AQUARIUM, 2);
5654 design = new Design(invention_shields[1], false);
5655 design->setCost(BONE, 1);
5656 design->setCost(VALIUM, 2);
5657 design = new Design(invention_shields[1], false);
5658 design->setCost(BETHLIUM, 2);
5659 design->setCost(VALIUM, 1);
5660 design = new Design(invention_shields[1], false);
5661 design->setCost(BONE, 1);
5662 design->setCost(HERBIRITE, 2);
5663 design = new Design(invention_shields[1], false);
5664 design->setCost(BETHLIUM, 3);
5665 design = new Design(invention_shields[1], false);
5666 design->setCost(SOLARIUM, 3);
5667 design = new Design(invention_shields[1], true);
5668 design->setCost(WOOD, 1);
5669 design->setCost(SOLARIUM, 2);
5670 design = new Design(invention_shields[1], true);
5671 design->setCost(BONE, 1);
5672 design->setCost(SOLARIUM, 2);
5673 design = new Design(invention_shields[1], false);
5674 design->setCost(BETHLIUM, 2);
5675 design->setCost(HERBIRITE, 1);
5676 design = new Design(invention_shields[1], false);
5677 design->setCost(ARULDITE, 3);
5678 design = new Design(invention_shields[1], false);
5679 design->setCost(BETHLIUM, 2);
5680 design->setCost(PARASITE, 1);
5681 design = new Design(invention_shields[1], false);
5682 design->setCost(BETHLIUM, 2);
5683 design->setCost(AQUARIUM, 1);
5684 design = new Design(invention_shields[1], false);
5685 design->setCost(SOLARIUM, 2);
5686 design->setCost(PARASITE, 1);
5687 design = new Design(invention_shields[1], false);
5688 design->setCost(SOLARIUM, 2);
5689 design->setCost(AQUARIUM, 1);
5690 design = new Design(invention_shields[1], true);
5691 design->setCost(ROCK, 1);
5692 design->setCost(ARULDITE, 2);
5693 design = new Design(invention_shields[1], true);
5694 design->setCost(BONE, 1);
5695 design->setCost(ARULDITE, 2);
5696 design = new Design(invention_shields[1], false);
5697 design->setCost(SLATE, 1);
5698 design->setCost(ARULDITE, 2);
5699 design = new Design(invention_shields[1], false);
5700 design->setCost(PLANETARIUM, 1);
5701 design->setCost(ARULDITE, 2);
5702 design = new Design(invention_shields[1], false);
5703 design->setCost(SOLARIUM, 2);
5704 design->setCost(ARULDITE, 1);
5705 design = new Design(invention_shields[1], false);
5706 design->setCost(MOONLITE, 1);
5707 design->setCost(SOLARIUM, 2);
5708 // 2 (100AD)
5709 design = new Design(invention_shields[2], false);
5710 design->setCost(WOOD, 0.5);
5711 design->setCost(SLATE, 2.5);
5712 design = new Design(invention_shields[2], false);
5713 design->setCost(WOOD, 0.5);
5714 design->setCost(MOONLITE, 2.5);
5715 design = new Design(invention_shields[2], false);
5716 design->setCost(SLATE, 2.5);
5717 design->setCost(MOONLITE, 0.5);
5718 design = new Design(invention_shields[2], false);
5719 design->setCost(BONE, 0.5);
5720 design->setCost(MOONLITE, 2.5);
5721 design = new Design(invention_shields[2], false);
5722 design->setCost(ROCK, 0.5);
5723 design->setCost(MOONLITE, 2.5);
5724 design = new Design(invention_shields[2], false);
5725 design->setCost(ROCK, 0.5);
5726 design->setCost(PLANETARIUM, 2.5);
5727 design = new Design(invention_shields[2], false);
5728 design->setCost(PLANETARIUM, 3);
5729 design = new Design(invention_shields[2], false);
5730 design->setCost(MOONLITE, 2.5);
5731 design->setCost(BETHLIUM, 0.5);
5732 design = new Design(invention_shields[2], false);
5733 design->setCost(HERBIRITE, 3);
5734 design = new Design(invention_shields[2], true);
5735 design->setCost(PLANETARIUM, 2.5);
5736 design->setCost(HERBIRITE, 0.5);
5737 design = new Design(invention_shields[2], false);
5738 design->setCost(PLANETARIUM, 2.5);
5739 design->setCost(SOLARIUM, 0.5);
5740 design = new Design(invention_shields[2], false);
5741 design->setCost(SLATE, 3);
5742 design = new Design(invention_shields[2], false);
5743 design->setCost(SLATE, 2.5);
5744 design->setCost(ONION, 0.5);
5745 design = new Design(invention_shields[2], false);
5746 design->setCost(SLATE, 2.5);
5747 design->setCost(SOLARIUM, 0.5);
5748 design = new Design(invention_shields[2], false);
5749 design->setCost(WOOD, 0.5);
5750 design->setCost(SOLARIUM, 2.5);
5751 design = new Design(invention_shields[2], false);
5752 design->setCost(SLATE, 2.5);
5753 design->setCost(ARULDITE, 0.5);
5754 design = new Design(invention_shields[2], false);
5755 design->setCost(PLANETARIUM, 2.5);
5756 design->setCost(ARULDITE, 0.5);
5757 design = new Design(invention_shields[2], true);
5758 design->setCost(SLATE, 2.5);
5759 design->setCost(YERIDIUM, 0.5);
5760 design = new Design(invention_shields[2], true);
5761 design->setCost(MOONLITE, 2.5);
5762 design->setCost(YERIDIUM, 0.5);
5763 design = new Design(invention_shields[2], false);
5764 design->setCost(MOONLITE, 2);
5765 design->setCost(YERIDIUM, 0.5);
5766 design->setCost(VALIUM, 0.5);
5767 design = new Design(invention_shields[2], false);
5768 design->setCost(WOOD, 2.5);
5769 design->setCost(YERIDIUM, 0.5);
5770 design = new Design(invention_shields[2], false);
5771 design->setCost(BONE, 2.5);
5772 design->setCost(YERIDIUM, 0.5);
5773 design = new Design(invention_shields[2], false);
5774 design->setCost(YERIDIUM, 0.5);
5775 design->setCost(AQUARIUM, 2.5);
5776 design = new Design(invention_shields[2], false);
5777 design->setCost(BONE, 0.5);
5778 design->setCost(PLANETARIUM, 2.5);
5779 design = new Design(invention_shields[2], false);
5780 design->setCost(MOONLITE, 3);
5781 design = new Design(invention_shields[2], false);
5782 design->setCost(MOONLITE, 2.5);
5783 design->setCost(PARASITE, 0.5);
5784 design = new Design(invention_shields[2], false);
5785 design->setCost(MOONLITE, 2.5);
5786 design->setCost(AQUARIUM, 0.5);
5787 design = new Design(invention_shields[2], false);
5788 design->setCost(MOONLITE, 2.5);
5789 design->setCost(BETHLIUM, 0.5);
5790 // 3 (900AD)
5791 design = new Design(invention_shields[3], false);
5792 design->setCost(ROCK, 2);
5793 design->setCost(BONE, 0.5);
5794 design->setCost(VALIUM, 0.5);
5795 design = new Design(invention_shields[3], true);
5796 design->setCost(BONE, 2);
5797 design->setCost(HERBIRITE, 0.5);
5798 design->setCost(VALIUM, 0.5);
5799 design = new Design(invention_shields[3], false);
5800 design->setCost(HERBIRITE, 2.5);
5801 design->setCost(VALIUM, 0.5);
5802 design = new Design(invention_shields[3], false);
5803 design->setCost(HERBIRITE, 0.5);
5804 design->setCost(VALIUM, 2.5);
5805 design = new Design(invention_shields[3], false);
5806 design->setCost(HERBIRITE, 0.5);
5807 design->setCost(PARASITE, 2.5);
5808 design = new Design(invention_shields[3], false);
5809 design->setCost(WOOD, 2);
5810 design->setCost(PARASITE, 1);
5811 design = new Design(invention_shields[3], false);
5812 design->setCost(WOOD, 2);
5813 design->setCost(HERBIRITE, 1);
5814 design = new Design(invention_shields[3], false);
5815 design->setCost(WOOD, 2.5);
5816 design->setCost(HERBIRITE, 0.5);
5817 design = new Design(invention_shields[3], false);
5818 design->setCost(WOOD, 0.5);
5819 design->setCost(MOONLITE, 2.5);
5820 design = new Design(invention_shields[3], false);
5821 design->setCost(WOOD, 2);
5822 design->setCost(HERBIRITE, 0.5);
5823 design->setCost(PALADIUM, 0.5);
5824 design = new Design(invention_shields[3], false);
5825 design->setCost(WOOD, 2);
5826 design->setCost(HERBIRITE, 0.5);
5827 design->setCost(AQUARIUM, 0.5);
5828 design = new Design(invention_shields[3], false);
5829 design->setCost(BONE, 2);
5830 design->setCost(VALIUM, 0.5);
5831 design->setCost(AQUARIUM, 0.5);
5832 design = new Design(invention_shields[3], false);
5833 design->setCost(BONE, 2);
5834 design->setCost(YERIDIUM, 1);
5835 design = new Design(invention_shields[3], false);
5836 design->setCost(BONE, 2.5);
5837 design->setCost(YERIDIUM, 0.5);
5838 design = new Design(invention_shields[3], false);
5839 design->setCost(ROCK, 2.5);
5840 design->setCost(YERIDIUM, 0.5);
5841 design = new Design(invention_shields[3], false);
5842 design->setCost(BONE, 2.5);
5843 design->setCost(VALIUM, 0.5);
5844 design = new Design(invention_shields[3], false);
5845 design->setCost(ROCK, 2.5);
5846 design->setCost(VALIUM, 0.5);
5847 design = new Design(invention_shields[3], false);
5848 design->setCost(ROCK, 2);
5849 design->setCost(VALIUM, 1);
5850 design = new Design(invention_shields[3], false);
5851 design->setCost(YERIDIUM, 2);
5852 design->setCost(PARASITE, 1);
5853 design = new Design(invention_shields[3], false);
5854 design->setCost(YERIDIUM, 0.5);
5855 design->setCost(PARASITE, 2.5);
5856 design = new Design(invention_shields[3], false);
5857 design->setCost(WOOD, 2);
5858 design->setCost(SOLARIUM, 0.5);
5859 design->setCost(PARASITE, 0.5);
5860 design = new Design(invention_shields[3], false);
5861 design->setCost(WOOD, 2);
5862 design->setCost(BETHLIUM, 0.5);
5863 design->setCost(PARASITE, 0.5);
5864 design = new Design(invention_shields[3], false);
5865 design->setCost(BETHLIUM, 2);
5866 design->setCost(YERIDIUM, 0.5);
5867 design->setCost(PARASITE, 0.5);
5868 design = new Design(invention_shields[3], false);
5869 design->setCost(ROCK, 2);
5870 design->setCost(SOLARIUM, 0.5);
5871 design->setCost(HERBIRITE, 0.5);
5872 design = new Design(invention_shields[3], false);
5873 design->setCost(ROCK, 2);
5874 design->setCost(HERBIRITE, 1);
5875 design = new Design(invention_shields[3], false);
5876 design->setCost(SLATE, 2);
5877 design->setCost(YERIDIUM, 0.5);
5878 design->setCost(PARASITE, 0.5);
5879 design = new Design(invention_shields[3], false);
5880 design->setCost(WOOD, 2);
5881 design->setCost(MOONLITE, 0.5);
5882 design->setCost(YERIDIUM, 0.5);
5883 design = new Design(invention_shields[3], true);
5884 design->setCost(BONE, 2);
5885 design->setCost(YERIDIUM, 0.5);
5886 design->setCost(VALIUM, 0.5);
5887 // ***
5888 design = new Design(invention_shields[3], false);
5889 design->setCost(ROCK, 2.5);
5890 design->setCost(PLANETARIUM, 0.5);
5891 // 4 (1400AD)
5892 design = new Design(invention_shields[4], false);
5893 design->setCost(ROCK, 3);
5894 design = new Design(invention_shields[4], false);
5895 design->setCost(BONE, 3);
5896 design = new Design(invention_shields[4], false);
5897 design->setCost(WOOD, 3);
5898 design = new Design(invention_shields[4], false);
5899 design->setCost(AQUARIUM, 3);
5900 design = new Design(invention_shields[4], false);
5901 design->setCost(BONE, 2.5);
5902 design->setCost(WOOD, 0.5);
5903 design = new Design(invention_shields[4], false);
5904 design->setCost(ROCK, 2.5);
5905 design->setCost(MOONLITE, 0.5);
5906 design = new Design(invention_shields[4], false);
5907 design->setCost(WOOD, 2.5);
5908 design->setCost(MOONLITE, 0.5);
5909 design = new Design(invention_shields[4], true);
5910 design->setCost(WOOD, 2.5);
5911 design->setCost(AQUARIUM, 0.5);
5912 design = new Design(invention_shields[4], true);
5913 design->setCost(ROCK, 2.5);
5914 design->setCost(AQUARIUM, 0.5);
5915 design = new Design(invention_shields[4], true);
5916 design->setCost(BONE, 2.5);
5917 design->setCost(AQUARIUM, 0.5);
5918 design = new Design(invention_shields[4], false);
5919 design->setCost(BONE, 2.5);
5920 design->setCost(BETHLIUM, 0.5);
5921 design = new Design(invention_shields[4], false);
5922 design->setCost(BONE, 2.5);
5923 design->setCost(MOONLITE, 0.5);
5924 design = new Design(invention_shields[4], false);
5925 design->setCost(BONE, 2.5);
5926 design->setCost(VALIUM, 0.5);
5927 design = new Design(invention_shields[4], false);
5928 design->setCost(ROCK, 2.5);
5929 design->setCost(VALIUM, 0.5);
5930 design = new Design(invention_shields[4], false);
5931 design->setCost(WOOD, 2.5);
5932 design->setCost(ONION, 0.5);
5933 design = new Design(invention_shields[4], false);
5934 design->setCost(BONE, 2.5);
5935 design->setCost(ONION, 0.5);
5936 design = new Design(invention_shields[4], false);
5937 design->setCost(BONE, 2.5);
5938 design->setCost(SOLARIUM, 0.5);
5939 design = new Design(invention_shields[4], false);
5940 design->setCost(WOOD, 0.5);
5941 design->setCost(ROCK, 2.5);
5942 design = new Design(invention_shields[4], false);
5943 design->setCost(ROCK, 2.5);
5944 design->setCost(BONE, 0.5);
5945 design = new Design(invention_shields[4], false);
5946 design->setCost(ROCK, 2.5);
5947 design->setCost(SLATE, 0.5);
5948 design = new Design(invention_shields[4], false);
5949 design->setCost(ROCK, 2.5);
5950 design->setCost(PLANETARIUM, 0.5);
5951 design = new Design(invention_shields[4], false);
5952 design->setCost(ROCK, 2.5);
5953 design->setCost(YERIDIUM, 0.5);
5954 design = new Design(invention_shields[4], true);
5955 design->setCost(ROCK, 2.5);
5956 design->setCost(PALADIUM, 0.5);
5957 design = new Design(invention_shields[4], false);
5958 design->setCost(PALADIUM, 3);
5959 design = new Design(invention_shields[4], true);
5960 design->setCost(HERBIRITE, 2.5);
5961 design->setCost(PALADIUM, 0.5);
5962 design = new Design(invention_shields[4], true);
5963 design->setCost(TEDIUM, 2.5);
5964 design->setCost(PALADIUM, 0.5);
5965 design = new Design(invention_shields[4], false);
5966 design->setCost(PALADIUM, 0.5);
5967 design->setCost(ONION, 2.5);
5968 design = new Design(invention_shields[4], false);
5969 design->setCost(PALADIUM, 0.5);
5970 design->setCost(MARMITE, 2.5);
5971 design = new Design(invention_shields[4], false);
5972 design->setCost(AQUARIUM, 0.5);
5973 design->setCost(TEDIUM, 2.5);
5974 design = new Design(invention_shields[4], false);
5975 design->setCost(AQUARIUM, 0.5);
5976 design->setCost(PALADIUM, 2.5);
5977 design = new Design(invention_shields[4], false);
5978 design->setCost(AQUARIUM, 0.5);
5979 design->setCost(MORON, 2.5);
5980 design = new Design(invention_shields[4], false);
5981 design->setCost(PLANETARIUM, 2.5);
5982 design->setCost(PALADIUM, 0.5);
5983 design = new Design(invention_shields[4], false);
5984 design->setCost(YERIDIUM, 2.5);
5985 design->setCost(PALADIUM, 0.5);
5986 design = new Design(invention_shields[4], false);
5987 design->setCost(YERIDIUM, 2.5);
5988 design->setCost(AQUARIUM, 0.5);
5989 design = new Design(invention_shields[4], false);
5990 design->setCost(WOOD, 2.5);
5991 design->setCost(SLATE, 0.5);
5992 design = new Design(invention_shields[4], false);
5993 design->setCost(AQUARIUM, 0.5);
5994 design->setCost(ONION, 2.5);
5995 design = new Design(invention_shields[4], false);
5996 design->setCost(WOOD, 2.5);
5997 design->setCost(SOLARIUM, 0.5);
5998 design = new Design(invention_shields[4], false);
5999 design->setCost(WOOD, 2.5);
6000 design->setCost(HERBIRITE, 0.5);
6001 design = new Design(invention_shields[4], false);
6002 design->setCost(BETHLIUM, 2.5);
6003 design->setCost(AQUARIUM, 0.5);
6004 design = new Design(invention_shields[4], false);
6005 design->setCost(MOONLITE, 2.5);
6006 design->setCost(AQUARIUM, 0.5);
6007 design = new Design(invention_shields[4], false);
6008 design->setCost(HERBIRITE, 2.5);
6009 design->setCost(AQUARIUM, 0.5);
6010 design = new Design(invention_shields[4], false);
6011 design->setCost(VALIUM, 2.5);
6012 design->setCost(AQUARIUM, 0.5);
6013 design = new Design(invention_shields[4], false);
6014 design->setCost(PARASITE, 2.5);
6015 design->setCost(AQUARIUM, 0.5);
6016 design = new Design(invention_shields[4], false);
6017 design->setCost(ROCK, 2.5);
6018 design->setCost(ARULDITE, 0.5);
6019 design = new Design(invention_shields[4], false);
6020 design->setCost(WOOD, 2.5);
6021 design->setCost(ARULDITE, 0.5);
6022 design = new Design(invention_shields[4], false);
6023 design->setCost(WOOD, 2.5);
6024 design->setCost(PLANETARIUM, 0.5);
6025 design = new Design(invention_shields[4], false);
6026 design->setCost(ARULDITE, 2.5);
6027 design->setCost(AQUARIUM, 0.5);
6028 // 5 (1850AD)
6029 design = new Design(invention_shields[5], false);
6030 design->setCost(BONE, 0.5);
6031 design->setCost(BETHLIUM, 2.5);
6032 design = new Design(invention_shields[5], false);
6033 design->setCost(BONE, 1.5);
6034 design->setCost(BETHLIUM, 1.5);
6035 design = new Design(invention_shields[5], false);
6036 design->setCost(WOOD, 0.5);
6037 design->setCost(SOLARIUM, 2.5);
6038 design = new Design(invention_shields[5], false);
6039 design->setCost(WOOD, 1.5);
6040 design->setCost(SOLARIUM, 1.5);
6041 design = new Design(invention_shields[5], false);
6042 design->setCost(BONE, 1.5);
6043 design->setCost(SOLARIUM, 1.5);
6044 design = new Design(invention_shields[5], false);
6045 design->setCost(ROCK, 1.5);
6046 design->setCost(ARULDITE, 1.5);
6047 design = new Design(invention_shields[5], false);
6048 design->setCost(ROCK, 0.5);
6049 design->setCost(ARULDITE, 2.5);
6050 design = new Design(invention_shields[5], false);
6051 design->setCost(ROCK, 0.5);
6052 design->setCost(SOLARIUM, 2.5);
6053 design = new Design(invention_shields[5], false);
6054 design->setCost(ROCK, 0.5);
6055 design->setCost(BETHLIUM, 2.5);
6056 design = new Design(invention_shields[5], false);
6057 design->setCost(WOOD, 0.5);
6058 design->setCost(ARULDITE, 2.5);
6059 design = new Design(invention_shields[5], false);
6060 design->setCost(WOOD, 1.5);
6061 design->setCost(ARULDITE, 1.5);
6062 design = new Design(invention_shields[5], false);
6063 design->setCost(WOOD, 0.5);
6064 design->setCost(BETHLIUM, 2.5);
6065 design = new Design(invention_shields[5], false);
6066 design->setCost(WOOD, 2);
6067 design->setCost(AQUARIUM, 1);
6068 design = new Design(invention_shields[5], false);
6069 design->setCost(WOOD, 0.5);
6070 design->setCost(AQUARIUM, 2.5);
6071 design = new Design(invention_shields[5], false);
6072 design->setCost(BONE, 0.5);
6073 design->setCost(AQUARIUM, 2.5);
6074 design = new Design(invention_shields[5], false);
6075 design->setCost(BONE, 2.5);
6076 design->setCost(ARULDITE, 0.5);
6077 design = new Design(invention_shields[5], false);
6078 design->setCost(BONE, 1.5);
6079 design->setCost(ARULDITE, 1.5);
6080 design = new Design(invention_shields[5], false);
6081 design->setCost(BONE, 0.5);
6082 design->setCost(ARULDITE, 2.5);
6083 design = new Design(invention_shields[5], false);
6084 design->setCost(SOLARIUM, 0.5);
6085 design->setCost(AQUARIUM, 2.5);
6086 design = new Design(invention_shields[5], false);
6087 design->setCost(ARULDITE, 1.5);
6088 design->setCost(AQUARIUM, 1.5);
6089 design = new Design(invention_shields[5], true);
6090 design->setCost(WOOD, 0.5);
6091 design->setCost(ARULDITE, 1.5);
6092 design->setCost(PALADIUM, 1);
6093 design = new Design(invention_shields[5], true);
6094 design->setCost(WOOD, 0.5);
6095 design->setCost(ARULDITE, 1.5);
6096 design->setCost(AQUARIUM, 1);
6097 design = new Design(invention_shields[5], false);
6098 design->setCost(WOOD, 0.5);
6099 design->setCost(ARULDITE, 1.5);
6100 design->setCost(ONION, 1);
6101 design = new Design(invention_shields[5], true);
6102 design->setCost(WOOD, 0.5);
6103 design->setCost(BETHLIUM, 1.5);
6104 design->setCost(AQUARIUM, 1);
6105 design = new Design(invention_shields[5], false);
6106 design->setCost(WOOD, 0.5);
6107 design->setCost(SLATE, 1.5);
6108 design->setCost(AQUARIUM, 1);
6109 design = new Design(invention_shields[5], false);
6110 design->setCost(ARULDITE, 1.5);
6111 design->setCost(AQUARIUM, 1);
6112 design->setCost(ONION, 0.5);
6113 design = new Design(invention_shields[5], false);
6114 design->setCost(ARULDITE, 1.5);
6115 design->setCost(PALADIUM, 1);
6116 design->setCost(TEDIUM, 0.5);
6117 design = new Design(invention_shields[5], false);
6118 design->setCost(WOOD, 0.5);
6119 design->setCost(PALADIUM, 1);
6120 design->setCost(MORON, 1.5);
6121 design = new Design(invention_shields[5], false);
6122 design->setCost(BETHLIUM, 2);
6123 design->setCost(PALADIUM, 1);
6124 design = new Design(invention_shields[5], false);
6125 design->setCost(BETHLIUM, 2);
6126 design->setCost(AQUARIUM, 1);
6127 design = new Design(invention_shields[5], false);
6128 design->setCost(PALADIUM, 0.5);
6129 design->setCost(ONION, 2.5);
6130 design = new Design(invention_shields[5], false);
6131 design->setCost(ROCK, 0.5);
6132 design->setCost(HERBIRITE, 1.5);
6133 design->setCost(PALADIUM, 1);
6134 design = new Design(invention_shields[5], true);
6135 design->setCost(ROCK, 0.5);
6136 design->setCost(ARULDITE, 1.5);
6137 design->setCost(AQUARIUM, 1);
6138 design = new Design(invention_shields[5], true);
6139 design->setCost(BONE, 0.5);
6140 design->setCost(ARULDITE, 1.5);
6141 design->setCost(AQUARIUM, 1);
6142 design = new Design(invention_shields[5], false);
6143 design->setCost(WOOD, 0.5);
6144 design->setCost(YERIDIUM, 1.5);
6145 design->setCost(AQUARIUM, 1);
6146 // 6 (1915AD)
6147 design = new Design(invention_shields[6], false);
6148 design->setCost(ROCK, 2.5);
6149 design->setCost(YERIDIUM, 0.5);
6150 design = new Design(invention_shields[6], false);
6151 design->setCost(ROCK, 2.5);
6152 design->setCost(MORON, 0.5);
6153 design = new Design(invention_shields[6], false);
6154 design->setCost(WOOD, 2);
6155 design->setCost(YERIDIUM, 1);
6156 design = new Design(invention_shields[6], false);
6157 design->setCost(WOOD, 2.5);
6158 design->setCost(YERIDIUM, 0.5);
6159 design = new Design(invention_shields[6], false);
6160 design->setCost(WOOD, 2);
6161 design->setCost(PALADIUM, 1);
6162 design = new Design(invention_shields[6], false);
6163 design->setCost(WOOD, 2);
6164 design->setCost(YERIDIUM, 0.5);
6165 design->setCost(PALADIUM, 0.5);
6166 design = new Design(invention_shields[6], false);
6167 design->setCost(WOOD, 2);
6168 design->setCost(YERIDIUM, 0.5);
6169 design->setCost(PARASITE, 0.5);
6170 design = new Design(invention_shields[6], false);
6171 design->setCost(WOOD, 2);
6172 design->setCost(YERIDIUM, 0.5);
6173 design->setCost(AQUARIUM, 0.5);
6174 design = new Design(invention_shields[6], false);
6175 design->setCost(ROCK, 2);
6176 design->setCost(PALADIUM, 1);
6177 design = new Design(invention_shields[6], false);
6178 design->setCost(WOOD, 0.5);
6179 design->setCost(ROCK, 2);
6180 design->setCost(HERBIRITE, 0.5);
6181 design = new Design(invention_shields[6], false);
6182 design->setCost(WOOD, 0.5);
6183 design->setCost(PALADIUM, 1.5);
6184 design->setCost(VALIUM, 1);
6185 design = new Design(invention_shields[6], false);
6186 design->setCost(WOOD, 2);
6187 design->setCost(AQUARIUM, 0.5);
6188 design->setCost(HERBIRITE, 0.5);
6189 design = new Design(invention_shields[6], false);
6190 design->setCost(WOOD, 2);
6191 design->setCost(AQUARIUM, 0.5);
6192 design->setCost(MORON, 0.5);
6193 design = new Design(invention_shields[6], false);
6194 design->setCost(WOOD, 2);
6195 design->setCost(SLATE, 0.5);
6196 design->setCost(HERBIRITE, 0.5);
6197 design = new Design(invention_shields[6], false);
6198 design->setCost(ROCK, 2);
6199 design->setCost(SLATE, 0.5);
6200 design->setCost(HERBIRITE, 0.5);
6201 design = new Design(invention_shields[6], false);
6202 design->setCost(BONE, 2.5);
6203 design->setCost(MORON, 0.5);
6204 design = new Design(invention_shields[6], false);
6205 design->setCost(BETHLIUM, 2);
6206 design->setCost(YERIDIUM, 0.5);
6207 design->setCost(MORON, 0.5);
6208 design = new Design(invention_shields[6], false);
6209 design->setCost(ROCK, 2);
6210 design->setCost(YERIDIUM, 0.5);
6211 design->setCost(ONION, 0.5);
6212 design = new Design(invention_shields[6], false);
6213 design->setCost(ROCK, 2);
6214 design->setCost(YERIDIUM, 0.5);
6215 design->setCost(MARMITE, 0.5);
6216 design = new Design(invention_shields[6], false);
6217 design->setCost(ARULDITE, 2);
6218 design->setCost(HERBIRITE, 0.5);
6219 design->setCost(MORON, 0.5);
6220 design = new Design(invention_shields[6], false);
6221 design->setCost(YERIDIUM, 2.5);
6222 design->setCost(MORON, 0.5);
6223 design = new Design(invention_shields[6], false);
6224 design->setCost(HERBIRITE, 0.5);
6225 design->setCost(MORON, 2.5);
6226 design = new Design(invention_shields[6], false);
6227 design->setCost(HERBIRITE, 2.5);
6228 design->setCost(MORON, 0.5);
6229 design = new Design(invention_shields[6], true);
6230 design->setCost(ROCK, 2);
6231 design->setCost(HERBIRITE, 0.5);
6232 design->setCost(MORON, 0.5);
6233 design = new Design(invention_shields[6], false);
6234 design->setCost(WOOD, 2);
6235 design->setCost(PALADIUM, 0.5);
6236 design->setCost(MORON, 0.5);
6237 design = new Design(invention_shields[6], false);
6238 design->setCost(ROCK, 2);
6239 design->setCost(ARULDITE, 0.5);
6240 design->setCost(HERBIRITE, 0.5);
6241 design = new Design(invention_shields[6], false);
6242 design->setCost(BONE, 2.5);
6243 design->setCost(YERIDIUM, 0.5);
6244 design = new Design(invention_shields[6], false);
6245 design->setCost(WOOD, 2);
6246 design->setCost(SOLARIUM, 0.5);
6247 design->setCost(YERIDIUM, 0.5);
6248 design = new Design(invention_shields[6], false);
6249 design->setCost(ARULDITE, 1.5);
6250 design->setCost(YERIDIUM, 0.5);
6251 design->setCost(AQUARIUM, 1);
6252 design = new Design(invention_shields[6], false);
6253 design->setCost(YERIDIUM, 0.5);
6254 design->setCost(AQUARIUM, 2);
6255 design->setCost(MORON, 0.5);
6256 design = new Design(invention_shields[6], false);
6257 design->setCost(BONE, 2);
6258 design->setCost(AQUARIUM, 0.5);
6259 design->setCost(MORON, 0.5);
6260 design = new Design(invention_shields[6], false);
6261 design->setCost(BONE, 2);
6262 design->setCost(SLATE, 0.5);
6263 design->setCost(YERIDIUM, 0.5);
6264 // 7 (1945AD)
6265 design = new Design(invention_shields[7], true);
6266 design->setCost(ROCK, 2);
6267 design->setCost(YERIDIUM, 0.5);
6268 design->setCost(MORON, 0.5);
6269 design = new Design(invention_shields[7], false);
6270 design->setCost(PALADIUM, 2);
6271 design->setCost(YERIDIUM, 0.5);
6272 design->setCost(MORON, 0.5);
6273 design = new Design(invention_shields[7], false);
6274 design->setCost(BONE, 2);
6275 design->setCost(YERIDIUM, 1);
6276 design = new Design(invention_shields[7], false);
6277 design->setCost(BONE, 1);
6278 design->setCost(SLATE, 1.5);
6279 design->setCost(MARMITE, 0.5);
6280 design = new Design(invention_shields[7], false);
6281 design->setCost(BONE, 1.5);
6282 design->setCost(ARULDITE, 1);
6283 design->setCost(MARMITE, 0.5);
6284 design = new Design(invention_shields[7], false);
6285 design->setCost(SLATE, 2);
6286 design->setCost(SOLARIUM, 1);
6287 design = new Design(invention_shields[7], false);
6288 design->setCost(SLATE, 2);
6289 design->setCost(BETHLIUM, 1);
6290 design = new Design(invention_shields[7], false);
6291 design->setCost(SLATE, 2);
6292 design->setCost(ARULDITE, 1);
6293 design = new Design(invention_shields[7], false);
6294 design->setCost(SLATE, 1.5);
6295 design->setCost(SOLARIUM, 1);
6296 design->setCost(TEDIUM, 0.5);
6297 design = new Design(invention_shields[7], false);
6298 design->setCost(SLATE, 1.5);
6299 design->setCost(ONION, 1);
6300 design->setCost(MARMITE, 0.5);
6301 design = new Design(invention_shields[7], false);
6302 design->setCost(SLATE, 1.5);
6303 design->setCost(PARASITE, 1);
6304 design->setCost(MARMITE, 0.5);
6305 design = new Design(invention_shields[7], false);
6306 design->setCost(SLATE, 1.5);
6307 design->setCost(MORON, 1);
6308 design->setCost(MARMITE, 0.5);
6309 design = new Design(invention_shields[7], false);
6310 design->setCost(WOOD, 0.5);
6311 design->setCost(SLATE, 1.5);
6312 design->setCost(ARULDITE, 1);
6313 design = new Design(invention_shields[7], false);
6314 design->setCost(WOOD, 0.5);
6315 design->setCost(PLANETARIUM, 1.5);
6316 design->setCost(ARULDITE, 1);
6317 design = new Design(invention_shields[7], false);
6318 design->setCost(WOOD, 2);
6319 design->setCost(HERBIRITE, 0.5);
6320 design->setCost(VALIUM, 0.5);
6321 design = new Design(invention_shields[7], false);
6322 design->setCost(ROCK, 1.5);
6323 design->setCost(ARULDITE, 1);
6324 design->setCost(MARMITE, 0.5);
6325 design = new Design(invention_shields[7], false);
6326 design->setCost(SLATE, 2.5);
6327 design->setCost(MARMITE, 0.5);
6328 design = new Design(invention_shields[7], false);
6329 design->setCost(SLATE, 1.5);
6330 design->setCost(MARMITE, 1.5);
6331 design = new Design(invention_shields[7], false);
6332 design->setCost(SLATE, 1.5);
6333 design->setCost(ARULDITE, 1);
6334 design->setCost(AQUARIUM, 0.5);
6335 design = new Design(invention_shields[7], false);
6336 design->setCost(SLATE, 1.5);
6337 design->setCost(ARULDITE, 1);
6338 design->setCost(ONION, 0.5);
6339 design = new Design(invention_shields[7], false);
6340 design->setCost(SLATE, 1.5);
6341 design->setCost(ARULDITE, 1);
6342 design->setCost(TEDIUM, 0.5);
6343 design = new Design(invention_shields[7], false);
6344 design->setCost(BETHLIUM, 1);
6345 design->setCost(MARMITE, 2);
6346 design = new Design(invention_shields[7], false);
6347 design->setCost(SOLARIUM, 1);
6348 design->setCost(MARMITE, 2);
6349 design = new Design(invention_shields[7], false);
6350 design->setCost(SOLARIUM, 2.5);
6351 design->setCost(MARMITE, 0.5);
6352 design = new Design(invention_shields[7], false);
6353 design->setCost(PLANETARIUM, 2);
6354 design->setCost(SOLARIUM, 1);
6355 design = new Design(invention_shields[7], false);
6356 design->setCost(SLATE, 1.5);
6357 design->setCost(ARULDITE, 1.5);
6358 design = new Design(invention_shields[7], false);
6359 design->setCost(MOONLITE, 2);
6360 design->setCost(ARULDITE, 1);
6361 design = new Design(invention_shields[7], false);
6362 design->setCost(MOONLITE, 1.5);
6363 design->setCost(ARULDITE, 1.5);
6364 design = new Design(invention_shields[7], false);
6365 design->setCost(PLANETARIUM, 1.5);
6366 design->setCost(ARULDITE, 1.5);
6367 design = new Design(invention_shields[7], false);
6368 design->setCost(PLANETARIUM, 1.5);
6369 design->setCost(BETHLIUM, 1.5);
6370 design = new Design(invention_shields[7], false);
6371 design->setCost(PLANETARIUM, 2.5);
6372 design->setCost(MARMITE, 0.5);
6373 design = new Design(invention_shields[7], false);
6374 design->setCost(PLANETARIUM, 1.5);
6375 design->setCost(ONION, 1);
6376 design->setCost(MARMITE, 0.5);
6377 design = new Design(invention_shields[7], false);
6378 design->setCost(PLANETARIUM, 1.5);
6379 design->setCost(AQUARIUM, 1);
6380 design->setCost(MARMITE, 0.5);
6381 design = new Design(invention_shields[7], false);
6382 design->setCost(MOONLITE, 1.5);
6383 design->setCost(SOLARIUM, 1.5);
6384 design = new Design(invention_shields[7], false);
6385 design->setCost(MOONLITE, 1.5);
6386 design->setCost(BETHLIUM, 1.5);
6387 design = new Design(invention_shields[7], false);
6388 design->setCost(ARULDITE, 1);
6389 design->setCost(MORON, 1.5);
6390 design->setCost(MARMITE, 0.5);
6391 design = new Design(invention_shields[7], false);
6392 design->setCost(ARULDITE, 1);
6393 design->setCost(ONION, 1.5);
6394 design->setCost(MARMITE, 0.5);
6395 design = new Design(invention_shields[7], false);
6396 design->setCost(ARULDITE, 1);
6397 design->setCost(AQUARIUM, 1.5);
6398 design->setCost(MARMITE, 0.5);
6399 design = new Design(invention_shields[7], false);
6400 design->setCost(ARULDITE, 1);
6401 design->setCost(MARMITE, 2);
6402 design = new Design(invention_shields[7], false);
6403 design->setCost(ARULDITE, 2.5);
6404 design->setCost(MARMITE, 0.5);
6405 design = new Design(invention_shields[7], true);
6406 design->setCost(MOONLITE, 1.5);
6407 design->setCost(ARULDITE, 1);
6408 design->setCost(MARMITE, 0.5);
6409 design = new Design(invention_shields[7], false);
6410 design->setCost(MOONLITE, 1.5);
6411 design->setCost(PARASITE, 1);
6412 design->setCost(MARMITE, 0.5);
6413 design = new Design(invention_shields[7], false);
6414 design->setCost(SLATE, 0.5);
6415 design->setCost(PLANETARIUM, 1.5);
6416 design->setCost(ARULDITE, 1);
6417 design = new Design(invention_shields[7], false);
6418 design->setCost(SLATE, 1.5);
6419 design->setCost(TEDIUM, 1);
6420 design->setCost(MARMITE, 0.5);
6421 design = new Design(invention_shields[7], false);
6422 design->setCost(MOONLITE, 1.5);
6423 design->setCost(PLANETARIUM, 0.5);
6424 design->setCost(ARULDITE, 1);
6425 design = new Design(invention_shields[7], false);
6426 design->setCost(BETHLIUM, 1);
6427 design->setCost(YERIDIUM, 1.5);
6428 design->setCost(MARMITE, 0.5);
6429 design = new Design(invention_shields[7], false);
6430 design->setCost(BETHLIUM, 1);
6431 design->setCost(TEDIUM, 1.5);
6432 design->setCost(MARMITE, 0.5);
6433 design = new Design(invention_shields[7], true);
6434 design->setCost(PLANETARIUM, 1.5);
6435 design->setCost(BETHLIUM, 1);
6436 design->setCost(MARMITE, 0.5);
6437 design = new Design(invention_shields[7], false);
6438 design->setCost(ROCK, 1.5);
6439 design->setCost(SOLARIUM, 1);
6440 design->setCost(MARMITE, 0.5);
6441 design = new Design(invention_shields[7], false);
6442 design->setCost(BETHLIUM, 1.5);
6443 design->setCost(SOLARIUM, 1);
6444 design->setCost(MARMITE, 0.5);
6445 // 8 (1980AD)
6446 design = new Design(invention_shields[8], false);
6447 design->setCost(BONE, 1.5);
6448 design->setCost(ARULDITE, 1);
6449 design->setCost(MARMITE, 0.5);
6450 design = new Design(invention_shields[8], false);
6451 design->setCost(BONE, 1);
6452 design->setCost(PARASITE, 1.5);
6453 design->setCost(MARMITE, 0.5);
6454 design = new Design(invention_shields[8], false);
6455 design->setCost(WOOD, 0.5);
6456 design->setCost(ARULDITE, 1);
6457 design->setCost(PARASITE, 1.5);
6458 design = new Design(invention_shields[8], false);
6459 design->setCost(SOLARIUM, 1);
6460 design->setCost(AQUARIUM, 1.5);
6461 design->setCost(MARMITE, 0.5);
6462 design = new Design(invention_shields[8], false);
6463 design->setCost(SOLARIUM, 1);
6464 design->setCost(YERIDIUM, 1.5);
6465 design->setCost(MARMITE, 0.5);
6466 design = new Design(invention_shields[8], false);
6467 design->setCost(PARASITE, 1.5);
6468 design->setCost(TEDIUM, 1);
6469 design->setCost(MARMITE, 0.5);
6470 design = new Design(invention_shields[8], true);
6471 design->setCost(ARULDITE, 1);
6472 design->setCost(PARASITE, 1.5);
6473 design->setCost(MARMITE, 0.5);
6474 design = new Design(invention_shields[8], false);
6475 design->setCost(ARULDITE, 1);
6476 design->setCost(AQUARIUM, 1.5);
6477 design->setCost(MARMITE, 0.5);
6478 design = new Design(invention_shields[8], false);
6479 design->setCost(ARULDITE, 1);
6480 design->setCost(VALIUM, 1.5);
6481 design->setCost(TEDIUM, 0.5);
6482 design = new Design(invention_shields[8], false);
6483 design->setCost(VALIUM, 1.5);
6484 design->setCost(PALADIUM, 1);
6485 design->setCost(MARMITE, 0.5);
6486 design = new Design(invention_shields[8], false);
6487 design->setCost(VALIUM, 1.5);
6488 design->setCost(MARMITE, 1.5);
6489 design = new Design(invention_shields[8], false);
6490 design->setCost(BETHLIUM, 1.5);
6491 design->setCost(VALIUM, 1.5);
6492 design = new Design(invention_shields[8], false);
6493 design->setCost(BETHLIUM, 1);
6494 design->setCost(VALIUM, 2);
6495 design = new Design(invention_shields[8], false);
6496 design->setCost(BETHLIUM, 2.5);
6497 design->setCost(MARMITE, 0.5);
6498 design = new Design(invention_shields[8], false);
6499 design->setCost(BETHLIUM, 1);
6500 design->setCost(MARMITE, 2);
6501 design = new Design(invention_shields[8], false);
6502 design->setCost(SOLARIUM, 1);
6503 design->setCost(MARMITE, 2);
6504 design = new Design(invention_shields[8], false);
6505 design->setCost(SOLARIUM, 2.5);
6506 design->setCost(MARMITE, 0.5);
6507 design = new Design(invention_shields[8], false);
6508 design->setCost(SOLARIUM, 1.5);
6509 design->setCost(PARASITE, 1.5);
6510 design = new Design(invention_shields[8], false);
6511 design->setCost(MOONLITE, 1.5);
6512 design->setCost(SOLARIUM, 1);
6513 design->setCost(MARMITE, 0.5);
6514 design = new Design(invention_shields[8], false);
6515 design->setCost(MOONLITE, 1);
6516 design->setCost(PARASITE, 1.5);
6517 design->setCost(MARMITE, 0.5);
6518 design = new Design(invention_shields[8], false);
6519 design->setCost(MOONLITE, 1.5);
6520 design->setCost(ARULDITE, 1);
6521 design->setCost(MARMITE, 0.5);
6522 design = new Design(invention_shields[8], false);
6523 design->setCost(ARULDITE, 2.5);
6524 design->setCost(MARMITE, 0.5);
6525 design = new Design(invention_shields[8], false);
6526 design->setCost(ARULDITE, 1);
6527 design->setCost(MARMITE, 2);
6528 design = new Design(invention_shields[8], false);
6529 design->setCost(PARASITE, 1.5);
6530 design->setCost(PALADIUM, 1);
6531 design->setCost(MARMITE, 0.5);
6532 design = new Design(invention_shields[8], false);
6533 design->setCost(BETHLIUM, 1);
6534 design->setCost(MARMITE, 0.5);
6535 design->setCost(ALIEN, 1.5);
6536 design = new Design(invention_shields[8], true);
6537 design->setCost(BETHLIUM, 1);
6538 design->setCost(VALIUM, 1.5);
6539 design->setCost(MARMITE, 0.5);
6540 design = new Design(invention_shields[8], false);
6541 design->setCost(BETHLIUM, 1);
6542 design->setCost(AQUARIUM, 1.5);
6543 design->setCost(MARMITE, 0.5);
6544 design = new Design(invention_shields[8], false);
6545 design->setCost(BETHLIUM, 1);
6546 design->setCost(TEDIUM, 1.5);
6547 design->setCost(MARMITE, 0.5);
6548 design = new Design(invention_shields[8], false);
6549 design->setCost(PARASITE, 1.5);
6550 design->setCost(MARMITE, 1.5);
6551 design = new Design(invention_shields[8], false);
6552 design->setCost(PARASITE, 1.5);
6553 design->setCost(MARMITE, 0.5);
6554 design->setCost(ALIEN, 1);
6555 design = new Design(invention_shields[8], false);
6556 design->setCost(SLATE, 0.5);
6557 design->setCost(SOLARIUM, 1);
6558 design->setCost(PARASITE, 1.5);
6559 design = new Design(invention_shields[8], false);
6560 design->setCost(SLATE, 1.5);
6561 design->setCost(ARULDITE, 1);
6562 design->setCost(MARMITE, 0.5);
6563 design = new Design(invention_shields[8], true);
6564 design->setCost(SOLARIUM, 1);
6565 design->setCost(VALIUM, 1.5);
6566 design->setCost(MARMITE, 0.5);
6567 // 9 (2001AD)
6568 design = new Design(invention_shields[9], false);
6569 design->setCost(BONE, 1);
6570 design->setCost(HERBIRITE, 2);
6571 design = new Design(invention_shields[9], false);
6572 design->setCost(WOOD, 2);
6573 design->setCost(ALIEN, 1);
6574 design = new Design(invention_shields[9], false);
6575 design->setCost(HERBIRITE, 2);
6576 design->setCost(TEDIUM, 1);
6577 design = new Design(invention_shields[9], false);
6578 design->setCost(HERBIRITE, 2);
6579 design->setCost(MARMITE, 1);
6580 design = new Design(invention_shields[9], false);
6581 design->setCost(HERBIRITE, 2);
6582 design->setCost(PALADIUM, 1);
6583 design = new Design(invention_shields[9], false);
6584 design->setCost(HERBIRITE, 2);
6585 design->setCost(PARASITE, 1);
6586 design = new Design(invention_shields[9], false);
6587 design->setCost(ROCK, 1);
6588 design->setCost(YERIDIUM, 2);
6589 design = new Design(invention_shields[9], false);
6590 design->setCost(ROCK, 1);
6591 design->setCost(HERBIRITE, 2);
6592 design = new Design(invention_shields[9], false);
6593 design->setCost(SLATE, 2);
6594 design->setCost(ALIEN, 1);
6595 design = new Design(invention_shields[9], false);
6596 design->setCost(ALIEN, 3);
6597 design = new Design(invention_shields[9], true);
6598 design->setCost(YERIDIUM, 2);
6599 design->setCost(ALIEN, 1);
6600 design = new Design(invention_shields[9], true);
6601 design->setCost(YERIDIUM, 2);
6602 design->setCost(MARMITE, 1);
6603 design = new Design(invention_shields[9], false);
6604 design->setCost(YERIDIUM, 2);
6605 design->setCost(MORON, 1);
6606 design = new Design(invention_shields[9], false);
6607 design->setCost(YERIDIUM, 2);
6608 design->setCost(PALADIUM, 1);
6609 design = new Design(invention_shields[9], false);
6610 design->setCost(YERIDIUM, 2);
6611 design->setCost(PARASITE, 1);
6612 design = new Design(invention_shields[9], false);
6613 design->setCost(YERIDIUM, 2);
6614 design->setCost(AQUARIUM, 1);
6615 design = new Design(invention_shields[9], false);
6616 design->setCost(YERIDIUM, 2);
6617 design->setCost(ONION, 1);
6618 design = new Design(invention_shields[9], false);
6619 design->setCost(MORON, 2);
6620 design->setCost(ALIEN, 1);
6621 design = new Design(invention_shields[9], false);
6622 design->setCost(YERIDIUM, 3);
6623 design = new Design(invention_shields[9], false);
6624 design->setCost(HERBIRITE, 3);
6625 design = new Design(invention_shields[9], false);
6626 design->setCost(ARULDITE, 2);
6627 design->setCost(ALIEN, 1);
6628 design = new Design(invention_shields[9], false);
6629 design->setCost(AQUARIUM, 2);
6630 design->setCost(ALIEN, 1);
6631 design = new Design(invention_shields[9], false);
6632 design->setCost(MARMITE, 2);
6633 design->setCost(ALIEN, 1);
6634 design = new Design(invention_shields[9], false);
6635 design->setCost(PALADIUM, 2);
6636 design->setCost(ALIEN, 1);
6637 design = new Design(invention_shields[9], false);
6638 design->setCost(BETHLIUM, 2);
6639 design->setCost(ALIEN, 1);
6640 design = new Design(invention_shields[9], false);
6641 design->setCost(BETHLIUM, 1);
6642 design->setCost(YERIDIUM, 2);
6643
6644 return true;
6645 }
6646