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);
    }
}
Exemple #3
0
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;
    }
  }