Starcraft BWAPI Clojure
Following has been sitting on my desktop for a while, I started playing with it but after that never had time to continue. It cost me couple of hours to figure stuff out so I didn't want to throw it away.
It won't do anything other than keep pumping scvs and command them to collect minerals.
(ns star-craft.core
(:refer-clojure :exclude [+ - * =])
(:use (clojure.contrib.generic [arithmetic :only [+ - *]]
[comparison :only [=]]))
(:use [vector-2d.core])
(:import (eisbot.proxy JNIBWAPI BWAPIEventListener)
(eisbot.proxy.types UnitType UnitType$UnitTypes)
(eisbot.proxy.model Unit)))
(declare bw-api)
(defn minerals []
(-> bw-api .getSelf .getMinerals))
(defn mineral-seq []
(filter #(= (.getTypeID %)
(.ordinal UnitType$UnitTypes/Resource_Mineral_Field))
(.. bw-api getNeutralUnits)))
(defn create-scv []
(.train bw-api (.getID
(first
(filter
#(= (.getTypeID %)
(.ordinal UnitType$UnitTypes/Terran_Command_Center))
(.. bw-api getMyUnits))))
(.ordinal UnitType$UnitTypes/Terran_SCV)))
(defn scv-seq []
(filter #(= (.getTypeID %) (.ordinal UnitType$UnitTypes/Terran_SCV))
(.. bw-api getMyUnits)))
(defn distance [a b]
(dist (vector-2d (.getX a) (.getY a)) (vector-2d (.getX b) (.getY b))))
(defn idle? [u]
(.isIdle u))
(defn training? [u]
(.isTraining u))
(defn send-unit [unit target]
(.rightClick bw-api (.getID unit) (.getID target)))
(defn keep-scvs-busy []
(let [idle-scvs (filter idle? (scv-seq))]
(doseq [scv idle-scvs]
(let [closest-mineral (first (sort-by #(distance scv %) (mineral-seq)))]
(send-unit scv closest-mineral)))))
(defn need-scv? []
(and (< (count (scv-seq)) 20)
(>= (minerals) 50)))
(defn build-scv []
(create-scv))
(defn take-turn []
(keep-scvs-busy)
(when (need-scv?)
(build-scv)))
(defn event-listener []
(proxy [BWAPIEventListener] []
(connected [] (.loadTypeData bw-api))
(gameStarted [] (println "[+] Game Started"))
(gameUpdate [] (try (take-turn)
(catch Exception e
(println "[+] Error Game Update: " e))))))
(def bw-api (JNIBWAPI. (event-listener)))
(defn -main []
(future (.start bw-api)))