void button_clicked_fleet(int button) { Fleet *flt = (Fleet*)cur_object; if(button == BUTTON_LAND) { if(!flt->CanLand()) return; if(!flt->Location()) return; if(!flt->Location()->Represents()) return; if(((Planet*)flt->Location()->Represents())->colonies.size() < 1) { ((Planet*)flt->Location()->Represents())->colonies.push_back( new Colony(flt->Owner(), ((Planet*)flt->Location()->Represents())) ); } int which = 0; while(!flt->GetShip(which)->CanLand()) ++which; ((Planet*)flt->Location()->Represents())->colonies[0]->LandShip(flt->GetShip(which)); if(flt->NumShips() <= 1) clear_sprites(1, 10); flt->DestroyShip(which); panel_draw(); page_draw(); } if(button == BUTTON_SPLIT) { /* if(!flt->Location()) return; if(!flt->Location()->Represents()) return; for(int shp=1; shp < flt->NumShips(); ++shp) { Fleet *newfleet = new Fleet(flt->Location()->Represents(), flt->Name()); newfleet->AddShip(flt->GetShip(shp)); newfleet->Location()->Represents()->Sys()->objects.push_back(newfleet); } */ for(int shp=1; shp < flt->NumShips(); ++shp) { Fleet *newfleet = new Fleet(); newfleet->CopyFrom(flt); newfleet->SetName(flt->Name()); newfleet->AddShip(flt->GetShip(shp)); flt->Sys()->objects.push_back(newfleet); } flt->RemoveShips(1); page_draw(); panel_init(); } }
void panel_draw_fleet() { int line = 0; char buf[80]; Fleet *flt = (Fleet*)cur_object; int col = cur_game->players[flt->Owner()]->color; SDL_Rect screenrec = {800, 12, 224, 24*23}; screenrec.h = min(int(screenrec.h), 24*(flt->NumShips()+SKIP)); SDL_FillRect(screen, &screenrec, black); sprintf(buf, "Fleet: %s", flt->Name()); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); if(flt->Target() && flt->Distance() >= 0) { sprintf(buf, "Course to %s", flt->Target()->Name()); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); int eta = flt->Distance(); if(eta > 1) sprintf(buf, "ETA: %d Days", eta); else if(eta == 1) sprintf(buf, "ETA: 1 Day"); else sprintf(buf, "Would Arrive Today"); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); } else if(flt->Target()) { sprintf(buf, "Invalid Course"); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); int eta = -flt->Distance(); if(eta > 1) sprintf(buf, "ETA: %d Days", eta); else if(eta == 1) sprintf(buf, "ETA: 1 Day"); else sprintf(buf, "Would Arrive Today"); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); } else if((!flt->Location()) && (!flt->Destination())) { sprintf(buf, "Orbiting Star"); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); sprintf(buf, "%d-Day Orbit", (flt->Period()+255)/256); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); } else if(!flt->Destination()) { sprintf(buf, "Orbiting %s", flt->Location()->Name()); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); sprintf(buf, "16 Orbits/Day"); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); } else { sprintf(buf, "Going to %s", flt->Destination()->Name()); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); int eta = flt->ArriveTurn() - cur_game->turn; if(eta > 1) sprintf(buf, "ETA: %d Days", eta); else if(eta == 1) sprintf(buf, "ETA: 1 Day"); else sprintf(buf, "Arriving Today"); string_draw(screen, 816, 13+24*(line++), cur_font_black[col], buf); } for(int ctr=0; ctr < min(int(flt->NumShips()), 23-SKIP); ++ctr) { int clr = cur_game->players[flt->GetShip(ctr)->Owner()]->color; if(ctr == selection) clr = 8; sprintf(buf, " %s: %s", flt->GetShip(ctr)->CName(), flt->GetShip(ctr)->Name()); string_draw(screen, 816, 13+24*(line++), cur_font_black[clr], buf); } if(flt->NumShips() > 1) { buttlist[PANEL_FLEET][BUTTON_SPLIT] = 9; } else { buttlist[PANEL_FLEET][BUTTON_SPLIT] = 0; } if(flt->CanLand() && (!flt->Destination())) { buttlist[PANEL_FLEET][BUTTON_LAND] = 10; mo[BUTTON_LAND] = -1; } else { buttlist[PANEL_FLEET][BUTTON_LAND] = 0; SDL_Rect canrec = {800, 768-64*2, 224, 64}; SDL_FillRect(screen, &canrec, black); update(&canrec); } }
void SObject::Arrive() { SObject *truedest = destination->Represents(); if(!truedest) { system = destination->Sys(); orbit = destination->OrbitDist(); period = destination->Period(); startpos = destination->OrbitPhase(); arrive_turn = destination->ArriveTurn(); depart_turn = destination->DepartTurn(); Trash(location); location = destination->Location(); Trash(destination); destination = destination->Destination(); Trash(target); target = NULL; distance = 0; } else if(truedest->SType() == SOBJECT_PLANET) { system = destination->system; orbit = destination->orbit; period = destination->period; startpos = destination->startpos; Trash(location); location = destination; truedest->See(Owner()); truedest->Know(Owner()); destination = NULL; } else if(truedest->SType() == SOBJECT_SYSTEM) { orbit = 6600; period = int(sqrt(double(orbit)*double(orbit)*double(orbit))); int xp = system->gxpos - destination->system->gxpos; int yp = system->gypos - destination->system->gypos; double tang = double(cur_game->turn) * double(256*256*256) / double(period); double nang = double(65536) * atan2(double(yp), double(xp)) / 2.0 / M_PIl; startpos = int(nang - tang); system->FleetLeaves((Fleet*)this); system = destination->system; system->FleetArrives((Fleet*)this); Trash(location); location = NULL; truedest->Know(Owner()); Trash(destination); destination = NULL; } else if(truedest->SType() == SOBJECT_FLEET && SType() == SOBJECT_FLEET && Owner() == truedest->Owner()) { Fleet *flt = (Fleet *)this; for(int shp=0; shp < flt->NumShips(); ++shp) ((Fleet*)truedest)->AddShip(flt->GetShip(shp)); if(cur_object == this) cur_object = truedest; panel_draw(); RemapPositions(flt, truedest); flt->RemoveShips(0); } else if(truedest->SType() == SOBJECT_FLEET && SType() == SOBJECT_FLEET) { Fleet *flt = (Fleet*)this; flt->Attack((Fleet*)truedest); system = destination->system; orbit = destination->orbit; period = destination->period; startpos = destination->startpos; Trash(location); location = destination->location; Trash(destination); destination = destination->destination; //FIXME! Two attacking each other! } else if(truedest->SType() == SOBJECT_FLEET) { system = destination->system; orbit = destination->orbit; period = destination->period; startpos = destination->startpos; Trash(location); location = destination->location; Trash(destination); destination = destination->destination; } }