annotate plugins/hangman/hangman.js @ 0:1158cffe5a5e

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