|
|
|
(in-package :pong.game)
|
|
|
|
|
|
|
|
(defclass action ()
|
|
|
|
((timestamp :initarg :timestamp
|
|
|
|
:initform (/ (get-internal-real-time) internal-time-units-per-second)
|
|
|
|
:reader action-timestamp)
|
|
|
|
(paddle :initarg :paddle :initform nil :reader paddle)))
|
|
|
|
|
|
|
|
(defgeneric apply-action (action game))
|
|
|
|
|
|
|
|
(defclass start-down-action (action) ())
|
|
|
|
|
|
|
|
(defclass stop-down-action (action) ())
|
|
|
|
|
|
|
|
(defclass start-up-action (action) ())
|
|
|
|
|
|
|
|
(defclass stop-up-action (action) ())
|
|
|
|
|
|
|
|
(cpk:defencoding action timestamp paddle)
|
|
|
|
(cpk:defencoding start-down-action timestamp paddle)
|
|
|
|
(cpk:defencoding stop-down-action timestamp paddle)
|
|
|
|
(cpk:defencoding start-up-action timestamp paddle)
|
|
|
|
(cpk:defencoding stop-up-action timestamp paddle)
|
|
|
|
|
|
|
|
(defun get-paddle (paddle state)
|
|
|
|
(case paddle
|
|
|
|
(:left (state-left-paddle state))
|
|
|
|
(:right (state-right-paddle state))) )
|
|
|
|
|
|
|
|
(defmethod apply-action ((action start-down-action) (game game))
|
|
|
|
(let* ((state (game-state game))
|
|
|
|
(paddle (get-paddle (paddle action) state)))
|
|
|
|
(incf (paddle-vy paddle) +paddle-speed+)))
|
|
|
|
|
|
|
|
(defmethod apply-action ((action stop-down-action) (game game))
|
|
|
|
(let* ((state (game-state game))
|
|
|
|
(paddle (get-paddle (paddle action) state)))
|
|
|
|
(decf (paddle-vy paddle) +paddle-speed+)))
|
|
|
|
|
|
|
|
(defmethod apply-action ((action start-up-action) (game game))
|
|
|
|
(let* ((state (game-state game))
|
|
|
|
(paddle (get-paddle (paddle action) state)))
|
|
|
|
(decf (paddle-vy paddle) +paddle-speed+)))
|
|
|
|
|
|
|
|
(defmethod apply-action ((action stop-up-action) (game game))
|
|
|
|
(let* ((state (game-state game))
|
|
|
|
(paddle (get-paddle (paddle action) state)))
|
|
|
|
(incf (paddle-vy paddle) +paddle-speed+)))
|