Make changes to battles against AI
authorTheSaminator <thesaminator@users.noreply.github.com>
Wed, 22 Jun 2022 16:32:52 +0000 (12:32 -0400)
committerTheSaminator <thesaminator@users.noreply.github.com>
Wed, 22 Jun 2022 16:32:52 +0000 (12:32 -0400)
src/jvmMain/kotlin/net/starshipfights/data/admiralty/admirals.kt
src/jvmMain/kotlin/net/starshipfights/data/data_documents.kt
src/jvmMain/kotlin/net/starshipfights/game/game_start_jvm.kt

index 01f3be2af0f2462fc04912dbad204c2511363c5d..a37bc03465056b74651b5019b65c9ed830c4ee23 100644 (file)
@@ -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
index 4328647a5cbcf164f876c2c25c2700baca81c038..51580a184311b019ca2f402ee77ed6f09a678048 100644 (file)
@@ -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<T : DataDocument<T>> {
                }
                
                fun <T : DataDocument<T>> create(kclass: KClass<T>, initFunc: suspend DocumentTable<T>.() -> Unit = {}): DocumentTable<T> = DocumentTableImpl(kclass) {
-                       runBlocking {
+                       val nameContext = kclass.simpleName?.let { name -> CoroutineName(name) } ?: EmptyCoroutineContext
+                       runBlocking(coroutineContext + nameContext) {
                                it.initFunc()
                        }
                }
@@ -85,11 +87,13 @@ private class DocumentTableImpl<T : DataDocument<T>>(val kclass: KClass<T>, priv
        }
        
        override suspend fun index(vararg properties: KProperty1<T, *>) {
-               collection().ensureIndex(*properties)
+               if (properties.isNotEmpty())
+                       collection().ensureIndex(*properties)
        }
        
        override suspend fun unique(vararg properties: KProperty1<T, *>) {
-               collection().ensureUniqueIndex(*properties)
+               if (properties.isNotEmpty())
+                       collection().ensureUniqueIndex(*properties)
        }
        
        override suspend fun put(doc: T) {
@@ -97,12 +101,13 @@ private class DocumentTableImpl<T : DataDocument<T>>(val kclass: KClass<T>, priv
        }
        
        override suspend fun put(docs: Iterable<T>) {
-               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<T>, set: Bson): Boolean {
index 60bb206903ebb6826a1364ccddea7a49dfdbaf61..d184cf622025c662c9f4178b1e3221164c9260c1 100644 (file)
@@ -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