diff --git a/game.py b/game.py index e33f968..665148a 100644 --- a/game.py +++ b/game.py @@ -11,7 +11,10 @@ class Player: self.game = game self.name = name self.id = str(uuid.uuid4()) - self.beginturn() + self.joined = False + self.word = "" + self.ready = False + self.selection = -1 players[self.id] = self def beginturn(self): @@ -19,6 +22,15 @@ class Player: self.ready = False self.selection = -1 + def join(self, word): + if not self.joined: + del players[self.id] + self.id = str(uuid.uuid4()) + players[self.id] = self + self.word = str(word).strip() + self.joined = True + self.game.playerJoin() + def select(self, i): if self.selection < 0 and i >= 0 and i < len(self.game.cards): self.selection = i @@ -32,7 +44,7 @@ class Player: def status(self): friend = self.game.players[1] if self.game.players[0] == self else self.game.players[0] - friendId = friend.id if self.game.players[0] == self else None + friendId = None if friend.joined else friend.id friendSelection = friend.selection if self.game.selected else -1 cards = [] for i in range(0, len(self.game.cards)): @@ -43,11 +55,12 @@ class Player: "word": self.game.word, "wordSource": self.game.wordSource, "cards": cards, + "started": self.game.started, "selected": self.game.selected, "host": config.externalHost, "prefix": config.prefix, "cardsPrefix": config.cardsPrefix, - "waiting": (self.selection >= 0 and friendSelection < 0) or (self.ready and not friend.ready), + "waiting": (self.joined and not self.game.started) or (self.selection >= 0 and not self.game.selected) or self.ready, "win": self.game.selected and self.selection == friend.selection, "lose": self.game.selected and self.selection != friend.selection, "me": { @@ -62,12 +75,16 @@ class Player: class Game: - def __init__(self): + def __init__(self, word): self.players = ( Player(self, "Player1"), Player(self, "Player2") ) self.turn = 1 self.score = 0 + self.started = False + self.selected = False self.cards = [] - self.beginturn() + self.word = "" + self.wordSource = "" + self.players[0].join(word) def beginturn(self): assert(cards) @@ -102,14 +119,19 @@ class Game: self.players[1].beginturn() self.selected = False + def playerJoin(self): + if not self.started and all(p.joined for p in self.players): + self.started = True + self.beginturn() + def playerSelect(self): - if not self.selected and self.players[0].selection >= 0 and self.players[1].selection >= 0: + if self.started and not self.selected and all(p.selection >= 0 for p in self.players): self.selected = True if self.players[0].selection == self.players[1].selection: self.score = self.score + 1 def playerReady(self): - if self.selected and self.players[0].ready and self.players[1].ready: + if self.started and self.selected and all(p.ready for p in self.players): self.turn = self.turn + 1 self.beginturn() diff --git a/server.py b/server.py index 0b9d75e..ee17460 100755 --- a/server.py +++ b/server.py @@ -63,10 +63,11 @@ class Server(http.server.BaseHTTPRequestHandler): length = int(self.headers.get('content-length')) data = self.rfile.read(length) fields = urllib.parse.parse_qs(str(data,"UTF-8")) + word = str(fields.get("word", [""])[0]) with mutex: if not path: # create new game - g = game.Game() + g = game.Game(word) self.send_response(303) self.send_header("Location", str(config.prefix) + "/" + str(g.players[0].id)) self.end_headers() @@ -77,7 +78,9 @@ class Server(http.server.BaseHTTPRequestHandler): return self.err() del path[0] - if len(path) == 2 and path[0] == "select": + if not path: + player.join(word) + elif len(path) == 2 and path[0] == "select": i = -1 try: i = int(path[1]) @@ -85,7 +88,6 @@ class Server(http.server.BaseHTTPRequestHandler): return self.err() player.select(i) elif len(path) == 1 and path[0] == "ready": - word = str(fields.get("word", [""])[0]) player.nextturn(word) else: return self.err() @@ -95,6 +97,8 @@ class Server(http.server.BaseHTTPRequestHandler): self.end_headers() def do_GET(self): + #loadTemplates() + if self.command != 'GET': return self.err() @@ -131,14 +135,23 @@ class Server(http.server.BaseHTTPRequestHandler): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() - #tplPlayerpage = template.TplLoader.load("tpl/playerpage.tpl") - tplPlayerpage.write(self, player.status()); + if player.game.started: + tplPlayerpage.write(self, player.status()); + else: + tplJoinpage.write(self, player.status()); + + +def loadTemplates(): + global tplStartpage, tplJoinpage, tplPlayerpage + tplStartpage = template.TplLoader.load("tpl/startpage.tpl") + tplJoinpage = template.TplLoader.load("tpl/joinpage.tpl") + tplPlayerpage = template.TplLoader.load("tpl/playerpage.tpl") + mutex = threading.Lock() -tplStartpage = template.TplLoader.load("tpl/startpage.tpl") -tplPlayerpage = template.TplLoader.load("tpl/playerpage.tpl") +loadTemplates() game.mergeCards("cards") game.mergeWords("words/words.txt") diff --git a/tpl/css.tpl b/tpl/css.tpl index 58e1fd4..9bef9f1 100644 --- a/tpl/css.tpl +++ b/tpl/css.tpl @@ -28,6 +28,12 @@ body { font-size: 12px; text-align: center; } color: gray; } +#mainform { + display: block; + padding-top: 100px; + padding-bottom: 100px; +} +#word h1 { font-size: 24px; font-weight: bold; margin: 0 0 0 0; } #cards { margin-bottom: 18px; diff --git a/tpl/joinpage.tpl b/tpl/joinpage.tpl new file mode 100644 index 0000000..72a5bc9 --- /dev/null +++ b/tpl/joinpage.tpl @@ -0,0 +1,18 @@ +{include:header.tpl} + +{if:waiting} +
+

waiting for the friend

+ {if:friend.id}

URL for the friend: {:host}{:prefix}/{:friend.id}

{endif} +
+{else} +
+

+

+
+{endif} + +
+ + +{include:footer.tpl} diff --git a/tpl/startpage.tpl b/tpl/startpage.tpl index db595c1..35b0f44 100644 --- a/tpl/startpage.tpl +++ b/tpl/startpage.tpl @@ -1,5 +1,6 @@ {include:header.tpl} -
- + +

+

{include:footer.tpl}