Code
1386/// Initiate a mission1387void CvUnitMission::StartMission(UnitHandle hUnit)1388{1389 bool bDelete;1390 bool bAction;1391 bool bNotify;13921393 static int stackDepth = 0;1394 ++stackDepth; // JAR debugging13951396 CvAssert(stackDepth < 100);13971398 CvAssert(!hUnit->IsBusy());1399 CvAssert(hUnit->getOwner() != NO_PLAYER);1400 CvAssert(hUnit->HeadMissionQueueNode() != NULL);14011402 CvPlayerAI& kUnitOwner = GET_PLAYER(hUnit->getOwner());140314041405 if(!kUnitOwner.isSimultaneousTurns())1406 {1407 if(!kUnitOwner.isTurnActive())1408 {1409 if(hUnit->getOwner() == GC.getGame().getActivePlayer())1410 {1411 if(hUnit->IsSelected())1412 {1413 GC.GetEngineUserInterface()->changeCycleSelectionCounter(1);1414 }1415 }14161417 --stackDepth; // JAR debugging1418 return;1419 }1420 }14211422 if(hUnit->canMove())1423 {1424 hUnit->SetActivityType(ACTIVITY_MISSION);1425 }1426 else1427 {1428 hUnit->SetActivityType(ACTIVITY_HOLD);1429 }14301431 bDelete = false;1432 bAction = false;1433 bNotify = false;14341435 hUnit->ClearPathCache();14361437 const MissionData* pkQueueData = GetHeadMissionData(hUnit);1438 if(!hUnit->CanStartMission(pkQueueData->eMissionType, pkQueueData->iData1, pkQueueData->iData2, hUnit->plot()))1439 {1440 bDelete = true;1441 }1442 else1443 {1444 CvAssertMsg(kUnitOwner.isTurnActive() || kUnitOwner.isHuman(), "It's expected that either the turn is active for this player or the player is human");14451446 if(pkQueueData->eMissionType == CvTypes::getMISSION_SKIP())1447 {1448 hUnit->SetActivityType(ACTIVITY_HOLD);1449 bDelete = true;1450 }14511452 else if(pkQueueData->eMissionType == CvTypes::getMISSION_SLEEP())1453 {1454 hUnit->SetActivityType(ACTIVITY_SLEEP);1455 bNotify = true;1456 bDelete = true;1457 }14581459 else if(pkQueueData->eMissionType == CvTypes::getMISSION_FORTIFY())1460 {1461 hUnit->SetActivityType(ACTIVITY_SLEEP);1462 bNotify = true;1463 bDelete = true;1464 }14651466 else if(pkQueueData->eMissionType == CvTypes::getMISSION_AIRPATROL())1467 {1468 hUnit->SetActivityType(ACTIVITY_INTERCEPT);1469 bDelete = true;1470 }14711472 else if(pkQueueData->eMissionType == CvTypes::getMISSION_HEAL())1473 {1474 hUnit->SetActivityType(ACTIVITY_HEAL);1475 bNotify = true;1476 bDelete = true;1477 }14781479 else if(pkQueueData->eMissionType == CvTypes::getMISSION_ALERT())1480 {1481 hUnit->SetActivityType(ACTIVITY_SENTRY);1482 bNotify = true;1483 bDelete = true;1484 }14851486#if defined(MOD_EVENTS_CUSTOM_MISSIONS)1487 else if (MOD_EVENTS_CUSTOM_MISSIONS) {1488 int iValue = 0;1489 if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_CustomMissionSetActivity, hUnit->getOwner(), hUnit->GetID(), pkQueueData->eMissionType, pkQueueData->iData1, pkQueueData->iData2, pkQueueData->iFlags, pkQueueData->iPushTurn) == GAMEEVENTRETURN_VALUE) {1490 if (iValue == CUSTOM_MISSION_ACTION ) {1491 bNotify = true;1492 } else if (iValue == CUSTOM_MISSION_DONE ) {1493 bDelete = true;1494 } else if (iValue == CUSTOM_MISSION_ACTION_AND_DONE ) {1495 bNotify = true;1496 bDelete = true;1497 }1498 }1499 }1500#endif15011502 if(bNotify)1503 {1504 // The entity should not futz with the missions, but...1505 CvAssert(GetHeadMissionData(hUnit) == pkQueueData);1506 pkQueueData = GetHeadMissionData(hUnit);1507 }15081509 if(hUnit->canMove())1510 {1511 if(pkQueueData->eMissionType == CvTypes::getMISSION_FORTIFY())1512 {1513 hUnit->SetFortifiedThisTurn(true);1514 }15151516 else if(pkQueueData->eMissionType == CvTypes::getMISSION_HEAL() ||1517 pkQueueData->eMissionType == CvTypes::getMISSION_ALERT())1518 {1519 hUnit->SetFortifiedThisTurn(true);1520 }15211522 else if(pkQueueData->eMissionType == CvTypes::getMISSION_SET_UP_FOR_RANGED_ATTACK())1523 {1524 hUnit->setSetUpForRangedAttack(true);1525 bAction = true;1526 }15271528 else if(pkQueueData->eMissionType == CvTypes::getMISSION_EMBARK())1529 {1530 bAction = true;1531 }15321533 else if(pkQueueData->eMissionType == CvTypes::getMISSION_DISEMBARK())1534 {1535 bAction = true;1536 }15371538 else if(pkQueueData->eMissionType == CvTypes::getMISSION_AIRLIFT())1539 {1540 if(hUnit->airlift(pkQueueData->iData1, pkQueueData->iData2))1541 {1542 bAction = true;1543 }1544 }15451546 else if(pkQueueData->eMissionType == CvTypes::getMISSION_NUKE())1547 {1548 MissionData& kMissionData = *hUnit->HeadMissionQueueNode();1549 if(GC.getMap().plot(kMissionData.iData1, kMissionData.iData2) == NULL || !hUnit->canNukeAt(hUnit->plot(), kMissionData.iData1, kMissionData.iData2))1550 {1551 // Invalid, delete the mission1552 bDelete = true;1553 }1554 }15551556 else if(pkQueueData->eMissionType == CvTypes::getMISSION_PARADROP())1557 {1558 if(hUnit->paradrop(pkQueueData->iData1, pkQueueData->iData2))1559 {1560 bAction = true;1561 // The Paradrop needs to have GameplayUnitMissionEnd, so if no mission timer will be started, do it now.1562 if (hUnit->plot()->isActiveVisible() && (!hUnit->isHuman() || !hUnit->plot()->isVisibleToWatchingHuman() || CalculateMissionTimer(hUnit) == 0))1563 {1564 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1565 gDLL->GameplayUnitMissionEnd(pDllUnit.get());1566 }1567 }1568 }15691570 else if(pkQueueData->eMissionType == CvTypes::getMISSION_AIR_SWEEP())1571 {1572 if(hUnit->airSweep(pkQueueData->iData1, pkQueueData->iData2))1573 {1574 bAction = true;1575 }1576 }15771578 else if(pkQueueData->eMissionType == CvTypes::getMISSION_REBASE())1579 {1580 if(hUnit->rebase(pkQueueData->iData1, pkQueueData->iData2))1581 {1582 bAction = true;1583 // The Rebase needs to have GameplayUnitMissionEnd, so if no mission timer will be started, do it now.1584 if (hUnit->plot()->isActiveVisible() && (!hUnit->isHuman() || !hUnit->plot()->isVisibleToWatchingHuman() || CalculateMissionTimer(hUnit) == 0))1585 {1586 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1587 gDLL->GameplayUnitMissionEnd(pDllUnit.get());1588 }1589 }1590 }15911592 else if(pkQueueData->eMissionType == CvTypes::getMISSION_RANGE_ATTACK())1593 {1594 MissionData& kMissionData = *hUnit->HeadMissionQueueNode();1595 if(GC.getMap().plot(kMissionData.iData1, kMissionData.iData2) == NULL || !hUnit->canRangeStrikeAt(kMissionData.iData1, kMissionData.iData2))1596 {1597 // Invalid, delete the mission1598 bDelete = true;1599 }1600 }16011602 else if(pkQueueData->eMissionType == CvTypes::getMISSION_PILLAGE())1603 {1604 if(hUnit->pillage())1605 {1606 bAction = true;1607 }1608 }16091610 else if(pkQueueData->eMissionType == CvTypes::getMISSION_FOUND())1611 {1612 if(hUnit->found())1613 {1614 bAction = true;1615 }1616 }16171618 else if(pkQueueData->eMissionType == CvTypes::getMISSION_JOIN())1619 {1620 if(hUnit->join((SpecialistTypes)(hUnit->HeadMissionQueueNode()->iData1)))1621 {1622 bAction = true;1623 }1624 }16251626 else if(pkQueueData->eMissionType == CvTypes::getMISSION_CONSTRUCT())1627 {1628 if(hUnit->construct((BuildingTypes)(hUnit->HeadMissionQueueNode()->iData1)))1629 {1630 bAction = true;1631 }1632 }16331634 else if(pkQueueData->eMissionType == CvTypes::getMISSION_DISCOVER())1635 {1636 if(hUnit->discover())1637 {1638 bAction = true;1639 }1640 }16411642 else if(pkQueueData->eMissionType == CvTypes::getMISSION_HURRY())1643 {1644 //if (hUnit->DoRushBuilding())1645 if(hUnit->hurry())1646 {1647 bAction = true;1648 }1649 }16501651 else if(pkQueueData->eMissionType == CvTypes::getMISSION_TRADE())1652 {1653 if(hUnit->trade())1654 {1655 bAction = true;1656 }1657 }16581659 else if (pkQueueData->eMissionType == CvTypes::getMISSION_BUY_CITY_STATE())1660 {1661 if (hUnit->buyCityState())1662 {1663 bAction = true;1664 }1665 }16661667 else if(pkQueueData->eMissionType == CvTypes::getMISSION_REPAIR_FLEET())1668 {1669 if(hUnit->repairFleet())1670 {1671 bAction = true;1672 }1673 }1674 1675 else if(pkQueueData->eMissionType == CvTypes::getMISSION_SPACESHIP())1676 {1677 if(hUnit->DoBuildSpaceship())1678 {1679 bAction = true;1680 }1681 }16821683 else if(pkQueueData->eMissionType == CvTypes::getMISSION_CULTURE_BOMB())1684 {1685 if(hUnit->DoCultureBomb())1686 {1687 bAction = true;1688 }1689 }16901691 else if(pkQueueData->eMissionType == CvTypes::getMISSION_FOUND_RELIGION())1692 {1693 if(hUnit->DoFoundReligion())1694 {1695 bAction = true;1696 }1697 }16981699 else if(pkQueueData->eMissionType == CvTypes::getMISSION_SPREAD_RELIGION())1700 {1701 if(hUnit->DoSpreadReligion())1702 {1703 bAction = true;1704 }1705 }17061707 else if(pkQueueData->eMissionType == CvTypes::getMISSION_ENHANCE_RELIGION())1708 {1709 if(hUnit->DoEnhanceReligion())1710 {1711 bAction = true;1712 }1713 }17141715 else if(pkQueueData->eMissionType == CvTypes::getMISSION_REMOVE_HERESY())1716 {1717 if(hUnit->DoRemoveHeresy())1718 {1719 bAction = true;1720 }1721 }17221723 else if(pkQueueData->eMissionType == CvTypes::getMISSION_GOLDEN_AGE())1724 {1725 //just play animation, not golden age - JW1726 if(hUnit->HeadMissionQueueNode()->iData1 != -1)1727 {1728 bAction = true;1729 }1730 else1731 {1732 if(hUnit->goldenAge())1733 {1734 bAction = true;1735 }1736 }1737 }17381739 else if (pkQueueData->eMissionType == CvTypes::getMISSION_ESTABLISH_TRADE_ROUTE())1740 {1741 CvPlot* pPlot = GC.getMap().plotByIndex(pkQueueData->iData1);1742 CvAssertMsg(pPlot, "pPlot is null! OH NOES, JOEY!");1743 if (pPlot)1744 {1745 if(hUnit->makeTradeRoute(pPlot->getX(), pPlot->getY(), (TradeConnectionType)pkQueueData->iData2))1746 {1747 bAction = true;1748 }1749 }1750 }1751 1752 else if (pkQueueData->eMissionType == CvTypes::getMISSION_PLUNDER_TRADE_ROUTE())1753 {1754 if (hUnit->plunderTradeRoute())1755 {1756 bAction = true;1757 }1758 }17591760 else if (pkQueueData->eMissionType == CvTypes::getMISSION_GREAT_WORK())1761 {1762 if (hUnit->createGreatWork())1763 {1764 bAction = true;1765 }1766 }17671768 else if (pkQueueData->eMissionType == CvTypes::getMISSION_CHANGE_TRADE_UNIT_HOME_CITY())1769 {1770 if(hUnit->changeTradeUnitHomeCity(pkQueueData->iData1, pkQueueData->iData2))1771 {1772 bAction = true;1773 }1774 }17751776 else if (pkQueueData->eMissionType == CvTypes::getMISSION_SELL_EXOTIC_GOODS())1777 {1778 if (hUnit->sellExoticGoods())1779 {1780 bAction = true;1781 }1782 }17831784 else if(pkQueueData->eMissionType == CvTypes::getMISSION_BUILD())1785 {1786 // Gold cost for Improvement construction1787 kUnitOwner.GetTreasury()->ChangeGold(-(kUnitOwner.getBuildCost(hUnit->plot(), (BuildTypes)(hUnit->HeadMissionQueueNode()->iData1))));17881789 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1790 gDLL->GameplayUnitWork(pDllUnit.get(), (hUnit->HeadMissionQueueNode()->iData1));1791 }17921793 else if(pkQueueData->eMissionType == CvTypes::getMISSION_ROUTE_TO())1794 {1795 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1796 gDLL->GameplayUnitWork(pDllUnit.get(), 0);1797 }17981799 else if(pkQueueData->eMissionType == CvTypes::getMISSION_LEAD())1800 {1801 if(hUnit->lead(hUnit->HeadMissionQueueNode()->iData1))1802 {1803 bAction = true;1804 }1805 }18061807 else if(pkQueueData->eMissionType == CvTypes::getMISSION_DIE_ANIMATION())1808 {1809 bAction = true;1810 }18111812 else if(pkQueueData->eMissionType == CvTypes::getMISSION_GIVE_POLICIES())1813 {1814 //just play animation, not golden age - JW1815 if(hUnit->HeadMissionQueueNode()->iData1 != -1)1816 {1817 bAction = true;1818 }1819 else1820 {1821 if(hUnit->givePolicies())1822 {1823 bAction = true;1824 }1825 }1826 }18271828 else if(pkQueueData->eMissionType == CvTypes::getMISSION_ONE_SHOT_TOURISM())1829 {1830 //just play animation, not golden age - JW1831 if(hUnit->HeadMissionQueueNode()->iData1 != -1)1832 {1833 bAction = true;1834 }1835 else1836 {1837 if(hUnit->blastTourism())1838 {1839 bAction = true;1840 }1841 }1842 }18431844 else if (pkQueueData->eMissionType == CvTypes::getMISSION_CHANGE_ADMIRAL_PORT())1845 {1846 if(hUnit->changeAdmiralPort(pkQueueData->iData1, pkQueueData->iData2))1847 {1848 bAction = true;1849 }1850 }18511852#if defined(MOD_EVENTS_CUSTOM_MISSIONS)1853 else if (MOD_EVENTS_CUSTOM_MISSIONS) {1854 int iValue = 0;1855 if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_CustomMissionStart, hUnit->getOwner(), hUnit->GetID(), pkQueueData->eMissionType, pkQueueData->iData1, pkQueueData->iData2, pkQueueData->iFlags, pkQueueData->iPushTurn) == GAMEEVENTRETURN_VALUE) {1856 if (iValue == CUSTOM_MISSION_ACTION) {1857 bAction = true;1858 }1859 }1860 }1861#endif1862 }1863 }18641865 if(hUnit->HeadMissionQueueNode() != NULL)1866 {1867 if(bAction)1868 {1869 if(hUnit->isHuman())1870 {1871 if(hUnit->plot()->isVisibleToWatchingHuman())1872 {1873 UpdateMissionTimer(hUnit);1874 }1875 }1876 }18771878 if(!hUnit->IsBusy())1879 {1880 if(bDelete)1881 {1882 if(hUnit->getOwner() == GC.getGame().getActivePlayer())1883 {1884 if(hUnit->IsSelected())1885 {1886 GC.GetEngineUserInterface()->changeCycleSelectionCounter(kUnitOwner.isOption(PLAYEROPTION_QUICK_MOVES)? 1 : 2);1887 }1888 }18891890 DeleteMissionQueueNode(hUnit, hUnit->HeadMissionQueueNode());1891 }1892 else if(hUnit->GetActivityType() == ACTIVITY_MISSION)1893 {1894 ContinueMission(hUnit);1895 }1896 }1897 }1898 --stackDepth;1899}