/** ** Make one or more unit leave the transporter. ** ** @param unit Pointer to unit. */ static void LeaveTransporter(CUnit *unit) { int i; int stillonboard; CUnit *goal; stillonboard = 0; goal = unit->Orders[0]->Goal; // // Goal is the specific unit unit that you want to unload. // This can be NULL, in case you want to unload everything. // if (goal) { unit->Orders[0]->Goal = NoUnitP; if (goal->Destroyed) { DebugPrint("destroyed unit unloading?\n"); goal->RefsDecrease(); return; } goal->RefsDecrease(); goal->X = unit->X; goal->Y = unit->Y; // Try to unload the unit. If it doesn't work there is no problem. if (UnloadUnit(goal)) { unit->BoardCount--; } } else { // Unload all units. goal = unit->UnitInside; for (i = unit->InsideCount; i; --i, goal = goal->NextContained) { if (goal->Boarded) { goal->X = unit->X; goal->Y = unit->Y; if (!UnloadUnit(goal)) { ++stillonboard; } else { unit->BoardCount--; } } } } if (IsOnlySelected(unit)) { SelectedUnitChanged(); } // We still have some units to unload, find a piece of free coast. if (stillonboard) { // We tell it to unload at it's current position. This can't be done, // so it will search for a piece of free coast nearby. unit->Orders[0]->Action = UnitActionUnload; unit->Orders[0]->Goal = NoUnitP; unit->Orders[0]->X = unit->X; unit->Orders[0]->Y = unit->Y; unit->SubAction = 0; } else { unit->ClearAction(); } }
/** ** Make one or more unit leave the transporter. ** ** @return false if action should continue */ bool COrder_Unload::LeaveTransporter(CUnit &transporter) { int stillonboard = 0; // Goal is the specific unit unit that you want to unload. // This can be NULL, in case you want to unload everything. if (this->HasGoal()) { CUnit &goal = *this->GetGoal(); if (goal.Destroyed) { DebugPrint("destroyed unit unloading?\n"); this->ClearGoal(); return true; } transporter.CurrentOrder()->ClearGoal(); // Try to unload the unit. If it doesn't work there is no problem. if (UnloadUnit(transporter, goal)) { this->ClearGoal(); } else { ++stillonboard; } } else { // Unload all units. CUnit *goal = transporter.UnitInside; for (int i = transporter.InsideCount; i; --i, goal = goal->NextContained) { if (goal->Boarded) { if (!UnloadUnit(transporter, *goal)) { ++stillonboard; } } } } if (IsOnlySelected(transporter)) { SelectedUnitChanged(); } // We still have some units to unload, find a piece of free coast. if (stillonboard) { // We tell it to unload at it's current position. This can't be done, // so it will search for a piece of free coast nearby. this->State = 0; return false; } else { return true; } }