67 lines
2 KiB
Clojure
67 lines
2 KiB
Clojure
(ns the-great-game.gossip.gossip
|
|
"Interchange of news events between gossip agents"
|
|
(:require [the-great-game.utils :refer [deep-merge]]
|
|
[the-great-game.gossip.news-items :refer [learn-news-item]]))
|
|
|
|
;; Note that habitual travellers are all gossip agents; specifically, at this
|
|
;; stage, that means merchants. When merchants are moved we also need to
|
|
;; update the location of the gossip with the same key.
|
|
|
|
(defn dialogue
|
|
"Dialogue between an `enquirer` and an `agent` in this `world`; returns a
|
|
map identical to `enquirer` except that its `:gossip` collection may have
|
|
additional entries."
|
|
;; TODO: not yet written, this is a stub.
|
|
[enquirer respondent world]
|
|
enquirer)
|
|
|
|
(defn gather-news
|
|
([world]
|
|
(reduce
|
|
deep-merge
|
|
world
|
|
(map
|
|
#(gather-news world %)
|
|
(keys (:gossips world)))))
|
|
([world gossip]
|
|
(let [g (cond (keyword? gossip)
|
|
(-> world :gossips gossip)
|
|
(map? gossip)
|
|
gossip)]
|
|
{:gossips
|
|
{(:id g)
|
|
(reduce
|
|
deep-merge
|
|
{}
|
|
(map
|
|
#(dialogue g % world)
|
|
(remove
|
|
#( = g %)
|
|
(filter
|
|
#(= (:location %) (:location g))
|
|
(vals (:gossips world))))))}})))
|
|
|
|
(defn move-gossip
|
|
"Return a world like this `world` but with this `gossip` moved to this
|
|
`new-location`. Many gossips are essentially shadow-records of agents of
|
|
other types, and the movement of the gossip should be controlled by the
|
|
run function of the type of the record they shadow. The [[#run]] function
|
|
below does NOT call this function."
|
|
[gossip world new-location]
|
|
(let [id (cond
|
|
(map? gossip)
|
|
(-> world :gossips gossip :id)
|
|
(keyword? gossip)
|
|
gossip)]
|
|
(deep-merge
|
|
world
|
|
{:gossips
|
|
{id
|
|
{:location new-location}}})))
|
|
|
|
(defn run
|
|
"Return a world like this `world`, with news items exchanged between gossip
|
|
agents."
|
|
[world]
|
|
(gather-news world))
|