Mercurial > irccd
annotate plugins/hangman/hangman.js @ 773:8c44bbcbbab9
Misc: style, cleanup and update
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 26 Oct 2018 13:01:00 +0200 |
parents | 3e816cebed2c |
children | 06cc2f95f479 |
rev | line source |
---|---|
0 | 1 /* |
2 * hangman.js -- hangman game for IRC | |
3 * | |
628
27587ff92a64
Misc: update copyrights
David Demelier <markand@malikania.fr>
parents:
577
diff
changeset
|
4 * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr> |
0 | 5 * |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
154
f554d1314208
Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents:
141
diff
changeset
|
19 // Plugin information. |
f554d1314208
Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents:
141
diff
changeset
|
20 info = { |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
21 name: "hangman", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
22 author: "David Demelier <markand@malikania.fr>", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
23 license: "ISC", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
24 summary: "A hangman game for IRC", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
25 version: "@IRCCD_VERSION@" |
154
f554d1314208
Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents:
141
diff
changeset
|
26 }; |
f554d1314208
Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents:
141
diff
changeset
|
27 |
141
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
28 // Modules. |
0 | 29 var Logger = Irccd.Logger; |
30 var File = Irccd.File; | |
31 var Plugin = Irccd.Plugin; | |
32 var Server = Irccd.Server; | |
33 var Unicode = Irccd.Unicode | |
34 var Util = Irccd.Util; | |
35 | |
141
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
36 // Default options. |
0 | 37 Plugin.config["collaborative"] = "true"; |
38 | |
141
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
39 // Formats. |
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
40 Plugin.format = { |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
41 "asked": "#{nickname}, '#{letter}' was already asked.", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
42 "dead": "#{nickname}, fail the word was: #{word}.", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
43 "found": "#{nickname}, nice! the word is now #{word}", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
44 "running": "#{nickname}, the game is already running and the word is: #{word}", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
45 "start": "#{nickname}, the game is started, the word to find is: #{word}", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
46 "win": "#{nickname}, congratulations, the word is #{word}.", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
47 "wrong-word": "#{nickname}, this is not the word.", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
48 "wrong-player": "#{nickname}, please wait until someone else proposes.", |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
49 "wrong-letter": "#{nickname}, there is no '#{letter}'." |
141
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
50 }; |
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
51 |
0 | 52 function Hangman(server, channel) |
53 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
54 this.server = server; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
55 this.channel = channel; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
56 this.tries = 10; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
57 this.select(); |
0 | 58 } |
59 | |
60 /** | |
61 * Map of games. | |
62 */ | |
63 Hangman.map = {}; | |
64 | |
65 /** | |
456
c81b38ec7bd2
Fix #644: fix word list and selection
David Demelier <markand@malikania.fr>
parents:
436
diff
changeset
|
66 * List of words. |
0 | 67 */ |
456
c81b38ec7bd2
Fix #644: fix word list and selection
David Demelier <markand@malikania.fr>
parents:
436
diff
changeset
|
68 Hangman.words = { |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
69 all: [], //!< All words, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
70 registry: {} //!< Words list per server/channel. |
456
c81b38ec7bd2
Fix #644: fix word list and selection
David Demelier <markand@malikania.fr>
parents:
436
diff
changeset
|
71 }; |
0 | 72 |
73 /** | |
74 * Search for an existing game. | |
75 * | |
76 * @param server the server object | |
77 * @param channel the channel name | |
78 * @return the hangman instance or undefined if no one exists | |
79 */ | |
80 Hangman.find = function (server, channel) | |
81 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
82 return Hangman.map[server.toString() + '@' + channel]; |
0 | 83 } |
84 | |
85 /** | |
86 * Create a new game, store it in the map and return it. | |
87 * | |
88 * @param server the server object | |
89 * @param channel the channel name | |
90 * @return the hangman object | |
91 */ | |
92 Hangman.create = function (server, channel) | |
93 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
94 return Hangman.map[server.toString() + "@" + channel] = new Hangman(server, channel); |
0 | 95 } |
96 | |
97 /** | |
98 * Remove the specified game from the map. | |
99 * | |
100 * @param game the game to remove | |
101 */ | |
102 Hangman.remove = function (game) | |
103 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
104 delete Hangman.map[game.server + "@" + game.channel]; |
0 | 105 } |
106 | |
107 /** | |
108 * Check if the text is a valid word. | |
109 * | |
110 * @param word the word to check | |
111 * @return true if a word | |
112 */ | |
113 Hangman.isWord = function (word) | |
114 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
115 if (word.length === 0) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
116 return false; |
0 | 117 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
118 for (var i = 0; i < word.length; ++i) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
119 if (!Unicode.isLetter(word.charCodeAt(i))) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
120 return false; |
0 | 121 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
122 return true; |
0 | 123 } |
124 | |
125 /** | |
126 * Load all words. | |
127 */ | |
128 Hangman.loadWords = function () | |
129 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
130 var path; |
0 | 131 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
132 // User specified file? |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
133 if (Plugin.config["file"]) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
134 path = Plugin.config["file"]; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
135 else |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
136 path = Plugin.paths.config + "/words.conf"; |
0 | 137 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
138 try { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
139 Logger.info("loading words..."); |
0 | 140 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
141 var file = new File(path, "r"); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
142 var line; |
0 | 143 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
144 while ((line = file.readline()) !== undefined) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
145 if (Hangman.isWord(line)) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
146 Hangman.words.all.push(line); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
147 } catch (e) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
148 throw new Error("could not open '" + path + "'"); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
149 } |
0 | 150 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
151 if (Hangman.words.all.length === 0) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
152 throw new Error("empty word database"); |
0 | 153 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
154 Logger.info("number of words in database: " + Hangman.words.all.length); |
0 | 155 } |
156 | |
157 /** | |
158 * Select the next word for the game. | |
159 */ | |
160 Hangman.prototype.select = function () | |
161 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
162 var id = this.server.toString() + "@" + this.channel; |
456
c81b38ec7bd2
Fix #644: fix word list and selection
David Demelier <markand@malikania.fr>
parents:
436
diff
changeset
|
163 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
164 // Reload the words if empty. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
165 if (!Hangman.words.registry[id] || Hangman.words.registry[id].length === 0) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
166 Hangman.words.registry[id] = Hangman.words.all.slice(0); |
0 | 167 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
168 var i = Math.floor(Math.random() * Hangman.words.registry[id].length); |
0 | 169 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
170 this.word = Hangman.words.registry[id][i]; |
456
c81b38ec7bd2
Fix #644: fix word list and selection
David Demelier <markand@malikania.fr>
parents:
436
diff
changeset
|
171 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
172 // Erase words from the registry. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
173 Hangman.words.registry[id].splice(i, 1); |
0 | 174 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
175 // Fill table. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
176 this.table = {}; |
0 | 177 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
178 for (var j = 0; j < this.word.length; ++j) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
179 this.table[this.word.charCodeAt(j)] = false; |
0 | 180 } |
181 | |
182 /** | |
183 * Format the word with underscore and letters. | |
184 * | |
185 * @return the secret | |
186 */ | |
187 Hangman.prototype.formatWord = function () | |
188 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
189 var str = ""; |
0 | 190 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
191 for (var i = 0; i < this.word.length; ++i) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
192 var ch = this.word.charCodeAt(i); |
0 | 193 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
194 if (!this.table[ch]) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
195 str += "_"; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
196 else |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
197 str += String.fromCharCode(ch); |
0 | 198 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
199 if (i + 1 < this.word.length) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
200 str += " "; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
201 } |
0 | 202 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
203 return str; |
0 | 204 } |
205 | |
206 /** | |
207 * Propose a word or a letter. | |
208 * | |
209 * @param ch the code point or the unique word | |
210 * @param nickname the user trying | |
211 * @return the status of the game | |
212 */ | |
213 Hangman.prototype.propose = function (ch, nickname) | |
214 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
215 var status = "found"; |
0 | 216 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
217 // Check for collaborative mode. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
218 if (Plugin.config["collaborative"] === "true" && !this.query) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
219 if (this.last !== undefined && this.last === nickname) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
220 return "wrong-player"; |
0 | 221 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
222 this.last = nickname; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
223 } |
0 | 224 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
225 if (typeof(ch) == "number") { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
226 if (this.table[ch] === undefined) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
227 this.tries -= 1; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
228 status = "wrong-letter"; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
229 } else { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
230 if (this.table[ch]) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
231 this.tries -= 1; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
232 status = "asked"; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
233 } else |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
234 this.table[ch] = true; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
235 } |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
236 } else { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
237 if (this.word != ch) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
238 this.tries -= 1; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
239 status = "wrong-word"; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
240 } else |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
241 status = "win"; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
242 } |
0 | 243 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
244 // Check if dead. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
245 if (this.tries <= 0) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
246 status = "dead"; |
0 | 247 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
248 // Check if win. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
249 var win = true; |
0 | 250 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
251 for (var i = 0; i < this.word.length; ++i) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
252 if (!this.table[this.word.charCodeAt(i)]) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
253 win = false; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
254 break; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
255 } |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
256 } |
0 | 257 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
258 if (win) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
259 status = "win"; |
0 | 260 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
261 return status; |
0 | 262 } |
263 | |
264 function onLoad() | |
265 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
266 Hangman.loadWords(); |
0 | 267 } |
268 | |
269 onReload = onLoad; | |
270 | |
271 function propose(server, channel, origin, game, proposition) | |
272 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
273 var kw = { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
274 channel: channel, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
275 command: server.info().commandChar + Plugin.info().name, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
276 nickname: Util.splituser(origin), |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
277 origin: origin, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
278 plugin: Plugin.info().name, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
279 server: server.toString() |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
280 }; |
0 | 281 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
282 var st = game.propose(proposition, kw.nickname); |
0 | 283 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
284 switch (st) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
285 case "found": |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
286 kw.word = game.formatWord(); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
287 server.message(channel, Util.format(Plugin.format["found"], kw)); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
288 break; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
289 case "wrong-letter": |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
290 case "wrong-player": |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
291 case "wrong-word": |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
292 kw.word = proposition; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
293 case "asked": |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
294 kw.letter = String.fromCharCode(proposition); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
295 server.message(channel, Util.format(Plugin.format[st], kw)); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
296 break; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
297 case "dead": |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
298 case "win": |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
299 kw.word = game.word; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
300 server.message(channel, Util.format(Plugin.format[st], kw)); |
0 | 301 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
302 // Remove the game. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
303 Hangman.remove(game); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
304 break; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
305 default: |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
306 break; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
307 } |
0 | 308 } |
309 | |
310 function onCommand(server, origin, channel, message) | |
311 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
312 var isquery = server.isSelf(channel); |
577
3d0dbc0bee7d
Irccd: update references to onChannel(Mode|Notice), onMode
David Demelier <markand@malikania.fr>
parents:
525
diff
changeset
|
313 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
314 if (isquery) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
315 channel = origin; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
316 else |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
317 channel = channel.toLowerCase(); |
436
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
318 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
319 var game = Hangman.find(server, channel); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
320 var kw = { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
321 channel: channel, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
322 command: server.info().commandChar + Plugin.info().name, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
323 nickname: Util.splituser(origin), |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
324 origin: origin, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
325 plugin: Plugin.info().name, |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
326 server: server.toString() |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
327 }; |
0 | 328 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
329 if (game) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
330 var list = message.split(" \t"); |
0 | 331 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
332 if (list.length === 0 || String(list[0]).length === 0) { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
333 kw.word = game.formatWord(); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
334 server.message(channel, Util.format(Plugin.format["running"], kw)); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
335 } else { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
336 var word = String(list[0]); |
0 | 337 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
338 if (Hangman.isWord(word)) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
339 propose(server, channel, origin, game, word); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
340 } |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
341 } else { |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
342 game = Hangman.create(server, channel); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
343 game.query = isquery; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
344 kw.word = game.formatWord(); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
345 server.message(channel, Util.format(Plugin.format["start"], kw)); |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
346 } |
272
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
347 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
348 return game; |
0 | 349 } |
350 | |
351 function onMessage(server, origin, channel, message) | |
352 { | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
353 if (server.isSelf(channel)) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
354 channel = origin; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
355 else |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
356 channel = channel.toLowerCase(); |
436
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
357 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
358 var game = Hangman.find(server, channel); |
0 | 359 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
360 if (!game) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
361 return; |
0 | 362 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
363 if (message.length === 1 && Unicode.isLetter(message.charCodeAt(0))) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
364 propose(server, channel, origin, game, message.charCodeAt(0)); |
0 | 365 } |