improved tower refresh

This commit is contained in:
weiss
2020-04-12 08:51:54 +02:00
parent b40d24f69c
commit 4fcf4219a8

View File

@@ -9,7 +9,7 @@ import Prelude
import Control.Monad.State (State, gets, modify_, runState) import Control.Monad.State (State, gets, modify_, runState)
import Control.MonadZero (guard) import Control.MonadZero (guard)
import Data.Array (any, filter, foldl, head, length, sortBy) import Data.Array (any, filter, foldl, head, length, reverse, sortBy)
import Data.Maybe (Maybe(..), fromJust) import Data.Maybe (Maybe(..), fromJust)
import Data.Tuple (fst, snd) import Data.Tuple (fst, snd)
import Effect (Effect) import Effect (Effect)
@@ -99,7 +99,7 @@ buildAll = do
let minesCnt = length $ friendlyMines sites let minesCnt = length $ friendlyMines sites
if minesCnt < 3 if minesCnt < 3
then buildMines then buildMines
else if buildingsCnt < 6 else if buildingsCnt < 5
then case head $ nearFreeSites (queen units) sites of then case head $ nearFreeSites (queen units) sites of
Just site -> do Just site -> do
let typ = if not $ hasArcherBarrack sites then 1 let typ = if not $ hasArcherBarrack sites then 1
@@ -107,22 +107,24 @@ buildAll = do
else 2 else 2
pure $ build site typ pure $ build site typ
Nothing -> refreshTowers Nothing -> refreshTowers
else if buildingsCnt < 9 else if buildingsCnt < 8
then buildTowers then buildTowers
else refreshTowers else refreshTowers
buildTowers :: State GameState String buildTowers :: State GameState String
buildTowers = do buildTowers = do
leftSide <- gets _.leftSide leftSide <- gets _.leftSide
units <- gets _.units
sites <- gets _.sites sites <- gets _.sites
case head $ nearFreeSites (corner leftSide) sites of case head $ nearFreeSites (queen units) sites of
Just site -> pure $ "BUILD " <> show site.id <> " TOWER" Just site -> pure $ "BUILD " <> show site.id <> " TOWER"
Nothing -> refreshTowers Nothing -> refreshTowers
refreshTowers :: State GameState String refreshTowers :: State GameState String
refreshTowers = do refreshTowers = do
sites <- gets _.sites towers <-friendlyTowersByAttraction
case head $ friendlyTowersByLvl sites of
case head towers of
Just site -> do Just site -> do
touched <- gets _.touchedSite touched <- gets _.touchedSite
if touched == -1 || touched /= site.id if touched == -1 || touched /= site.id
@@ -237,6 +239,16 @@ friendlyTowers = filter isOwn <<< filter isTower
friendlyTowersByLvl :: Array Site -> Array Site friendlyTowersByLvl :: Array Site -> Array Site
friendlyTowersByLvl sites = sortBy (\s1 s2 -> compare s1.lvl s2.lvl) (friendlyTowers sites) friendlyTowersByLvl sites = sortBy (\s1 s2 -> compare s1.lvl s2.lvl) (friendlyTowers sites)
-- TODO: Queen should use state -> easier
-- less distant towers and towers with less hp are preferred
friendlyTowersByAttraction :: State GameState (Array Site)
friendlyTowersByAttraction = do
sites <- gets _.sites
units <- gets _.units
let q = queen units
pure $ reverse $ sortBy (\t1 t2 -> compare (attraction t1 q) (attraction t2 q)) (friendlyTowers sites)
where attraction t q = t.param1 - dist t q
nearSites :: forall a. { x :: Int, y :: Int | a } -> Array Site -> Array Site nearSites :: forall a. { x :: Int, y :: Int | a } -> Array Site -> Array Site
nearSites minion sites = sortBy (compareSiteDist minion) sites nearSites minion sites = sortBy (compareSiteDist minion) sites
@@ -244,7 +256,7 @@ nearFreeSites :: forall a. { x :: Int, y :: Int | a } -> Array Site -> Array Sit
nearFreeSites minion sites = sortBy (compareSiteDist minion) (freeSites sites) nearFreeSites minion sites = sortBy (compareSiteDist minion) (freeSites sites)
nearNonEmptyMines :: forall x. { x :: Int, y :: Int | x } -> Array Site -> Array Site nearNonEmptyMines :: forall x. { x :: Int, y :: Int | x } -> Array Site -> Array Site
nearNonEmptyMines minion sites = filter (\s -> (s.gold > 20 || s.gold == -1) && s.lvl < 5 && s.owner /= 1) $ nearSites minion sites nearNonEmptyMines minion sites = filter (\s -> (s.gold > 20 || s.gold == -1) && s.lvl < 3 && s.owner /= 1) $ nearSites minion sites
hasKnightsBarrack :: Array Site -> Boolean hasKnightsBarrack :: Array Site -> Boolean
hasKnightsBarrack sites = any (\s -> s.param2 == 0) (friendlySites sites) hasKnightsBarrack sites = any (\s -> s.param2 == 0) (friendlySites sites)