diff --git a/src/server/farm.scm b/src/server/farm.scm index 9f6d9a0..f89e32d 100644 --- a/src/server/farm.scm +++ b/src/server/farm.scm @@ -266,6 +266,9 @@ (assert (number? (game-id g))) (assert (list? (game-players g))) (for-each (lambda (p) + (when (not (= (player-cash p) (player-display-cash p))) + (print "display cash out-of-sync") + (safe-set! (player-display-cash p) (player-cash p))) (assert (instance-of? p )) (assert (number? (player-cash p))) (assert (number? (player-display-cash p))) @@ -1353,6 +1356,9 @@ (safe-set! (player-display-cash player) (player-cash player)) (safe-set! (player-debt player) 0)))))) (create-ws-response player "loan" '())) + ((string=? type "nothing") + (message-players! game player '() type: "update") + (create-ws-response player "update" '())) ((string=? type "trade") (let ((res (propose-trade game player (alist-ref 'parameters msg)))) (if (eq? res #t) @@ -1680,22 +1686,27 @@ ((end-ai-turn) (if (eq? (player-state player) 'pre-turn) (process-ai-push-message player game '((type . "update"))) ;; restarting at AI player's turn - (when (ai-processing-turn player) - (when (< (player-cash player) 0) - (print "taking out loan") - (process-message player game "loan" `((amount . ,(/ (+ (abs (player-cash player)) - (remainder (abs (player-cash player)) 1000)) - 1000))))) - (when (>= (player-cash player) 1000) - (print "repaying loan") - (process-message player game "loan" `((amount . ,(* (/ (- (player-cash player) - (remainder (player-cash player) 1000)) - 1000) - -1))))) - (print "ending turn") - ;; (thread-sleep! 0.5) - (set! (ai-processing-turn player) #f) - (process-message player game "turn-ended" '()) + (if (ai-processing-turn player) + (begin + (when (< (player-cash player) 0) + (print "taking out loan") + (process-message player game "loan" `((amount . ,(/ (+ (abs (player-cash player)) + (remainder (abs (player-cash player)) 1000)) + 1000))))) + (when (>= (player-cash player) 1000) + (print "repaying loan") + (process-message player game "loan" `((amount . ,(* (/ (- (player-cash player) + (remainder (player-cash player) 1000)) + 1000) + -1))))) + (print "ending turn") + ;; (thread-sleep! 0.5) + (set! (ai-processing-turn player) #f) + (process-message player game "turn-ended" '())) + ;; this could happen if we restart the game in the middle of a turn + ;; so lets just force the next turn + ;; TODO this might get hit for every AI player? + (process-message player game "turn-ended" '()) ))))) (define (make-ai-push-receiver game player) @@ -1703,7 +1714,13 @@ (*game* game) (*player* player) (let loop ((msg (mailbox-receive! (player-mailbox player)))) - (process-ai-push-message player game msg) + (handle-exceptions + exn + (begin (log-error exn) + (print (conc "Server error: " (with-output-to-string + (lambda () + (print-error-message exn)))))) + (process-ai-push-message player game msg)) (loop (mailbox-receive! (player-mailbox player)))))) (define (session-game) @@ -1746,7 +1763,9 @@ (let* ((game (*game*)) (res (process-message (*player*) game - (alist-ref 'type msg) + (alist-ref 'type (if (list? msg) + msg + '((type . "nothing")))) msg))) (when game (safe-set! (game-last-updated game) (+ (game-last-updated game) 1)) @@ -2571,6 +2590,8 @@ ;; bug on display for uncle berts farm ;; Error: (mailbox-send!) bad argument type - not a mailbox: "redhead91 +;; farmers luck can cause display cash to be out of sync + ;; Uncaught TypeError: Cannot read property 'toFixed' of undefined ;; at St (app.0f8d4f4543faaee5dff1.js:1377) ;; at app.0f8d4f4543faaee5dff1.js:1457