AI fixes
authorTheSaminator <TheSaminator@users.noreply.github.com>
Tue, 31 May 2022 14:17:47 +0000 (10:17 -0400)
committerTheSaminator <TheSaminator@users.noreply.github.com>
Tue, 31 May 2022 14:17:47 +0000 (10:17 -0400)
src/commonMain/kotlin/starshipfights/game/ai/ai_behaviors.kt
src/commonMain/kotlin/starshipfights/game/ai/ai_util_combat.kt
src/commonMain/kotlin/starshipfights/game/ai/ai_util_nav.kt

index ce77d492f76b1a6d8f4a11c2004fefa6e459b48b..a89f43ef3b1231abf933bd19c862fabc62443428 100644 (file)
@@ -136,19 +136,26 @@ suspend fun AIPlayer.behave(instincts: Instincts, mySide: GlobalSide) {
                                                                        }
                                                                else emptyList()
                                                        }.associateWith { (ship, weaponId, target) ->
-                                                               weaponId.expectedAdvantageFromWeaponUsage(state, ship, target) * brain[shipAttackPriority forShip target.id].signedPow(instincts[combatPrioritization])
+                                                               weaponId.expectedAdvantageFromWeaponUsage(state, ship, target) * smoothNegative(brain[shipAttackPriority forShip target.id].signedPow(instincts[combatPrioritization])) * (1 + target.calculateSuffering()).signedPow(instincts[combatPreyOnTheWeak])
                                                        }.weightedRandomOrNull()
                                                        
                                                        if (attackWith == null)
                                                                doActions.send(PlayerAction.UseAbility(PlayerAbilityType.DonePhase(phase), PlayerAbilityData.DonePhase))
                                                        else {
                                                                val (ship, weaponId, target) = attackWith
-                                                               val targetPickResponse = if (ship.armaments.weaponInstances[weaponId]?.weapon is AreaWeapon)
-                                                                       PickResponse.Location(target.position.location)
-                                                               else
-                                                                       PickResponse.Ship(target.id)
+                                                               val targetPickResponse = when (val weaponSpec = ship.armaments.weaponInstances[weaponId]?.weapon) {
+                                                                       is AreaWeapon -> PickResponse.Location(ship.getWeaponPickRequest(weaponSpec).boundary.closestPointTo(target.position.location))
+                                                                       else -> PickResponse.Ship(target.id)
+                                                               }
                                                                
                                                                doActions.send(PlayerAction.UseAbility(PlayerAbilityType.UseWeapon(ship.id, weaponId), PlayerAbilityData.UseWeapon(targetPickResponse)))
+                                                               
+                                                               withTimeoutOrNull(50L) { getErrors.receive() }?.let { error ->
+                                                                       logWarning("Error when attacking target ship ID ${target.id} with weapon $weaponId of ship ID ${ship.id} - $error")
+                                                                       
+                                                                       val nextState = gameState.value
+                                                                       phasePipe.send(nextState.phase to (nextState.doneWithPhase != mySide && (!nextState.phase.usesInitiative || nextState.currentInitiative != mySide.other)))
+                                                               }
                                                        }
                                                }
                                                is GamePhase.Repair -> {
index 8cbfc61d3c360d57f07efdf250853fec7ccb89e6..362e8c244b85b763b8ccf7f808a0e6fd4292245e 100644 (file)
@@ -11,10 +11,11 @@ val combatTargetShipWeight by instinct { Random.nextDouble(0.5, 2.5) }
 val combatAvengeShipwrecks by instinct { Random.nextDouble(0.5, 4.5) }
 val combatAvengeShipWeight by instinct { Random.nextDouble(-0.5, 1.5) }
 
-val combatPrioritization by instinct { Random.nextDouble(-1.0, 1.0) }
+val combatPrioritization by instinct { Random.nextDouble(-1.5, 2.5) }
 
 val combatAvengeAttacks by instinct { Random.nextDouble(0.5, 4.5) }
 val combatForgiveTarget by instinct { Random.nextDouble(-1.5, 2.5) }
+val combatPreyOnTheWeak by instinct { Random.nextDouble(-1.5, 2.5) }
 
 val combatFrustratedByFailedAttacks by instinct { Random.nextDouble(-2.5, 5.5) }
 
index d9310403491e99b59b689feef89cdf36f0a8d76b..0cdbf18f9afa35a592925a1742df3aebbfd33833 100644 (file)
@@ -20,11 +20,11 @@ fun ShipPosition.score(gameState: GameState, shipInstance: ShipInstance, instinc
        val canBeAttackedBy = ship.attackableWithDamageBy(gameState)
        
        val opportunityScore = canAttack.map { (targetId, potentialDamage) ->
-               brain[shipAttackPriority forShip targetId].signedPow(instincts[navTunnelVision]) * potentialDamage
+               smoothNegative(brain[shipAttackPriority forShip targetId]).signedPow(instincts[navTunnelVision]) * potentialDamage
        }.sum() + (ship.calculateSuffering() * instincts[navLustForBlood])
        
        val vulnerabilityScore = canBeAttackedBy.map { (targetId, potentialDamage) ->
-               brain[shipAttackPriority forShip targetId].signedPow(instincts[navTunnelVision]) * potentialDamage
+               smoothNegative(brain[shipAttackPriority forShip targetId]).signedPow(instincts[navTunnelVision]) * potentialDamage
        }.sum() * -expm1(-ship.calculateSuffering() * instincts[navSqueamishness])
        
        return instincts[navOptimality].pow(opportunityScore.signedPow(instincts[navAggression]) - vulnerabilityScore.signedPow(instincts[navPassivity]))