void CargoHolder::ProcessUnload(CargoHolder * dest, CargoType ct, TransferType tt, long value) // value usage depends on TransferType { assert(dest->IsWith(*this)); assert(dest != this); if (value < 0) { Message * mess = NCGetOwner()->AddMessage("Error: Transfer order is negative", this); mess->AddLong("Amount transferred", value); return; } if (value > Rules::GetConstant("MaxTransfer")) { Message * mess = NCGetOwner()->AddMessage("Error: Transfer order is over max", this); mess->AddLong("Amount transferred", value); return; } long destAmt = dest->GetContain(ct); if (GetOwner() != dest->GetOwner() && (ct == POPULATION || !dest->CanLoadBy(GetOwner()))) destAmt = 0; long amount = 0; // actual amount moved; switch (tt) { case TRANSFER_LOADALL: // processing unloads, skip loads. break; case TRANSFER_DROPNLOAD: case TRANSFER_UNLOADALL: amount = TransferAmount(ct, this, dest, GetContain(ct)); break; case TRANSFER_LOADAMT: // processing unloads, skip loads. break; case TRANSFER_UNLOADAMT: amount = TransferAmount(ct, this, dest, value); break; case TRANSFER_FILLPER: case TRANSFER_WAITPER: // affects movement too // processing unloads, skip loads. break; case TRANSFER_LOADDUNN: // processing unloads, skip loads. break; case TRANSFER_SETTOPER: if (value > 100) { Message * mess = NCGetOwner()->AddMessage("Error: Transfer percent over 100%", this); mess->AddLong("Amount transferred", value); return; } value = GetCargoCapacity() * value / 100; // drop to a regualr transfer amount case TRANSFER_AMOUNTTO: if (GetContain(ct) > value) amount = TransferAmount(ct, this, dest, GetContain(ct) - value); break; case TRANSFER_DESTTO: // Allow set dest to for pop to do a maximal invade, followed by a setto load if (ct == POPULATION && GetOwner() != dest->GetOwner()) amount = TransferAmount(ct, this, dest, GetContain(ct)); else if (destAmt < value) amount = TransferAmount(ct, this, dest, value - destAmt); break; default: Message * mess = NCGetOwner()->AddMessage("Error: Invalid transfer order", this); mess->AddLong("Transfer code", tt); return; } if (amount > 0 && ct == POPULATION && GetOwner() != dest->GetOwner()) { // try to drop pop on an uninhabited world if (dest->GetOwner() == NULL) { Message * mess; mess = NCGetOwner()->AddMessage("Warning: Pop drop on unowned world", this); return; } // Dropping pop on a world with a base Planet * destP = dynamic_cast<Planet *>(dest); if (destP && destP->GetBaseNumber() >= 0) { Message * mess; mess = NCGetOwner()->AddMessage("Warning: Pop drop with base", this); mess->AddItem("", destP); return; } // unloading pop to some one elses fleet Fleet * destF = dynamic_cast<Fleet *>(dest); if (destF) { Message * mess; mess = NCGetOwner()->AddMessage("Warning: Transfer pop to unowned fleet", this); mess->AddItem("", destF); return; } if (GetOwner()->GroundAttackFactor() <= 0.01) { Message * mess; mess = NCGetOwner()->AddMessage("Warning: AR trying to invade", this); mess->AddItem("", dest); return; } destP->Invade(NCGetOwner(), amount); } assert(amount >= 0); dest->AdjustAmounts(ct, amount); // add cargo to destination AdjustAmounts(ct, -amount); // remove it from the source }
void CargoHolder::TransferCargo(CargoHolder * dest, CargoType ct, long * amount, Player * player) { if (*amount == 0) return; assert(*amount > 0); if (GetContain(ct) < *amount) { Message * mess = player->AddMessage("Warning: Transfer more then carried", this); mess->AddLong("Attempted amount", *amount); *amount = GetContain(ct); mess->AddLong("Actual amount", *amount); } if (ct == POPULATION) { *amount -= *amount % Rules::PopEQ1kT; // only transfer full groups if (dest->GetCargoCapacity() >= 0 && dest->GetCargoCapacity() < dest->GetCargoMass() + (*amount / Rules::PopEQ1kT)) { Message * mess = player->AddMessage("Warning: Transfer more then capacity", this); mess->AddItem("", dest); mess->AddLong("Attempted amount", *amount); *amount = (dest->GetCargoCapacity() - dest->GetCargoMass()) * Rules::PopEQ1kT; mess->AddLong("Actual amount", *amount); } } else if (ct == FUEL) { Fleet * destf = dynamic_cast<Fleet *>(dest); if (destf->GetFuelCapacity() >= 0 && destf->GetFuelCapacity() < destf->GetFuel() + *amount) { Message * mess = player->AddMessage("Warning: Transfer more then capacity", this); mess->AddItem("", dest); mess->AddLong("Attempted amount", *amount); *amount = destf->GetFuelCapacity() - destf->GetFuel(); mess->AddLong("Actual amount", *amount); } } else { if (dest->GetCargoCapacity() >= 0 && dest->GetCargoCapacity() < dest->GetCargoMass() + *amount) { Message * mess = player->AddMessage("Warning: Transfer more then capacity", this); mess->AddItem("", dest); mess->AddLong("Attempted amount", *amount); *amount = dest->GetCargoCapacity() - dest->GetCargoMass(); mess->AddLong("Actual amount", *amount); } } if (ct == POPULATION && GetOwner() != dest->GetOwner()) { assert(false); // should never get here now Planet * destp = dynamic_cast<Planet *>(dest); if (destp) { if (destp->GetBaseNumber() >= 0) { player->AddMessage("Warning: Invading world with base", this); return; } else { AdjustAmounts(ct, -*amount); destp->Invade(NCGetOwner(), *amount); return; } } else { Message * mess = player->AddMessage("Warning: Transfer pop to unowned fleet", this); mess->AddItem("", dest); return; } } dest->AdjustAmounts(ct, *amount); AdjustAmounts(ct, -*amount); }