navOptimality,
)
-fun genInstinctCandidates(count: Int): Set<Instincts> {
+fun generateInstinctCandidates(count: Int): Set<Instincts> {
return Random.nextOrthonormalBasis(allInstincts.size).take(count).map { vector ->
Instincts.fromValues((allInstincts zip vector.values).associate { (key, value) ->
key.key to key.denormalize(value)
FactionFlavor.COLEMAN_SF_BASE_VESTIGIUM -> Faction.VESTIGIUM
}
-fun genNPCFleet(owner: FactionFlavor, rank: AdmiralRank): Map<Id<Ship>, Ship> {
+fun generateNPCFleet(owner: FactionFlavor, rank: AdmiralRank): Map<Id<Ship>, Ship> {
val battleSize = BattleSize.values().filter { rank >= it.minRank }.associateWith { 100.0 / it.numPoints }.weightedRandom()
val possibleShips = ShipType.values().filter { it.faction == owner.shipSource && it.weightClass.tier <= battleSize.maxTier }
suspend fun generateCluster(): StarClusterView {
return withTimeoutOrNull(10_000L) {
val positionsAsync = async {
- val rp = fixPositions(genPositions().take(settings.size.maxStars).toList())
+ val rp = fixPositions(generatePositions().take(settings.size.maxStars).toList())
val p = indexPositions(rp)
- p to fixWarpLanes(p, genWarpLanes(p))
+ p to fixWarpLanes(p, generateWarpLanes(p))
}
val starSystemsAsync = async {
} ?: generateCluster()
}
- private fun genPositions() = flow {
+ private fun generatePositions() = flow {
val initial = Vec2(0.0, 0.0)
val samples = mutableSetOf(initial)
emit(initial)
return polarVector(r, theta)
}
- private suspend fun genWarpLanes(positions: Map<Id<StarSystem>, Vec2>): Set<WarpLane> {
+ private suspend fun generateWarpLanes(positions: Map<Id<StarSystem>, Vec2>): Set<WarpLane> {
val allSystems = positions.keys
val maxDistance = positions.values.maxOf { it.magnitude } / settings.size.maxHyperlaneDistanceFactor
val starVec2 = Vec2(0.0, 0.0)
usedPositions += starVec2
- val starType = genStarType()
+ val starType = randomStarType()
val starSize = starType.sizeRange.random()
val star = UnnamedCelestialObject.Star(
position = Position(starVec2),
usedPositions += starAPos
usedPositions += starBPos
- val starAType = genStarType()
+ val starAType = randomStarType()
val starASize = starAType.sizeRange.random()
val starA = UnnamedCelestialObject.Star(
position = Position(starAPos),
type = starAType,
)
- val starBType = genStarType()
+ val starBType = randomStarType()
val starBSize = starBType.sizeRange.random()
val starB = UnnamedCelestialObject.Star(
position = Position(starBPos),
private fun rotationSpeed() = (0.125..0.625).random() * (if ((1..7).random() == 1) -1 else 1)
- private fun genStarType() = (StarType.values().toSet() - StarType.X).random()
+ private fun randomStarType() = (StarType.values().toSet() - StarType.X).random()
private suspend fun corruptStarSystem(starSystem: UnplacedStarSystem) = starSystem.copy(bodies = starSystem.bodies.map { obj ->
throttle()
import net.starshipfights.data.admiralty.AdmiralNameFlavor
import net.starshipfights.data.admiralty.AdmiralNames
import net.starshipfights.data.invoke
-import net.starshipfights.data.space.genFleetName
+import net.starshipfights.data.space.generateFleetName
import net.starshipfights.game.AdmiralRank
import net.starshipfights.game.FactionFlavor
import kotlin.random.Random
val fleets = (1..numOfFleets).associate { _ ->
val admiralRank = AdmiralRank.values().random()
val admiralIsFemale = flavor == FactionFlavor.FELINAE_FELICES || Random.nextBoolean()
- val admiralFleet = genNPCFleet(flavor, admiralRank)
+ val admiralFleet = generateNPCFleet(flavor, admiralRank)
Id<FleetPresence>() to FleetPresence(
- name = flavor.genFleetName(),
+ name = flavor.generateFleetName(),
owner = flavor,
ships = admiralFleet,
admiralName = AdmiralNames.randomName(AdmiralNameFlavor.forFactionFlavor(flavor).random(), admiralIsFemale),
})
}
-fun genAIName(faction: Faction, isFemale: Boolean) = AdmiralNames.randomName(AdmiralNameFlavor.forFaction(faction).random(), isFemale)
+fun generateAIName(faction: Faction, isFemale: Boolean) = AdmiralNames.randomName(AdmiralNameFlavor.forFaction(faction).random(), isFemale)
-fun genAI(faction: Faction, forBattleSize: BattleSize): Admiral {
+fun generateAIAdmiral(faction: Faction, forBattleSize: BattleSize): Admiral {
val isFemale = Random.nextBoolean()
return Admiral(
id = Id("advanced_robotical_admiral"),
owningUser = Id("fake_player_actually_an_AI"),
- name = genAIName(faction, isFemale),
+ name = generateAIName(faction, isFemale),
isFemale = isFemale,
faction = faction,
acumen = AdmiralRank.values().first {
private fun rangedOrdinal(max: Int, min: Int = 1) = (min..max).random().toOrdinal()
private fun rangedRomanNumeral(max: Int, min: Int = 1) = (min..max).random().toRomanNumerals()
-fun FactionFlavor.genFleetName(): String = when (this) {
+fun FactionFlavor.generateFleetName(): String = when (this) {
FactionFlavor.MECHYRDIA -> "${(100..999).random()}il Expediciós Flót"
FactionFlavor.TYLA -> "${(100..399).random()}a Kasaklas Safasra"
FactionFlavor.OLYMPIA -> "${rangedRomanNumeral(399, 50)} Classis Belligerens Astronautica"
import net.starshipfights.data.DataDocument
import net.starshipfights.data.DocumentTable
import net.starshipfights.data.Id
+import net.starshipfights.data.admiralty.Admiral
import net.starshipfights.data.invoke
import net.starshipfights.game.FactionFlavor
import net.starshipfights.game.Position
+import net.starshipfights.game.Ship
import org.litote.kmongo.eq
@Serializable
launch { ClusterStarSystem.put(clusterSystem) }
launch {
- for ((bodyId, body) in system.bodies)
- launch {
- ClusterCelestialObject.put(
- ClusterCelestialObject(
- id = bodyId.reinterpret(),
- starSystemId = clusterSystem.id,
- celestialObject = body
- )
+ ClusterCelestialObject.put(
+ system.bodies.map { (bodyId, body) ->
+ ClusterCelestialObject(
+ id = bodyId.reinterpret(),
+ starSystemId = clusterSystem.id,
+ celestialObject = body
)
}
+ )
}
launch {
- for ((fleetId, fleet) in system.fleets)
- launch {
- ClusterFleetPresence.put(
- ClusterFleetPresence(
- id = fleetId.reinterpret(),
- starSystemId = clusterSystem.id,
- fleetPresence = fleet
- )
+ ClusterFleetPresence.put(
+ system.fleets.map { (fleetId, fleet) ->
+ ClusterFleetPresence(
+ id = fleetId.reinterpret(),
+ starSystemId = clusterSystem.id,
+ fleetPresence = fleet
)
}
+ )
}
}
}
)
}
}
+
+suspend fun deployableFleet(systemId: Id<ClusterStarSystem>, admiral: Admiral): Map<Id<Ship>, Ship> {
+ return ClusterFleetPresence.filter(ClusterFleetPresence::starSystemId eq systemId)
+ .toList()
+ .filter { admiral.faction in it.fleetPresence.owner.loyalties }
+ .flatMap {
+ it.fleetPresence.ships.toList().filter { (_, ship) ->
+ ship.shipType.weightClass.tier <= admiral.rank.maxShipTier
+ }
+ }
+ .toMap()
+}
package net.starshipfights.game
-import net.starshipfights.data.admiralty.genAI
+import net.starshipfights.data.admiralty.generateAIAdmiral
import net.starshipfights.data.admiralty.generateFleet
import net.starshipfights.data.admiralty.getAdmiralsShips
import kotlin.math.PI
val hostDeployCenter2 = Position(Vec2(-deployWidth4, (-battleLength / 2) + deployLength2))
val guestDeployCenter = Position(Vec2(0.0, (battleLength / 2) - deployLength2))
- val aiAdmiral = genAI(enemyFaction, battleInfo.size)
+ val aiAdmiral = generateAIAdmiral(enemyFaction, battleInfo.size)
val gameStart = GameStart(
battlefieldWidth = battleWidth, battlefieldLength = battleLength,
val hostDeployCenter = Position(Vec2(0.0, (-battleLength / 2) + deployLength2))
val guestDeployCenter = Position(Vec2(0.0, (battleLength / 2) - deployLength2))
- val aiAdmiral = genAI(enemyFaction, battleInfo.size)
+ val aiAdmiral = generateAIAdmiral(enemyFaction, battleInfo.size)
return GameState(
start = GameStart(
if (instinctVectorIndex == JOptionPane.CLOSED_OPTION) return
val instinctVectorCount = instinctVectorCounts[instinctVectorIndex]
- val instinctVectors = genInstinctCandidates(instinctVectorCount)
+ val instinctVectors = generateInstinctCandidates(instinctVectorCount)
val numTrialCounts = listOf(3, 5, 7, 10, 25)
val numTrialOptions = numTrialCounts.map { it.toString() }.toTypedArray()