Hooks
static bool BeforeCvPlot_setOwner(CvPlot* self, PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool arg3);static void AfterCvPlot_setOwner(CvPlot* self, PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool arg3);static void ReplaceCvPlot_setOwner(void (*original)(CvPlot*, PlayerTypes, int, bool, bool), CvPlot* self, PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool arg3);CivRegisterBefore<CivHooks::CvPlot_setOwner>(host, &BeforeCvPlot_setOwner);CivRegisterAfter<CivHooks::CvPlot_setOwner>(host, &AfterCvPlot_setOwner);CivRegisterReplace<CivHooks::CvPlot_setOwner>(host, &ReplaceCvPlot_setOwner);
Code
5307void CvPlot::setOwner(PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool)5308{5309 IDInfo* pUnitNode;5310 CvCity* pOldCity;5311 CvString strBuffer;5312 int iI;53135314 // Remove effects for old owner before changing the member5315 if(getOwner() != eNewValue)5316 {5317 PlayerTypes eOldOwner = getOwner();;53185319 GC.getGame().addReplayMessage(REPLAY_MESSAGE_PLOT_OWNER_CHANGE, eNewValue, "", getX(), getY());53205321 pOldCity = getPlotCity();53225323 {5324 setOwnershipDuration(0);53255326 // Plot was owned by someone else5327 if(isOwned())5328 {5329#if defined(MOD_API_EXTENSIONS)5330 changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION);5331#else5332 changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION, false);5333#endif53345335 // if this tile is owned by a minor share the visibility with my ally5336 if(pOldCity)5337 {5338 for(uint ui = 0; ui < MAX_MAJOR_CIVS; ui++)5339 {5340 PlayerTypes ePlayer = (PlayerTypes)ui;5341 if(GET_PLAYER(ePlayer).GetEspionage()->HasEstablishedSurveillanceInCity(pOldCity))5342 {5343#if defined(MOD_API_EXTENSIONS)5344 changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), false, NO_INVISIBLE, NO_DIRECTION);5345#else5346 changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), false, NO_INVISIBLE, NO_DIRECTION, false);5347#endif5348 }5349 }5350 }53515352 if(eOldOwner >= MAX_MAJOR_CIVS && eOldOwner != BARBARIAN_PLAYER)5353 {5354 CvPlayer& thisPlayer = GET_PLAYER(eOldOwner);5355 CvMinorCivAI* pMinorCivAI = thisPlayer.GetMinorCivAI();5356 if(pMinorCivAI && pMinorCivAI->GetAlly() != NO_PLAYER)5357 {5358#if defined(MOD_API_EXTENSIONS)5359 changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION);5360#else5361 changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION, false);5362#endif5363 }5364 }53655366 if(area())5367 {5368 area()->changeNumOwnedTiles(-1);5369 }5370 GC.getMap().changeOwnedPlots(-1);53715372 if(!isWater())5373 {5374 GET_PLAYER(getOwner()).changeTotalLand(-1);5375 GET_TEAM(getTeam()).changeTotalLand(-1);53765377 if(isOwnershipScore())5378 {5379 GET_PLAYER(getOwner()).changeTotalLandScored(-1);5380 }5381 }53825383 // Improvement is here5384 if(getImprovementType() != NO_IMPROVEMENT)5385 {5386 GET_PLAYER(getOwner()).changeImprovementCount(getImprovementType(), -1);53875388 // Remove siphoned resources5389 CvImprovementEntry* pImprovementInfo = GC.getImprovementInfo(getImprovementType());5390 if (pImprovementInfo != NULL && pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor() > 0)5391 {5392 if (GetPlayerThatBuiltImprovement() != NO_PLAYER)5393 {5394 if (GET_PLAYER(eOldOwner).isMinorCiv())5395 {5396 GET_PLAYER(GetPlayerThatBuiltImprovement()).changeSiphonLuxuryCount(eOldOwner, -1 * pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor());5397 }5398 }5399 }5400 // Maintenance change!5401 if(MustPayMaintenanceHere(getOwner()))5402 {5403 GET_PLAYER(getOwner()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getImprovementInfo(getImprovementType())->GetGoldMaintenance());5404 }5405 }54065407 // Route is here5408 if(getRouteType() != NO_ROUTE && !isCity())5409 {5410 // Maintenance change!5411 if(MustPayMaintenanceHere(getOwner()))5412 {5413 GET_PLAYER(getOwner()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getRouteInfo(getRouteType())->GetGoldMaintenance());5414 }5415 }54165417 // Remove Resource Quantity from total5418 if(getResourceType() != NO_RESOURCE)5419 {5420 // Disconnect resource link5421 if(GetResourceLinkedCity() != NULL)5422 {5423 SetResourceLinkedCity(NULL);5424 }54255426 if(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes) GC.getResourceInfo(getResourceType())->getTechCityTrade()))5427 {5428 if(getImprovementType() != NO_IMPROVEMENT && GC.getImprovementInfo(getImprovementType())->IsImprovementResourceTrade(getResourceType()))5429 {5430 if(!IsImprovementPillaged())5431 {5432 GET_PLAYER(getOwner()).changeNumResourceTotal(getResourceType(), -getNumResourceForPlayer(getOwner()));5433 }5434 }5435 }5436 }5437 }5438 // Plot is unowned5439 else5440 {5441 // Someone paying for this improvement5442 if(GetPlayerResponsibleForImprovement() != NO_PLAYER)5443 {5444 if(MustPayMaintenanceHere(GetPlayerResponsibleForImprovement()))5445 {5446 GET_PLAYER(GetPlayerResponsibleForImprovement()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getImprovementInfo(getImprovementType())->GetGoldMaintenance());5447 }5448 SetPlayerResponsibleForImprovement(NO_PLAYER);5449 }5450 // Someone paying for this Route5451 if(GetPlayerResponsibleForRoute() != NO_PLAYER)5452 {5453 if(MustPayMaintenanceHere(GetPlayerResponsibleForRoute()))5454 {5455 GET_PLAYER(GetPlayerResponsibleForRoute()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getRouteInfo(getRouteType())->GetGoldMaintenance());5456 }5457 SetPlayerResponsibleForRoute(NO_PLAYER);5458 }5459 }54605461 // This plot is ABOUT TO BE owned. Pop Goody Huts/remove barb camps, etc. Otherwise it will try to reduce the # of Improvements we have in our borders, and these guys shouldn't apply to that count5462 if(eNewValue != NO_PLAYER)5463 {5464 // Pop Goody Huts here5465 if(isGoody())5466 {5467 GET_PLAYER(eNewValue).doGoody(this, NULL);5468 }54695470 // If there's a camp here, clear it5471 if(getImprovementType() == GC.getBARBARIAN_CAMP_IMPROVEMENT())5472 {5473 setImprovementType(NO_IMPROVEMENT);5474 CvBarbarians::DoBarbCampCleared(this, eNewValue);5475 SetPlayerThatClearedBarbCampHere(eNewValue);54765477 // Don't give gold for Camps cleared by settling5478 }5479 }54805481 pUnitNode = headUnitNode();54825483 // ACTUALLY CHANGE OWNERSHIP HERE5484 m_eOwner = eNewValue;54855486 setWorkingCityOverride(NULL);5487 updateWorkingCity();54885489 // Post ownership switch54905491 if(isOwned())5492 {5493 CvPlayerAI& newPlayer = GET_PLAYER(eNewValue);5494 if(iAcquiringCityID >= 0)5495 {5496 m_purchaseCity.eOwner = eNewValue;5497 m_purchaseCity.iID = iAcquiringCityID;5498 }5499 else5500 {5501 m_purchaseCity.eOwner = NO_PLAYER;5502 m_purchaseCity.iID = -1;5503 }55045505#if defined(MOD_API_EXTENSIONS)5506 changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION);5507#else5508 changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION, false);5509#endif55105511 // if this tile is owned by a minor share the visibility with my ally5512 if(pOldCity)5513 {5514 for(uint ui = 0; ui < MAX_MAJOR_CIVS; ui++)5515 {5516 PlayerTypes ePlayer = (PlayerTypes)ui;5517 if(GET_PLAYER(ePlayer).GetEspionage()->HasEstablishedSurveillanceInCity(pOldCity))5518 {5519#if defined(MOD_API_EXTENSIONS)5520 changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), true, NO_INVISIBLE, NO_DIRECTION);5521#else5522 changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), true, NO_INVISIBLE, NO_DIRECTION, false);5523#endif5524 }5525 }5526 }55275528 if(eNewValue >= MAX_MAJOR_CIVS && eNewValue != BARBARIAN_PLAYER)5529 {5530 CvPlayer& thisPlayer = GET_PLAYER(eNewValue);5531 CvMinorCivAI* pMinorCivAI = thisPlayer.GetMinorCivAI();5532 if(pMinorCivAI && pMinorCivAI->GetAlly() != NO_PLAYER)5533 {5534#if defined(MOD_API_EXTENSIONS)5535 changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION);5536#else5537 changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION, false);5538#endif5539 }5540 }55415542 if(area())5543 {5544 area()->changeNumOwnedTiles(1);5545 }5546 GC.getMap().changeOwnedPlots(1);55475548 if(!isWater())5549 {5550 GET_PLAYER(getOwner()).changeTotalLand(1);5551 GET_TEAM(getTeam()).changeTotalLand(1);55525553 if(isOwnershipScore())5554 {5555 GET_PLAYER(getOwner()).changeTotalLandScored(1);5556 }5557 }55585559 // Improvement is here5560 if(getImprovementType() != NO_IMPROVEMENT)5561 {5562 GET_PLAYER(eNewValue).changeImprovementCount(getImprovementType(), 1);55635564 // Add siphoned resources5565 CvImprovementEntry* pImprovementInfo = GC.getImprovementInfo(getImprovementType());5566 if (pImprovementInfo != NULL && pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor() > 0)5567 {5568 if (GetPlayerThatBuiltImprovement() != NO_PLAYER)5569 {5570 if (GET_PLAYER(eNewValue).isMinorCiv())5571 {5572 GET_PLAYER(GetPlayerThatBuiltImprovement()).changeSiphonLuxuryCount(eNewValue, pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor());5573 }5574 }5575 }55765577 // Maintenance change!5578 if(MustPayMaintenanceHere(eNewValue))5579 {5580 GET_PLAYER(eNewValue).GetTreasury()->ChangeBaseImprovementGoldMaintenance(GC.getImprovementInfo(getImprovementType())->GetGoldMaintenance());5581 }5582 }55835584 // Route is here5585 if(getRouteType() != NO_ROUTE && !isCity())5586 {5587 // Maintenance change!5588 if(MustPayMaintenanceHere(eNewValue))5589 {5590 GET_PLAYER(eNewValue).GetTreasury()->ChangeBaseImprovementGoldMaintenance(GC.getRouteInfo(getRouteType())->GetGoldMaintenance());5591 }5592 }55935594 if(getResourceType() != NO_RESOURCE)5595 {5596 // Add Resource Quantity to total5597 if(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes) GC.getResourceInfo(getResourceType())->getTechCityTrade()))5598 {5599 if(getImprovementType() != NO_IMPROVEMENT && GC.getImprovementInfo(getImprovementType())->IsImprovementResourceTrade(getResourceType()))5600 {5601 if(!IsImprovementPillaged())5602 {5603 GET_PLAYER(getOwner()).changeNumResourceTotal(getResourceType(), getNumResourceForPlayer(getOwner()));5604 }5605 }5606 }56075608 // Should we link the Resource here with a City so special Buildings may be constructed?5609 if(GetResourceLinkedCity() == NULL)5610 {5611 DoFindCityToLinkResourceTo();5612 }5613 }56145615 // update the high water mark for player (if human)5616 int iMaxCityHighWaterMark = GC.getMAX_CITY_DIST_HIGHWATER_MARK();5617 if(newPlayer.isHuman() && newPlayer.GetCityDistanceHighwaterMark() < iMaxCityHighWaterMark)5618 {5619 int bestHighWaterMark = newPlayer.GetCityDistanceHighwaterMark();5620 for(int iDX = -iMaxCityHighWaterMark; iDX <= iMaxCityHighWaterMark && bestHighWaterMark < iMaxCityHighWaterMark; iDX++)5621 {5622 for(int iDY = -iMaxCityHighWaterMark; iDY <= iMaxCityHighWaterMark && bestHighWaterMark < iMaxCityHighWaterMark; iDY++)5623 {5624 int hexRange;56255626 // I'm assuming iDX and iDY are in hex-space5627 if((iDX >= 0) == (iDY >= 0)) // the signs match5628 {5629 int iAbsDX = iDX >= 0 ? iDX : -iDX;5630 int iAbsDY = iDY >= 0 ? iDY : -iDY;5631 hexRange = iAbsDX + iAbsDY;5632 }5633 else5634 {5635 int iAbsDX = iDX >= 0 ? iDX : -iDX;5636 int iAbsDY = iDY >= 0 ? iDY : -iDY;5637 hexRange = iAbsDX >= iAbsDY ? iAbsDX : iAbsDY;5638 }56395640 if(hexRange > bestHighWaterMark && hexRange <= iMaxCityHighWaterMark)5641 {5642 CvPlot* pLoopPlot = plotXY(getX(), getY(), iDX, iDY);5643 if(pLoopPlot)5644 {5645 CvCity* thisCity = pLoopPlot->getPlotCity();5646 if(thisCity)5647 {5648 if(thisCity->getOwner() == eNewValue)5649 {5650 bestHighWaterMark = hexRange;5651 }5652 }5653 }5654 }5655 }5656 }5657 if(bestHighWaterMark > newPlayer.GetCityDistanceHighwaterMark())5658 {5659 newPlayer.SetCityDistanceHighwaterMark(bestHighWaterMark);5660 if(GC.GetEngineUserInterface()->isCityScreenUp())5661 {5662 auto_ptr<ICvCity1> pHeadSelectedCity(GC.GetEngineUserInterface()->getHeadSelectedCity());5663 if(pHeadSelectedCity.get())5664 {5665 CvCity* pkHeadSelectedCity = GC.UnwrapCityPointer(pHeadSelectedCity.get());5666 auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(pkHeadSelectedCity->plot());5667 GC.GetEngineUserInterface()->lookAt(pDllPlot.get(), CAMERALOOKAT_CITY_ZOOM_IN);5668 }5669 }5670 }5671 }56725673#if defined(MOD_EVENTS_TILE_IMPROVEMENTS)5674 if (MOD_EVENTS_TILE_IMPROVEMENTS) {5675 GAMEEVENTINVOKE_HOOK(GAMEEVENT_TileOwnershipChanged, getX(), getY(), getOwner(), eOldOwner);5676 }5677#endif5678 }56795680 pUnitNode = headUnitNode();56815682 for(iI = 0; iI < MAX_TEAMS; ++iI)5683 {5684 if(GET_TEAM((TeamTypes)iI).isAlive())5685 {5686 updateRevealedOwner((TeamTypes)iI);5687 }5688 }56895690 updateYield();56915692 // Update happiness if there's a luxury or natural wonder here5693 if(isOwned())5694 {5695 bool bShouldUpdateHappiness = false;56965697 if(getFeatureType() != NO_FEATURE)5698 {5699 if(GC.getFeatureInfo(getFeatureType())->IsNaturalWonder())5700 {5701 bShouldUpdateHappiness = true;5702 }5703 }57045705 if(!bShouldUpdateHappiness && getResourceType(getTeam()) != NO_RESOURCE)5706 {5707 if(GC.getResourceInfo(getResourceType(getTeam()))->getResourceUsage() == RESOURCEUSAGE_LUXURY)5708 {5709 if(getImprovementType() != NO_IMPROVEMENT)5710 {5711 bShouldUpdateHappiness = true;5712 }5713 }5714 }57155716 if(bShouldUpdateHappiness)5717 {5718 GET_PLAYER(getOwner()).DoUpdateHappiness();5719 }5720 }57215722 if(bCheckUnits)5723 {5724 verifyUnitValidPlot();5725 }57265727 if(GC.getGame().isDebugMode())5728 {5729 auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(this);5730 GC.GetEngineUserInterface()->UpdateCountryBorder(pDllPlot.get());5731 }5732 }57335734 auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(this);5735 GC.GetEngineUserInterface()->UpdateCountryBorder(pDllPlot.get());5736 GC.GetEngineUserInterface()->setDirty(NationalBorders_DIRTY_BIT, true);5737 updateSymbols();5738 }5739}