Well, you can't avoid your King's embargos on goods when you refuse a tax increase.
The good news is that the embargo does not last forever anymore (as much as I hate the US embargo on Cuba).
This would require some changes to the C++ code so here we are:
We are going to make changes to CvPlayer.h and CvPlayer.cpp.
CvPlayer.h:
CvPlayer.cpp:
somewhere beginning of file after #includes:
CvPlayer constructor:
CvPlayer destructor:
reset() method:
doTurn() method;
handleDiploEvent() method:
setYieldEuropeTradable() method:
new methods():
read() method:
write() method:
Some changes are just boiler plate stuff. I didn't bother with i18n of strings and the embargo duration in turns is hard coded as 10 turns to quickly test this feature.
Pictures are next...
The good news is that the embargo does not last forever anymore (as much as I hate the US embargo on Cuba).
This would require some changes to the C++ code so here we are:
Spoiler :
We are going to make changes to CvPlayer.h and CvPlayer.cpp.
CvPlayer.h:
Code:
public:
// ESPARTACO: overcoming King's embargo START
// so far, no need to export these two methods
int getEmbargoOnYieldTurns(YieldTypes eYield) const;
void changeEmbargoOnYieldTurns(YieldTypes eYield, int iChange) const;
// ESPARTACO: overcoming King's embargo END
protected:
// ESPARTACO: overcoming King's embargo START
int* m_aiEmbargoOnYieldTurns;
// ESPARTACO: overcoming King's embargo END
// ESPARTACO: overcoming King's embargo START
void doEmbargos(void);
// ESPARTACO: overcoming King's embargo END
CvPlayer.cpp:
somewhere beginning of file after #includes:
Code:
// ESPARTACO: overcoming King's embargo START
// Number of turns for an embargo
static const int EMBARGO_TURNS = 10; // TODO: move this number to an XML file
// ESPARTACO: overcoming King's embargo END
CvPlayer constructor:
Code:
// ESPARTACO: overcoming King's embargo START
m_aiEmbargoOnYieldTurns = new int[NUM_YIELD_TYPES];
// ESPARTACO: overcoming King's embargo END
CvPlayer destructor:
Code:
// ESPARTACO: overcoming King's embargo START
SAFE_DELETE_ARRAY(m_aiEmbargoOnYieldTurns);
// ESPARTACO: overcoming King's embargo END
reset() method:
Code:
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
// ESPARTACO: overcoming King's embargo START
m_aiEmbargoOnYieldTurns[iI] = 0;
// ESPARTACO: overcoming King's embargo END
}
doTurn() method;
Code:
verifyCivics();
doPrices();
doEvents();
// ESPARTACO: overcoming King's embargo START
doEmbargos();
// ESPARTACO: overcoming King's embargo END
handleDiploEvent() method:
Code:
case DIPLOEVENT_REFUSE_TAX_RATE:
{
AI_changeMemoryCount(ePlayer, MEMORY_REFUSED_TAX, 1);
CvPlayer& kPlayer = GET_PLAYER(ePlayer);
YieldTypes eYield = (YieldTypes) iData1;
kPlayer.setYieldEuropeTradable(eYield, false);
// ESPARTACO: overcoming King's embargo START
// I don't understand this so it is commented out
//kPlayer.setYieldTradedTotal(eYield, 0);
// ESPARTACO: overcoming King's embargo END
CvCity* pCity = kPlayer.getCity(iData2);
setYieldEuropeTradable() method:
Code:
if (bOldTradeable != isYieldEuropeTradable(eYield))
{
validateTradeRoutes();
// ESPARTACO: overcoming King's embargo START
if(bTradeable == false)
{
// start embargo on this good
m_aiEmbargoOnYieldTurns[eYield] = EMBARGO_TURNS;
}
// ESPARTACO: overcoming King's embargo END
}
new methods():
Code:
// ESPARTACO: overcoming King's embargo START
int CvPlayer::getEmbargoOnYieldTurns(YieldTypes eYield) const
{
FAssert(eYield > -1);
FAssert(eYield < NUM_YIELD_TYPES);
return m_aiEmbargoOnYieldTurns[eYield];
}
void CvPlayer::changeEmbargoOnYieldTurns(YieldTypes eYield, int iChange) const
{
FAssert(eYield > -1);
FAssert(eYield < NUM_YIELD_TYPES);
m_aiEmbargoOnYieldTurns[eYield] += iChange;
}
void CvPlayer::doEmbargos(void)
{
if(getParent() == NO_PLAYER) // no King?
{
return;
}
for(int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)
{
YieldTypes eYield = (YieldTypes)iYield;
// is there an embergo on this good?
if(m_abYieldEuropeTradable[iYield] == false)
{
// is time to lift the embargo?
m_aiEmbargoOnYieldTurns[iYield]--;
if(m_aiEmbargoOnYieldTurns[iYield] <= 0)
{
m_aiEmbargoOnYieldTurns[iYield] = 0;
setYieldEuropeTradable(eYield, true);
// TODO: i18n this message; add yield icon?
CvWString szMessage = CvWString::format(L"Embargo on %s has been lifted!", GC.getYieldInfo(eYield).getDescription());
// TODO: beutify better this message? include a popup? sounds?
bool bForce = true;
int iLength = GC.getEVENT_MESSAGE_TIME();
LPCTSTR pszSound = NULL;
InterfaceMessageTypes eType = MESSAGE_TYPE_MAJOR_EVENT;
LPCSTR pszIcon = NULL;
ColorTypes eFlashColor = (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN");
gDLL->getInterfaceIFace()->addMessage(getID(),
bForce,
iLength,
szMessage,
pszSound,
eType,
pszIcon,
eFlashColor);
}
}
}
}
// ESPARTACO: overcoming King's embargo END
read() method:
Code:
pStream->Read(NUM_YIELD_TYPES, m_abYieldEuropeTradable);
// ESPARTACO: overcoming King's embargo START
pStream->Read(NUM_YIELD_TYPES, m_aiEmbargoOnYieldTurns);
// ESPARTACO: overcoming King's embargo END
pStream->Read(NUM_FEAT_TYPES, m_abFeatAccomplished);
write() method:
Code:
pStream->Write(NUM_YIELD_TYPES, m_abYieldEuropeTradable);
// ESPARTACO: overcoming King's embargo START
pStream->Write(NUM_YIELD_TYPES, m_aiEmbargoOnYieldTurns);
// ESPARTACO: overcoming King's embargo END
pStream->Write(NUM_FEAT_TYPES, m_abFeatAccomplished);
Some changes are just boiler plate stuff. I didn't bother with i18n of strings and the embargo duration in turns is hard coded as 10 turns to quickly test this feature.
Pictures are next...