예제 #1
0
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();
    }
}
예제 #2
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;
    }
  }