Ich denke, du meist GlobalDefines.xml?
Code:
<Define>
<DefineName>MAX_CITY_DEFENSE_DAMAGE</DefineName>
<iDefineIntVal>100</iDefineIntVal>
</Define>
<Define>
<DefineName>CITY_DEFENSE_DAMAGE_HEAL_RATE</DefineName>
<iDefineIntVal>5</iDefineIntVal>
</Define>
Das müssten die Originalwerte sein.
CvCity::changeDefenseDamage ist noch original
Code:
void CvCity::changeDefenseDamage(int iChange)
{
if (iChange != 0)
{
m_iDefenseDamage = range((m_iDefenseDamage + iChange), 0, GC.getMAX_CITY_DEFENSE_DAMAGE());
if (iChange > 0)
{
setBombarded(true);
}
setInfoDirty(true);
plot()->plotAction(PUF_makeInfoBarDirty);
}
}
CvCityDoTurn wurde geändert:
Code:
void CvCity::doTurn()
{
PROFILE("CvCity::doTurn()");
CvPlot* pLoopPlot;
int iI;
// dune wars - start
for (iI = 0; iI < GC.getNumBuildingInfos(); iI++)
{
if (getNumRealBuilding((BuildingTypes)iI) > 0 && m_paiBuildingDuration[iI] == 0)
{
setNumRealBuilding(((BuildingTypes)iI), 0);
}
m_paiBuildingDuration[iI] -= 1;
}
// dune wars - end
if (!isBombarded())
{
changeDefenseDamage(-(GC.getDefineINT("CITY_DEFENSE_DAMAGE_HEAL_RATE")));
}
setLastDefenseDamage(getDefenseDamage());
setBombarded(false);
setPlundered(false);
setDrafted(false);
setAirliftTargeted(false);
/************************************************************************************************/
/* Afforess 9/7/10 */
/* */
/* */
/************************************************************************************************/
//Counts down the disable power timer
doDisabledPower();
doWarWeariness();
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
setCurrAirlift(0);
AI_doTurn();
bool bAllowNoProduction = !doCheckProduction();
doGrowth();
doCulture();
doPlotCulture(false, getOwnerINLINE(), getCommerceRate(COMMERCE_CULTURE));
doProduction(bAllowNoProduction);
doDecay();
doReligion();
doGreatPeople();
//Kathy Beginn Free Unit Birth
doFreeUnitBirth();
//Kathy End Free Unit Birth
doMeltdown();
updateEspionageVisibility(true);
if (!isDisorder())
{
for (iI = 0; iI < NUM_CITY_PLOTS; iI++)
{
pLoopPlot = getCityIndexPlot(iI);
if (pLoopPlot != NULL)
{
if (pLoopPlot->getWorkingCity() == this)
{
if (pLoopPlot->isBeingWorked())
{
pLoopPlot->doImprovement();
}
}
}
}
}
if (getCultureUpdateTimer() > 0)
{
changeCultureUpdateTimer(-1);
}
if (getOccupationTimer() > 0)
{
changeOccupationTimer(-1);
}
if (getHurryAngerTimer() > 0)
{
changeHurryAngerTimer(-1);
}
if (getConscriptAngerTimer() > 0)
{
changeConscriptAngerTimer(-1);
}
if (getDefyResolutionAngerTimer() > 0)
{
changeDefyResolutionAngerTimer(-1);
}
if (getHappinessTimer() > 0)
{
changeHappinessTimer(-1);
}
if (getEspionageHealthCounter() > 0)
{
changeEspionageHealthCounter(-1);
}
if (getEspionageHappinessCounter() > 0)
{
changeEspionageHappinessCounter(-1);
}
if (isOccupation() || (angryPopulation() > 0) || (healthRate() < 0))
{
setWeLoveTheKingDay(false);
}
else if ((getPopulation() >= GC.getDefineINT("WE_LOVE_THE_KING_POPULATION_MIN_POPULATION")) && (GC.getGameINLINE().getSorenRandNum(GC.getDefineINT("WE_LOVE_THE_KING_RAND"), "Do We Love The King?") < getPopulation()))
{
setWeLoveTheKingDay(true);
}
else
{
setWeLoveTheKingDay(false);
}
// ONEVENT - Do turn
CvEventReporter::getInstance().cityDoTurn(this, getOwnerINLINE());
//Kathy: UNzufriedenheit führt zu Aufständen Beginn
if (angryPopulation() > 5)
{
if (GC.getGameINLINE().getSorenRandNum( 5, "Do We Love The King?") < 2)
{
if (GET_PLAYER(getOwnerINLINE()).doBarbarianUprising( this, angryPopulation()/10+1, getFoodProducedUnit() ))
{
CvWString szBuffer;
szBuffer = gDLL->getText("TXT_KEY_MESSAGE_UNHAPPY_BARBARIAN", getNameKey() , getNameKey() );
PlayerTypes eActivePlayer;
eActivePlayer = (PlayerTypes)GET_PLAYER(getOwnerINLINE()).getID() ;
gDLL->getInterfaceIFace()->addMessage( eActivePlayer, false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_RED"));
}
}
}
//Kathy: UNzufriedenheit führt zu Aufständen Beginn
// XXX
#ifdef _DEBUG
{
CvPlot* pPlot;
int iCount;
int iI, iJ;
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
FAssert(getBaseYieldRate((YieldTypes)iI) >= 0);
FAssert(getYieldRate((YieldTypes)iI) >= 0);
iCount = 0;
for (iJ = 0; iJ < NUM_CITY_PLOTS; iJ++)
{
if (isWorkingPlot(iJ))
{
pPlot = getCityIndexPlot(iJ);
if (pPlot != NULL)
{
iCount += pPlot->getYield((YieldTypes)iI);
}
}
}
for (iJ = 0; iJ < GC.getNumSpecialistInfos(); iJ++)
{
iCount += (GET_PLAYER(getOwnerINLINE()).specialistYield(((SpecialistTypes)iJ), ((YieldTypes)iI)) * (getSpecialistCount((SpecialistTypes)iJ) + getFreeSpecialistCount((SpecialistTypes)iJ)));
}
for (iJ = 0; iJ < GC.getNumBuildingInfos(); iJ++)
{
iCount += getNumActiveBuilding((BuildingTypes)iJ) * (GC.getBuildingInfo((BuildingTypes) iJ).getYieldChange(iI) + getBuildingYieldChange((BuildingClassTypes)GC.getBuildingInfo((BuildingTypes) iJ).getBuildingClassType(), (YieldTypes)iI));
}
iCount += getTradeYield((YieldTypes)iI);
iCount += getCorporationYield((YieldTypes)iI);
FAssert(iCount == getBaseYieldRate((YieldTypes)iI));
}
for (iI = 0; iI < NUM_COMMERCE_TYPES; iI++)
{
FAssert(getBuildingCommerce((CommerceTypes)iI) >= 0);
FAssert(getSpecialistCommerce((CommerceTypes)iI) >= 0);
FAssert(getReligionCommerce((CommerceTypes)iI) >= 0);
FAssert(getCorporationCommerce((CommerceTypes)iI) >= 0);
FAssert(GET_PLAYER(getOwnerINLINE()).getFreeCityCommerce((CommerceTypes)iI) >= 0);
}
for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
FAssert(isNoBonus((BonusTypes)iI) || getNumBonuses((BonusTypes)iI) >= ((isConnectedToCapital()) ? (GET_PLAYER(getOwnerINLINE()).getBonusImport((BonusTypes)iI) - GET_PLAYER(getOwnerINLINE()).getBonusExport((BonusTypes)iI)) : 0));
}
}
#endif
// XXX
}
Der Codeteil von "Dune Wars" ist schon ewig da drin und hat solange keine Probleme gemacht.
Neu von mit ist der Teil //Kathy: UNzufriedenheit führt zu Aufständen Beginn, der aber nirgendwo die Defense-Rate berührt, sondern nur Barbareneinheiten erzeugt und die Bevölkerung verringern kann. Den Code, der dahinter steht, kann ich aber auch posten, wenn es von Interesse ist.
Auch neu ist "doFreeUnitBirth()", das diesen COde hat:
Code:
//Kathy Beginn Fre Unit Birth
void CvCity::doFreeUnitBirth()
{
CvUnit* pUnit;
CvPlot* pRallyPlot;
CyCity* pyCity = new CyCity(this);
CyArgsList argsList;
argsList.add(gDLL->getPythonIFace()->makePythonObject(pyCity)); // pass in city class
long lResult=0;
gDLL->getPythonIFace()->callFunction(PYGameModule, "doGreatPeople", argsList.makeFunctionArgs(), &lResult);
delete pyCity; // python fxn must not hold on to this pointer
if (lResult == 1)
{
return;
}
if (isDisorder())
{
return;
}
if ( GC.getGame().getGameTurn() % 10 == 0)
{
//Kathy Beginn Military Citystate
if ( isCapital() )
{
UnitTypes eMercenaryUnit;
UnitClassTypes eMercenaryUnitclass;
EraTypes eMercenaryEra;
eMercenaryEra = GET_PLAYER(getOwnerINLINE()).getCurrentEra();
eMercenaryUnitclass = (UnitClassTypes)(GC.getEraInfo(eMercenaryEra).getMercenaryUnitclass());
eMercenaryUnit = ((UnitTypes)(GC.getCivilizationInfo(getCivilizationType()).getCivilizationUnits(eMercenaryUnitclass)));
int iMercenaryUnits = GET_TEAM(getTeam()).getNumMilitaryVassals()*2;
UnitAITypes eUnitAi = (UnitAITypes)GC.getUnitInfo(eMercenaryUnit).getDefaultUnitAIType();
for(int iIUnit = 0; iIUnit < iMercenaryUnits; ++iIUnit)
{
pUnit = GET_PLAYER(getOwnerINLINE()).initUnit(eMercenaryUnit, getX_INLINE(), getY_INLINE(), eUnitAi );
FAssertMsg(pUnit != NULL, "pUnit is expected to be assigned a valid unit object");
pUnit->finishMoves();
addProductionExperience(pUnit);
pRallyPlot = getRallyPlot();
if (pRallyPlot != NULL)
{
pUnit->getGroup()->pushMission(MISSION_MOVE_TO, pRallyPlot->getX_INLINE(), pRallyPlot->getY_INLINE());
}
if (isHuman())
{
if (GET_PLAYER(getOwnerINLINE()).isOption(PLAYEROPTION_START_AUTOMATED))
{
pUnit->automate(AUTOMATE_BUILD);
}
if (GET_PLAYER(getOwnerINLINE()).isOption(PLAYEROPTION_MISSIONARIES_AUTOMATED))
{
pUnit->automate(AUTOMATE_RELIGION);
}
}
CvEventReporter::getInstance().unitBuilt(this, pUnit);
}
}
//Kathy End Military Citystate
for (int iI = 0; iI < GC.getNumUnitInfos(); iI++)
{
if ( getFreeUnit((UnitTypes)iI) > 0)
{
UnitAITypes eUnitAi = (UnitAITypes)GC.getUnitInfo((UnitTypes)iI).getDefaultUnitAIType();
for (int iJ = 0; iJ < getFreeUnit((UnitTypes)iI)*4; iJ++)
{
pUnit = GET_PLAYER(getOwnerINLINE()).initUnit((UnitTypes)iI, getX_INLINE(), getY_INLINE(), eUnitAi );
FAssertMsg(pUnit != NULL, "pUnit is expected to be assigned a valid unit object");
pUnit->finishMoves();
addProductionExperience(pUnit);
pRallyPlot = getRallyPlot();
if (pRallyPlot != NULL)
{
pUnit->getGroup()->pushMission(MISSION_MOVE_TO, pRallyPlot->getX_INLINE(), pRallyPlot->getY_INLINE());
}
if (isHuman())
{
if (GET_PLAYER(getOwnerINLINE()).isOption(PLAYEROPTION_START_AUTOMATED))
{
pUnit->automate(AUTOMATE_BUILD);
}
if (GET_PLAYER(getOwnerINLINE()).isOption(PLAYEROPTION_MISSIONARIES_AUTOMATED))
{
pUnit->automate(AUTOMATE_RELIGION);
}
}
CvEventReporter::getInstance().unitBuilt(this, pUnit);
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 10/02/09 jdog5000 */
/* */
/* AI logging */
/************************************************************************************************/
if( gCityLogLevel >= 1 )
{
CvWString szString;
getUnitAIString(szString, pUnit->AI_getUnitAIType());
logBBAI(" City %S finishes production of unit %S with UNITAI %S", getName().GetCString(), pUnit->getName(0).GetCString(), szString.GetCString() );
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
if (GC.getUnitInfo((UnitTypes)iI).getDomainType() == DOMAIN_AIR)
{
if (plot()->countNumAirUnits(getTeam()) > getAirUnitCapacity(getTeam()))
{
pUnit->jumpToNearestValidPlot(); // can destroy unit
}
}
}
}
}
}
}
//Kathy End Free Unit Birth
Mit wird einerseits alle 10 Runden geprüft, ob man einen militärischen Stadtstaat unterstützt und für diesen jeweils 2 Einheiten erzeugt, andererseits erzeugt so das Wunder "Orden der Tempelritter" regelmäßig Kreuzfahrer.
GC.getEraInfo(eMercenaryEra).getMercenaryUnitclass() liest nur eine bei den Eras gespeicherte Einheitenklasse aus.
getFreeUnit((UnitTypes)iI) gibt einen Wert zurück, der in jeder Stadt (vermutlich für jeden Unittype) gespeichert ist und standartmäßig auf 0 ist. Dieser Wert wird beim Bau des Wunders geändert. Wenn das wichtig sein könnte, kann ich alle dazugehörenden Codeteile auch posten.