More stuff

This commit is contained in:
2026-07-27 22:01:08 -06:00
parent a179e453b1
commit befcdfc352
5 changed files with 55 additions and 35 deletions

View File

@@ -49,22 +49,29 @@
entity-relative-mouse-pos (.toLocal ^js entity-layer global-mouse-pos) entity-relative-mouse-pos (.toLocal ^js entity-layer global-mouse-pos)
send-interval 25 ; Send every 25ms (10 tps) send-interval 25 ; Send every 25ms (10 tps)
elapsed (.-elapsedMS t) elapsed (.-elapsedMS t)
{:keys [player entities]} (-> (update @state :elapsed + elapsed) {player :player} @state
(update/update-state :entities dt layers) {:keys [player entities players]} (-> (update @state :elapsed + elapsed)
(update/update-state :players dt layers) (update/update-state :entities dt layers)
(update/update-player dt send-interval layers entity-relative-mouse-pos sb) (update/update-state :players dt layers)
(update/update-from-server rx-chan) (update/update-player dt send-interval layers entity-relative-mouse-pos sb)
(drain-outbox! tx-chan) (update/update-from-server rx-chan)
(->> (swap! state merge))) (drain-outbox! tx-chan)
(->> (swap! state merge)))
sx (- (/ (.. app -screen -width) 2) (player :x)) sx (- (/ (.. app -screen -width) 2) (player :x))
sy (- (/ (.. app -screen -height) 2) (player :y)) sy (- (/ (.. app -screen -height) 2) (player :y))
entity-renderables (->> (vals entities) entity-renderables (->> (vals entities)
(remove #(nil? (% :renderable))) (remove #(nil? (% :renderable)))
(vec)) (vec))
other-players-renderables (->> (vals players)
(remove #(nil? (% :renderable)))
(vec))
world-renderables (vector {:renderable world-layer :x sx :y sy}) world-renderables (vector {:renderable world-layer :x sx :y sy})
player-renderables (vector player player-renderables (vector player
(assoc player :renderable (:shootbox player))) (assoc player :renderable (:shootbox player)))
things-to-update (concat player-renderables entity-renderables world-renderables)] things-to-update (concat player-renderables
other-players-renderables
entity-renderables
world-renderables)]
(doseq [thing things-to-update] (doseq [thing things-to-update]
(let [{renderable :renderable (let [{renderable :renderable
x :x x :x

View File

@@ -17,7 +17,6 @@
(if (and (nil? (e :renderable)) (e :sprite)) (if (and (nil? (e :renderable)) (e :sprite))
(let [{entity-layer :entity-layer} layers (let [{entity-layer :entity-layer} layers
renderable (entity/render entity-layer e)] renderable (entity/render entity-layer e)]
(js/console.log (clj->js e))
(assoc e :renderable renderable)) (assoc e :renderable renderable))
e)) e))
@@ -56,16 +55,17 @@
(update :outbox conj {:type "position" :x x :y y})) (update :outbox conj {:type "position" :x x :y y}))
state))) state)))
;; TODO: Cleanup entities somehow
(defn update-state [state key dt layers] (defn update-state [state key dt layers]
(let [{v key} state (let [{v key} state
new-entities (update-vals v #(-> % _ (js/console.log (clj->js v))
(apply-server-position) new-values (update-vals v #(-> %
(apply-renderable layers) (apply-server-position)
(apply-velocity dt)))] (apply-renderable layers)
(assoc state key new-entities))) (apply-velocity dt)))]
(assoc state key new-values)))
(defn update-player [state dt send-interval layers mouse-pos sb] (defn update-player [state dt send-interval layers mouse-pos sb]
(println state)
(let [{player :player} state (let [{player :player} state
updated-player (-> player updated-player (-> player
(apply-renderable layers) (apply-renderable layers)

View File

@@ -12,14 +12,20 @@
[il.system.movement :as movement])) [il.system.movement :as movement]))
(defn ws-handler [state state-chan player-id] (defn ws-handler [state state-chan player-id]
(println "Starting session for " player-id)
(go-websocket [in out err] (go-websocket [in out err]
(go-loop [] (go-loop []
(when-let [e (<! err)] (when-let [e (<! err)]
(println (.getMessage e)) (println (.getMessage e))
(recur))) (recur)))
(go-loop [] (go-loop []
(if-let [raw (<! in)] (if-not (contains? (@state :players) player-id)
(if (contains? (@state :players) player-id) (do (s/change state-chan update :players assoc player-id {:out out :in in :err err
:x 0 :y 0
:initialized false
:data (merge p/default-player {:id player-id})})
(recur))
(if-let [raw (<! in)]
(let [msg (j/from-json raw) (let [msg (j/from-json raw)
type (get msg :type "invalid") type (get msg :type "invalid")
state @state] state @state]
@@ -31,12 +37,9 @@
(println msg) (println msg)
(println state) (println state)
(recur)) (recur))
(do (s/change state-chan update :players assoc player-id {:out out :in in :err err :x 0 :y 0 (do
:data (merge p/default-player {:id player-id})}) (s/change state-chan update :players dissoc player-id)
(recur))) (println "Closed: " player-id)))))))
(do
(s/change state-chan update :players dissoc player-id)
(println "Closed: " player-id))))))
(defn index-handler [_] (defn index-handler [_]
(h/html (h/html
@@ -58,7 +61,7 @@
(defn game-loop [state state-chan] (defn game-loop [state state-chan]
(go-loop [] (go-loop []
(let [start-time (System/currentTimeMillis) (let [start-time (System/currentTimeMillis)
max-inputs-per-tick 15000 ; Stops the game from spinning for too long with events endlessly, dropping ticks max-inputs-per-tick 15000 ; Stops the game from spinning for too long with events endlessly dropping ticks
events-to-apply (loop [inputs [] events-to-apply (loop [inputs []
count 0] count 0]
(if (>= count max-inputs-per-tick) (if (>= count max-inputs-per-tick)
@@ -77,16 +80,28 @@
entities (updated-state :entities) entities (updated-state :entities)
players (updated-state :players)] players (updated-state :players)]
(doseq [{:keys [initialized data out] :as player} (vals players)] (doseq [{:keys [initialized data out] :as player} (vals players)]
(when-not (nil? out) (let [player-id (data :id)]
(when (nil? initialized) (println player)
(>! out (j/to-json (assoc (merge data (select-keys player [:x :y])) :type "init"))) (when-not (nil? out)
(s/change state-chan update-in [:players (data :id)] assoc :initialized true)) (when-not initialized
(>! out (j/to-json {:type "sync" (let [coords (select-keys player [:x :y])
:entities entities data-to-send (conj data coords)
:players (update-vals players #(select-keys % [:x :y :data :sprite]))}))))) msg (assoc data-to-send :type "init")]
(println "Initializing " player-id)
(async/put! out (j/to-json msg))
(s/change state-chan update-in [:players player-id] assoc :initialized true)))
(let [players (update-vals players (fn [e] (-> e
(select-keys [:x :y :data])
(#(merge (dissoc % :data) (get % :data))))))
players-without-player-id (dissoc players player-id)] ; Strip the selected player from the update
(async/put! out (j/to-json {:type "sync"
:entities entities
:players players-without-player-id})))))))
(let [elapsed (- (System/currentTimeMillis) start-time) (let [elapsed (- (System/currentTimeMillis) start-time)
sleep-time (max 0 (- 50 elapsed))] sleep-time (max 0 (- 50 elapsed))]
(<! (async/timeout sleep-time))) (<! (async/timeout sleep-time)))
(recur)))) (recur))))
(defn -main [] (defn -main []

View File

@@ -3,11 +3,10 @@
[il.common.velocity :as v])) [il.common.velocity :as v]))
(defn handle-position [_ state-chan player-id {x :x y :y}] (defn handle-position [_ state-chan player-id {x :x y :y}]
(println "Setting player movement: " player-id x y)
(s/change state-chan update-in [:players player-id] assoc :x x :y y)) (s/change state-chan update-in [:players player-id] assoc :x x :y y))
(defn handle-request-init [_ state-chan player-id _] (defn handle-request-init [_ state-chan player-id _]
(s/change state-chan update-in [:players player-id] dissoc :initialized)) (s/change state-chan update-in [:players player-id] assoc :initialized false))
(defn handle-shoot [_ state-chan player-id msg] (defn handle-shoot [_ state-chan player-id msg]
(let [bullet-id (random-uuid) (let [bullet-id (random-uuid)

View File

@@ -9,5 +9,4 @@
:race race/human :race race/human
:class class/priest} :class class/priest}
:sprite "https://pixijs.com/assets/bunny.png" :sprite "https://pixijs.com/assets/bunny.png"
:speed 10 :speed 10})
:renderable nil})