Skip to content

Commit

Permalink
Promotions can now give a unit a combat bonus for X turns after a tec…
Browse files Browse the repository at this point in the history
…h is

researched.

Holy shit, what is up with EnemyUnitPanel.lua?
  • Loading branch information
Sergeus committed Feb 23, 2015
1 parent 77001a0 commit 820dbe2
Show file tree
Hide file tree
Showing 13 changed files with 252 additions and 2 deletions.
18 changes: 18 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/CvPromotionClasses.cpp
Expand Up @@ -103,6 +103,9 @@ CvPromotionEntry::CvPromotionEntry():
#if WOTMOD
m_iTurnDamage(0),
m_iRangedAttackSelfDamageChance(0),
m_iOnResearchCombatModifier(0),
m_iOnResearchRangedCombatModifier(0),
m_iOnResearchModifiersDuration(0),
m_bBlocksHealing(false),
#endif // WOTMOD

Expand Down Expand Up @@ -322,6 +325,9 @@ bool CvPromotionEntry::CacheResults(Database::Results& kResults, CvDatabaseUtili
#if WOTMOD
m_iTurnDamage = kResults.GetInt("TurnDamage");
m_iRangedAttackSelfDamageChance = kResults.GetInt("RangedAttackSelfDamageChance");
m_iOnResearchCombatModifier = kResults.GetInt("OnResearchCombatModifier");
m_iOnResearchRangedCombatModifier = kResults.GetInt("OnResearchRangedCombatModifier");
m_iOnResearchModifiersDuration = kResults.GetInt("OnResearchModifiersDuration");
m_bBlocksHealing = kResults.GetBool("BlocksHealing");
#endif // WOTMOD

Expand Down Expand Up @@ -1202,6 +1208,18 @@ int CvPromotionEntry::GetNearbyGovernorYieldChange(YieldTypes eYield) const
{
return m_aiNearbyGovernorYieldChange[eYield];
}
int CvPromotionEntry::GetOnResearchCombatModifier() const
{
return m_iOnResearchCombatModifier;
}
int CvPromotionEntry::GetOnResearchRangedCombatModifier() const
{
return m_iOnResearchRangedCombatModifier;
}
int CvPromotionEntry::GetOnResearchModifiersDuration() const
{
return m_iOnResearchModifiersDuration;
}
#endif // WOTMOD

/// Accessor: Can this Promotion be earned through normal leveling?
Expand Down
6 changes: 6 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/CvPromotionClasses.h
Expand Up @@ -131,6 +131,9 @@ class CvPromotionEntry: public CvHotKeyInfo
#if WOTMOD
int GetTurnDamage() const;
int GetRangedAttackSelfDamageChance() const;
int GetOnResearchCombatModifier() const;
int GetOnResearchRangedCombatModifier() const;
int GetOnResearchModifiersDuration() const;
bool IsBlocksHealing() const;
int GetNearbyGovernorYieldChange(YieldTypes eYield) const;
#endif // WOTMOD
Expand Down Expand Up @@ -296,6 +299,9 @@ class CvPromotionEntry: public CvHotKeyInfo
#if WOTMOD
int m_iTurnDamage;
int m_iRangedAttackSelfDamageChance;
int m_iOnResearchCombatModifier;
int m_iOnResearchRangedCombatModifier;
int m_iOnResearchModifiersDuration;
bool m_bBlocksHealing;
std::vector<int> m_aiNearbyGovernorYieldChange;
#endif // WOTMOD
Expand Down
4 changes: 4 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/CvTeam.cpp
Expand Up @@ -774,6 +774,10 @@ void CvTeam::doTurn()
DoMinorCivTech();
}

#if WOTMOD
GetTeamTechs()->ChangeTurnsSinceLastTech(1);
#endif // WOTMOD

for(iI = 0; iI < GC.getNumTechInfos(); iI++)
{
GetTeamTechs()->SetNoTradeTech(((TechTypes)iI), false);
Expand Down
24 changes: 23 additions & 1 deletion DLL/CvGameCoreDLL_Expansion2/CvTechClasses.cpp
Expand Up @@ -1863,8 +1863,15 @@ void CvTeamTechs::SetHasTech(TechTypes eIndex, bool bNewValue)
{
m_pabHasTech[eIndex] = bNewValue;

if(bNewValue)
if (bNewValue)
#if WOTMOD
{
#endif // WOTMOD
SetLastTechAcquired(eIndex);
#if WOTMOD
SetTurnsSinceLastTech(0);
}
#endif // WOTMOD

ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();
if(pkScriptSystem)
Expand Down Expand Up @@ -1914,6 +1921,21 @@ void CvTeamTechs::SetLastTechAcquired(TechTypes eTech)
m_eLastTechAcquired = eTech;
}

#if WOTMOD
int CvTeamTechs::GetTurnsSinceLastTech() const
{
return m_iTurnsSinceLastTechAcquired;
}
void CvTeamTechs::SetTurnsSinceLastTech(int iNewValue)
{
m_iTurnsSinceLastTechAcquired = iNewValue;
}
void CvTeamTechs::ChangeTurnsSinceLastTech(int iChange)
{
SetTurnsSinceLastTech(GetTurnsSinceLastTech() + iChange);
}
#endif // WOTMOD

/// How many total Techs does this team have?
int CvTeamTechs::GetNumTechsKnown() const
{
Expand Down
9 changes: 9 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/CvTechClasses.h
Expand Up @@ -305,6 +305,12 @@ class CvTeamTechs
TechTypes GetLastTechAcquired() const;
void SetLastTechAcquired(TechTypes eTech);

#if WOTMOD
int GetTurnsSinceLastTech() const;
void SetTurnsSinceLastTech(int iNewValue);
void ChangeTurnsSinceLastTech(int iChange);
#endif // WOTMOD

int GetNumTechsKnown() const;
bool HasResearchedAllTechs() const;

Expand All @@ -327,6 +333,9 @@ class CvTeamTechs
int GetMaxResearchOverflow(TechTypes eTech, PlayerTypes ePlayer) const;

TechTypes m_eLastTechAcquired;
#if WOTMOD
int m_iTurnsSinceLastTechAcquired;
#endif // WOTMOD

bool* m_pabHasTech;
bool* m_pabNoTradeTech;
Expand Down
88 changes: 88 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/CvUnit.cpp
Expand Up @@ -271,6 +271,8 @@ CvUnit::CvUnit() :
, m_iRangedAttackSelfDamageChance(0)
, m_iHealBlockedCount(0)
, m_aiNearbyGovernorYieldChange("CvUnit::m_aiNearbyGovernorYieldChange", m_syncArchive)
, m_aiOnResearchCombatModifiers("CvUnit::m_aiOnResearchCombatModifiers", m_syncArchive)
, m_aiOnResearchRangedCombatModifiers("CvUnit::m_aiOnResearchRangedCombatModifiers", m_syncArchive)
#endif // WOTMOD

, m_strName("")
Expand Down Expand Up @@ -10649,6 +10651,10 @@ int CvUnit::GetMaxAttackStrength(const CvPlot* pFromPlot, const CvPlot* pToPlot,
iTempModifier = getAttackModifier();
iModifier += iTempModifier;

#if WOTMOD
iModifier += GetOnResearchCombatModifier();
#endif // WOTMOD

// Kamikaze attack
if(getKamikazePercent() != 0)
{
Expand Down Expand Up @@ -11020,6 +11026,10 @@ int CvUnit::GetMaxRangedCombatStrength(const CvUnit* pOtherUnit, const CvCity* p
// Extra combat percent
iModifier = getExtraCombatPercent();

#if WOTMOD
iModifier += GetOnResearchRangedCombatModifier();
#endif // WOTMOD

// Kamikaze attack
if(getKamikazePercent() != 0)
iModifier += getKamikazePercent();
Expand Down Expand Up @@ -17832,6 +17842,9 @@ void CvUnit::setHasPromotion(PromotionTypes eIndex, bool bNewValue)
{
DoUpdateNearbyGovernorYieldChange(plot(), iChange < 0);
}

ChangeOnResearchCombatModifier(thisPromotion.GetOnResearchCombatModifier(), thisPromotion.GetOnResearchModifiersDuration(), iChange < 0);
ChangeOnResearchRangedCombatModifier(thisPromotion.GetOnResearchRangedCombatModifier(), thisPromotion.GetOnResearchModifiersDuration(), iChange < 0);
#endif // WOTMOD

for(iI = 0; iI < GC.getNumTerrainInfos(); iI++)
Expand Down Expand Up @@ -21874,6 +21887,81 @@ void CvUnit::DoUpdateNearbyGovernorYieldChange(CvPlot* pRootPlot, bool bRemove)
}
}
}

int CvUnit::GetOnResearchCombatModifier() const
{
int iModifier = 0;
int iTurnsSinceTech = GET_TEAM(getTeam()).GetTeamTechs()->GetTurnsSinceLastTech();

for (int i = 0; i < m_aiOnResearchCombatModifiers.size(); ++i)
{
if (m_aiOnResearchCombatModifiers[i].second >= iTurnsSinceTech)
{
iModifier += m_aiOnResearchCombatModifiers[i].first;
}
}

return iModifier;
}

int CvUnit::GetOnResearchRangedCombatModifier() const
{
int iModifier = 0;
int iTurnsSinceTech = GET_TEAM(getTeam()).GetTeamTechs()->GetTurnsSinceLastTech();

for (int i = 0; i < m_aiOnResearchRangedCombatModifiers.size(); ++i)
{
if (m_aiOnResearchRangedCombatModifiers[i].second >= iTurnsSinceTech)
{
iModifier += m_aiOnResearchRangedCombatModifiers[i].first;
}
}

return iModifier;
}

void CvUnit::ChangeOnResearchCombatModifier(int iModifier, int iDuration, bool bRemove)
{
if (bRemove)
{
for (int i = 0; i < m_aiOnResearchCombatModifiers.size(); ++i)
{
if (m_aiOnResearchCombatModifiers[i].first == iModifier && m_aiOnResearchCombatModifiers[i].second == iDuration)
{
m_aiOnResearchCombatModifiers.erase(i);
break;
}
}
}
else
{
if (iModifier != 0 && iDuration > 0)
{
m_aiOnResearchCombatModifiers.push_back(make_pair(iModifier, iDuration));
}
}
}
void CvUnit::ChangeOnResearchRangedCombatModifier(int iModifier, int iDuration, bool bRemove)
{
if (bRemove)
{
for (int i = 0; i < m_aiOnResearchRangedCombatModifiers.size(); ++i)
{
if (m_aiOnResearchRangedCombatModifiers[i].first == iModifier && m_aiOnResearchRangedCombatModifiers[i].second == iDuration)
{
m_aiOnResearchRangedCombatModifiers.erase(i);
break;
}
}
}
else
{
if (iModifier != 0 && iDuration > 0)
{
m_aiOnResearchRangedCombatModifiers.push_back(make_pair(iModifier, iDuration));
}
}
}
#endif // WOTMOD

// --------------------------------------------------------------------------------
Expand Down
8 changes: 8 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/CvUnit.h
Expand Up @@ -462,6 +462,7 @@ class CvUnit
int GetBaseCombatStrengthConsideringDamage() const;

int GetGenericMaxStrengthModifier(const CvUnit* pOtherUnit, const CvPlot* pBattlePlot, bool bIgnoreUnitAdjacency) const;

int GetMaxAttackStrength(const CvPlot* pFromPlot, const CvPlot* pToPlot, const CvUnit* pDefender) const;
int GetMaxDefenseStrength(const CvPlot* pInPlot, const CvUnit* pAttacker, bool bFromRangedAttack = false) const;
int GetEmbarkedUnitDefense() const;
Expand Down Expand Up @@ -1275,6 +1276,11 @@ class CvUnit
void SetNearbyGovernorYieldChange(YieldTypes eYield, int iNewValue);
void ChangeNearbyGovernorYieldChange(YieldTypes eYield, int iChangePair);
void DoUpdateNearbyGovernorYieldChange(CvPlot* pPlot, bool bRemove);

int GetOnResearchCombatModifier() const;
int GetOnResearchRangedCombatModifier() const;
void ChangeOnResearchCombatModifier(int iModifier, int iRange, bool bRemove);
void ChangeOnResearchRangedCombatModifier(int iModifier, int iRange, bool bRemove);
#endif // WOTMOD

protected:
Expand Down Expand Up @@ -1317,6 +1323,8 @@ class CvUnit

#if WOTMOD
FAutoVariable<std::vector<int>, CvUnit> m_aiNearbyGovernorYieldChange;
FAutoVariable<std::vector<std::pair<int, int>>, CvUnit> m_aiOnResearchCombatModifiers;
FAutoVariable<std::vector<std::pair<int, int>>, CvUnit> m_aiOnResearchRangedCombatModifiers;
#endif // WOTMOD

FAutoVariable<int, CvUnit> m_iHotKeyNumber;
Expand Down
10 changes: 10 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/Lua/CvLuaUnit.cpp
Expand Up @@ -476,6 +476,8 @@ void CvLuaUnit::PushMethods(lua_State* L, int t)
Method(GetGovernorType);
Method(DoGovernCity);
Method(DoTrainAtTower);
Method(GetOnResearchCombatModifier);
Method(GetOnResearchRangedCombatModifier);
#endif // WOTMOD
}
//------------------------------------------------------------------------------
Expand Down Expand Up @@ -4543,4 +4545,12 @@ int CvLuaUnit::lDoTrainAtTower(lua_State* L)

return 0;
}
int CvLuaUnit::lGetOnResearchCombatModifier(lua_State* L)
{
return BasicLuaMethod(L, &CvUnit::GetOnResearchCombatModifier);
}
int CvLuaUnit::lGetOnResearchRangedCombatModifier(lua_State* L)
{
return BasicLuaMethod(L, &CvUnit::GetOnResearchRangedCombatModifier);
}
#endif // WOTMOD
2 changes: 2 additions & 0 deletions DLL/CvGameCoreDLL_Expansion2/Lua/CvLuaUnit.h
Expand Up @@ -485,6 +485,8 @@ class CvLuaUnit : public CvLuaScopedInstance<CvLuaUnit, CvUnit>
static int lGetGovernorType(lua_State* L);
static int lDoGovernCity(lua_State* L);
static int lDoTrainAtTower(lua_State* L);
static int lGetOnResearchCombatModifier(lua_State* L);
static int lGetOnResearchRangedCombatModifier(lua_State* L);
#endif // WOTMOD
};

Expand Down

0 comments on commit 820dbe2

Please sign in to comment.