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); } }
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() ); }
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 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]; } } }
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; } }