| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -9,7 +9,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  {:canvas (.getElementById js/document "gamecanvas")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   :ctx (.getContext (.getElementById js/document "gamecanvas") "2d")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   :target-fps 40
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   :running true
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   :continue? true
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   :timing {;; msecs of previous frame
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            :prev 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ;; msecs of current frame
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -57,30 +57,32 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				(defn update-scene
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  "updates the current scene using its udpate function"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  [gamestate]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  (let [scenekey (:scene gamestate)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        scenedata (get-in gamestate [:scenes scenekey])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        updatefunc (:update scenedata)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        newdata (updatefunc gamestate scenedata)]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    (assoc-in gamestate [:scenes scenekey] newdata)))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  (if-not (:continue? gamestate)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    gamestate
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    (let [scenekey (:scene gamestate)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          scenedata (get-in gamestate [:scenes scenekey])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          updatefunc (:update scenedata)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          newdata (updatefunc gamestate scenedata)]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      (assoc-in gamestate [:scenes scenekey] newdata))))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				(defn continue-running?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  "checks if the gameloop should keep running, based on input"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  [gamestate]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  (update
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   gamestate
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   :running
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   (fn [running]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   :continue?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				   (fn [continue?]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				     (cond
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       (and running
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       (and continue?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            (input/keydown? :Digit2)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            (input/keydown? :ControlLeft))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       false
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       (and (not running)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       (and (not continue?)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            (input/keydown? :Digit3)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            (input/keydown? :ControlLeft))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       true
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       :else
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       true))))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				       continue?))))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				(defn update-step
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  "updates timing information and the current scene"
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -134,12 +136,10 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    ;; more accurately
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    (let [now (get-in newstate [:timing :now])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          duration (- (.now js/performance) now)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          continue? (:running newstate)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          tfps (:target-fps gamestate)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          timeout (if continue?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          timeout (if (:continue? newstate)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    (/
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                     (- 1000 duration)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                     (:target-fps gamestate))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                     (:target-fps newstate))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    5000)]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      (.setTimeout js/window
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                   (fn []
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |