X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Frun-game.scm;h=0fed48d0c51f3a43182aff45d953a368d0ad09a7;hp=ff58f23a91beadd32c95f2212f23110dc5ba1fea;hb=6f7c1d4f9a2043c16f83facef6b3216e45e14f40;hpb=a1f2eb03faa50232cee704a2ad710d26da918cba diff --git a/mudsync/run-game.scm b/mudsync/run-game.scm index ff58f23..0fed48d 100644 --- a/mudsync/run-game.scm +++ b/mudsync/run-game.scm @@ -18,15 +18,15 @@ (define-module (mudsync run-game) #:use-module (mudsync game-master) - #:use-module (8sync agenda) + #:use-module (8sync) #:use-module (8sync repl) - #:use-module (8sync systems actors) - #:use-module (8sync systems actors debug) + #:use-module (8sync debug) #:use-module (srfi srfi-1) #:use-module (ice-9 receive) #:use-module (ice-9 q) + #:use-module (ice-9 match) #:export (run-demo - inject-special! + do-inject-special! make-special-injector ;; Debug stuff, might go away @@ -46,9 +46,32 @@ ;; "quasi-evil for productivity's sake" anyway). You can set up your own ;; solution which doesn't use a global though. +(define %inject-queue #f) + (define (inject-gameobj! game-spec special-symbol) - (display "Game hasn't been started...\n")) + (if %inject-queue + (let ((gameobj-spec + (or (find + (lambda (entry) (eq? (car entry) special-symbol)) + game-spec) + (throw 'no-such-symbol "Can't find such a symbol in the game-spec" + #:symbol special-symbol)))) + (enq! %inject-queue (cons gameobj-spec special-symbol))) + (display "Game hasn't been started...\n")) + 'done) + +(define-actor () + ((repl-update gameobj-injector-inject-queued)) + (gm #:init-keyword #:gm + #:getter .gm)) +(define (gameobj-injector-inject-queued injector message) + (while (not (q-empty? %inject-queue)) + (match (deq! %inject-queue) + ((gameobj-spec . special-symbol) + (<- (.gm injector) 'inject-special! + #:special-symbol special-symbol + #:gameobj-spec gameobj-spec))))) ;;; Game running stuff @@ -59,59 +82,21 @@ (define new-conn-handler (make-default-room-conn-handler default-room)) (define gm - (hive-create-actor-gimmie* hive "gm" - #:new-conn-handler new-conn-handler)) - (define initial-tasks - (list (bootstrap-message hive (actor-id gm) 'init-world - #:game-spec game-spec))) - (define agenda - (make-agenda #:pre-unwind-handler print-error-and-continue - #:queue (list->q initial-tasks))) + (bootstrap-actor-gimmie* hive "gm" + #:new-conn-handler new-conn-handler)) + (define injector + (bootstrap-actor hive + #:gm (actor-id gm))) + + (define repl-manager + (bootstrap-actor* hive "repl" + #:subscribers (list injector))) (set! %live-gm gm) (set! %live-hive hive) - (receive (post-run-hook gameobj-injector) - (make-special-injector agenda hive (actor-id gm)) - ;; Set up injector for live hacking - (set! inject-gameobj! gameobj-injector) - - ;; Set up REPL sever - (cond - ;; If repl-server is an integer, we'll use that as the port - ((integer? repl-server) - (spawn-and-queue-repl-server! agenda repl-server)) - (repl-server - (spawn-and-queue-repl-server! agenda))) - - (start-agenda agenda - #:post-run-hook post-run-hook))) - - -(define (inject-special! queue hive gm-id game-spec special-symbol) - (define gameobj-spec - (or (find - (lambda (entry) (eq? (car entry) special-symbol)) - game-spec) - (throw 'no-such-symbol "Can't find such a symbol in the game-spec" - #:symbol special-symbol))) - (define task - (bootstrap-message hive gm-id 'inject-special! - #:special-symbol special-symbol - #:gameobj-spec gameobj-spec)) - (enq! queue task) - 'done) -(define (queue-injected-tasks-on-agenda! agenda inject-queue) - "Inject tasks from the inject-queue onto the agenda queue." - (while (not (q-empty? inject-queue)) - (enq! (agenda-queue agenda) (q-pop! inject-queue)))) + (set! %inject-queue (make-q)) -(define* (make-special-injector agenda hive gm-id) - "Make a post-run-hook and gameobj injector for quick live hacking." - (define inject-queue (make-q)) - (values - (lambda (agenda) - (queue-injected-tasks-on-agenda! agenda inject-queue)) - (lambda (game-spec special-symbol) - (inject-special! inject-queue hive gm-id - game-spec special-symbol)))) + (run-hive hive + (list (bootstrap-message hive (actor-id gm) 'init-world + #:game-spec game-spec))))