(use 'cljsc2.clj.core)
(def sc-process (start-client "/home/bb/cljsc2/StarCraftII/Versions/Base59877/SC2_x64"))
(def conn (restart-conn))
(use 'cljsc2.clj.game-parsing)
(keys knowledge-layout)
(get knowledge-layout :ability-type-attributes)
(require '[datascript.core :as ds])
(ds/q '[:find ?name
:where
[_ :unit-type/name ?name]]
knowledge-base)
(clojure.pprint/pprint
(take 5 (ds/q
'[:find ?name ?minerals ?vespene ?build-time
:where
[?unit-e-id :unit-type/name ?name]
[?unit-e-id :unit-type/mineral-cost ?minerals]
[?unit-e-id :unit-type/vespene-cost ?vespene]
[?unit-e-id :unit-type/build-time ?build-time]]
knowledge-base)))
(defn get-abilities-for-unit-name [unit-name]
(ds/q '[:find ?ability-id ?ability-name
:in $ ?unit-name
:where
[?unit-type-e-id :unit-type/name ?unit-name]
[?unit-type-e-id :unit-type/abilities ?ability-e-id]
[?ability-e-id :ability-type/name ?ability-name]
[?ability-e-id :ability-type/id ?ability-id]]
knowledge-base
unit-name))
(get-abilities-for-unit-name "Marine")
(send-request-and-get-response-message
conn
#:SC2APIProtocol.sc2api$RequestCreateGame
{:create-game #:SC2APIProtocol.sc2api$RequestCreateGame
{:map #:SC2APIProtocol.sc2api$LocalMap
{:local-map
{:map-path "/home/bb/cljsc2/StarCraftII/Maps/Simple64.SC2Map"}}
:player-setup
[#:SC2APIProtocol.sc2api$PlayerSetup
{:race "Terran" :type "Participant"}
#:SC2APIProtocol.sc2api$PlayerSetup
{:race "Protoss" :type "Computer"}]}})
(send-request-and-get-response-message
conn
#:SC2APIProtocol.sc2api$RequestJoinGame
{:join-game
#:SC2APIProtocol.sc2api$RequestJoinGame
{:participation
#:SC2APIProtocol.sc2api$RequestJoinGame
{:race "Terran"}
:options #:SC2APIProtocol.sc2api$InterfaceOptions
{:raw true
:feature-layer #:SC2APIProtocol.sc2api$SpatialCameraSetup
{:width 24
:resolution #:SC2APIProtocol.common$Size2DI{:x 84 :y 84}
:minimap-resolution #:SC2APIProtocol.common$Size2DI{:x 64 :y 64}
}
:render #:SC2APIProtocol.sc2api$SpatialCameraSetup
{:width 24
:resolution #:SC2APIProtocol.common$Size2DI{:x 480 :y 270}
:minimap-resolution #:SC2APIProtocol.common$Size2DI{:x 64 :y 64}
}
}}})
(do-sc2 conn
(fn [observation _]
(def observation observation)
[])
{:run-until-fn (run-for 1)})
(use 'cljsc2.clj.rules)
(let [unit-name "SCV"
observation-facts (ds/db-with
knowledge-base
(obs->facts observation))
builder-query '[:find ?builder ?ability-id
:in $ % ?name
:where
(can-build ?name ?ability-id ?builder)]
builder-build-action (ds/q builder-query
observation-facts
can-build-rule
unit-name)]
builder-build-action)
(ability-to-action [4313841665] 524)
(use 'cljsc2.clj.rendering)
(do-sc2
conn
(fn [observation _]
[(ability-to-action [4313841665] 524)])
{:run-until-fn (run-for 1)
:collect-observations true})
(do-sc2
conn
(fn [_ _]
[])
{:run-until-fn (run-for 300)
:collect-observations true})
(do-sc2
conn
(fn [observation connection]
[(let [unit-name "SupplyDepot"
observation-facts (ds/db-with
knowledge-base
(obs->facts observation))
builder-build-action (-> '[:find ?builder ?ability-id
:in $ % ?name
:where
(can-build ?name ?ability-id ?builder)
]
(ds/q observation-facts
can-build-rule
unit-name))
[builder-unit-tag ability-id] (first builder-build-action)
[x y] (-> '[:find ?x ?y
:in $ % ?name
:where
(units-of-type ?name ?command-center-id)
[?command-center-id :unit/x ?x]
[?command-center-id :unit/y ?y]
]
(ds/q observation-facts
units-of-type-rule
"CommandCenter")
first)
]
(ability-to-action [builder-unit-tag] ability-id (+ x 3) y {}))]
)
{:run-until-fn (run-for 1)
:collect-observations true})
(do-sc2
conn
(fn [observation _]
(let [rules (concat can-build-rule
has-order-or-nil-order-rule)
facts (ds/db-with knowledge-base
(obs->facts observation))
builders (ds/q '[:find ?builder-unit-tag ?ability-id (count ?order)
:in $ % ?unit-name
:where
(can-build ?unit-name ?ability-id ?builder-unit-tag)
(has-order-or-nil-order ?builder-unit-tag ?order)
]
facts
rules
"SCV")]
(->> builders
(filter (fn [[unit-tag ability-id order-count]]
(< order-count 2)))
(map (fn [[unit-tag ability-id _]]
(ability-to-action [unit-tag] ability-id))))))
{:run-until-fn (run-for 1200)
:collect-observations :yes-please})
(do-sc2
conn
(fn [observation connection]
(let [unit-name "Barracks"
observation-facts (ds/db-with
knowledge-base
(obs->facts observation))
builder-build-action (-> '[:find ?builder-tag ?ability-id
:in $ % ?name
:where
(can-build ?name ?ability-id ?builder-tag)
]
(ds/q observation-facts
can-build-rule
unit-name))
[supply-depot-x supply-depot-y] (-> '[:find ?x ?y
:in $ % ?name
:where
(units-of-type ?name ?unit-id)
[?unit-id :unit/x ?x]
[?unit-id :unit/y ?y]
]
(ds/q observation-facts
units-of-type-rule
"SupplyDepot")
first)
]
(map-indexed (fn [i [builder-unit-tag ability-id]]
(ability-to-action [builder-unit-tag]
ability-id
(+ supply-depot-x 3)
(+ supply-depot-y (* 3 i))
{}))
(take 3 builder-build-action)))
)
{:run-until-fn (run-for 1)})
(defn build-thing [observation thing-name]
(let [rules (concat can-build-rule
has-order-or-nil-order-rule)
facts (ds/db-with knowledge-base
(obs->facts observation))
builders (ds/q '[:find ?builder-unit-tag ?ability-id (count ?order)
:in $ % ?unit-name
:where
(can-build ?unit-name ?ability-id ?builder-unit-tag)
(has-order-or-nil-order ?builder-unit-tag ?order)
]
facts
rules
thing-name)]
(->> builders
(filter (fn [[unit-tag ability-id order-count]]
(< order-count 2)))
(map (fn [[unit-tag ability-id _]]
(ability-to-action [unit-tag] ability-id))))))
(do-sc2
conn
(fn [observation _]
(concat (build-thing observation "SCV")
(build-thing observation "Marine")))
{:run-until-fn (run-for 1200)
:collect-observations :uhu})
(do-sc2
conn
(fn [observation connection]
(let [unit-name "SupplyDepot"
observation-facts (ds/db-with
knowledge-base
(obs->facts observation))
builder-build-action (-> '[:find ?builder ?ability-id
:in $ % ?name
:where
(can-build ?name ?ability-id ?builder)
]
(ds/q observation-facts
can-build-rule
unit-name))
[builder-unit-tag ability-id] (first builder-build-action)
[x y] (-> '[:find ?x ?y
:in $ % ?name
:where
(units-of-type ?name ?command-center-id)
[?command-center-id :unit/x ?x]
[?command-center-id :unit/y ?y]
]
(ds/q observation-facts
units-of-type-rule
"CommandCenter")
first)
]
[(ability-to-action [builder-unit-tag] ability-id (+ x 3) (- y 2) {:queue-command true})
(ability-to-action [builder-unit-tag] ability-id (+ x 3) (+ y 2) {:queue-command true})
(ability-to-action [builder-unit-tag] ability-id (+ x 3) (+ y 4) {:queue-command true})])
)
{:run-until-fn (run-for 1)})
(do-sc2
conn
(fn [observation _]
(concat (build-thing observation "SCV")
(build-thing observation "Marine")))
{:run-until-fn (run-for 1200)
:collect-observations :yup})
(do-sc2
conn
(fn [observation connection]
(let [unit-name "Marine"
observation-facts (ds/db-with
knowledge-base
(obs->facts observation))
[avg-x avg-y] (-> '[:find [(avg ?x) (avg ?y)]
:in $ % ?name
:where
(units-of-type ?name ?marine-e-id)
[?marine-e-id :unit/x ?x]
[?marine-e-id :unit/y ?y]
]
(ds/q observation-facts
units-of-type-rule
unit-name))
marine-unit-tags (-> '[:find [?unit-tag ...]
:in $ % ?name
:where
(units-of-type ?name ?unit-tag)
]
(ds/q observation-facts
units-of-type-rule
unit-name))]
(map (fn [unit-tag] (ability-to-action unit-tag 23 (+ avg-x 15) (- avg-y 50) {}))
marine-unit-tags))
)
{:run-until-fn (run-for 300)
:collect-observations true})