Mercurial > irccd
annotate plugins/hangman/hangman.js @ 436:a2ed6bc6e42c release-2.1
Fix #642: fix case sensitivity in hangman, roulette
Plugins hangman and roulette are actually case sensitive which means that using
them in #abc and #ABC ends in different results and should not.
Task: #642
Errata: 20170403
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 03 Apr 2017 21:32:43 +0200 |
parents | c6fbb6e0e06d |
children | f3c27790d0d1 c81b38ec7bd2 |
rev | line source |
---|---|
0 | 1 /* |
2 * hangman.js -- hangman game for IRC | |
3 * | |
394 | 4 * Copyright (c) 2013-2017 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 = { |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
21 author: "David Demelier <markand@malikania.fr>", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
22 license: "ISC", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
23 summary: "A hangman game for IRC", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
24 version: "@IRCCD_VERSION@" |
154
f554d1314208
Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents:
141
diff
changeset
|
25 }; |
f554d1314208
Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents:
141
diff
changeset
|
26 |
141
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
27 // Modules. |
0 | 28 var Logger = Irccd.Logger; |
29 var File = Irccd.File; | |
30 var Plugin = Irccd.Plugin; | |
31 var Server = Irccd.Server; | |
32 var Unicode = Irccd.Unicode | |
33 var Util = Irccd.Util; | |
34 | |
141
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
35 // Default options. |
0 | 36 Plugin.config["collaborative"] = "true"; |
37 | |
141
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
38 // Formats. |
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
39 Plugin.format = { |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
40 "asked": "#{nickname}, '#{letter}' was already asked.", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
41 "dead": "#{nickname}, fail the word was: #{word}.", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
42 "found": "#{nickname}, nice! the word is now #{word}", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
43 "running": "#{nickname}, the game is already running.", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
44 "start": "#{nickname}, the game is started, the word to find is: #{word}", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
45 "win": "#{nickname}, congratulations, the word is #{word}.", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
46 "wrong-word": "#{nickname}, this is not the word.", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
47 "wrong-player": "#{nickname}, please wait until someone else proposes.", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
48 "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
|
49 }; |
2ce88e3a4759
Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
50 |
0 | 51 function Hangman(server, channel) |
52 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
53 this.server = server; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
54 this.channel = channel; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
55 this.tries = 10; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
56 this.select(); |
0 | 57 } |
58 | |
59 /** | |
60 * Map of games. | |
61 */ | |
62 Hangman.map = {}; | |
63 | |
64 /** | |
65 * List of words | |
66 */ | |
67 Hangman.words = []; | |
68 | |
69 /** | |
70 * Search for an existing game. | |
71 * | |
72 * @param server the server object | |
73 * @param channel the channel name | |
74 * @return the hangman instance or undefined if no one exists | |
75 */ | |
76 Hangman.find = function (server, channel) | |
77 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
78 return Hangman.map[server.toString() + '@' + channel]; |
0 | 79 } |
80 | |
81 /** | |
82 * Create a new game, store it in the map and return it. | |
83 * | |
84 * @param server the server object | |
85 * @param channel the channel name | |
86 * @return the hangman object | |
87 */ | |
88 Hangman.create = function (server, channel) | |
89 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
90 return Hangman.map[server.toString() + "@" + channel] = new Hangman(server, channel); |
0 | 91 } |
92 | |
93 /** | |
94 * Remove the specified game from the map. | |
95 * | |
96 * @param game the game to remove | |
97 */ | |
98 Hangman.remove = function (game) | |
99 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
100 delete Hangman.map[game.server + "@" + game.channel]; |
0 | 101 } |
102 | |
103 /** | |
104 * Check if the text is a valid word. | |
105 * | |
106 * @param word the word to check | |
107 * @return true if a word | |
108 */ | |
109 Hangman.isWord = function (word) | |
110 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
111 if (word.length === 0) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
112 return false; |
0 | 113 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
114 for (var i = 0; i < word.length; ++i) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
115 if (!Unicode.isLetter(word.charCodeAt(i))) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
116 return false; |
0 | 117 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
118 return true; |
0 | 119 } |
120 | |
121 /** | |
122 * Load all words. | |
123 */ | |
124 Hangman.loadWords = function () | |
125 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
126 var path; |
0 | 127 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
128 // User specified file? |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
129 if (Plugin.config["file"]) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
130 path = Plugin.config["file"]; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
131 else |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
132 path = Plugin.configPath + "words.conf"; |
0 | 133 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
134 try { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
135 Logger.info("loading words..."); |
0 | 136 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
137 var file = new File(path, "r"); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
138 var line; |
0 | 139 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
140 while ((line = file.readline()) !== undefined) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
141 if (Hangman.isWord(line)) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
142 Hangman.words.push(line); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
143 } catch (e) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
144 throw new Error("could not open '" + path + "'"); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
145 } |
0 | 146 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
147 if (Hangman.words.length === 0) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
148 throw new Error("empty word database"); |
0 | 149 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
150 Logger.info("number of words in database: " + Hangman.words.length); |
0 | 151 } |
152 | |
153 /** | |
154 * Load all formats. | |
155 */ | |
156 Hangman.loadFormats = function () | |
157 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
158 // --- DEPRECATED ------------------------------------------- |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
159 // |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
160 // This code will be removed. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
161 // |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
162 // Since: 2.1.0 |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
163 // Until: 3.0.0 |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
164 // Reason: new [format] section replaces it. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
165 // |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
166 // ---------------------------------------------------------- |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
167 for (var key in Plugin.format) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
168 var optname = "format-" + key; |
0 | 169 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
170 if (typeof (Plugin.config[optname]) !== "string") |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
171 continue; |
0 | 172 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
173 if (Plugin.config[optname].length === 0) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
174 Logger.warning("skipping empty '" + optname + "' format"); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
175 else |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
176 Plugin.format[key] = Plugin.config[optname]; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
177 } |
0 | 178 } |
179 | |
180 /** | |
181 * Select the next word for the game. | |
182 */ | |
183 Hangman.prototype.select = function () | |
184 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
185 // Reload the words if empty. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
186 if (!this.words || this.words.length === 0) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
187 this.words = Hangman.words.slice(0); |
0 | 188 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
189 var i = Math.floor(Math.random() * this.words.length); |
0 | 190 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
191 this.word = this.words[i]; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
192 this.words.splice(i, 1); |
0 | 193 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
194 // Fill table. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
195 this.table = {}; |
0 | 196 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
197 for (var j = 0; j < this.word.length; ++j) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
198 this.table[this.word.charCodeAt(j)] = false; |
0 | 199 } |
200 | |
201 /** | |
202 * Format the word with underscore and letters. | |
203 * | |
204 * @return the secret | |
205 */ | |
206 Hangman.prototype.formatWord = function () | |
207 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
208 var str = ""; |
0 | 209 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
210 for (var i = 0; i < this.word.length; ++i) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
211 var ch = this.word.charCodeAt(i); |
0 | 212 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
213 if (!this.table[ch]) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
214 str += "_"; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
215 else |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
216 str += String.fromCharCode(ch); |
0 | 217 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
218 if (i + 1 < this.word.length) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
219 str += " "; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
220 } |
0 | 221 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
222 return str; |
0 | 223 } |
224 | |
225 /** | |
226 * Propose a word or a letter. | |
227 * | |
228 * @param ch the code point or the unique word | |
229 * @param nickname the user trying | |
230 * @return the status of the game | |
231 */ | |
232 Hangman.prototype.propose = function (ch, nickname) | |
233 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
234 var status = "found"; |
0 | 235 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
236 // Check for collaborative mode. |
272
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
237 if (Plugin.config["collaborative"] === "true" && !this.query) { |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
238 if (this.last !== undefined && this.last === nickname) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
239 return "wrong-player"; |
0 | 240 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
241 this.last = nickname; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
242 } |
0 | 243 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
244 if (typeof(ch) == "number") { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
245 if (this.table[ch] === undefined) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
246 this.tries -= 1; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
247 status = "wrong-letter"; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
248 } else { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
249 if (this.table[ch]) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
250 this.tries -= 1; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
251 status = "asked"; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
252 } else |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
253 this.table[ch] = true; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
254 } |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
255 } else { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
256 if (this.word != ch) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
257 this.tries -= 1; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
258 status = "wrong-word"; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
259 } else |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
260 status = "win"; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
261 } |
0 | 262 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
263 // Check if dead. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
264 if (this.tries <= 0) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
265 status = "dead"; |
0 | 266 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
267 // Check if win. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
268 var win = true; |
0 | 269 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
270 for (var i = 0; i < this.word.length; ++i) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
271 if (!this.table[this.word.charCodeAt(i)]) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
272 win = false; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
273 break; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
274 } |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
275 } |
0 | 276 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
277 if (win) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
278 status = "win"; |
0 | 279 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
280 return status; |
0 | 281 } |
282 | |
283 function onLoad() | |
284 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
285 Hangman.loadFormats(); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
286 Hangman.loadWords(); |
0 | 287 } |
288 | |
289 onReload = onLoad; | |
290 | |
291 function propose(server, channel, origin, game, proposition) | |
292 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
293 var kw = { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
294 channel: channel, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
295 command: server.info().commandChar + Plugin.info().name, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
296 nickname: Util.splituser(origin), |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
297 origin: origin, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
298 plugin: Plugin.info().name, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
299 server: server.toString() |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
300 }; |
0 | 301 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
302 var st = game.propose(proposition, kw.nickname); |
0 | 303 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
304 switch (st) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
305 case "found": |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
306 kw.word = game.formatWord(); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
307 server.message(channel, Util.format(Plugin.format["found"], kw)); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
308 break; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
309 case "wrong-letter": |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
310 case "wrong-player": |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
311 case "wrong-word": |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
312 kw.word = proposition; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
313 case "asked": |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
314 kw.letter = String.fromCharCode(proposition); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
315 server.message(channel, Util.format(Plugin.format[st], kw)); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
316 break; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
317 case "dead": |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
318 case "win": |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
319 kw.word = game.word; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
320 server.message(channel, Util.format(Plugin.format[st], kw)); |
0 | 321 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
322 // Remove the game. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
323 Hangman.remove(game); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
324 break; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
325 default: |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
326 break; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
327 } |
0 | 328 } |
329 | |
330 function onCommand(server, origin, channel, message) | |
331 { | |
436
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
332 channel = channel.toLowerCase(); |
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
333 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
334 var game = Hangman.find(server, channel); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
335 var kw = { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
336 channel: channel, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
337 command: server.info().commandChar + Plugin.info().name, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
338 nickname: Util.splituser(origin), |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
339 origin: origin, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
340 plugin: Plugin.info().name, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
341 server: server.toString() |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
342 }; |
0 | 343 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
344 if (game) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
345 var list = message.split(" \t"); |
0 | 346 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
347 if (list.length === 0 || String(list[0]).length === 0) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
348 server.message(channel, Util.format(Plugin.format["running"], kw)); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
349 else { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
350 var word = String(list[0]); |
0 | 351 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
352 if (Hangman.isWord(word)) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
353 propose(server, channel, origin, game, word); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
354 } |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
355 } else { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
356 game = Hangman.create(server, channel); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
357 kw.word = game.formatWord(); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
358 server.message(channel, Util.format(Plugin.format["start"], kw)); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
359 } |
272
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
360 |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
361 return game; |
0 | 362 } |
363 | |
364 function onMessage(server, origin, channel, message) | |
365 { | |
436
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
366 channel = channel.toLowerCase(); |
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
367 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
368 var game = Hangman.find(server, channel); |
0 | 369 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
370 if (!game) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
371 return; |
0 | 372 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
373 if (message.length === 1 && Unicode.isLetter(message.charCodeAt(0))) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
154
diff
changeset
|
374 propose(server, channel, origin, game, message.charCodeAt(0)); |
0 | 375 } |
272
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
376 |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
377 function onQueryCommand(server, origin, message) |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
378 { |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
379 onCommand(server, origin, Util.splituser(origin), message).query = true; |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
380 } |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
381 |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
382 function onQuery(server, origin, message) |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
383 { |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
384 onMessage(server, origin, Util.splituser(origin), message); |
8fb6bd57878c
Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents:
207
diff
changeset
|
385 } |