Added logging; simulation ALMOST runs
This commit is contained in:
parent
984feb850a
commit
28db4866eb
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -40,6 +40,24 @@
|
|||
#(= (: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 if 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)
|
||||
(:id (-> world :gossipe gossip)
|
||||
(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."
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
(ns the-great-game.merchants.markets
|
||||
"Adjusting quantities and prices in markets."
|
||||
(:require [the-great-game.utils :refer [deep-merge]]
|
||||
(:require [taoensso.timbre :as l :refer [info error]]
|
||||
[the-great-game.utils :refer [deep-merge]]
|
||||
[the-great-game.world.world :refer [actual-price default-world]]))
|
||||
|
||||
(defn new-price
|
||||
|
@ -38,12 +39,15 @@
|
|||
(> su st)
|
||||
(- su st)
|
||||
true 0)
|
||||
price (new-price p st su d)]
|
||||
n (new-price p st su d)]
|
||||
(if
|
||||
(not (= p n))
|
||||
(l/info "Price of " commodity " at " id " has changed from " (float p) " to " (float n)))
|
||||
{:cities {id
|
||||
{:stock
|
||||
{commodity (+ (- st decrement) increment)}
|
||||
:prices
|
||||
{commodity price}}}}))
|
||||
{commodity n}}}}))
|
||||
|
||||
|
||||
(defn update-markets
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
"Trade planning for merchants, primarily."
|
||||
(:require [taoensso.timbre :as l :refer [info error]]
|
||||
[the-great-game.utils :refer [deep-merge]]
|
||||
[the-great-game.gossip.gossip :refer [move-gossip]]
|
||||
[the-great-game.world.routes :refer [find-route]]
|
||||
[the-great-game.world.world :refer [actual-price default-world]]))
|
||||
|
||||
|
@ -309,16 +310,19 @@
|
|||
:cash (+ (:cash market) p)}}})
|
||||
;; if no plan, then if at home stay put
|
||||
(= (:location m) (:home m))
|
||||
{}
|
||||
(do
|
||||
(l/info "Merchant " id " remains at home in " location)
|
||||
{})
|
||||
;; else move towards home
|
||||
true
|
||||
(let [route (find-route world location (:home m))
|
||||
next-location (nth route 1)]
|
||||
(l/info "No trade possible at " location "; merchant " id " moves to " next-location)
|
||||
(merge
|
||||
{:merchants
|
||||
{id
|
||||
{:location next-location}}})))))
|
||||
|
||||
{:location next-location}}}
|
||||
(move-gossip id world next-location)))))))
|
||||
|
||||
(defn re-plan
|
||||
"Having failed to sell a cargo at current location, re-plan a route to
|
||||
|
@ -338,7 +342,6 @@
|
|||
{id
|
||||
{:plan plan}}})))
|
||||
|
||||
|
||||
(defn sell-and-buy
|
||||
"Return a new world like this `world`, in which this `merchant` has sold
|
||||
their current stock in their current location, and planned a new trade, and
|
||||
|
@ -381,7 +384,6 @@
|
|||
;; else
|
||||
(re-plan merchant world))))
|
||||
|
||||
|
||||
(defn move-merchant
|
||||
"Handle general en route movement of this `merchant` in this `world`."
|
||||
[merchant world]
|
||||
|
@ -396,18 +398,23 @@
|
|||
next-location (if plan
|
||||
(nth 1 (find-route world (:location m) (:destination plan)))
|
||||
(:location m))]
|
||||
(l/info "Merchant " id " at " (:location m))
|
||||
(cond at-destination?
|
||||
(l/info "Merchant " id " has moved from " (:location m) " to " next-location)
|
||||
(cond
|
||||
;; if the merchant is at the destination of their current plan
|
||||
;; sell all cargo and repurchase.
|
||||
at-destination?
|
||||
(sell-and-buy merchant world plan)
|
||||
;; if they don't have a plan, seek to create one
|
||||
(nil? (:plan m))
|
||||
(plan-and-buy merchant world)
|
||||
;; otherwise, move one step towards their destination
|
||||
true
|
||||
(deep-merge
|
||||
{:merchants
|
||||
{id
|
||||
{:id id
|
||||
:location next-location
|
||||
:known-prices (add-known-prices m world)}}})))
|
||||
|
||||
{:location next-location
|
||||
:known-prices (add-known-prices m world)}}}
|
||||
(move-gossip id world next-location)))))
|
||||
|
||||
(defn run
|
||||
"Return a world like this `world`, but with each merchant moved."
|
||||
|
|
|
@ -185,6 +185,6 @@
|
|||
(defn run
|
||||
"Return a world like this `world` with only the `:date` value updated
|
||||
(incremented by one). For running other aspects of the simulation, see
|
||||
[[the-great-game.world.run#var-run]]."
|
||||
[[the-great-game.world.run]]."
|
||||
[world]
|
||||
(assoc world :date (inc (or (:date world) 0))))
|
||||
|
|
Loading…
Reference in a new issue