From: TheSaminator Date: Wed, 22 Jun 2022 16:32:52 +0000 (-0400) Subject: Make changes to battles against AI X-Git-Url: https://gitweb.starshipfights.net/?a=commitdiff_plain;h=923293053e9d4d6319f5ce36774927c570527a8d;p=starship-fights Make changes to battles against AI --- diff --git a/src/jvmMain/kotlin/net/starshipfights/data/admiralty/admirals.kt b/src/jvmMain/kotlin/net/starshipfights/data/admiralty/admirals.kt index 01f3be2..a37bc03 100644 --- a/src/jvmMain/kotlin/net/starshipfights/data/admiralty/admirals.kt +++ b/src/jvmMain/kotlin/net/starshipfights/data/admiralty/admirals.kt @@ -14,6 +14,7 @@ import net.starshipfights.game.* import org.bson.conversions.Bson import org.litote.kmongo.* import java.time.Instant +import kotlin.random.Random @Serializable data class Admiral( @@ -40,17 +41,23 @@ data class Admiral( }) } -fun genAI(faction: Faction, forBattleSize: BattleSize) = Admiral( - id = Id("advanced_robotical_admiral"), - owningUser = Id("fake_player_actually_an_AI"), - name = "M-5 Computational Unit", - isFemale = true, - faction = faction, - acumen = AdmiralRank.values().first { - it.maxBattleSize >= forBattleSize - }.minAcumen + 500, - money = 0 -) +fun genAIName(faction: Faction, isFemale: Boolean) = AdmiralNames.randomName(AdmiralNameFlavor.forFaction(faction).random(), isFemale) + +fun genAI(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), + isFemale = isFemale, + faction = faction, + acumen = AdmiralRank.values().first { + it.maxBattleSize >= forBattleSize + }.minAcumen + 500, + money = 0 + ) +} infix fun AdmiralRank.Companion.eq(rank: AdmiralRank): Bson = when (rank.ordinal) { 0 -> Admiral::acumen lt AdmiralRank.values()[1].minAcumen diff --git a/src/jvmMain/kotlin/net/starshipfights/data/data_documents.kt b/src/jvmMain/kotlin/net/starshipfights/data/data_documents.kt index 4328647..51580a1 100644 --- a/src/jvmMain/kotlin/net/starshipfights/data/data_documents.kt +++ b/src/jvmMain/kotlin/net/starshipfights/data/data_documents.kt @@ -13,6 +13,7 @@ import org.litote.kmongo.util.KMongoUtil import org.slf4j.Logger import org.slf4j.LoggerFactory import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext import kotlin.reflect.KClass import kotlin.reflect.KProperty1 @@ -68,7 +69,8 @@ interface DocumentTable> { } fun > create(kclass: KClass, initFunc: suspend DocumentTable.() -> Unit = {}): DocumentTable = DocumentTableImpl(kclass) { - runBlocking { + val nameContext = kclass.simpleName?.let { name -> CoroutineName(name) } ?: EmptyCoroutineContext + runBlocking(coroutineContext + nameContext) { it.initFunc() } } @@ -85,11 +87,13 @@ private class DocumentTableImpl>(val kclass: KClass, priv } override suspend fun index(vararg properties: KProperty1) { - collection().ensureIndex(*properties) + if (properties.isNotEmpty()) + collection().ensureIndex(*properties) } override suspend fun unique(vararg properties: KProperty1) { - collection().ensureUniqueIndex(*properties) + if (properties.isNotEmpty()) + collection().ensureUniqueIndex(*properties) } override suspend fun put(doc: T) { @@ -97,12 +101,13 @@ private class DocumentTableImpl>(val kclass: KClass, priv } override suspend fun put(docs: Iterable) { - collection().bulkWrite( - docs.map { doc -> - replaceOne(KMongoUtil.idFilterQuery(doc.id), doc, ReplaceOptions().upsert(true)) - }, - BulkWriteOptions().ordered(false) - ) + if (docs.any()) + collection().bulkWrite( + docs.map { doc -> + replaceOne(KMongoUtil.idFilterQuery(doc.id), doc, ReplaceOptions().upsert(true)) + }, + BulkWriteOptions().ordered(false) + ) } override suspend fun set(id: Id, set: Bson): Boolean { diff --git a/src/jvmMain/kotlin/net/starshipfights/game/game_start_jvm.kt b/src/jvmMain/kotlin/net/starshipfights/game/game_start_jvm.kt index 60bb206..d184cf6 100644 --- a/src/jvmMain/kotlin/net/starshipfights/game/game_start_jvm.kt +++ b/src/jvmMain/kotlin/net/starshipfights/game/game_start_jvm.kt @@ -60,7 +60,10 @@ suspend fun generate2v1GameInitialState(player1Info: InGameAdmiral, player2Info: val deployWidth2 = battleWidth / 2 val deployLength2 = 875.0 - val hostDeployCenter = Position(Vec2(0.0, (-battleLength / 2) + deployLength2)) + val deployWidth4 = deployWidth2 / 2 + + val hostDeployCenter1 = Position(Vec2(deployWidth4, (-battleLength / 2) + deployLength2)) + val hostDeployCenter2 = Position(Vec2(-deployWidth4, (-battleLength / 2) + deployLength2)) val guestDeployCenter = Position(Vec2(0.0, (battleLength / 2) - deployLength2)) val aiAdmiral = genAI(enemyFaction, battleInfo.size) @@ -70,17 +73,17 @@ suspend fun generate2v1GameInitialState(player1Info: InGameAdmiral, player2Info: hostStarts = mapOf( GlobalShipController.Player1Disambiguation to PlayerStart( - cameraPosition = hostDeployCenter, + cameraPosition = hostDeployCenter1, cameraFacing = PI / 2, - deployZone = PickBoundary.Rectangle(hostDeployCenter, deployWidth2, deployLength2), + deployZone = PickBoundary.Rectangle(hostDeployCenter1, deployWidth4, deployLength2), deployFacing = PI / 2, deployableFleet = getAdmiralsShips(player1Info.id.reinterpret()).filterValues { it.shipType.weightClass.tier <= battleInfo.size.maxTier }, deployPointsFactor = 0.75 ), GlobalShipController.Player2Disambiguation to PlayerStart( - cameraPosition = hostDeployCenter, + cameraPosition = hostDeployCenter2, cameraFacing = PI / 2, - deployZone = PickBoundary.Rectangle(hostDeployCenter, deployWidth2, deployLength2), + deployZone = PickBoundary.Rectangle(hostDeployCenter2, deployWidth4, deployLength2), deployFacing = PI / 2, deployableFleet = getAdmiralsShips(player2Info.id.reinterpret()).filterValues { it.shipType.weightClass.tier <= battleInfo.size.maxTier }, deployPointsFactor = 0.75