diff --git a/doc/api.org b/doc/api.org index 25eb9a0..bfabd40 100644 --- a/doc/api.org +++ b/doc/api.org @@ -4,8 +4,14 @@ #+LATEX_HEADER: \usepackage{fullpage} * General Description - - All transmissions will be based on UDP - - All UDP packet will contain plain json data + - All transmissions will be based on TCP because: + - Packet length are not fixed + - Packet ordering is important + - All TCP stream from *client to server* will: + - Contain plain json data + - Be terminated by a "#EOF" line (in order for the server to detect the end of the request + - All TCP stream from *server to client* will contains plai json data (connection will be closed by the server + so there is no need of "#EOF". * Communications ** Initialisation 1. Server wait for a client @@ -14,36 +20,33 @@ { "type": "new-game" } + #EOF #+END_SRC 3. Server can reply: #+BEGIN_SRC json { "type": "state", - "syn": 1, "game-id": 1, "game-over": false, "snake": [[1,2],[1,3]], "food": [[6,7]] } #+END_SRC - Note that, syn entry is used to keep packet ordering consistent and detecting packet inversion on the network. Thus, - syn entry indicate the expected syn that the client should send on the next UDP packet. ** Gameplay *** Change Direction 1. When client is playing a game it can ask to the server to change snake direction: #+BEGIN_SRC json { "type": "update", - "syn": 1, "game-id": 1, "direction": "left", } + #EOF #+END_SRC 2. Server can reply #+BEGIN_SRC json { "type": "state", - "syn": 2, "game-id": 1, "game-over": false, "snake": [[0,2],[1,2]], @@ -55,16 +58,15 @@ #+BEGIN_SRC json { "type": "update", - "syn": 2, "game-id": 1, "direction": null } + #EOF #+END_SRC 2. Server can reply: #+BEGIN_SRC json { "type": "state", - "syn": 3, "game-id": 1, "game-over": false, "snake": [[1,2],[0,2]], @@ -76,11 +78,10 @@ #+BEGIN_SRC json { "type": "state", - "syn": null, "game-id": 1, "game-over": true, "snake": [[0,2],[1,2]], "food": [[6,7]] } #+END_SRC - - No reply is expected from the client and server will be in charge to free local memory. Note that syn=null. + - No reply is expected from the client and server will be in charge to free local memory. diff --git a/doc/api.pdf b/doc/api.pdf index b2b5cc9..902dc6b 100644 Binary files a/doc/api.pdf and b/doc/api.pdf differ diff --git a/server/api/api.lisp b/server/api/api.lisp index 3bd7e49..9174717 100644 --- a/server/api/api.lisp +++ b/server/api/api.lisp @@ -4,25 +4,7 @@ (defclass api () ((gm - :initform (make-instance 'game-manager)) - (games-syn - :initform '()))) - - -(defmethod create-syn ((api api) game-id &optional (initial-value 0)) - (unless (eq nil (get-syn api game-id)) (error "This game ~a already have a syn !" game-id)) - (with-slots (games-syn) api - (push (list :game-id game-id :syn initial-value) games-syn) - initial-value)) - -(defmethod refresh-syn ((api api) game-id) - (with-slots (games-syn) api - (incf (getf (first (remove-if-not #'(lambda (entry) (eql game-id (getf entry :game-id))) games-syn)) :syn)))) - -(defmethod get-syn ((api api) game-id) - (with-slots (games-syn) api - (getf (first (remove-if-not #'(lambda (entry) (eql game-id (getf entry :game-id))) games-syn)) :syn))) - + :initform (make-instance 'game-manager)))) ;;; TODO: Handle errors (valid json etc..) @@ -34,12 +16,11 @@ (defmethod handle-new-game ((api api) data) (with-slots (gm) api - (let* ((game-id (create-game gm)) - (game-syn (create-syn api game-id 1))) ; Create syn with 1 (since first packet already receive) + (let* ((game-id (create-game gm))) (let ((game-dump (dump gm game-id))) (setf (getf game-dump :game-over) :null) ; Define nil as null (for json) (to-json - (append (list :type "state" :syn game-syn) game-dump)))))) + (append (list :type "state") game-dump)))))) ;;; TODO: RETURN JSON !!!! (defmethod handle-update ((api api) data) @@ -55,7 +36,8 @@ (t (setf dir nil))) (if dir (refresh game :dir dir) - (refresh game))))) + (refresh game)) + (append (list :type "update") (dump gm game-id)))))