]> git.cworth.org Git - lmno.games/blob - empires/empires-client.js
Implement support for the "game-state" and "character-reveal" events
[lmno.games] / empires / empires-client.js
1 const API = "https://families.cworth.org/api/";
2
3 function undisplay(element) {
4   element.style.display="none";
5 }
6
7 function add_message(severity, message) {
8   message = `<div class="message ${severity}" onclick="undisplay(this)">
9 ${message}
10 <span class="hide-button" onclick="undisplay(this.parentElement)">&times</span>
11 </div>`;
12   const message_area = document.getElementById('message-area');
13   message_area.insertAdjacentHTML('beforeend', message);
14 }
15
16 function register(form) {
17   var request = new XMLHttpRequest();
18
19   request.open("POST", API + "register");
20   request.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
21   var data = {
22     "name": form.name.value,
23     "character": form.character.value
24   };
25   request.send(JSON.stringify(data));
26
27   form.reset();
28 }
29
30 const events = new EventSource(API + "events");
31
32 events.onerror = function(event) {
33   if (event.target.readyState === EventSource.CLOSED) {
34       add_message("danger", "Connection to server lost.");
35   }
36 };
37
38 events.addEventListener("players", function(event) {
39   const players_element = document.getElementById("players");
40   const players = JSON.parse(event.data);
41
42   players_element.innerHTML = '';
43   for (const player of players) {
44     var li = document.createElement('li');
45     li.id = "player-" + player.id;
46     li.innerText = player.name;
47     players_element.appendChild(li);
48   }
49 });
50
51 events.addEventListener("player-join", function(event) {
52   const players = document.getElementById("players");
53   const player = JSON.parse(event.data);
54
55   const li = document.createElement('li');
56   li.id = "player-" + player.id;
57   li.innerText = player.name;
58   players.appendChild(li);
59
60   add_message("success", player.name + " is now in the game!");
61 });
62
63 events.addEventListener("player-leave", function(event) {
64   const players = document.getElementById("players");
65   const id = JSON.parse(event.data);
66   const player = document.getElementById("player-" + id.id);
67
68   add_message("info", player.innerText + " has left the game.");
69   players.removeChild(player);
70 });
71
72 events.addEventListener("game-state", function(event) {
73   const data = JSON.parse(event.data);
74   const old_state = data.old_state;
75   const new_state = data.new_state;
76
77   const hide_selector = ".show-state-" +old_state+ ",.hide-state-" +new_state;
78   const show_selector = ".hide-state-" +old_state+ ",.show-state-" +new_state;
79
80   /* Hide all elements based on the state transition. */
81   var elts = document.querySelectorAll(hide_selector);
82   for (const elt of elts) {
83     elt.style.display = "none";
84   }
85
86   /* And show all elements based on the same state transition. */
87   elts = document.querySelectorAll(show_selector);
88   for (const elt of elts) {
89     elt.style.display = "block";
90   }
91 });
92
93 events.addEventListener("character-reveal", function(event) {
94   const data = JSON.parse(event.data);
95   const character_name = data.character;
96
97   const character = document.getElementById("character-reveal");
98
99   character.innerText = character_name;
100 });
101
102 events.addEventListener("capture", function(event_string) {
103   const players = document.getElementById("players");
104   const event = JSON.parse(event_string.data);
105   const player = document.getElementById("player-" + event.captee);
106
107   players.removeChild(player);
108 });