Класс - EngineSettings (Настройки среды)[]
EngineSettings содержит различные константы, влияющие на среду игры, атрибуты существ и рассчитанные значения для Terrarium. Можно использовать эти значения для принятия решений или расчета собственных новых значений для существ. Однако они не должны противоречить законам физики или биологии Terrarium.
Константы (в скобках значение по умолчанию):
Базовые константы[]
- Int32 MaxMatureSize (= 48) - Представляет наибольшее возможное значение, которое можно разместить в атрибуте MatureSize. Ни одно существо не может вырасти на значение, превышающее эту константу.
- Int32 MinMatureSize (= 25) - Представляет наименьшее возможное значение, которое можно поместить в атрибут MatureSize. Ни одно существо не может достичь взрослого состояния, но быть меньше этой константы.
- Int32 SpeedBase (= 5) - Представляет основную развиваемую существом скорость; размещает 0 пунктов в MaximumSpeedAttribute.
- Int32 SpeedMaximum (= 100) - Представляет максимально достижимую существом скорость; размещает MaxAvailableCharacteristicPoints в MaximumSpeedAttribute.
- Int32 TicksToIncubate (= 10) - Количество времени во временных интервалах игры, необходимое между вызовом BeginReproduction и фактическим рождением нового существа от родителя.
- Int32 MaxAvailableCharacteristicPoints (= 100) - Представляет максимальное число пунктов характеристики, доступных разработчикам существ для назначения статистики характеристик.
- Double MaxEnergyBasePerUnitRadius (= EnergyRequiredToMoveMinimumRequirements) - Представляет запас энергии на единицу размеров, необходимый существу, если в MaximumEnergyPointsAttribute размещено 0 пунктов. Даже если в MaximumEnergyPointsAttribute размещено 0 пунктов, существо все равно может иметь повышенный запас энергии из-за увеличения MatureSize.
- Double MaxEnergyMaximumPerUnitRadius (= EnergyRequiredToMoveMinimumRequirements * 20) - Представляет наиболее высокий достигаемый запас энергии на единицу радиуса. Для получения максимальной энергии необходимо применить MaxAvailableCharacteristicPoints к MaximumEnergyPointsAttribute. Обратите внимание, что это значение, умноженное на размеры в данный момент, и является фактическим общим запасом энергии. Это означает, что размещение пунктов в MaximumEnergyPointsAttribute или увеличение MatureSize существа увеличат общий запас энергии.
Константы существенные для растений[]
- Int32 BasePlantEnergyPerUnitOfRadius - Количество энергии, необходимое растению на один временной интервал для выживания в игре. Эта константа умножается на радиус растения, поэтому крупным растениям необходимо больше энергии на один временной интервал, чем растениям небольших размеров.
- Int32 PlantFoodChunksPerUnitOfRadius (= 50) - Количество пищи, которое представляет собой растение. Крупные растения будут представлять большее количество пищи для травоядных животных, чем растения небольших размеров.
- Double PlantIncubationEnergyPerUnitOfRadius (= (PlantMatureSizeProvidedEnergyPerUnitRadius / TicksToIncubate) * PlantIncubationEnergyMultiplier) - Количество энергии, необходимое на один временной интервал для размножения. Это число умножается на радиус растения, поэтому крупным растениям необходимо больше энергии на инкубационный период, чем растениям небольших размеров.
- Int32 PlantLifeSpanPerUnitMaximumRadius (= 150) - Количество времени во временных интервалах игры, в течение которых растение может оставаться живым. Это число умножается на MatureSize растения, поэтому растения небольших размеров живут не так долго, как крупные растения.
- Int32 PlantMaxHealingPerTickPerRadius (= 1) - Максимальное количество пунктов, которое растение может использовать для восстановления в течение одного временного интервала. Это число умножается на радиус растения, поэтому крупные растения могут восстановиться после получения большего количества повреждений, чем растения небольших размеров.
- Int32 PlantReproductionWaitPerUnitRadius (= 25) - Количество времени во временных интервалах игры, которое растение должно выждать до наступления способности размножаться. Это число умножается на радиус растения, поэтому крупным растениям необходимо больше времени на паузы между воспроизводством, чем растениям небольших размеров.
- Int32 PlantRequiredEnergyPerUnitOfHealing (= 100) - Количество энергии, необходимое растению для восстановления здоровья на одну единицу здоровья.
- Double PlantRequiredEnergyPerUnitOfRadiusGrowth (= MaxEnergyBasePerUnitRadius * ( 1 / 5)) - Количество энергии, необходимое растению для того, чтобы вырасти на одну единицу размеров. Растения небольших размеров будут затрачивать больше усилий на поглощение этого количества энергии, но по мере роста растения эти затраты энергии будут снижаться.
- Int32 MaxSeedSpreadDistance (= 1000) - Максимальное расстояние, на которое растение может распылить семена при воспроизводстве.
- Int32 MaxEnergyFromLightPerTick (= 550) - Максимальное количество энергии, которое может получить растение в течение временного интервала от естественного света экосистемы.
Константы существенные для травоядных[]
- Double BaseAnimalEnergyPerUnitOfRadius - Количество энергии, необходимое существу на один временной интервал для выживания в игре. Эта константа умножается на размеры существа, поэтому крупным существам необходимо больше энергии на один временной интервал, чем существам небольших размеров.
- Double AnimalIncubationEnergyPerUnitOfRadius (= (AnimalMatureSizeProvidedEnergyPerUnitRadius / TicksToIncubate) * AnimalIncubationEnergyMultiplier) - Количество энергии, требуемое на один временной интервал для выведения потомства. Это число умножается на размеры (радиус) существа, поэтому крупным существам необходимо больше энергии на инкубационный период, чем существам небольших размеров.
- Int32 AnimalReproductionWaitPerUnitRadius (= 8) - Количество времени во временных интервалах игры, которое существо должно выждать до наступления способности воспроизвестись. Это число умножается на размеры существа, поэтому существам небольших размеров требуется меньше времени на паузы между следующим воспроизводством.
- Double AnimalRequiredEnergyPerUnitOfRadiusGrowth (MaxEnergyBasePerUnitRadius * (1 / 5)) - Количество энергии, необходимое существу для того, чтобы вырасти на одну единицу размеров. Существа небольших размеров будут затрачивать больше усилий на поглощение этого количества энергии, но по мере роста существа эти затраты на энергию будут снижаться.
- Int32 AnimalLifeSpanPerUnitMaximumRadius (=50) - Количество времени во временных интервалах игры, в течение которого существо может оставаться живым. Это число умножается на MatureSize существа, поэтому существа небольших размеров живут не так долго, как крупные существа.
- Int32 EnergyPerPlantFoodChunk (= 1) - Количество энергии, необходимое существу для отделения одного куска от растения.
- Int32 BaseEatingSpeedPerUnitOfRadius - Представляет основное количество пищи, необходимое существу; размещает 0 пунктов в EatingSpeedPointsAttribute. Количество пищи, обозначенное для этой константы, умножено на размеры существа в данный момент. Это означает, что и MatureSize существа, и EatingSpeedPointsAttribute могут увеличить количество пищи, которое существо сможет откусить за один раз.
- Int32 BaseEyesightRadius - Представляет основное расстояние, на которое существо может видеть, если в EyesightPointsAttribute размещено 0 пунктов. Это расстояние указано в ячейках террариума, поэтому для получения фактического расстояния в единицах террариума (пикселы) это значение нужно умножить на 8.
- Int32 MaximumEatingSpeedPerUnitOfRadius - Представляет максимальное количество пищи, которое может получить существо за один укус; MaxAvailableCharacteristicPoints размещено в EatingSpeedPointsAttribute. Количество пищи, обозначенное для этой константы, умножено на размеры существа в данный момент. Это означает, что и MatureSize существа, и EatingSpeedPointsAttribute могут увеличить количество пищи, откусываемой за один раз.
- Int32 MaximumEyesightRadius - Представляет максимальное расстояние, на которое существо может видеть, если в EyesightPointsAttribute поместить MaxAvailableCharacteristicPoints. Это расстояние указано в ячейках террариума, поэтому для получения фактического расстояния в единицах террариума (пикселы) это значение нужно умножить на 8.
- Double RequiredEnergyPerUnitOfRadiusSpeedDistance - Количество энергии, необходимое существу для перемещения. Это число рассчитывается из скорости перемещения существа, размеров существа и расстояния, на которое оно перемещается, и данной константы. Обратите внимание, что RadiusSpeedDistance равен Radius * Speed * Distance. Это означает, что чем выше скорость перемещения существа, тем больше энергии будет затрачено на преодоление равных расстояний. Для экономии энергии существо не должно превышать необходимую скорость.
Константы существенные для хищников (или влияющие на защиту травоядных)[]
- Int32 BaseDefendedDamagePerUnitOfRadius - Представляет основное количество повреждений, получаемых существом; размещает 0 пунктов в DefendDamagePointsAttribute. Количество получаемых повреждений, обозначенных для этой константы, умноженное на размеры существа в данный момент. Это означает, что и MatureSize существа, и DefendDamagePointsAttribute могут увеличить количество повреждений, которое сможет выдержать данное существо.
- Int32 EnergyPerAnimalFoodChunk (= 1) - Количество энергии, необходимое существу для отделения одного куска от тела.
- Double AnimalRequiredEnergyPerUnitOfHealing - Количество энергии, необходимое существу для восстановления здоровья на одну единицу здоровья.
- Int32 AnimalMaxHealingPerTickPerRadius - Максимальное количество пунктов, которое существо может использовать для восстановления в течение одного временного интервала. Это число умножается на размеры существа, поэтому крупные существа могут восстановиться после получения большего количества повреждений, чем существа небольших размеров.
- Double CarnivoreAttackDefendMultiplier - Модификаторы Attack и Defense, примененные к хищникам. Дает хищникам преимущество как в нападении, так и в защите от травоядных, поскольку для нападения и добывания пищи им приходится расходовать больше энергии.
- Int32 CarnivoreLifeSpanMultiplier - Этот множитель используется для изменения продолжительности жизни хищников. Поскольку продолжительность жизни хищников в два раза больше, чем травоядных, они имеют в два раза больше возможностей для воспроизводства.
- Int32 DamageToKillPerUnitOfRadius - Количество повреждений, необходимое для того, чтобы существо погибло. Это число умножается на размеры существа, поэтому крупные существа могут выдержать больше ударов, чем существа небольших размеров.
- Int32 BaseInflictedDamagePerUnitOfRadius - Представляет основное количество повреждений, которое может быть нанесено существом; размещает 0 пунктов в AttackDamagePointsAttribute. Количество повреждений, обозначенное для этой константы, умножено на размеры существа в данный момент. Это означает, что и MatureSize существа, и AttackDamagePointsAttribute могут увеличить количество повреждений, которое сможет нанести данное существо.
- Int32 MaximumDefendedDamagePerUnitOfRadius - Представляет максимальное количество повреждений, которое может получить существо; MaxAvailableCharacteristicPoints размещено в DefendDamagePointsAttribute. Количество полученных повреждений, обозначенное для этой константы, умножено на размеры существа в данный момент. Это означает, что и MatureSize существа, и DefendDamagePointsAttribute могут увеличить количество повреждений, которое сможет выдержать данное существо.
- Int32 MaximumInflictedDamagePerUnitOfRadius - Представляет максимальное количество повреждений, которое может быть нанесено существом; размещает MaxAvailableCharacteristicPoints в AttackDamagePointsAttribute. Количество повреждений, обозначенное для этой константы, умножено на размеры существа в данный момент. Это означает, что и MatureSize существа, и AttackDamagePointsAttribute могут увеличить количество повреждений, которое сможет нанести данное существо.
- Int32 InvisibleOddsBase - Представляет наименьшие шансы для возможности оставаться невидимым в террариуме. Для получения минимальных средств маскировки в CamouflagePointsAttribute нужно ввести 0 пунктов.
- Int32 InvisibleOddsMaximum - Представляет наибольшие шансы для возможности оставаться невидимым в террариуме. Для установки максимальной маскировки к CamouflagePointsAttribute необходимо применить MaxAvailableCharacteristicPoints.
- Int32 FoodChunksPerUnitOfRadius - Количество пищи, которой становится существо после смерти. Крупные существа представляют собой большее количество пищи для хищников, чем существа небольших размеров.
- Int32 TimeToRot - Количество времени во временных интервалах игры, в течение которого тело существа остается в экосистеме до полного разложения и исчезновения. Хищники должны успевать найти тела и съесть их до разложения.
Прочие константы[]
// MaximumEnergyPointsAttribute
// Energy required to move MinimumUnitsToMoveAtMinimumEnergy units, at speed MinimumSpeedToMoveAtMinimumEnergy,
// including the energy burned in the turns it would take.
// Turns = (MinimumUnitsToMoveAtMinimumEnergy / MinimumSpeedToMoveAtMinimumEnergy)
// We want to make sure all animals can at least move that much.
// Here's how we figure it:
// TurnsRequired = UnitsToMove / Speed
// BaseEnergyBurned = Radius * TurnsRequired * BaseAnimalEnergyPerUnitOfRadius
// MovementEnergyBurned = Radius * Speed * UnitsToMove * PlantRequiredEnergyPerUnitOfRadiusGrowth
// EnergyRequired = MovementEnergyBurned + BaseEnergyBurned
// Since we're assuming Radius = 1, that factor disappears
// Radius * Speed * UnitsToMove * PlantRequiredEnergyPerUnitOfRadiusGrowth + TurnsRequired * BaseAnimalEnergyPerUnitOfRadius
* '''double MinimumUnitsToMoveAtMinimumEnergy''' (= 2000)
* '''double MinimumSpeedToMoveAtMinimumEnergy''' (= 5)
* '''double EnergyRequiredToMoveMinimumRequirements''' (= MinimumUnitsToMoveAtMinimumEnergy *
MinimumSpeedToMoveAtMinimumEnergy * RequiredEnergyPerUnitOfRadiusSpeedDistance +
(MinimumUnitsToMoveAtMinimumEnergy / MinimumSpeedToMoveAtMinimumEnergy) * BaseAnimalEnergyPerUnitOfRadius)
// This is where we attempt to estimate how many animals we can support on this machine.
// We assume we want 20 frames a second and we do two engine ticks per second which means we have
// 500 msec per engine tick. We budget our paint time 200 mSec, and that leaves 300 mSec for all engine
// processing.
// We assume we'll allocate 4/5 of our available engine processing time to running animals, and 1/5 to plants.
// organismQuanta is how many microseconds each animal will get, so we have to divide by 1000
// to get milliseconds.
// We assume that we can use all engine processing time for running animals although this isn't strictly true
// since we need to run the engine code too. It's OK, because animals can't use all their allocated time every
// tick -- they'll eventually get killed. Thus, we use the time they don't use for the engine processing.
// It's all basically an estimate, that we've tuned and works pretty well.
//Это - то, где мы пытаемся оценить, сколько животных мы можем поддержать на этой машине.
//Мы предполагаем, что мы хотим 20 структур в секунду и мы делаем два машинных такта в секунду, что означает, что у нас есть
//тиканье 500 мс за двигатель. Мы планируем наше время краски 200 мс, и это оставляет 300 мс для всего двигателя
//обработка.
//Мы предполагаем, что мы ассигнуем 4/5 нашей доступной машинной продолжительности обработки бегущим животным, и 1/5 на заводы.
//organismQuanta - то, сколько микросекунд каждое животное доберется, таким образом мы должны будем разделиться на 1000
//, чтобы получить миллисекунды.
//Мы предполагаем, что мы можем использовать всю машинную продолжительность обработки для бегущих животных, хотя это не строго истинный
//, так как мы должны управлять кодом двигателя также. Все в порядке, потому что животные не могут использовать все свое ассигнованное время каждое тиканье
//-они в конечном счете убить. Таким образом, мы используем время, которое они не используют для машинной обработки.
//Это - все в основном оценка, что мы настроились и работаем вполне прилично.
float baseTime = (300 / 5) / (((float) organismQuanta) / ((float) 1000));
maxAnimals = (int) (baseTime * 4);
maxAnimals = (int) (maxAnimals * ((double) GameConfig.CpuThrottle / (double) 100));
maxPlants = maxAnimals;