1
0
mirror of https://github.com/veden/Rampant.git synced 2025-01-03 22:52:20 +02:00
Rampant/libs/BaseUtils.lua

614 lines
20 KiB
Lua
Raw Normal View History

2019-02-16 06:17:30 +02:00
if baseUtilsG then
return baseUtilsG
end
2017-05-08 08:56:11 +02:00
local baseUtils = {}
-- imports
local mathUtils = require("MathUtils")
2017-05-08 08:56:11 +02:00
local constants = require("Constants")
local chunkPropertyUtils = require("ChunkPropertyUtils")
2019-11-30 02:49:22 +02:00
local mapUtils = require("MapUtils")
2017-06-08 02:57:24 +02:00
2017-05-08 08:56:11 +02:00
-- constants
2019-12-18 03:09:08 +02:00
local FACTION_MUTATION_MAPPING = constants.FACTION_MUTATION_MAPPING
2019-03-28 05:55:13 +02:00
local BUILDING_SPACE_LOOKUP = constants.BUILDING_SPACE_LOOKUP
2018-08-02 05:18:52 +02:00
local MAGIC_MAXIMUM_NUMBER = constants.MAGIC_MAXIMUM_NUMBER
2019-02-12 08:30:13 +02:00
local BASE_AI_STATE_DORMANT = constants.BASE_AI_STATE_DORMANT
local BASE_AI_STATE_ACTIVE = constants.BASE_AI_STATE_ACTIVE
local BASE_AI_STATE_WORMS = constants.BASE_AI_STATE_WORMS
local BASE_AI_STATE_NESTS = constants.BASE_AI_STATE_NESTS
local BASE_AI_STATE_OVERDRIVE = constants.BASE_AI_STATE_OVERDRIVE
local BASE_AI_STATE_MUTATE = constants.BASE_AI_STATE_MUTATE
2019-11-30 02:49:22 +02:00
local FACTION_SET = constants.FACTION_SET
2019-11-30 02:49:22 +02:00
local BASE_DEADZONE_TTL = constants.BASE_DEADZONE_TTL
2019-02-12 08:30:13 +02:00
local BASE_AI_MIN_STATE_DURATION = constants.BASE_AI_MIN_STATE_DURATION
local BASE_AI_MIN_TEMPERAMENT_DURATION = constants.BASE_AI_MIN_TEMPERAMENT_DURATION
local BASE_AI_MAX_STATE_DURATION = constants.BASE_AI_MAX_STATE_DURATION
local BASE_AI_MAX_TEMPERAMENT_DURATION = constants.BASE_AI_MAX_TEMPERAMENT_DURATION
2018-02-05 02:07:25 +02:00
local BASE_UPGRADE = constants.BASE_UPGRADE
2019-11-30 02:49:22 +02:00
local HIVE_BUILDINGS_COST = constants.HIVE_BUILDINGS_COST
local BASE_DISTANCE_THRESHOLD = constants.BASE_DISTANCE_THRESHOLD
local BASE_DISTANCE_LEVEL_BONUS = constants.BASE_DISTANCE_LEVEL_BONUS
local BASE_DISTANCE_TO_EVO_INDEX = constants.BASE_DISTANCE_TO_EVO_INDEX
2017-05-08 08:56:11 +02:00
local BASE_ALIGNMENT_EVOLUTION_BASELINE = constants.BASE_ALIGNMENT_EVOLUTION_BASELINE
2018-01-26 07:48:12 +02:00
local BASE_QUEUE_SIZE = constants.BASE_QUEUE_SIZE
local BASE_COLLECTION_THRESHOLD = constants.BASE_COLLECTION_THRESHOLD
local CHUNK_SIZE = constants.CHUNK_SIZE
2019-03-28 05:55:13 +02:00
local CHUNK_AND_HALF_SIZE = constants.CHUNK_AND_HALF_SIZE
local EVOLUTION_INCREMENTS = constants.EVOLUTION_INCREMENTS
2017-05-08 08:56:11 +02:00
-- imported functions
2019-02-12 08:30:13 +02:00
local randomTickEvent = mathUtils.randomTickEvent
local euclideanDistancePoints = mathUtils.euclideanDistancePoints
local roundToFloor = mathUtils.roundToFloor
2017-05-08 08:56:11 +02:00
2019-11-30 02:49:22 +02:00
local getChunkByPosition = mapUtils.getChunkByPosition
local gaussianRandomRange = mathUtils.gaussianRandomRange
local gaussianRandomRangeRG = mathUtils.gaussianRandomRangeRG
2019-11-30 02:49:22 +02:00
local linearInterpolation = mathUtils.linearInterpolation
2017-06-01 03:46:53 +02:00
local mFloor = math.floor
local mMin = math.min
local mMax = math.max
2019-11-30 02:49:22 +02:00
local distort = mathUtils.distort
local getChunkBase = chunkPropertyUtils.getChunkBase
local setChunkBase = chunkPropertyUtils.setChunkBase
2017-06-01 03:46:53 +02:00
2019-11-30 02:49:22 +02:00
local getResourceGenerator = chunkPropertyUtils.getResourceGenerator
2018-01-26 07:48:12 +02:00
local tRemove = table.remove
local mRandom = math.random
2017-05-19 09:47:24 +02:00
-- module code
2017-05-08 08:56:11 +02:00
2019-11-30 02:49:22 +02:00
local function evoToTier(natives, evolutionFactor)
local v
2019-12-16 03:16:56 +02:00
for i=10,1,-1 do
2019-11-30 02:49:22 +02:00
if natives.evoToTierMapping[i] <= evolutionFactor then
v = i
if mRandom() <= 0.65 then
break
2019-03-12 08:03:26 +02:00
end
2019-10-19 21:13:48 +02:00
end
2019-03-12 08:03:26 +02:00
end
2019-11-30 02:49:22 +02:00
return v
2018-08-02 05:18:52 +02:00
end
2019-11-30 02:49:22 +02:00
function baseUtils.findNearbyBase(map, chunk)
local x = chunk.x
local y = chunk.y
local foundBase = getChunkBase(map, chunk)
if foundBase then
2019-10-19 21:13:48 +02:00
return foundBase
end
2019-11-30 02:49:22 +02:00
local bases = map.natives.bases
local closet = MAGIC_MAXIMUM_NUMBER
for i=1, #bases do
2019-10-19 21:13:48 +02:00
local base = bases[i]
local distance = euclideanDistancePoints(base.x, base.y, x, y)
if (distance <= base.distanceThreshold) and (distance < closet) then
closet = distance
2019-10-19 21:13:48 +02:00
foundBase = base
end
2017-05-08 08:56:11 +02:00
end
2019-02-03 08:01:28 +02:00
2017-05-28 06:50:37 +02:00
return foundBase
2017-05-19 09:47:24 +02:00
end
2019-11-30 02:49:22 +02:00
local function findBaseMutation(natives, targetEvolution)
local tier = evoToTier(natives, targetEvolution or natives.evolutionLevel)
local alignments = natives.evolutionTableAlignment[tier]
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local roll = mRandom()
for i=1,#alignments do
local alignment = alignments[i]
2019-11-30 02:49:22 +02:00
roll = roll - alignment[1]
2019-11-04 08:19:22 +02:00
2019-11-30 02:49:22 +02:00
if (roll <= 0) then
return alignment[2]
end
end
2019-11-30 02:49:22 +02:00
return alignments[#alignments]
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local function initialEntityUpgrade(baseAlignment, tier, maxTier, natives, useHiveType)
local evolutionTable = natives.buildingEvolveLookup
local entity
2019-12-16 03:16:56 +02:00
local useTier
local tierRoll = mRandom()
if (tierRoll < 0.4) then
useTier = maxTier
elseif (tierRoll < 0.7) then
useTier = mMax(maxTier - 1, tier)
elseif (tierRoll < 0.9) then
useTier = mMax(maxTier - 2, tier)
else
useTier = mMax(maxTier - 3, tier)
end
local upgrades = evolutionTable[baseAlignment][useTier]
if upgrades then
if useHiveType then
for ui=1,#upgrades do
local upgrade = upgrades[ui]
if upgrade[3] == useHiveType then
entity = upgrade[2][mRandom(#upgrade[2])]
break
2019-03-12 08:03:26 +02:00
end
2019-12-16 03:16:56 +02:00
end
else
local roll = mRandom()
local initial = roll
2019-11-30 02:49:22 +02:00
2019-12-16 03:16:56 +02:00
for ui=1,#upgrades do
local upgrade = upgrades[ui]
2019-11-30 02:49:22 +02:00
2019-12-16 03:16:56 +02:00
roll = roll - upgrade[1]
2019-11-30 02:49:22 +02:00
2019-12-16 03:16:56 +02:00
if (roll <= 0) then
entity = upgrade[2][mRandom(#upgrade[2])]
break
2019-03-12 08:03:26 +02:00
end
end
2019-11-04 08:19:22 +02:00
end
2019-11-30 02:49:22 +02:00
end
2019-12-16 03:16:56 +02:00
2019-11-30 02:49:22 +02:00
return entity
end
local function entityUpgrade(baseAlignment, tier, maxTier, originalEntity, natives)
local buildingHiveTypeLookup = natives.buildingHiveTypeLookup
local evolutionTable = natives.upgradeLookup
local entity
2019-12-18 03:09:08 +02:00
local hiveType = buildingHiveTypeLookup[originalEntity.name]
2019-11-30 02:49:22 +02:00
2019-12-18 03:09:08 +02:00
for t=maxTier,tier,-1 do
local factionLookup = evolutionTable[baseAlignment][t]
local upgrades = factionLookup[hiveType]
if not upgrades then
local mapTypes = FACTION_MUTATION_MAPPING[hiveType]
for i=1, #mapTypes do
local upgrade = factionLookup[mapTypes[i]]
if upgrade and (#upgrade > 0) then
entity = upgrade[mRandom(#upgrade)]
if mRandom() < 0.55 then
return entity
end
end
end
elseif (#upgrades > 0) then
2019-11-30 02:49:22 +02:00
entity = upgrades[mRandom(#upgrades)]
2019-12-16 03:16:56 +02:00
if mRandom() < 0.55 then
2019-11-30 02:49:22 +02:00
break
2019-03-12 08:03:26 +02:00
end
2019-11-04 08:19:22 +02:00
end
end
return entity
end
2019-11-30 02:49:22 +02:00
local function findEntityUpgrade(baseAlignment, currentEvo, evoIndex, originalEntity, natives, evolve)
local adjCurrentEvo = mMax(
((baseAlignment ~= entityAlignment) and 0) or currentEvo,
0
)
local tier = evoToTier(natives, adjCurrentEvo)
local maxTier = evoToTier(natives, evoIndex)
2019-11-30 02:49:22 +02:00
if (tier > maxTier) then
return nil
end
2019-12-16 03:16:56 +02:00
2019-11-30 02:49:22 +02:00
if evolve then
local chunk = getChunkByPosition(natives.map, originalEntity.position)
2019-12-16 03:16:56 +02:00
local makeHive = (chunk ~= SENTINEL_IMPASSABLE_CHUNK) and (getResourceGenerator(natives.map, chunk) > 0) and (mRandom() < 0.2)
2019-11-30 02:49:22 +02:00
return initialEntityUpgrade(baseAlignment, tier, maxTier, natives, (makeHive and "hive"))
else
return entityUpgrade(baseAlignment, tier, maxTier, originalEntity, natives)
2019-12-16 03:16:56 +02:00
end
2019-11-30 02:49:22 +02:00
end
local function findBaseInitialAlignment(natives, evoIndex)
2019-02-03 08:01:28 +02:00
local evoTop = gaussianRandomRange(evoIndex, evoIndex * 0.3, 0, evoIndex)
2019-11-30 02:49:22 +02:00
local result
if mRandom() < 0.05 then
result = {findBaseMutation(natives, evoTop), findBaseMutation(natives, evoTop)}
else
result = {findBaseMutation(natives, evoTop)}
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
return result
end
2018-01-26 07:48:12 +02:00
function baseUtils.recycleBases(natives, tick)
local baseIndex = natives.baseIndex
local bases = natives.bases
local endIndex = mMin(baseIndex+BASE_QUEUE_SIZE, #bases)
for index = endIndex, baseIndex, -1 do
2018-01-26 07:48:12 +02:00
local base = bases[index]
2019-02-03 08:01:28 +02:00
if ((tick - base.tick) > BASE_COLLECTION_THRESHOLD) then
tRemove(bases, index)
2019-02-03 08:01:28 +02:00
end
2018-01-26 07:48:12 +02:00
end
if (endIndex == #bases) then
2019-02-03 08:01:28 +02:00
natives.baseIndex = 1
2018-01-26 07:48:12 +02:00
else
2019-02-03 08:01:28 +02:00
natives.baseIndex = endIndex + 1
end
2018-01-26 07:48:12 +02:00
end
2019-12-07 07:57:20 +02:00
function baseUtils.upgradeEntity(entity, surface, baseAlignment, natives, disPos, evolve)
local position = entity.position
2019-11-04 08:19:22 +02:00
local currentEvo = entity.prototype.build_base_evolution_requirement or 0
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
if not baseAlignment[1] then
2019-03-12 08:03:26 +02:00
entity.destroy()
2019-02-03 08:01:28 +02:00
return nil
2019-11-04 08:19:22 +02:00
end
2019-03-12 08:03:26 +02:00
local distance = mMin(1, euclideanDistancePoints(position.x, position.y, 0, 0) * BASE_DISTANCE_TO_EVO_INDEX)
2019-11-30 02:49:22 +02:00
local evoIndex = mMax(distance, natives.evolutionLevel)
local spawnerName = findEntityUpgrade(baseAlignment[mRandom(#baseAlignment)],
currentEvo,
evoIndex,
entity,
natives,
2019-12-16 03:16:56 +02:00
evolve)
if spawnerName then
2019-03-12 08:03:26 +02:00
entity.destroy()
2019-11-30 02:49:22 +02:00
local name = natives.buildingSpaceLookup[spawnerName] or spawnerName
local query = natives.map.upgradeEntityQuery
query.name = name
query.position = disPos or position
if not surface.can_place_entity(query) then
local newPosition = surface.find_non_colliding_position(
name,
disPos or position,
CHUNK_SIZE,
1,
true
)
query.position = newPosition or disPos or position
2019-02-03 08:01:28 +02:00
end
2018-01-14 09:07:29 +02:00
2019-11-30 02:49:22 +02:00
query.name = spawnerName
return surface.create_entity(query)
2019-02-13 03:12:32 +02:00
end
2019-11-30 02:49:22 +02:00
return nil
2019-02-12 08:30:13 +02:00
end
2019-11-30 02:49:22 +02:00
local function upgradeBase(natives, base)
local baseAlignment = base.alignment
2019-02-12 08:30:13 +02:00
local roll = mRandom()
2019-11-30 02:49:22 +02:00
if baseAlignment[2] then
2019-02-12 08:30:13 +02:00
if (roll < 0.05) then
2019-11-30 02:49:22 +02:00
baseAlignment[2] = nil
baseAlignment[1] = findBaseMutation(natives)
elseif (roll < 0.25) then
baseAlignment[1] = findBaseMutation(natives)
2019-02-12 08:30:13 +02:00
else
2019-11-30 02:49:22 +02:00
baseAlignment[2] = findBaseMutation(natives)
2019-02-12 08:30:13 +02:00
end
return true
2019-11-30 02:49:22 +02:00
else
2019-02-12 08:30:13 +02:00
if (roll < 0.85) then
2019-11-30 02:49:22 +02:00
base.alignment[1] = findBaseMutation(natives)
2019-02-12 08:30:13 +02:00
else
2019-11-30 02:49:22 +02:00
base.alignment[2] = findBaseMutation(natives)
2019-02-12 08:30:13 +02:00
end
2019-02-03 08:01:28 +02:00
return true
end
end
2019-11-30 02:49:22 +02:00
function baseUtils.processBase(chunk, surface, natives, tick, base)
if not base.alignment[1] then
base.state = BASE_AI_STATE_DORMANT
return
end
2019-11-04 08:19:22 +02:00
2019-11-30 02:49:22 +02:00
local map = natives.map
local point = map.position
2019-11-30 02:49:22 +02:00
point.x = chunk.x + (CHUNK_SIZE * mRandom())
point.y = chunk.y + (CHUNK_SIZE * mRandom())
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local baseAlignment = base.alignment
2019-02-12 08:30:13 +02:00
2019-11-30 02:49:22 +02:00
if (base.state == BASE_AI_STATE_ACTIVE) then
local entity = surface.find_entities_filtered(map.filteredEntitiesPointQueryLimited)
local cost = (natives.costLookup[entity.name] or MAGIC_MAXIMUM_NUMBER)
if entity and (base.points >= cost) then
local newEntity = baseUtils.upgradeEntity(entity,
surface,
base.alignment,
natives)
if newEntity then
base.points = base.points - cost
end
2019-02-03 08:01:28 +02:00
end
2019-02-12 08:30:13 +02:00
elseif (base.state == BASE_AI_STATE_MUTATE) then
2019-02-03 08:01:28 +02:00
if (base.points >= BASE_UPGRADE) then
2019-11-30 02:49:22 +02:00
if upgradeBase(natives, base) then
2019-02-03 08:01:28 +02:00
base.points = base.points - BASE_UPGRADE
end
end
end
2019-02-12 08:30:13 +02:00
if (base.state == BASE_AI_STATE_OVERDRIVE) then
base.points = base.points + (natives.baseIncrement * 5)
elseif (base.state ~= BASE_AI_STATE_DORMANT) then
base.points = base.points + natives.baseIncrement
end
if (base.temperamentTick <= tick) then
2019-10-19 21:13:48 +02:00
base.temperament = mRandom()
2019-11-30 02:49:22 +02:00
base.temperamentTick = randomTickEvent(tick,
BASE_AI_MIN_TEMPERAMENT_DURATION,
BASE_AI_MAX_TEMPERAMENT_DURATION)
2019-02-12 08:30:13 +02:00
end
if (base.stateTick <= tick) then
2019-11-30 02:49:22 +02:00
local roll = mRandom() * mMax(1 - natives.evolutionLevel, 0.15)
2019-10-19 21:13:48 +02:00
if (roll > natives.temperament) then
base.state = BASE_AI_STATE_DORMANT
else
roll = mRandom()
if (roll < 0.70) then
base.state = BASE_AI_STATE_ACTIVE
elseif (roll < 0.80) then
base.state = BASE_AI_STATE_NESTS
2019-02-12 08:30:13 +02:00
elseif (roll < 0.90) then
2019-10-19 21:13:48 +02:00
base.state = BASE_AI_STATE_WORMS
2019-02-12 08:30:13 +02:00
elseif (roll < 0.975) then
2019-10-19 21:13:48 +02:00
base.state = BASE_AI_STATE_OVERDRIVE
2019-02-12 08:30:13 +02:00
else
2019-10-19 21:13:48 +02:00
base.state = BASE_AI_STATE_MUTATE
end
end
2019-11-30 02:49:22 +02:00
base.stateTick = randomTickEvent(tick,
BASE_AI_MIN_STATE_DURATION,
BASE_AI_MAX_STATE_DURATION)
2019-02-12 08:30:13 +02:00
end
2019-11-04 08:19:22 +02:00
base.tick = tick
end
2019-11-30 02:49:22 +02:00
function baseUtils.createBase(natives, chunk, tick, rebuilding)
local x = chunk.x
local y = chunk.y
local distance = euclideanDistancePoints(x, y, 0, 0)
2019-11-30 02:49:22 +02:00
local meanLevel = mFloor(distance * 0.005)
2019-02-03 08:01:28 +02:00
local distanceIndex = mMin(1, distance * BASE_DISTANCE_TO_EVO_INDEX)
2019-11-30 02:49:22 +02:00
local evoIndex = mMax(distanceIndex, natives.evolutionLevel)
local baseTick = tick
2019-11-04 08:19:22 +02:00
local alignment
if (not rebuilding) and (mRandom() < natives.deadZoneFrequency) then
2019-11-30 02:49:22 +02:00
alignment = {}
baseTick = BASE_DEADZONE_TTL
else
2019-11-30 02:49:22 +02:00
alignment = findBaseInitialAlignment(natives, evoIndex) or {"neutral"}
end
2019-02-03 08:01:28 +02:00
local baseLevel = gaussianRandomRange(meanLevel, meanLevel * 0.3, meanLevel * 0.50, meanLevel * 1.50)
2019-11-30 02:49:22 +02:00
local baseDistanceThreshold = gaussianRandomRange(BASE_DISTANCE_THRESHOLD,
BASE_DISTANCE_THRESHOLD * 0.2,
BASE_DISTANCE_THRESHOLD * 0.75,
BASE_DISTANCE_THRESHOLD * 1.50)
local distanceThreshold = (baseLevel * BASE_DISTANCE_LEVEL_BONUS) + baseDistanceThreshold
2017-05-12 06:50:06 +02:00
local base = {
2019-02-03 08:01:28 +02:00
x = x,
y = y,
distanceThreshold = distanceThreshold,
2019-11-30 02:49:22 +02:00
tick = baseTick,
alignment = alignment,
2019-02-12 08:30:13 +02:00
state = BASE_AI_STATE_DORMANT,
stateTick = 0,
temperamentTick = 0,
createdTick = tick,
2019-02-12 08:30:13 +02:00
temperament = 0,
2019-02-03 08:01:28 +02:00
points = 0
2017-05-12 06:50:06 +02:00
}
2019-11-30 02:49:22 +02:00
setChunkBase(natives.map, chunk, base)
natives.bases[#natives.bases+1] = base
2019-02-03 08:01:28 +02:00
2017-05-12 06:50:06 +02:00
return base
2017-05-08 08:56:11 +02:00
end
function baseUtils.rebuildNativeTables(natives, surface, rg)
2019-11-30 02:49:22 +02:00
local createEntityStmt = {
name = nil,
position = {0,0}
}
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local alignmentSet = {}
natives.evolutionTableAlignment = alignmentSet
local buildingSpaceLookup = {}
natives.buildingSpaceLookup = buildingSpaceLookup
local enemyAlignmentLookup = {}
natives.enemyAlignmentLookup = enemyAlignmentLookup
local evoToTierMapping = {}
natives.evoToTierMapping = evoToTierMapping
local upgradeLookup = {}
natives.upgradeLookup = upgradeLookup
local buildingEvolveLookup = {}
natives.buildingEvolveLookup = buildingEvolveLookup
local costLookup = {}
natives.costLookup = costLookup
local buildingHiveTypeLookup = {}
natives.buildingHiveTypeLookup = buildingHiveTypeLookup
for i=1,10 do
local evo = (((i - 1) * 0.1) ^ 0.5) - 0.05
evoToTierMapping[#evoToTierMapping+1] = evo
end
for i=1,#FACTION_SET do
local faction = FACTION_SET[i]
local factionUpgradeLookup = {}
upgradeLookup[faction.type] = factionUpgradeLookup
local factionBuildingPicker = {}
buildingEvolveLookup[faction.type] = factionBuildingPicker
for t=1,10 do
if (t == 1) then
evo = faction.evo
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local alignments = alignmentSet[t]
if not alignments then
alignments = {}
alignmentSet[t] = alignments
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
--[[
alignments table is a table that is used for selecting what factions are available
to pick given an evolution level.
evolutionTable is a table that given a faction allows the selection of a building
2019-12-16 03:16:56 +02:00
type based on the propabilities given. Once the the building type is selected given
2019-11-30 02:49:22 +02:00
a faction, then the evolution decides what level of building to select
--]]
local factionAcceptRate = faction.acceptRate
local low = factionAcceptRate[1]
local high = factionAcceptRate[2]
if (low <= t) and (t <= high) then
alignments[#alignments+1] = {
distort(rg,
linearInterpolation((t - low) / (high - low), factionAcceptRate[3], factionAcceptRate[4])),
faction.type
}
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local tieredUpgradeBuildingSet = factionUpgradeLookup[t]
if not tieredUpgradeBuildingSet then
tieredUpgradeBuildingSet = {}
factionUpgradeLookup[t] = tieredUpgradeBuildingSet
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local tieredBuildingPickerSet = factionBuildingPicker[t]
if not tieredBuildingPickerSet then
tieredBuildingPickerSet = {}
factionBuildingPicker[t] = tieredBuildingPickerSet
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
for b=1,#faction.buildings do
local building = faction.buildings[b]
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local buildingSet = tieredUpgradeBuildingSet[building.type]
if not buildingSet then
buildingSet = {}
tieredUpgradeBuildingSet[building.type] = buildingSet
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local variationSet = {}
for v=1,natives.ENEMY_VARIATIONS do
local entry = faction.type .. "-" .. building.name .. "-v" .. v .. "-t" .. t .. "-rampant"
enemyAlignmentLookup[entry] = faction.type
local proxyEntity = "entity-proxy-" .. building.type .. "-t" .. t .. "-rampant"
buildingSpaceLookup[entry] = proxyEntity
costLookup[entry] = HIVE_BUILDINGS_COST[building.type]
buildingHiveTypeLookup[entry] = building.type
if not buildingHiveTypeLookup[proxyEntity] then
buildingHiveTypeLookup[proxyEntity] = building.type
end
variationSet[#variationSet+1] = entry
end
2019-11-30 02:49:22 +02:00
local buildingAcceptRate = building.acceptRate
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
local low = buildingAcceptRate[1]
local high = buildingAcceptRate[2]
if (low <= t) and (t <= high) then
for vi=1,#variationSet do
local variation = variationSet[vi]
buildingSet[#buildingSet+1] = variation
end
tieredBuildingPickerSet[#tieredBuildingPickerSet+1] = {
distort(rg,
linearInterpolation((t - low) / (high - low), buildingAcceptRate[3], buildingAcceptRate[4])),
variationSet,
building.type
}
end
2019-02-03 08:01:28 +02:00
2019-11-30 02:49:22 +02:00
end
end
2019-02-03 08:01:28 +02:00
end
2018-02-05 05:24:28 +02:00
2019-11-30 02:49:22 +02:00
for t=1,10 do
local alignments = alignmentSet[t]
local totalAlignment = 0
for i=1,#alignments do
totalAlignment = totalAlignment + alignments[i][1]
end
for i=1,#alignments do
alignments[i][1] = alignments[i][1] / totalAlignment
end
2019-02-14 07:53:31 +02:00
2019-11-30 02:49:22 +02:00
for fi=1,#FACTION_SET do
local faction = FACTION_SET[fi]
local factionBuildingSet = buildingEvolveLookup[faction.type][t]
local totalBuildingSet = 0
for i=1,#factionBuildingSet do
totalBuildingSet = totalBuildingSet + factionBuildingSet[i][1]
end
for i=1,#factionBuildingSet do
factionBuildingSet[i][1] = factionBuildingSet[i][1] / totalBuildingSet
end
end
2019-02-13 07:50:25 +02:00
end
2019-12-16 03:16:56 +02:00
end
2019-02-16 06:17:30 +02:00
baseUtilsG = baseUtils
2017-05-08 08:56:11 +02:00
return baseUtils