예제 #1
0
void panel_clicked_fleet(int mx, int my, int mb) {
    Fleet *flt = (Fleet*)cur_object;
    if(mx >= 800 && mb == 4) {
        --panel_offset;
        panel_draw_fleet();
        SDL_Rect screenrec = {800, 12+24*SKIP, 224, 24*23};
        screenrec.h = min(int(screenrec.h), 24*(flt->NumShips()));
        update(&screenrec);
        return;
    }
    if(mx >= 800 && mb == 5) {
        ++panel_offset;
        panel_draw_fleet();
        SDL_Rect screenrec = {800, 12+24*SKIP, 224, 24*23};
        screenrec.h = min(int(screenrec.h), 24*(flt->NumShips()));
        update(&screenrec);
        return;
    }

    int line = my;
    line -= 12+24*SKIP;
    if(line >= 0) line /= 24;
    if(line < 0 || line > 22
            || line >= int(flt->NumShips()) - panel_offset) {
        if(selection >= 0) {
            update(800, 12+24*(SKIP+selection-panel_offset), 224, 24);
            selection = -1;
            panel_draw_fleet();
        }
        return;
    }

    line += panel_offset;

    if(mb == 3) {
    }
    else if(mb == 1) {
        SDL_Rect screenrec = {800, 12+24*SKIP, 224, 24};
        if(selection >= 0) {
            screenrec.y = 12+24*(SKIP+selection);
            update(&screenrec);
        }
        if(selection != line) {
            selection = line;
            screenrec.y = 12+24*(SKIP+selection);
            update(&screenrec);
            panel_draw_fleet();
        }
        else {
            cur_ship = line;
            panel = PANEL_SHIP;
            panel_init();
        }
        audio_play(click2, 8, 8);
    }
}
예제 #2
0
bool Fleet::operator == (const Fleet& fleet) const{
    return (_ownerID==fleet.OwnerID() &&
		   _source_planet_id==fleet.SourcePlanetID() &&
		   _destination_planet_id==fleet.DestinationPlanetID() &&
		   _num_ships==fleet.NumShips() &&
			_turns_remaining==fleet.TurnsRemaining() );
}
예제 #3
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();
    }
}
예제 #4
0
void Planet::advanceState(uint nr_turns, Fleets* arrivingFleets){
	Fleet* tempFleet;
	for(uint i=1;i<=nr_turns;i++){
		uint ships[NUM_PLAYERS];
		ships[PLAYER_NEUTRAL]=ships[PLAYER_1]=ships[PLAYER_2]=0;
		
		if(_ownerID!=PLAYER_NEUTRAL){
			ships_count+=_growth_rate;
		}
		ships[_ownerID]=ships_count;
		
		for(uint j=0;j<arrivingFleets->size();j++){
			tempFleet = arrivingFleets->at(j);
			if(tempFleet->TurnsRemaining()==i){
				ships[tempFleet->OwnerID()]+=tempFleet->NumShips();
			}
		}
		
		//std::cerr << "arriving ships: " << ships[0] << " " << ships[1] << " " << ships[2] << std::endl;
		uint greatest_id = _ownerID;
		uint second_greatest_id=0;
		for(uint j=0;j<NUM_PLAYERS;j++){
			if(ships[j]>ships[greatest_id]) greatest_id=j;
		}
		for(uint j=0;j<NUM_PLAYERS;j++){
			if(j!=greatest_id && ships[j]>ships[second_greatest_id]) second_greatest_id=j;
		}
		
		//std::cerr << "Player " << greatest_id << " has ships: " << ships[greatest_id] << " second: " << second_greatest_id << " " << ships[second_greatest_id] << std::endl;
		
		if(ships[greatest_id]==ships[second_greatest_id]){
			ships_count = 0;
		} else {
			//std::cerr << "setting owner: " << greatest_id << " new ship count: " << ships[greatest_id]-ships[second_greatest_id] << std::endl;
			_ownerID = greatest_id;
			ships_count = ships[greatest_id]-ships[second_greatest_id];
		}
	}
}
예제 #5
0
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);
    }
}
예제 #6
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;
    }
  }