├── .editorconfig
├── .eslintrc
├── .gitattributes
├── .gitignore
├── .travis.yml
├── Contributing.md
├── Readme.md
├── css
└── main.css
├── favicon.ico
├── fonts
├── rlragd94-webfont.eot
├── rlragd94-webfont.svg
├── rlragd94-webfont.ttf
├── rlragd94-webfont.woff
└── rlragd94-webfont.woff2
├── img
├── arrows-sprite.png
├── clouds.png
├── fence.gif
├── fireball-mask.png
├── fireball.gif
├── htmlacademy-logo.png
├── icon-cross.png
├── icon-star-inactive-form.png
├── icon-star-inactive.png
├── icon-star.png
├── screenshots
│ ├── 1.png
│ ├── 10.png
│ ├── 2.png
│ ├── 3.png
│ ├── 4.png
│ ├── 5.png
│ ├── 6.png
│ ├── 7.png
│ ├── 8.png
│ ├── 9.png
│ └── cm-sample.mp4
├── title-gallery.png
├── title-reviews.png
├── title-site.png
├── tree.gif
├── user-1.jpg
├── user-2.png
├── user-3.png
├── wizard-reversed.gif
├── wizard.gif
└── wizard.svg
├── index.html
├── js
└── game.js
├── package-lock.json
└── package.json
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Файл с настройками для редактора.
2 | #
3 | # Если вы разрабатываете в редакторе WebStorm, BBEdit, Coda или SourceLair
4 | # этот файл уже поддерживается и не нужно производить никаких дополнительных
5 | # действий.
6 | #
7 | # Если вы ведёте разработку в другом редакторе, зайдите
8 | # на http://editorconfig.org и в разделе «Download a Plugin»
9 | # скачайте дополнение для вашего редактора.
10 |
11 |
12 | root = true
13 |
14 | [*]
15 | charset = utf-8
16 | indent_style = space
17 | indent_size = 2
18 | end_of_line = lf
19 | trim_trailing_whitespace = true
20 | insert_final_newline = true
21 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | root: true
2 |
3 | env:
4 | browser: true
5 |
6 | extends:
7 | "htmlacademy/es5"
8 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text eol=lf
2 | *.jpg -text
3 | *.png -text
4 | *.gif -text
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .idea
3 | *.ai
4 | *.log
5 | *.pdf
6 | *.psd
7 | *.sublime*
8 | build/
9 | node_modules/
10 | npm-debug.log*
11 | Thumbs.db
12 | .vscode/
13 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 |
3 | node_js:
4 | - "8.9"
5 |
6 | notifications:
7 | email: false
8 |
--------------------------------------------------------------------------------
/Contributing.md:
--------------------------------------------------------------------------------
1 | # Руководство по внесению изменений
2 |
3 | Поддерживайте ваш репозиторий обновлённым. Когда наставник принимает ваш пулреквест, он попадает в репозиторий Академии, но не в ваш форк.
4 |
5 | #### 1. Не коммитьте ничего самостоятельно в `master` вашего репозитория
6 |
7 | Это помешает вам аккуратно обновлять ваш репозиторий, могут возникнуть конфликты.
8 |
9 | #### 2. Прежде чем приступать к новому заданию, обновите `master`
10 |
11 | Обновить свой репозиторий из репозитория Академии можно так:
12 |
13 | ```
14 | # В вашей локальной копии переключитесь в ветку master
15 | git checkout master
16 |
17 | # Заберите изменения из репозитория Академии¹
18 | git pull academy master
19 |
20 | # Отправьте изменения в ваш форк на Гитхабе
21 | git push
22 | ```
23 |
24 | ¹ В `academy` должна быть ссылка на репозиторий Академии. Если его там нет, добавьте:
25 |
26 | ```
27 | git remote add academy git@github.com:htmlacademy-javascript/1098489-code-and-magick-17.git
28 | ```
29 |
30 | Когда вы обновили `master`, создайте ветку для нового задания:
31 |
32 | ```
33 | git checkout -b module2-task1
34 | ```
35 |
36 | `module2-task1` — это название ветки. Под описанием каждого задания в интерфейсе интенсива для вас будет указано правильное название ветки.
37 |
38 | --
39 |
40 | #### Есть вопрос?
41 |
42 | Посмотрите [коллекцию часто задаваемых вопросов по Git](http://firstaidgit.ru).
43 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # Учебный проект «Код и Магия» [![Build status][travis-image]][travis-url]
2 |
3 | * Студент: [Айдар Садыков](https://up.htmlacademy.ru/javascript/17/user/1098489).
4 | * Наставник: `Неизвестно`.
5 |
6 | ---
7 |
8 | _Не удаляйте и не обращайте внимание на файлы:_
9 | _`.editorconfig`, `.eslintrc`, `.gitattributes`, `.gitignore`, `.travis.yml`, `package-lock.json`, `package.json`._
10 |
11 | ---
12 |
13 | ### Памятка
14 |
15 | #### 1. Зарегистрируйтесь на Гитхабе
16 |
17 | Если у вас ещё нет аккаунта на [github.com](https://github.com/join), скорее зарегистрируйтесь.
18 |
19 | #### 2. Создайте форк
20 |
21 | Откройте репозиторий и нажмите кнопку «Fork» в правом верхнем углу. Репозиторий из Академии будет скопирован в ваш аккаунт.
22 |
23 |
24 |
25 | Получится вот так:
26 |
27 |
28 |
29 | #### 3. Клонируйте репозиторий на свой компьютер
30 |
31 | Будьте внимательны: нужно клонировать свой репозиторий (форк), а не репозиторий Академии. Также обратите внимание, что клонировать репозиторий нужно через SSH, а не через HTTPS. Нажмите зелёную кнопку в правой части экрана, чтобы скопировать SSH-адрес вашего репозитория:
32 |
33 |
34 |
35 | Клонировать репозиторий можно так:
36 |
37 | ```
38 | git clone SSH-адрес_вашего_форка
39 | ```
40 |
41 | Команда клонирует репозиторий на ваш компьютер и подготовит всё необходимое для старта работы.
42 |
43 | #### 4. Начинайте обучение!
44 |
45 | ---
46 |
47 |
48 |
49 | Репозиторий создан для обучения на интенсивном онлайн‑курсе «[Профессиональный JavaScript](https://htmlacademy.ru/intensive/javascript)», уровень 1 от [HTML Academy](https://htmlacademy.ru).
50 |
51 | [travis-image]: https://travis-ci.com/htmlacademy-javascript/1098489-code-and-magick-17.svg?branch=master
52 | [travis-url]: https://travis-ci.com/htmlacademy-javascript/1098489-code-and-magick-17
53 |
--------------------------------------------------------------------------------
/css/main.css:
--------------------------------------------------------------------------------
1 | html,
2 | body
3 | {
4 | font: 20px 'PT Mono';
5 |
6 | min-width: 1024px;
7 | margin: 0;
8 | margin: 0 auto;
9 | padding: 0;
10 |
11 | color: #fff;
12 | background: #da641a;
13 | }
14 |
15 | h1,
16 | h2
17 | {
18 | text-align: center;
19 |
20 | text-shadow: 5px 5px 0 rgba(0, 0, 0, .72);
21 | }
22 |
23 | button
24 | {
25 | font: bold 20px 'PT Mono';
26 | line-height: 54px;
27 |
28 | margin-right: 20px;
29 | padding: 0 16px;
30 |
31 | border: 0;
32 | background: #fff;
33 | }
34 |
35 | *[tabindex]:focus,
36 | button:focus,
37 | input:focus
38 | {
39 | outline: none;
40 | box-shadow: 0 0 10px #fff000;
41 | }
42 |
43 | form
44 | {
45 | margin-bottom: 0;
46 | }
47 |
48 | .hidden
49 | {
50 | display: none;
51 | }
52 |
53 | .popup
54 | {
55 | position: absolute;
56 | z-index: 100;
57 |
58 | min-width: 200px;
59 |
60 | border-width: 2px;
61 | border-style: solid;
62 | border-color: black;
63 | background-color: #414342;
64 | }
65 |
66 | .section-title
67 | {
68 | position: relative;
69 |
70 | height: 52px;
71 |
72 | text-indent: -1000em;
73 | }
74 |
75 | .section-title img
76 | {
77 | position: absolute;
78 | top: 0;
79 | left: 50%;
80 |
81 | transform: translateX(-50%);
82 | }
83 |
84 | header
85 | {
86 | position: relative;
87 |
88 | padding-top: 80px;
89 |
90 | text-align: center;
91 |
92 | border-bottom: solid 8px #1cb34d;
93 | background: #2b5cfc;
94 | background: linear-gradient(180deg, #00f, #94c6fd);
95 | }
96 |
97 | .header-title
98 | {
99 | height: 101px;
100 | margin-bottom: 30px;
101 | }
102 |
103 | .header-clouds
104 | {
105 | position: absolute;
106 | z-index: 0;
107 | top: 0;
108 | right: 0;
109 | left: 0;
110 |
111 | height: 363px;
112 |
113 | background: url('../img/clouds.png') top center repeat-x;
114 | }
115 |
116 | .header-fence
117 | {
118 | position: absolute;
119 | bottom: 0;
120 | left: 50%;
121 |
122 | width: 91px;
123 | height: 48px;
124 | margin-left: -400px;
125 |
126 | background: url('../img/fence.gif') no-repeat;
127 | }
128 |
129 | .header-tree
130 | {
131 | position: absolute;
132 | bottom: 0;
133 | left: 50%;
134 |
135 | width: 120px;
136 | height: 137px;
137 | margin-left: 300px;
138 |
139 | background: url('../img/tree.gif') no-repeat;
140 | }
141 |
142 | .header-soon
143 | {
144 | font-size: 26px;
145 |
146 | position: relative;
147 | z-index: 1;
148 |
149 | color: #fff;
150 | color: rgba(255, 255, 255, .6);
151 | }
152 |
153 | .header-title
154 | {
155 | font-size: 69px;
156 |
157 | position: relative;
158 | z-index: 1;
159 |
160 | margin: 0 0 28px;
161 | padding: 0;
162 | }
163 |
164 | .header-description
165 | {
166 | font-size: 20px;
167 | line-height: 1.5;
168 |
169 | position: relative;
170 | z-index: 1;
171 |
172 | width: 620px;
173 | margin: 0 auto;
174 | }
175 |
176 | .demo
177 | {
178 | width: 700px;
179 | height: 300px;
180 | margin: 0 auto;
181 | }
182 |
183 | main
184 | {
185 | padding-top: 80px;
186 |
187 | background: linear-gradient(180deg, #ae340a, #fcb945);
188 | }
189 |
190 | .main-section
191 | {
192 | box-sizing: border-box;
193 | margin: 0 auto 60px;
194 | padding: 10px;
195 | }
196 |
197 | .photogallery
198 | {
199 | position: relative;
200 |
201 | width: 1000px;
202 | padding: 10px 0;
203 |
204 | text-align: center;
205 | }
206 |
207 | .photogallery-title
208 | {
209 | margin-bottom: 35px;
210 | }
211 |
212 | .photogallery-image
213 | {
214 | display: inline-block;
215 | overflow: hidden;
216 |
217 | width: 292px;
218 | height: 271px;
219 | margin: 21px 8px;
220 |
221 | border: 0;
222 | box-shadow: 7px 10px 0 rgba(0, 0, 0, .30), 0 0 20px rgba(255, 255, 190, .3);
223 | }
224 |
225 | .reviews
226 | {
227 | box-sizing: border-box;
228 | width: 670px;
229 | }
230 |
231 | .reviews-title
232 | {
233 | margin-bottom: 30px;
234 | }
235 |
236 | .reviews-filter
237 | {
238 | margin-bottom: 60px;
239 |
240 | white-space: nowrap;
241 | }
242 |
243 | .reviews-filter-item
244 | {
245 | font-size: 22px;
246 | font-weight: bold;
247 |
248 | display: inline-block;
249 |
250 | margin-right: 50px;
251 |
252 | cursor: pointer;
253 | vertical-align: middle;
254 |
255 | color: #fff;
256 | border-bottom: dotted 2px #fff;
257 | }
258 |
259 | .reviews-filter input
260 | {
261 | position: absolute;
262 | left: -1200em;
263 | }
264 |
265 | input[type=radio]:checked + .reviews-filter-item
266 | {
267 | line-height: 36px;
268 |
269 | margin-right: 35px;
270 | margin-left: -15px;
271 | padding: 0 15px;
272 |
273 | cursor: auto;
274 |
275 | color: #000;
276 | border-bottom: solid 2px;
277 | background: #fff;
278 | box-shadow: 3px 3px 0 #000;
279 | }
280 |
281 | .review
282 | {
283 | font-size: 17px;
284 | line-height: 1.4;
285 |
286 | position: relative;
287 |
288 | margin-bottom: 75px;
289 | padding-left: 155px;
290 | }
291 |
292 | .reviews-list-loading,
293 | .reviews-load-failure
294 | {
295 | padding-bottom: 40px;
296 |
297 | text-align: center;
298 | }
299 |
300 | .reviews-list-loading:after
301 | {
302 | content: 'Загрузка...';
303 | }
304 |
305 | .reviews-load-failure:after
306 | {
307 | display: inline-block;
308 |
309 | width: 40px;
310 | height: 40px;
311 |
312 | content: '';
313 |
314 | background: url('../img/icon-cross.png') no-repeat center;
315 | }
316 |
317 | .review-load-failure .review-author
318 | {
319 | visibility: hidden;
320 | }
321 |
322 | .review-load-failure .review-author:after
323 | {
324 | position: absolute;
325 | top: 0;
326 | right: 0;
327 | bottom: 0;
328 | left: 0;
329 |
330 | display: block;
331 | visibility: visible;
332 |
333 | content: '';
334 |
335 | opacity: .4;
336 | border: solid 1px rgba(255, 255, 255, .5);
337 | border-radius: 50%;
338 | background: url('../img/icon-cross.png') center no-repeat;
339 | }
340 |
341 | .review-rating
342 | {
343 | display: block;
344 |
345 | width: 30px;
346 | height: 30px;
347 |
348 | background: url('../img/icon-star.png') top left repeat-x;
349 | }
350 |
351 |
352 | .review-rating-one
353 | {
354 | width: 40px;
355 | }
356 | .review-rating-two
357 | {
358 | width: 80px;
359 | }
360 | .review-rating-three
361 | {
362 | width: 120px;
363 | }
364 | .review-rating-four
365 | {
366 | width: 160px;
367 | }
368 | .review-rating-five
369 | {
370 | width: 200px;
371 | }
372 |
373 | .review-author
374 | {
375 | position: absolute;
376 | top: 5px;
377 | left: 0;
378 |
379 | width: 124px;
380 | height: 124px;
381 |
382 | border-radius: 50%;
383 | }
384 |
385 | .review-quiz
386 | {
387 | font-size: 15px;
388 |
389 | color: #fff;
390 | color: rgba(255, 255, 255, .5);
391 | }
392 |
393 | .review-quiz-answer
394 | {
395 | display: inline-block;
396 |
397 | margin: 0 5px;
398 |
399 | cursor: pointer;
400 | vertical-align: middle;
401 | text-decoration: underline;
402 | }
403 |
404 | .review-quiz-answer-active
405 | {
406 | cursor: default;
407 | text-decoration: none;
408 |
409 | color: #fff;
410 | }
411 |
412 | .reviews-controls
413 | {
414 | text-align: center;
415 | }
416 |
417 | .reviews-controls-item
418 | {
419 | display: inline-block;
420 |
421 | cursor: pointer;
422 | vertical-align: middle;
423 | }
424 |
425 | .reviews-controls-more
426 | {
427 | font-size: 20px;
428 | font-weight: bold;
429 | line-height: 55px;
430 |
431 | margin-right: 26px;
432 | padding: 0 30px;
433 |
434 | color: #000;
435 | background: #fff;
436 | box-shadow: 5px 5px 0 rgba(0, 0, 0, 1);
437 | }
438 |
439 | .reviews-controls-new
440 | {
441 | font-size: 18px;
442 | line-height: 36px;
443 |
444 | padding: 0 18px;
445 |
446 | color: #000;
447 | border: solid 1px;
448 | }
449 |
450 | footer
451 | {
452 | font-size: 16px;
453 | line-height: 1.6;
454 |
455 | text-align: center;
456 |
457 | color: #000;
458 | }
459 |
460 | footer a
461 | {
462 | color: #000;
463 | }
464 |
465 | footer p
466 | {
467 | margin-bottom: 0;
468 | padding-bottom: 20px;
469 | }
470 |
471 | .overlay-container,
472 | .overlay-gallery
473 | {
474 | position: fixed;
475 | z-index: 1;
476 | top: 0;
477 | right: 0;
478 | bottom: 0;
479 | left: 0;
480 |
481 | overflow: auto;
482 |
483 | background: rgba(0, 0, 0, .8);
484 | }
485 |
486 | .review-form
487 | {
488 | position: relative;
489 |
490 | width: 510px;
491 | margin: 100px auto;
492 | padding: 0 10px;
493 |
494 | text-align: left;
495 | }
496 |
497 | .review-form-title
498 | {
499 | font-family: 'PT Mono';
500 |
501 | text-align: left;
502 | }
503 |
504 | .overlay-gallery-close,
505 | .review-form-close
506 | {
507 | font-size: 45px;
508 |
509 | position: absolute;
510 | top: -5px;
511 | right: 0;
512 |
513 | padding: 0 10px;
514 |
515 | cursor: pointer;
516 | text-align: center;
517 | }
518 |
519 | .review-form-group
520 | {
521 | margin: 0;
522 | margin-bottom: 15px;
523 | padding: 0;
524 |
525 | border: 0;
526 | }
527 |
528 | .review-form-group-mark
529 | {
530 | min-height: 55px;
531 | margin-left: -15px;
532 | }
533 |
534 | .review-form-group-mark .review-form-label
535 | {
536 | margin-left: 15px;
537 | }
538 |
539 | .review-form-group-mark input[type=radio]
540 | {
541 | position: absolute;
542 |
543 | visibility: hidden;
544 | }
545 |
546 | .review-mark-label
547 | {
548 | position: absolute;
549 |
550 | width: 40px;
551 | height: 30px;
552 | margin: 0 10px;
553 |
554 | cursor: pointer;
555 | text-indent: -100em;
556 |
557 | color: #fff;
558 | background: none;
559 | }
560 |
561 | .review-mark-label-1
562 | {
563 | width: 40px;
564 | }
565 | .review-mark-label-2
566 | {
567 | width: 80px;
568 | }
569 | .review-mark-label-3
570 | {
571 | width: 120px;
572 | }
573 | .review-mark-label-4
574 | {
575 | width: 160px;
576 | }
577 | .review-mark-label-5
578 | {
579 | width: 200px;
580 |
581 | background: url('../img/icon-star-inactive-form.png') repeat-x;
582 | }
583 |
584 | input[type=radio]:checked + .review-mark-label
585 | {
586 | background: url('../img/icon-star.png') repeat-x;
587 | }
588 |
589 | .review-form-label
590 | {
591 | font-size: 20px;
592 | line-height: 1.6;
593 | }
594 |
595 | .review-form-field
596 | {
597 | font: 20px/1.5 'PT Mono';
598 |
599 | padding: 5px;
600 |
601 | color: #000;
602 | border: 0;
603 | background: #fff;
604 | }
605 |
606 | .review-form-field-name
607 | {
608 | width: 15em;
609 | }
610 |
611 | .review-form-controls
612 | {
613 | white-space: nowrap;
614 | }
615 |
616 | .review-form-control
617 | {
618 | display: inline-block;
619 |
620 | vertical-align: top;
621 | }
622 |
623 | .review-fields
624 | {
625 | font-size: 16px;
626 |
627 | white-space: normal;
628 |
629 | color: #fff;
630 | color: rgba(255, 255, 255, .6);
631 | }
632 |
633 | .review-fields-label
634 | {
635 | cursor: pointer;
636 | text-decoration: underline;
637 | }
638 |
639 | .footer-link
640 | {
641 | position: relative;
642 |
643 | display: block;
644 |
645 | width: 250px;
646 | margin: 0 auto;
647 | padding-top: 50px;
648 | }
649 |
650 | .footer-link:hover
651 | {
652 | opacity: .6;
653 | }
654 |
655 | .footer-link img
656 | {
657 | position: absolute;
658 | top: 0;
659 | left: 50%;
660 |
661 | transform: translateX(-50%);
662 | }
663 |
664 | .setup
665 | {
666 | position: absolute;
667 | z-index: 3;
668 | top: 80px;
669 | left: 50%;
670 |
671 | box-sizing: border-box;
672 | width: 800px;
673 |
674 | transform: translateX(-50%);
675 |
676 | color: #000;
677 | background: #89a1fd;
678 | box-shadow: 10px 10px 0 rgba(0, 0, 0, .25);
679 | }
680 |
681 | .setup-open-icon
682 | {
683 | position: absolute;
684 | z-index: 2;
685 | top: 100px;
686 | right: 100px;
687 |
688 | cursor: pointer;
689 | }
690 |
691 | .setup-open-icon:hover
692 | {
693 | box-shadow: 5px 5px 0 rgba(0, 0, 0, .5);
694 | }
695 |
696 | .setup-title
697 | {
698 | padding: 20px;
699 | }
700 |
701 | .setup-user
702 | {
703 | display: inline-block;
704 | }
705 |
706 | .setup-open-icon,
707 | .setup-user-pic
708 | {
709 | display: inline-block;
710 | overflow: hidden;
711 |
712 | width: 40px;
713 | height: 40px;
714 | margin-top: -10px;
715 | margin-right: 5px;
716 |
717 | vertical-align: middle;
718 |
719 | border-radius: 40px;
720 | }
721 |
722 | .setup-user-name
723 | {
724 | font-family: 'PT Mono', serif;
725 | font-size: 30px;
726 | font-weight: 900;
727 |
728 | width: 500px;
729 |
730 | color: #fff;
731 | border: 0;
732 | background: transparent;
733 | }
734 |
735 | .setup-user-name:valid
736 | {
737 | border: 0;
738 | }
739 |
740 | .setup-user-name:invalid
741 | {
742 | border: 2px solid red;
743 | }
744 |
745 | .setup-user-name:focus
746 | {
747 | border-bottom: solid 1px #000;
748 | outline: none;
749 | }
750 |
751 | .setup-close
752 | {
753 | font-size: 70px;
754 |
755 | top: 20px;
756 | right: 20px;
757 |
758 | float: right;
759 |
760 | cursor: pointer;
761 | transform: translateY(-.3em);
762 |
763 | color: #000;
764 | }
765 |
766 | .setup-artifacts-shop
767 | {
768 | display: flex;
769 |
770 | width: 716px;
771 | height: 65px;
772 | padding-top: 20px;
773 | padding-bottom: 20px;
774 |
775 | flex-wrap: wrap;
776 | justify-content: flex-end;
777 | }
778 |
779 | .setup-player
780 | {
781 | position: relative;
782 |
783 | height: 300px;
784 | min-height: 300px;
785 | padding-top: 20px;
786 | }
787 |
788 | .setup-wizard
789 | {
790 | position: absolute;
791 | bottom: 0;
792 | left: 50px;
793 |
794 | width: 250px;
795 | height: 250px;
796 | }
797 |
798 | .setup-fireball-wrap
799 | {
800 | position: absolute;
801 | top: 0;
802 | left: 300px;
803 |
804 | width: 75px;
805 | height: 75px;
806 |
807 | background: #ee4830;
808 | }
809 |
810 | .setup-fireball
811 | {
812 | width: 75px;
813 | height: 75px;
814 |
815 | background: url('../img/fireball-mask.png');
816 | background-size: 75px 75px;
817 | }
818 |
819 | .setup-artifacts
820 | {
821 | position: absolute;
822 | right: 46px;
823 | bottom: 0;
824 |
825 | display: flex;
826 |
827 | width: 260px;
828 | height: 260px;
829 |
830 | flex-wrap: wrap;
831 | justify-content: space-between;
832 | }
833 |
834 | .setup-artifacts-cell
835 | {
836 | box-sizing: border-box;
837 | width: 65px;
838 | height: 65px;
839 |
840 | border: solid 1px rgba(255, 255, 255, .5);
841 | background: rgba(0, 0, 0, .1);
842 | }
843 |
844 | .setup-artifacts-cell:last-child
845 | {
846 | border-right-width: 1px;
847 | }
848 |
849 | .setup-footer
850 | {
851 | padding-bottom: 20px;
852 |
853 | border-top: 10px solid #1cb34d;
854 | background-color: #da641a;
855 | }
856 |
857 | .setup-similar-title
858 | {
859 | margin-left: 20px;
860 |
861 | color: #fff;
862 | }
863 |
864 | .setup-similar-list
865 | {
866 | display: flex;
867 | flex-direction: row;
868 |
869 | margin-right: 20px;
870 | margin-left: 20px;
871 |
872 | justify-content: space-between;
873 | flex-wrap: nowrap;
874 | }
875 |
876 | .setup-similar-item
877 | {
878 | overflow: hidden;
879 |
880 | max-width: 150px;
881 |
882 | text-overflow: ellipsis;
883 | }
884 |
885 | .setup-similar-label
886 | {
887 | margin: 5px;
888 |
889 | color: #fff;
890 | }
891 |
892 | .setup-similar-content
893 | {
894 | position: relative;
895 |
896 | width: 150px;
897 | height: 150px;
898 |
899 | background-color: #414342;
900 | box-shadow: 5px 5px 0 rgba(0, 0, 0, .25);
901 | }
902 |
903 | .setup-similar-wizard
904 | {
905 | position: absolute;
906 | bottom: 0;
907 | left: 50%;
908 |
909 | width: 100px;
910 | margin: 0 auto;
911 |
912 | transform: translateX(-50%);
913 | }
914 |
915 | .setup-submit
916 | {
917 | display: block;
918 |
919 | margin: 20px auto 0;
920 |
921 | color: #fff;
922 | background: #1cb34d;
923 | }
924 |
925 | .setup-submit:disabled
926 | {
927 | opacity: .3;
928 | }
929 |
930 | .overlay-gallery
931 | {
932 | text-align: center;
933 | }
934 |
935 | .overlay-gallery-controls
936 | {
937 | margin: 100px 0;
938 | }
939 |
940 | .overlay-gallery-control
941 | {
942 | display: inline-block;
943 |
944 | width: 30px;
945 | height: 46px;
946 |
947 | cursor: pointer;
948 | vertical-align: middle;
949 |
950 | background: url('../img/arrows-sprite.png') no-repeat;
951 | }
952 |
953 | .overlay-gallery-control-right
954 | {
955 | background-position: -30px 0;
956 | }
957 |
958 | .overlay-gallery-preview
959 | {
960 | font-size: 0;
961 |
962 | position: relative;
963 |
964 | display: inline-block;
965 |
966 | min-width: 300px;
967 | min-height: 300px;
968 |
969 | vertical-align: middle;
970 |
971 | border: dotted 1px rgba(255, 255, 255, .2);
972 | }
973 |
974 | .overlay-gallery-preview-number
975 | {
976 | font-size: 14px;
977 | font-weight: bold;
978 |
979 | position: absolute;
980 | top: -1.5em;
981 | left: 0;
982 |
983 | color: #fff;
984 | }
985 |
986 | .upload
987 | {
988 | position: relative;
989 |
990 | display: inline-block;
991 |
992 | box-sizing: border-box;
993 | width: 40px;
994 | min-width: 40px;
995 | max-width: 40px;
996 | height: 40px;
997 | }
998 |
999 | .upload .setup-user-pic
1000 | {
1001 | position: absolute;
1002 | top: 0;
1003 | left: 0;
1004 |
1005 | display: block;
1006 |
1007 | margin: 0;
1008 | }
1009 |
1010 | .upload input
1011 | {
1012 | position: absolute;
1013 | z-index: 0;
1014 | top: 0;
1015 | left: 0;
1016 |
1017 | width: 100%;
1018 | height: 100%;
1019 |
1020 | opacity: 0;
1021 | }
1022 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/favicon.ico
--------------------------------------------------------------------------------
/fonts/rlragd94-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/fonts/rlragd94-webfont.eot
--------------------------------------------------------------------------------
/fonts/rlragd94-webfont.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
731 |
732 |
733 |
734 |
735 |
736 |
737 |
738 |
739 |
740 |
741 |
742 |
743 |
744 |
745 |
746 |
747 |
748 |
749 |
750 |
751 |
752 |
753 |
754 |
755 |
756 |
757 |
758 |
759 |
760 |
761 |
762 |
763 |
764 |
765 |
766 |
767 |
768 |
769 |
770 |
771 |
772 |
773 |
774 |
775 |
776 |
777 |
778 |
779 |
780 |
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 |
797 |
798 |
799 |
800 |
801 |
802 |
803 |
804 |
805 |
806 |
807 |
808 |
809 |
810 |
811 |
812 |
813 |
814 |
815 |
816 |
817 |
818 |
819 |
820 |
821 |
822 |
823 |
824 |
825 |
826 |
827 |
828 |
829 |
830 |
831 |
832 |
833 |
834 |
835 |
836 |
837 |
838 |
839 |
840 |
841 |
842 |
843 |
844 |
845 |
846 |
847 |
848 |
849 |
850 |
851 |
852 |
853 |
854 |
855 |
856 |
857 |
858 |
859 |
860 |
861 |
862 |
863 |
864 |
865 |
866 |
867 |
868 |
869 |
870 |
871 |
872 |
873 |
874 |
875 |
876 |
877 |
878 |
879 |
880 |
881 |
882 |
883 |
884 |
885 |
886 |
887 |
888 |
889 |
890 |
891 |
892 |
893 |
894 |
895 |
896 |
897 |
898 |
899 |
900 |
901 |
902 |
903 |
904 |
905 |
906 |
907 |
908 |
909 |
910 |
911 |
912 |
913 |
914 |
915 |
916 |
917 |
918 |
919 |
920 |
921 |
922 |
923 |
924 |
925 |
926 |
927 |
928 |
929 |
930 |
931 |
932 |
933 |
934 |
935 |
936 |
937 |
938 |
939 |
940 |
941 |
942 |
943 |
944 |
945 |
946 |
947 |
948 |
949 |
950 |
951 |
952 |
953 |
954 |
955 |
956 |
957 |
958 |
959 |
960 |
961 |
962 |
963 |
964 |
965 |
966 |
967 |
968 |
969 |
970 |
971 |
972 |
973 |
974 |
975 |
976 |
977 |
978 |
979 |
980 |
981 |
982 |
983 |
984 |
985 |
986 |
987 |
988 |
989 |
990 |
991 |
992 |
993 |
994 |
995 |
996 |
997 |
998 |
999 |
1000 |
1001 |
1002 |
1003 |
1004 |
1005 |
1006 |
1007 |
1008 |
1009 |
1010 |
1011 |
1012 |
1013 |
1014 |
1015 |
1016 |
1017 |
1018 |
1019 |
1020 |
1021 |
1022 |
1023 |
1024 |
1025 |
1026 |
1027 |
1028 |
1029 |
1030 |
1031 |
1032 |
1033 |
1034 |
1035 |
1036 |
1037 |
1038 |
1039 |
1040 |
1041 |
1042 |
1043 |
1044 |
1045 |
1046 |
1047 |
1048 |
1049 |
1050 |
1051 |
1052 |
1053 |
1054 |
1055 |
1056 |
1057 |
1058 |
1059 |
1060 |
1061 |
1062 |
1063 |
1064 |
1065 |
1066 |
1067 |
1068 |
1069 |
1070 |
1071 |
1072 |
1073 |
1074 |
1075 |
1076 |
1077 |
1078 |
1079 |
1080 |
1081 |
1082 |
1083 |
1084 |
1085 |
1086 |
1087 |
1088 |
1089 |
1090 |
1091 |
1092 |
1093 |
1094 |
1095 |
1096 |
1097 |
1098 |
1099 |
1100 |
1101 |
1102 |
1103 |
1104 |
1105 |
1106 |
1107 |
1108 |
1109 |
1110 |
1111 |
1112 |
1113 |
1114 |
1115 |
1116 |
1117 |
--------------------------------------------------------------------------------
/fonts/rlragd94-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/fonts/rlragd94-webfont.ttf
--------------------------------------------------------------------------------
/fonts/rlragd94-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/fonts/rlragd94-webfont.woff
--------------------------------------------------------------------------------
/fonts/rlragd94-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/fonts/rlragd94-webfont.woff2
--------------------------------------------------------------------------------
/img/arrows-sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/arrows-sprite.png
--------------------------------------------------------------------------------
/img/clouds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/clouds.png
--------------------------------------------------------------------------------
/img/fence.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/fence.gif
--------------------------------------------------------------------------------
/img/fireball-mask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/fireball-mask.png
--------------------------------------------------------------------------------
/img/fireball.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/fireball.gif
--------------------------------------------------------------------------------
/img/htmlacademy-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/htmlacademy-logo.png
--------------------------------------------------------------------------------
/img/icon-cross.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/icon-cross.png
--------------------------------------------------------------------------------
/img/icon-star-inactive-form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/icon-star-inactive-form.png
--------------------------------------------------------------------------------
/img/icon-star-inactive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/icon-star-inactive.png
--------------------------------------------------------------------------------
/img/icon-star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/icon-star.png
--------------------------------------------------------------------------------
/img/screenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/1.png
--------------------------------------------------------------------------------
/img/screenshots/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/10.png
--------------------------------------------------------------------------------
/img/screenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/2.png
--------------------------------------------------------------------------------
/img/screenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/3.png
--------------------------------------------------------------------------------
/img/screenshots/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/4.png
--------------------------------------------------------------------------------
/img/screenshots/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/5.png
--------------------------------------------------------------------------------
/img/screenshots/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/6.png
--------------------------------------------------------------------------------
/img/screenshots/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/7.png
--------------------------------------------------------------------------------
/img/screenshots/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/8.png
--------------------------------------------------------------------------------
/img/screenshots/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/9.png
--------------------------------------------------------------------------------
/img/screenshots/cm-sample.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/screenshots/cm-sample.mp4
--------------------------------------------------------------------------------
/img/title-gallery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/title-gallery.png
--------------------------------------------------------------------------------
/img/title-reviews.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/title-reviews.png
--------------------------------------------------------------------------------
/img/title-site.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/title-site.png
--------------------------------------------------------------------------------
/img/tree.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/tree.gif
--------------------------------------------------------------------------------
/img/user-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/user-1.jpg
--------------------------------------------------------------------------------
/img/user-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/user-2.png
--------------------------------------------------------------------------------
/img/user-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/user-3.png
--------------------------------------------------------------------------------
/img/wizard-reversed.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/wizard-reversed.gif
--------------------------------------------------------------------------------
/img/wizard.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gophergit/1098489-code-and-magick-17/011ddc4fea147808272718c76ee4f5629dfe5869/img/wizard.gif
--------------------------------------------------------------------------------
/img/wizard.svg:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
7 |
9 |
10 |
13 |
15 |
17 |
19 |
23 |
26 |
27 |
28 |
29 |
30 |
32 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Код и Магия
9 |
10 |
11 |
12 |
13 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
23 |
25 |
26 |
27 |
30 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
41 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
57 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
162 |
163 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
Петр Петров
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
--------------------------------------------------------------------------------
/js/game.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | window.GameConstants = {
4 | Fireball: {
5 | size: window.fireballSize || 24,
6 | speed: window.getFireballSpeed || function (movingLeft) {
7 | return movingLeft ? 2 : 5;
8 | }
9 | },
10 | Wizard: {
11 | speed: window.wizardSpeed || 2,
12 | width: window.wizardWidth || 61,
13 | getHeight: window.getWizardHeight || function (width) {
14 | return 1.377 * width;
15 | },
16 | getX: window.getWizardX || function (width) {
17 | return width / 3;
18 | },
19 | getY: window.getWizardY || function (height) {
20 | return height - 100;
21 | }
22 | }
23 | };
24 |
25 | window.Game = (function () {
26 | /**
27 | * @const
28 | * @type {number}
29 | */
30 | var HEIGHT = 300;
31 |
32 | /**
33 | * @const
34 | * @type {number}
35 | */
36 | var WIDTH = 700;
37 |
38 | /**
39 | * ID уровней.
40 | * @enum {number}
41 | */
42 | var Level = {
43 | INTRO: 0,
44 | MOVE_LEFT: 1,
45 | MOVE_RIGHT: 2,
46 | LEVITATE: 3,
47 | HIT_THE_MARK: 4
48 | };
49 |
50 | var NAMES = ['Кекс', 'Катя', 'Игорь'];
51 |
52 | /**
53 | * Порядок прохождения уровней.
54 | * @type {Array.}
55 | */
56 | var LevelSequence = [
57 | Level.INTRO
58 | ];
59 |
60 | /**
61 | * Начальный уровень.
62 | * @type {Level}
63 | */
64 | var INITIAL_LEVEL = LevelSequence[0];
65 |
66 | /**
67 | * Допустимые виды объектов на карте.
68 | * @enum {number}
69 | */
70 | var ObjectType = {
71 | ME: 0,
72 | FIREBALL: 1
73 | };
74 |
75 | /**
76 | * Допустимые состояния объектов.
77 | * @enum {number}
78 | */
79 | var ObjectState = {
80 | OK: 0,
81 | DISPOSED: 1
82 | };
83 |
84 | /**
85 | * Коды направлений.
86 | * @enum {number}
87 | */
88 | var Direction = {
89 | NULL: 0,
90 | LEFT: 1,
91 | RIGHT: 2,
92 | UP: 4,
93 | DOWN: 8
94 | };
95 |
96 | /**
97 | * Карта спрайтов игры.
98 | * @type {Object.}
99 | */
100 | var SpriteMap = {};
101 | var REVERSED = '-reversed';
102 |
103 | SpriteMap[ObjectType.ME] = {
104 | width: 61,
105 | height: 84,
106 | url: 'img/wizard.gif'
107 | };
108 |
109 | // TODO: Find a clever way
110 | SpriteMap[ObjectType.ME + REVERSED] = {
111 | width: 61,
112 | height: 84,
113 | url: 'img/wizard-reversed.gif'
114 | };
115 |
116 | SpriteMap[ObjectType.FIREBALL] = {
117 | width: 24,
118 | height: 24,
119 | url: 'img/fireball.gif'
120 | };
121 |
122 | /**
123 | * Правила перерисовки объектов в зависимости от состояния игры.
124 | * @type {Object.}
125 | */
126 | var ObjectsBehaviour = {};
127 |
128 | /**
129 | * Обновление движения мага. Движение мага зависит от нажатых в данный момент
130 | * стрелок. Маг может двигаться одновременно по горизонтали и по вертикали.
131 | * На движение мага влияет его пересечение с препятствиями.
132 | * @param {Object} object
133 | * @param {Object} state
134 | * @param {number} timeframe
135 | */
136 | ObjectsBehaviour[ObjectType.ME] = function (object, state, timeframe) {
137 | // Пока зажата стрелка вверх, маг сначала поднимается, а потом левитирует
138 | // в воздухе на определенной высоте.
139 | // NB! Сложность заключается в том, что поведение описано в координатах
140 | // канваса, а не координатах, относительно нижней границы игры.
141 | if (state.keysPressed.UP && object.y > 0) {
142 | object.direction = object.direction & ~Direction.DOWN;
143 | object.direction = object.direction | Direction.UP;
144 | object.y -= object.speed * timeframe * 2;
145 | }
146 |
147 | // Если стрелка вверх не зажата, а маг находится в воздухе, он плавно
148 | // опускается на землю.
149 | if (!state.keysPressed.UP) {
150 | if (object.y < HEIGHT - object.height) {
151 | object.direction = object.direction & ~Direction.UP;
152 | object.direction = object.direction | Direction.DOWN;
153 | object.y += object.speed * timeframe / 3;
154 | }
155 | }
156 |
157 | // Если зажата стрелка влево, маг перемещается влево.
158 | if (state.keysPressed.LEFT) {
159 | object.direction = object.direction & ~Direction.RIGHT;
160 | object.direction = object.direction | Direction.LEFT;
161 | object.x -= object.speed * timeframe;
162 | }
163 |
164 | // Если зажата стрелка вправо, маг перемещается вправо.
165 | if (state.keysPressed.RIGHT) {
166 | object.direction = object.direction & ~Direction.LEFT;
167 | object.direction = object.direction | Direction.RIGHT;
168 | object.x += object.speed * timeframe;
169 | }
170 |
171 | // Ограничения по перемещению по полю. Маг не может выйти за пределы поля.
172 | if (object.y < 0) {
173 | object.y = 0;
174 | }
175 |
176 | if (object.y > HEIGHT - object.height) {
177 | object.y = HEIGHT - object.height;
178 | }
179 |
180 | if (object.x < 0) {
181 | object.x = 0;
182 | }
183 |
184 | if (object.x > WIDTH - object.width) {
185 | object.x = WIDTH - object.width;
186 | }
187 | };
188 |
189 | /**
190 | * Обновление движения файрбола. Файрбол выпускается в определенном направлении
191 | * и после этого неуправляемо движется по прямой в заданном направлении. Если
192 | * он пролетает весь экран насквозь, он исчезает.
193 | * @param {Object} object
194 | * @param {Object} _state
195 | * @param {number} timeframe
196 | */
197 | ObjectsBehaviour[ObjectType.FIREBALL] = function (object, _state, timeframe) {
198 | if (object.direction & Direction.LEFT) {
199 | object.x -= object.speed * timeframe;
200 | }
201 |
202 | if (object.direction & Direction.RIGHT) {
203 | object.x += object.speed * timeframe;
204 | }
205 |
206 | if (object.x < 0 || object.x > WIDTH) {
207 | object.state = ObjectState.DISPOSED;
208 | }
209 | };
210 |
211 | /**
212 | * ID возможных ответов функций, проверяющих успех прохождения уровня.
213 | * CONTINUE говорит о том, что раунд не закончен и игру нужно продолжать,
214 | * WIN о том, что раунд выигран, FAIL — о поражении. PAUSE о том, что игру
215 | * нужно прервать.
216 | * @enum {number}
217 | */
218 | var Verdict = {
219 | CONTINUE: 0,
220 | WIN: 1,
221 | FAIL: 2,
222 | PAUSE: 3,
223 | INTRO: 4
224 | };
225 |
226 | /**
227 | * Правила завершения уровня. Ключами служат ID уровней, значениями функции
228 | * принимающие на вход состояние уровня и возвращающие true, если раунд
229 | * можно завершать или false если нет.
230 | * @type {Object.}
231 | */
232 | var LevelsRules = {};
233 |
234 | /**
235 | * Уровень считается пройденным, если был выпущен файлболл и он улетел
236 | * за экран.
237 | * @param {Object} state
238 | * @return {Verdict}
239 | */
240 | LevelsRules[Level.INTRO] = function (state) {
241 | var deletedFireballs = state.garbage.filter(function (object) {
242 | return object.type === ObjectType.FIREBALL;
243 | });
244 |
245 | var fenceHit = deletedFireballs.filter(function (fireball) {
246 | // Did we hit the fence?
247 | return fireball.x < 10 && fireball.y > 240;
248 | })[0];
249 |
250 | return fenceHit ? Verdict.WIN : Verdict.CONTINUE;
251 | };
252 |
253 | /**
254 | * Начальные условия для уровней.
255 | * @enum {Object.}
256 | */
257 | var LevelsInitialize = {};
258 |
259 | /**
260 | * Первый уровень.
261 | * @param {Object} state
262 | * @return {Object}
263 | */
264 | LevelsInitialize[Level.INTRO] = function (state) {
265 | state.objects.push(
266 | // Установка персонажа в начальное положение. Он стоит в крайнем левом
267 | // углу экрана, глядя вправо. Скорость перемещения персонажа на этом
268 | // уровне равна 2px за кадр.
269 | {
270 | direction: Direction.RIGHT,
271 | height: window.GameConstants.Wizard.getHeight(window.GameConstants.Wizard.width),
272 | speed: window.GameConstants.Wizard.speed,
273 | sprite: SpriteMap[ObjectType.ME],
274 | state: ObjectState.OK,
275 | type: ObjectType.ME,
276 | width: window.GameConstants.Wizard.width,
277 | x: window.GameConstants.Wizard.getX(WIDTH),
278 | y: window.GameConstants.Wizard.getY(HEIGHT)
279 | }
280 | );
281 |
282 | return state;
283 | };
284 |
285 | /**
286 | * Конструктор объекта Game. Создает canvas, добавляет обработчики событий
287 | * и показывает приветственный экран.
288 | * @param {Element} container
289 | * @constructor
290 | */
291 | var Game = function (container) {
292 | this.container = container;
293 | this.canvas = document.createElement('canvas');
294 | this.canvas.width = container.clientWidth;
295 | this.canvas.height = container.clientHeight;
296 | this.container.appendChild(this.canvas);
297 |
298 | this.ctx = this.canvas.getContext('2d');
299 |
300 | this._onKeyDown = this._onKeyDown.bind(this);
301 | this._onKeyUp = this._onKeyUp.bind(this);
302 | this._pauseListener = this._pauseListener.bind(this);
303 |
304 | this.setDeactivated(false);
305 | };
306 |
307 | Game.prototype = {
308 | /**
309 | * Текущий уровень игры.
310 | * @type {Level}
311 | */
312 | level: INITIAL_LEVEL,
313 |
314 | /** @param {boolean} deactivated */
315 | setDeactivated: function (deactivated) {
316 | if (this._deactivated === deactivated) {
317 | return;
318 | }
319 |
320 | this._deactivated = deactivated;
321 |
322 | if (deactivated) {
323 | this._removeGameListeners();
324 | } else {
325 | this._initializeGameListeners();
326 | }
327 | },
328 |
329 | /**
330 | * Состояние игры. Описывает местоположение всех объектов на игровой карте
331 | * и время проведенное на уровне и в игре.
332 | * @return {Object}
333 | */
334 | getInitialState: function () {
335 | return {
336 | // Статус игры. Если CONTINUE, то игра продолжается.
337 | currentStatus: Verdict.CONTINUE,
338 |
339 | // Объекты, удаленные на последнем кадре.
340 | garbage: [],
341 |
342 | // Время с момента отрисовки предыдущего кадра.
343 | lastUpdated: null,
344 |
345 | // Состояние нажатых клавиш.
346 | keysPressed: {
347 | ESC: false,
348 | LEFT: false,
349 | RIGHT: false,
350 | SPACE: false,
351 | UP: false
352 | },
353 |
354 | // Время начала прохождения уровня.
355 | levelStartTime: null,
356 |
357 | // Все объекты на карте.
358 | objects: [],
359 |
360 | // Время начала прохождения игры.
361 | startTime: null
362 | };
363 | },
364 |
365 | /**
366 | * Начальные проверки и запуск текущего уровня.
367 | * @param {boolean=} restart
368 | */
369 | initializeLevelAndStart: function (restart) {
370 | restart = typeof restart === 'undefined' ? true : restart;
371 |
372 | if (restart || !this.state) {
373 | // сбросить кэш при перезагрузке уровня
374 | this._imagesArePreloaded = void 0;
375 |
376 | // При перезапуске уровня, происходит полная перезапись состояния
377 | // игры из изначального состояния.
378 | this.state = this.getInitialState();
379 | this.state = LevelsInitialize[this.level](this.state);
380 | } else {
381 | // При продолжении уровня состояние сохраняется, кроме записи о том,
382 | // что состояние уровня изменилось с паузы на продолжение игры.
383 | this.state.currentStatus = Verdict.CONTINUE;
384 | }
385 |
386 | // Запись времени начала игры и времени начала уровня.
387 | this.state.levelStartTime = Date.now();
388 | if (!this.state.startTime) {
389 | this.state.startTime = this.state.levelStartTime;
390 | }
391 |
392 | this._preloadImagesForLevel(function () {
393 | // Предварительная отрисовка игрового экрана.
394 | this.render();
395 |
396 | // Установка обработчиков событий.
397 | this._initializeGameListeners();
398 |
399 | // Запуск игрового цикла.
400 | this.update();
401 | }.bind(this));
402 | },
403 |
404 | /**
405 | * Временная остановка игры.
406 | * @param {Verdict=} verdict
407 | */
408 | pauseLevel: function (verdict) {
409 | if (verdict) {
410 | this.state.currentStatus = verdict;
411 | }
412 |
413 | this.state.keysPressed.ESC = false;
414 | this.state.lastUpdated = null;
415 |
416 | this._removeGameListeners();
417 | window.addEventListener('keydown', this._pauseListener);
418 |
419 | this._drawPauseScreen();
420 | },
421 |
422 | /**
423 | * Обработчик событий клавиатуры во время паузы.
424 | * @param {KeyboardsEvent} evt
425 | * @private
426 | * @private
427 | */
428 | _pauseListener: function (evt) {
429 | if (evt.keyCode === 32 && !this._deactivated) {
430 | evt.preventDefault();
431 | var needToRestartTheGame = this.state.currentStatus === Verdict.WIN ||
432 | this.state.currentStatus === Verdict.FAIL;
433 | this.initializeLevelAndStart(needToRestartTheGame);
434 |
435 | window.removeEventListener('keydown', this._pauseListener);
436 | }
437 | },
438 |
439 | /**
440 | * Отрисовка экрана паузы.
441 | */
442 | _drawPauseScreen: function () {
443 | var message;
444 | switch (this.state.currentStatus) {
445 | case Verdict.WIN:
446 | if (window.renderStatistics) {
447 | var statistics = this._generateStatistics(new Date() - this.state.startTime);
448 | var keys = this._shuffleArray(Object.keys(statistics));
449 | window.renderStatistics(this.ctx, keys, keys.map(function (it) {
450 | return statistics[it];
451 | }));
452 | return;
453 | }
454 | message = 'Вы победили Газебо!\nУра!';
455 | break;
456 | case Verdict.FAIL:
457 | message = 'Вы проиграли!';
458 | break;
459 | case Verdict.PAUSE:
460 | message = 'Игра на паузе!\nНажмите Пробел, чтобы продолжить';
461 | break;
462 | case Verdict.INTRO:
463 | message = 'Добро пожаловать!\nНажмите Пробел для начала игры';
464 | break;
465 | }
466 |
467 | this._drawMessage(message);
468 | },
469 |
470 | _generateStatistics: function (time) {
471 | var generationIntervalSec = 3000;
472 | var minTimeInSec = 1000;
473 |
474 | var statistic = {
475 | 'Вы': time
476 | };
477 |
478 | for (var i = 0; i < NAMES.length; i++) {
479 | var diffTime = Math.random() * generationIntervalSec;
480 | var userTime = time + (diffTime - generationIntervalSec / 2);
481 | if (userTime < minTimeInSec) {
482 | userTime = minTimeInSec;
483 | }
484 | statistic[NAMES[i]] = userTime;
485 | }
486 |
487 | return statistic;
488 | },
489 |
490 | _shuffleArray: function (array) {
491 | for (var i = array.length - 1; i > 0; i--) {
492 | var j = Math.floor(Math.random() * (i + 1));
493 | var temp = array[i];
494 | array[i] = array[j];
495 | array[j] = temp;
496 | }
497 | return array;
498 | },
499 |
500 | _drawMessage: function (message) {
501 | var ctx = this.ctx;
502 |
503 | var drawCloud = function (x, y, width, heigth) {
504 | var offset = 10;
505 | ctx.beginPath();
506 | ctx.moveTo(x, y);
507 | ctx.lineTo(x + offset, y + heigth / 2);
508 | ctx.lineTo(x, y + heigth);
509 | ctx.lineTo(x + width / 2, y + heigth - offset);
510 | ctx.lineTo(x + width, y + heigth);
511 | ctx.lineTo(x + width - offset, y + heigth / 2);
512 | ctx.lineTo(x + width, y);
513 | ctx.lineTo(x + width / 2, y + offset);
514 | ctx.lineTo(x, y);
515 | ctx.stroke();
516 | ctx.closePath();
517 | ctx.fill();
518 | };
519 |
520 | ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';
521 | drawCloud(190, 40, 320, 100);
522 |
523 | ctx.fillStyle = 'rgba(256, 256, 256, 1.0)';
524 | drawCloud(180, 30, 320, 100);
525 |
526 | ctx.fillStyle = '#000';
527 | ctx.font = '16px PT Mono';
528 | message.split('\n').forEach(function (line, i) {
529 | ctx.fillText(line, 200, 80 + 20 * i);
530 | });
531 | },
532 |
533 | /**
534 | * Предзагрузка необходимых изображений для уровня.
535 | * @param {function} callback
536 | * @private
537 | */
538 | _preloadImagesForLevel: function (callback) {
539 | if (typeof this._imagesArePreloaded === 'undefined') {
540 | this._imagesArePreloaded = [];
541 | }
542 |
543 | if (this._imagesArePreloaded[this.level]) {
544 | callback();
545 | return;
546 | }
547 |
548 | var keys = Object.keys(SpriteMap);
549 | var imagesToGo = keys.length;
550 |
551 | var self = this;
552 |
553 | var loadSprite = function (sprite) {
554 | var image = new Image(sprite.width, sprite.height);
555 | image.onload = function () {
556 | sprite.image = image;
557 | if (--imagesToGo === 0) {
558 | self._imagesArePreloaded[self.level] = true;
559 | callback();
560 | }
561 | };
562 | image.src = sprite.url;
563 | };
564 |
565 | for (var i = 0; i < keys.length; i++) {
566 | loadSprite(SpriteMap[keys[i]]);
567 | }
568 | },
569 |
570 | /**
571 | * Обновление статуса объектов на экране. Добавляет объекты, которые должны
572 | * появиться, выполняет проверку поведения всех объектов и удаляет те, которые
573 | * должны исчезнуть.
574 | * @param {number} delta Время, прошеднее с отрисовки прошлого кадра.
575 | */
576 | updateObjects: function (delta) {
577 | // Персонаж.
578 | var me = this.state.objects.filter(function (object) {
579 | return object.type === ObjectType.ME;
580 | })[0];
581 |
582 | // Добавляет на карту файрбол по нажатию на Shift.
583 | if (this.state.keysPressed.SHIFT) {
584 | this.state.objects.push({
585 | direction: me.direction,
586 | height: window.GameConstants.Fireball.size,
587 | speed: window.GameConstants.Fireball.speed(!!(me.direction & Direction.LEFT)),
588 | sprite: SpriteMap[ObjectType.FIREBALL],
589 | type: ObjectType.FIREBALL,
590 | width: window.GameConstants.Fireball.size,
591 | x: me.direction & Direction.RIGHT ? me.x + me.width : me.x - window.GameConstants.Fireball.size,
592 | y: me.y + me.height / 2
593 | });
594 |
595 | this.state.keysPressed.SHIFT = false;
596 | }
597 |
598 | this.state.garbage = [];
599 |
600 | // Убирает в garbage не используемые на карте объекты.
601 | var remainingObjects = this.state.objects.filter(function (object) {
602 | ObjectsBehaviour[object.type](object, this.state, delta);
603 |
604 | if (object.state === ObjectState.DISPOSED) {
605 | this.state.garbage.push(object);
606 | return false;
607 | }
608 |
609 | return true;
610 | }, this);
611 |
612 | this.state.objects = remainingObjects;
613 | },
614 |
615 | /**
616 | * Проверка статуса текущего уровня.
617 | */
618 | checkStatus: function () {
619 | // Нет нужны запускать проверку, нужно ли останавливать уровень, если
620 | // заранее известно, что да.
621 | if (this.state.currentStatus !== Verdict.CONTINUE) {
622 | return;
623 | }
624 |
625 | if (!this.commonRules) {
626 | // Проверки, не зависящие от уровня, но влияющие на его состояние.
627 | this.commonRules = [
628 |
629 | /**
630 | * Если персонаж мертв, игра прекращается.
631 | * @param {Object} state
632 | * @return {Verdict}
633 | */
634 | function (state) {
635 | var me = state.objects.filter(function (object) {
636 | return object.type === ObjectType.ME;
637 | })[0];
638 |
639 | return me.state === ObjectState.DISPOSED ?
640 | Verdict.FAIL :
641 | Verdict.CONTINUE;
642 | },
643 |
644 | /**
645 | * Если нажата клавиша Esc игра ставится на паузу.
646 | * @param {Object} state
647 | * @return {Verdict}
648 | */
649 | function (state) {
650 | return state.keysPressed.ESC ? Verdict.PAUSE : Verdict.CONTINUE;
651 | },
652 |
653 | /**
654 | * Игра прекращается если игрок продолжает играть в нее два часа подряд.
655 | * @param {Object} state
656 | * @return {Verdict}
657 | */
658 | function (state) {
659 | return Date.now() - state.startTime > 3 * 60 * 1000 ?
660 | Verdict.FAIL :
661 | Verdict.CONTINUE;
662 | }
663 | ];
664 | }
665 |
666 | // Проверка всех правил влияющих на уровень. Запускаем цикл проверок
667 | // по всем универсальным проверкам и проверкам конкретного уровня.
668 | // Цикл продолжается до тех пор, пока какая-либо из проверок не вернет
669 | // любое другое состояние кроме CONTINUE или пока не пройдут все
670 | // проверки. После этого состояние сохраняется.
671 | var allChecks = this.commonRules.concat(LevelsRules[this.level]);
672 | var currentCheck = Verdict.CONTINUE;
673 | var currentRule;
674 |
675 | while (currentCheck === Verdict.CONTINUE && allChecks.length) {
676 | currentRule = allChecks.shift();
677 | currentCheck = currentRule(this.state);
678 | }
679 |
680 | this.state.currentStatus = currentCheck;
681 | },
682 |
683 | /**
684 | * Принудительная установка состояния игры. Используется для изменения
685 | * состояния игры от внешних условий, например, когда необходимо остановить
686 | * игру, если она находится вне области видимости и установить вводный
687 | * экран.
688 | * @param {Verdict} status
689 | */
690 | setGameStatus: function (status) {
691 | if (this.state.currentStatus !== status) {
692 | this.state.currentStatus = status;
693 | }
694 | },
695 |
696 | /**
697 | * Отрисовка всех объектов на экране.
698 | */
699 | render: function () {
700 | // Удаление всех отрисованных на странице элементов.
701 | this.ctx.clearRect(0, 0, WIDTH, HEIGHT);
702 |
703 | // Выставление всех элементов, оставшихся в this.state.objects согласно
704 | // их координатам и направлению.
705 | this.state.objects.forEach(function (object) {
706 | if (object.sprite) {
707 | var reversed = object.direction & Direction.LEFT;
708 | var sprite = SpriteMap[object.type + (reversed ? REVERSED : '')] || SpriteMap[object.type];
709 | this.ctx.drawImage(sprite.image, object.x, object.y, object.width, object.height);
710 | }
711 | }, this);
712 | },
713 |
714 | /**
715 | * Основной игровой цикл. Сначала проверяет состояние всех объектов игры
716 | * и обновляет их согласно правилам их поведения, а затем запускает
717 | * проверку текущего раунда. Рекурсивно продолжается до тех пор, пока
718 | * проверка не вернет состояние FAIL, WIN или PAUSE.
719 | */
720 | update: function () {
721 | if (!this.state.lastUpdated) {
722 | this.state.lastUpdated = Date.now();
723 | }
724 |
725 | var delta = (Date.now() - this.state.lastUpdated) / 10;
726 | this.updateObjects(delta);
727 | this.checkStatus();
728 |
729 | switch (this.state.currentStatus) {
730 | case Verdict.CONTINUE:
731 | this.state.lastUpdated = Date.now();
732 | this.render();
733 | requestAnimationFrame(function () {
734 | this.update();
735 | }.bind(this));
736 | break;
737 |
738 | case Verdict.WIN:
739 | case Verdict.FAIL:
740 | case Verdict.PAUSE:
741 | case Verdict.INTRO:
742 | this.pauseLevel();
743 | break;
744 | }
745 | },
746 |
747 | /**
748 | * @param {KeyboardEvent} evt [description]
749 | * @private
750 | */
751 | _onKeyDown: function (evt) {
752 | switch (evt.keyCode) {
753 | case 37:
754 | this.state.keysPressed.LEFT = true;
755 | break;
756 | case 39:
757 | this.state.keysPressed.RIGHT = true;
758 | break;
759 | case 38:
760 | this.state.keysPressed.UP = true;
761 | break;
762 | case 27:
763 | this.state.keysPressed.ESC = true;
764 | break;
765 | }
766 |
767 | if (evt.shiftKey) {
768 | this.state.keysPressed.SHIFT = true;
769 | }
770 | },
771 |
772 | /**
773 | * @param {KeyboardEvent} evt [description]
774 | * @private
775 | */
776 | _onKeyUp: function (evt) {
777 | switch (evt.keyCode) {
778 | case 37:
779 | this.state.keysPressed.LEFT = false;
780 | break;
781 | case 39:
782 | this.state.keysPressed.RIGHT = false;
783 | break;
784 | case 38:
785 | this.state.keysPressed.UP = false;
786 | break;
787 | case 27:
788 | this.state.keysPressed.ESC = false;
789 | break;
790 | }
791 |
792 | if (evt.shiftKey) {
793 | this.state.keysPressed.SHIFT = false;
794 | }
795 | },
796 |
797 | /** @private */
798 | _initializeGameListeners: function () {
799 | window.addEventListener('keydown', this._onKeyDown);
800 | window.addEventListener('keyup', this._onKeyUp);
801 | },
802 |
803 | /** @private */
804 | _removeGameListeners: function () {
805 | window.removeEventListener('keydown', this._onKeyDown);
806 | window.removeEventListener('keyup', this._onKeyUp);
807 | }
808 | };
809 |
810 | Game.Verdict = Verdict;
811 |
812 | var game = new Game(document.querySelector('.demo'));
813 |
814 | window.restartGame = function (wizardRightImage, wizardLeftImage) {
815 | SpriteMap[ObjectType.ME].url = wizardRightImage;
816 | SpriteMap[ObjectType.ME + REVERSED].url = wizardLeftImage;
817 |
818 | game.initializeLevelAndStart();
819 | game.setGameStatus(Verdict.INTRO);
820 | };
821 |
822 | window.restartGame('img/wizard.gif', 'img/wizard-reversed.gif');
823 |
824 | return game;
825 | })();
826 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "code-and-magick",
3 | "version": "15.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "acorn": {
8 | "version": "5.7.2",
9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz",
10 | "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==",
11 | "dev": true
12 | },
13 | "acorn-jsx": {
14 | "version": "3.0.1",
15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
17 | "dev": true,
18 | "requires": {
19 | "acorn": "3.3.0"
20 | },
21 | "dependencies": {
22 | "acorn": {
23 | "version": "3.3.0",
24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
26 | "dev": true
27 | }
28 | }
29 | },
30 | "ajv": {
31 | "version": "5.5.2",
32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
33 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
34 | "dev": true,
35 | "requires": {
36 | "co": "4.6.0",
37 | "fast-deep-equal": "1.1.0",
38 | "fast-json-stable-stringify": "2.0.0",
39 | "json-schema-traverse": "0.3.1"
40 | }
41 | },
42 | "ajv-keywords": {
43 | "version": "2.1.1",
44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
45 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
46 | "dev": true
47 | },
48 | "ansi-escapes": {
49 | "version": "3.1.0",
50 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
51 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
52 | "dev": true
53 | },
54 | "ansi-regex": {
55 | "version": "2.1.1",
56 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
57 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
58 | "dev": true
59 | },
60 | "ansi-styles": {
61 | "version": "2.2.1",
62 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
63 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
64 | "dev": true
65 | },
66 | "argparse": {
67 | "version": "1.0.10",
68 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
69 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
70 | "dev": true,
71 | "requires": {
72 | "sprintf-js": "1.0.3"
73 | }
74 | },
75 | "array-union": {
76 | "version": "1.0.2",
77 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
78 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
79 | "dev": true,
80 | "requires": {
81 | "array-uniq": "1.0.3"
82 | }
83 | },
84 | "array-uniq": {
85 | "version": "1.0.3",
86 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
87 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
88 | "dev": true
89 | },
90 | "arrify": {
91 | "version": "1.0.1",
92 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
93 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
94 | "dev": true
95 | },
96 | "babel-code-frame": {
97 | "version": "6.26.0",
98 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
99 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
100 | "dev": true,
101 | "requires": {
102 | "chalk": "1.1.3",
103 | "esutils": "2.0.2",
104 | "js-tokens": "3.0.2"
105 | },
106 | "dependencies": {
107 | "chalk": {
108 | "version": "1.1.3",
109 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
110 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
111 | "dev": true,
112 | "requires": {
113 | "ansi-styles": "2.2.1",
114 | "escape-string-regexp": "1.0.5",
115 | "has-ansi": "2.0.0",
116 | "strip-ansi": "3.0.1",
117 | "supports-color": "2.0.0"
118 | }
119 | },
120 | "strip-ansi": {
121 | "version": "3.0.1",
122 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
123 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
124 | "dev": true,
125 | "requires": {
126 | "ansi-regex": "2.1.1"
127 | }
128 | }
129 | }
130 | },
131 | "balanced-match": {
132 | "version": "1.0.0",
133 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
134 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
135 | "dev": true
136 | },
137 | "brace-expansion": {
138 | "version": "1.1.11",
139 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
140 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
141 | "dev": true,
142 | "requires": {
143 | "balanced-match": "1.0.0",
144 | "concat-map": "0.0.1"
145 | }
146 | },
147 | "buffer-from": {
148 | "version": "1.1.1",
149 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
150 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
151 | "dev": true
152 | },
153 | "caller-path": {
154 | "version": "0.1.0",
155 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
156 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
157 | "dev": true,
158 | "requires": {
159 | "callsites": "0.2.0"
160 | }
161 | },
162 | "callsites": {
163 | "version": "0.2.0",
164 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
165 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
166 | "dev": true
167 | },
168 | "chalk": {
169 | "version": "2.4.1",
170 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
171 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
172 | "dev": true,
173 | "requires": {
174 | "ansi-styles": "3.2.1",
175 | "escape-string-regexp": "1.0.5",
176 | "supports-color": "5.5.0"
177 | },
178 | "dependencies": {
179 | "ansi-styles": {
180 | "version": "3.2.1",
181 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
182 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
183 | "dev": true,
184 | "requires": {
185 | "color-convert": "1.9.3"
186 | }
187 | },
188 | "supports-color": {
189 | "version": "5.5.0",
190 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
191 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
192 | "dev": true,
193 | "requires": {
194 | "has-flag": "3.0.0"
195 | }
196 | }
197 | }
198 | },
199 | "chardet": {
200 | "version": "0.4.2",
201 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
202 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
203 | "dev": true
204 | },
205 | "circular-json": {
206 | "version": "0.3.3",
207 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
208 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
209 | "dev": true
210 | },
211 | "cli-cursor": {
212 | "version": "2.1.0",
213 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
214 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
215 | "dev": true,
216 | "requires": {
217 | "restore-cursor": "2.0.0"
218 | }
219 | },
220 | "cli-width": {
221 | "version": "2.2.0",
222 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
223 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
224 | "dev": true
225 | },
226 | "co": {
227 | "version": "4.6.0",
228 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
229 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
230 | "dev": true
231 | },
232 | "color-convert": {
233 | "version": "1.9.3",
234 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
235 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
236 | "dev": true,
237 | "requires": {
238 | "color-name": "1.1.3"
239 | }
240 | },
241 | "color-name": {
242 | "version": "1.1.3",
243 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
244 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
245 | "dev": true
246 | },
247 | "concat-map": {
248 | "version": "0.0.1",
249 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
250 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
251 | "dev": true
252 | },
253 | "concat-stream": {
254 | "version": "1.6.2",
255 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
256 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
257 | "dev": true,
258 | "requires": {
259 | "buffer-from": "1.1.1",
260 | "inherits": "2.0.3",
261 | "readable-stream": "2.3.6",
262 | "typedarray": "0.0.6"
263 | }
264 | },
265 | "core-util-is": {
266 | "version": "1.0.2",
267 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
268 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
269 | "dev": true
270 | },
271 | "cross-spawn": {
272 | "version": "5.1.0",
273 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
274 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
275 | "dev": true,
276 | "requires": {
277 | "lru-cache": "4.1.3",
278 | "shebang-command": "1.2.0",
279 | "which": "1.3.1"
280 | }
281 | },
282 | "debug": {
283 | "version": "3.1.0",
284 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
285 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
286 | "dev": true,
287 | "requires": {
288 | "ms": "2.0.0"
289 | }
290 | },
291 | "deep-is": {
292 | "version": "0.1.3",
293 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
294 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
295 | "dev": true
296 | },
297 | "del": {
298 | "version": "2.2.2",
299 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
300 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
301 | "dev": true,
302 | "requires": {
303 | "globby": "5.0.0",
304 | "is-path-cwd": "1.0.0",
305 | "is-path-in-cwd": "1.0.1",
306 | "object-assign": "4.1.1",
307 | "pify": "2.3.0",
308 | "pinkie-promise": "2.0.1",
309 | "rimraf": "2.6.2"
310 | }
311 | },
312 | "doctrine": {
313 | "version": "2.1.0",
314 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
315 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
316 | "dev": true,
317 | "requires": {
318 | "esutils": "2.0.2"
319 | }
320 | },
321 | "escape-string-regexp": {
322 | "version": "1.0.5",
323 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
324 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
325 | "dev": true
326 | },
327 | "eslint": {
328 | "version": "4.19.1",
329 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
330 | "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
331 | "dev": true,
332 | "requires": {
333 | "ajv": "5.5.2",
334 | "babel-code-frame": "6.26.0",
335 | "chalk": "2.4.1",
336 | "concat-stream": "1.6.2",
337 | "cross-spawn": "5.1.0",
338 | "debug": "3.1.0",
339 | "doctrine": "2.1.0",
340 | "eslint-scope": "3.7.3",
341 | "eslint-visitor-keys": "1.0.0",
342 | "espree": "3.5.4",
343 | "esquery": "1.0.1",
344 | "esutils": "2.0.2",
345 | "file-entry-cache": "2.0.0",
346 | "functional-red-black-tree": "1.0.1",
347 | "glob": "7.1.3",
348 | "globals": "11.7.0",
349 | "ignore": "3.3.10",
350 | "imurmurhash": "0.1.4",
351 | "inquirer": "3.3.0",
352 | "is-resolvable": "1.1.0",
353 | "js-yaml": "3.12.0",
354 | "json-stable-stringify-without-jsonify": "1.0.1",
355 | "levn": "0.3.0",
356 | "lodash": "4.17.10",
357 | "minimatch": "3.0.4",
358 | "mkdirp": "0.5.1",
359 | "natural-compare": "1.4.0",
360 | "optionator": "0.8.2",
361 | "path-is-inside": "1.0.2",
362 | "pluralize": "7.0.0",
363 | "progress": "2.0.0",
364 | "regexpp": "1.1.0",
365 | "require-uncached": "1.0.3",
366 | "semver": "5.5.1",
367 | "strip-ansi": "4.0.0",
368 | "strip-json-comments": "2.0.1",
369 | "table": "4.0.2",
370 | "text-table": "0.2.0"
371 | }
372 | },
373 | "eslint-config-htmlacademy": {
374 | "version": "0.5.2",
375 | "resolved": "https://registry.npmjs.org/eslint-config-htmlacademy/-/eslint-config-htmlacademy-0.5.2.tgz",
376 | "integrity": "sha512-/lu1x0ZOGytBcGWX4hKMl4QYafrn/1qSBG5IMIljogqZb/Gv1+7XRvcTzDzbl3Wx21AYtBZOVYTili9scQAUTw==",
377 | "dev": true
378 | },
379 | "eslint-scope": {
380 | "version": "3.7.3",
381 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
382 | "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
383 | "dev": true,
384 | "requires": {
385 | "esrecurse": "4.2.1",
386 | "estraverse": "4.2.0"
387 | }
388 | },
389 | "eslint-visitor-keys": {
390 | "version": "1.0.0",
391 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
392 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
393 | "dev": true
394 | },
395 | "espree": {
396 | "version": "3.5.4",
397 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
398 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
399 | "dev": true,
400 | "requires": {
401 | "acorn": "5.7.2",
402 | "acorn-jsx": "3.0.1"
403 | }
404 | },
405 | "esprima": {
406 | "version": "4.0.1",
407 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
408 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
409 | "dev": true
410 | },
411 | "esquery": {
412 | "version": "1.0.1",
413 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
414 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
415 | "dev": true,
416 | "requires": {
417 | "estraverse": "4.2.0"
418 | }
419 | },
420 | "esrecurse": {
421 | "version": "4.2.1",
422 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
423 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
424 | "dev": true,
425 | "requires": {
426 | "estraverse": "4.2.0"
427 | }
428 | },
429 | "estraverse": {
430 | "version": "4.2.0",
431 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
432 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
433 | "dev": true
434 | },
435 | "esutils": {
436 | "version": "2.0.2",
437 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
438 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
439 | "dev": true
440 | },
441 | "external-editor": {
442 | "version": "2.2.0",
443 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
444 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
445 | "dev": true,
446 | "requires": {
447 | "chardet": "0.4.2",
448 | "iconv-lite": "0.4.24",
449 | "tmp": "0.0.33"
450 | }
451 | },
452 | "fast-deep-equal": {
453 | "version": "1.1.0",
454 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
455 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
456 | "dev": true
457 | },
458 | "fast-json-stable-stringify": {
459 | "version": "2.0.0",
460 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
461 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
462 | "dev": true
463 | },
464 | "fast-levenshtein": {
465 | "version": "2.0.6",
466 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
467 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
468 | "dev": true
469 | },
470 | "figures": {
471 | "version": "2.0.0",
472 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
473 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
474 | "dev": true,
475 | "requires": {
476 | "escape-string-regexp": "1.0.5"
477 | }
478 | },
479 | "file-entry-cache": {
480 | "version": "2.0.0",
481 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
482 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
483 | "dev": true,
484 | "requires": {
485 | "flat-cache": "1.3.0",
486 | "object-assign": "4.1.1"
487 | }
488 | },
489 | "flat-cache": {
490 | "version": "1.3.0",
491 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
492 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
493 | "dev": true,
494 | "requires": {
495 | "circular-json": "0.3.3",
496 | "del": "2.2.2",
497 | "graceful-fs": "4.1.11",
498 | "write": "0.2.1"
499 | }
500 | },
501 | "fs.realpath": {
502 | "version": "1.0.0",
503 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
504 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
505 | "dev": true
506 | },
507 | "functional-red-black-tree": {
508 | "version": "1.0.1",
509 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
510 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
511 | "dev": true
512 | },
513 | "glob": {
514 | "version": "7.1.3",
515 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
516 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
517 | "dev": true,
518 | "requires": {
519 | "fs.realpath": "1.0.0",
520 | "inflight": "1.0.6",
521 | "inherits": "2.0.3",
522 | "minimatch": "3.0.4",
523 | "once": "1.4.0",
524 | "path-is-absolute": "1.0.1"
525 | }
526 | },
527 | "globals": {
528 | "version": "11.7.0",
529 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
530 | "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
531 | "dev": true
532 | },
533 | "globby": {
534 | "version": "5.0.0",
535 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
536 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
537 | "dev": true,
538 | "requires": {
539 | "array-union": "1.0.2",
540 | "arrify": "1.0.1",
541 | "glob": "7.1.3",
542 | "object-assign": "4.1.1",
543 | "pify": "2.3.0",
544 | "pinkie-promise": "2.0.1"
545 | }
546 | },
547 | "graceful-fs": {
548 | "version": "4.1.11",
549 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
550 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
551 | "dev": true
552 | },
553 | "has-ansi": {
554 | "version": "2.0.0",
555 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
556 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
557 | "dev": true,
558 | "requires": {
559 | "ansi-regex": "2.1.1"
560 | }
561 | },
562 | "has-flag": {
563 | "version": "3.0.0",
564 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
565 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
566 | "dev": true
567 | },
568 | "iconv-lite": {
569 | "version": "0.4.24",
570 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
571 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
572 | "dev": true,
573 | "requires": {
574 | "safer-buffer": "2.1.2"
575 | }
576 | },
577 | "ignore": {
578 | "version": "3.3.10",
579 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
580 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
581 | "dev": true
582 | },
583 | "imurmurhash": {
584 | "version": "0.1.4",
585 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
586 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
587 | "dev": true
588 | },
589 | "inflight": {
590 | "version": "1.0.6",
591 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
592 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
593 | "dev": true,
594 | "requires": {
595 | "once": "1.4.0",
596 | "wrappy": "1.0.2"
597 | }
598 | },
599 | "inherits": {
600 | "version": "2.0.3",
601 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
602 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
603 | "dev": true
604 | },
605 | "inquirer": {
606 | "version": "3.3.0",
607 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
608 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
609 | "dev": true,
610 | "requires": {
611 | "ansi-escapes": "3.1.0",
612 | "chalk": "2.4.1",
613 | "cli-cursor": "2.1.0",
614 | "cli-width": "2.2.0",
615 | "external-editor": "2.2.0",
616 | "figures": "2.0.0",
617 | "lodash": "4.17.10",
618 | "mute-stream": "0.0.7",
619 | "run-async": "2.3.0",
620 | "rx-lite": "4.0.8",
621 | "rx-lite-aggregates": "4.0.8",
622 | "string-width": "2.1.1",
623 | "strip-ansi": "4.0.0",
624 | "through": "2.3.8"
625 | }
626 | },
627 | "is-fullwidth-code-point": {
628 | "version": "2.0.0",
629 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
630 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
631 | "dev": true
632 | },
633 | "is-path-cwd": {
634 | "version": "1.0.0",
635 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
636 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
637 | "dev": true
638 | },
639 | "is-path-in-cwd": {
640 | "version": "1.0.1",
641 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
642 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
643 | "dev": true,
644 | "requires": {
645 | "is-path-inside": "1.0.1"
646 | }
647 | },
648 | "is-path-inside": {
649 | "version": "1.0.1",
650 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
651 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
652 | "dev": true,
653 | "requires": {
654 | "path-is-inside": "1.0.2"
655 | }
656 | },
657 | "is-promise": {
658 | "version": "2.1.0",
659 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
660 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
661 | "dev": true
662 | },
663 | "is-resolvable": {
664 | "version": "1.1.0",
665 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
666 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
667 | "dev": true
668 | },
669 | "isarray": {
670 | "version": "1.0.0",
671 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
672 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
673 | "dev": true
674 | },
675 | "isexe": {
676 | "version": "2.0.0",
677 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
678 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
679 | "dev": true
680 | },
681 | "js-tokens": {
682 | "version": "3.0.2",
683 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
684 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
685 | "dev": true
686 | },
687 | "js-yaml": {
688 | "version": "3.12.0",
689 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
690 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
691 | "dev": true,
692 | "requires": {
693 | "argparse": "1.0.10",
694 | "esprima": "4.0.1"
695 | }
696 | },
697 | "json-schema-traverse": {
698 | "version": "0.3.1",
699 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
700 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
701 | "dev": true
702 | },
703 | "json-stable-stringify-without-jsonify": {
704 | "version": "1.0.1",
705 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
706 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
707 | "dev": true
708 | },
709 | "levn": {
710 | "version": "0.3.0",
711 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
712 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
713 | "dev": true,
714 | "requires": {
715 | "prelude-ls": "1.1.2",
716 | "type-check": "0.3.2"
717 | }
718 | },
719 | "lodash": {
720 | "version": "4.17.10",
721 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
722 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
723 | "dev": true
724 | },
725 | "lru-cache": {
726 | "version": "4.1.3",
727 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
728 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
729 | "dev": true,
730 | "requires": {
731 | "pseudomap": "1.0.2",
732 | "yallist": "2.1.2"
733 | }
734 | },
735 | "mimic-fn": {
736 | "version": "1.2.0",
737 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
738 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
739 | "dev": true
740 | },
741 | "minimatch": {
742 | "version": "3.0.4",
743 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
744 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
745 | "dev": true,
746 | "requires": {
747 | "brace-expansion": "1.1.11"
748 | }
749 | },
750 | "minimist": {
751 | "version": "0.0.8",
752 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
753 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
754 | "dev": true
755 | },
756 | "mkdirp": {
757 | "version": "0.5.1",
758 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
759 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
760 | "dev": true,
761 | "requires": {
762 | "minimist": "0.0.8"
763 | }
764 | },
765 | "ms": {
766 | "version": "2.0.0",
767 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
768 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
769 | "dev": true
770 | },
771 | "mute-stream": {
772 | "version": "0.0.7",
773 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
774 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
775 | "dev": true
776 | },
777 | "natural-compare": {
778 | "version": "1.4.0",
779 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
780 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
781 | "dev": true
782 | },
783 | "object-assign": {
784 | "version": "4.1.1",
785 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
786 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
787 | "dev": true
788 | },
789 | "once": {
790 | "version": "1.4.0",
791 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
792 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
793 | "dev": true,
794 | "requires": {
795 | "wrappy": "1.0.2"
796 | }
797 | },
798 | "onetime": {
799 | "version": "2.0.1",
800 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
801 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
802 | "dev": true,
803 | "requires": {
804 | "mimic-fn": "1.2.0"
805 | }
806 | },
807 | "optionator": {
808 | "version": "0.8.2",
809 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
810 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
811 | "dev": true,
812 | "requires": {
813 | "deep-is": "0.1.3",
814 | "fast-levenshtein": "2.0.6",
815 | "levn": "0.3.0",
816 | "prelude-ls": "1.1.2",
817 | "type-check": "0.3.2",
818 | "wordwrap": "1.0.0"
819 | }
820 | },
821 | "os-tmpdir": {
822 | "version": "1.0.2",
823 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
824 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
825 | "dev": true
826 | },
827 | "path-is-absolute": {
828 | "version": "1.0.1",
829 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
830 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
831 | "dev": true
832 | },
833 | "path-is-inside": {
834 | "version": "1.0.2",
835 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
836 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
837 | "dev": true
838 | },
839 | "pify": {
840 | "version": "2.3.0",
841 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
842 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
843 | "dev": true
844 | },
845 | "pinkie": {
846 | "version": "2.0.4",
847 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
848 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
849 | "dev": true
850 | },
851 | "pinkie-promise": {
852 | "version": "2.0.1",
853 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
854 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
855 | "dev": true,
856 | "requires": {
857 | "pinkie": "2.0.4"
858 | }
859 | },
860 | "pluralize": {
861 | "version": "7.0.0",
862 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
863 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
864 | "dev": true
865 | },
866 | "prelude-ls": {
867 | "version": "1.1.2",
868 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
869 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
870 | "dev": true
871 | },
872 | "process-nextick-args": {
873 | "version": "2.0.0",
874 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
875 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
876 | "dev": true
877 | },
878 | "progress": {
879 | "version": "2.0.0",
880 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
881 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
882 | "dev": true
883 | },
884 | "pseudomap": {
885 | "version": "1.0.2",
886 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
887 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
888 | "dev": true
889 | },
890 | "readable-stream": {
891 | "version": "2.3.6",
892 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
893 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
894 | "dev": true,
895 | "requires": {
896 | "core-util-is": "1.0.2",
897 | "inherits": "2.0.3",
898 | "isarray": "1.0.0",
899 | "process-nextick-args": "2.0.0",
900 | "safe-buffer": "5.1.2",
901 | "string_decoder": "1.1.1",
902 | "util-deprecate": "1.0.2"
903 | }
904 | },
905 | "regexpp": {
906 | "version": "1.1.0",
907 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
908 | "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
909 | "dev": true
910 | },
911 | "require-uncached": {
912 | "version": "1.0.3",
913 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
914 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
915 | "dev": true,
916 | "requires": {
917 | "caller-path": "0.1.0",
918 | "resolve-from": "1.0.1"
919 | }
920 | },
921 | "resolve-from": {
922 | "version": "1.0.1",
923 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
924 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
925 | "dev": true
926 | },
927 | "restore-cursor": {
928 | "version": "2.0.0",
929 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
930 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
931 | "dev": true,
932 | "requires": {
933 | "onetime": "2.0.1",
934 | "signal-exit": "3.0.2"
935 | }
936 | },
937 | "rimraf": {
938 | "version": "2.6.2",
939 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
940 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
941 | "dev": true,
942 | "requires": {
943 | "glob": "7.1.3"
944 | }
945 | },
946 | "run-async": {
947 | "version": "2.3.0",
948 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
949 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
950 | "dev": true,
951 | "requires": {
952 | "is-promise": "2.1.0"
953 | }
954 | },
955 | "rx-lite": {
956 | "version": "4.0.8",
957 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
958 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
959 | "dev": true
960 | },
961 | "rx-lite-aggregates": {
962 | "version": "4.0.8",
963 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
964 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
965 | "dev": true,
966 | "requires": {
967 | "rx-lite": "4.0.8"
968 | }
969 | },
970 | "safe-buffer": {
971 | "version": "5.1.2",
972 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
973 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
974 | "dev": true
975 | },
976 | "safer-buffer": {
977 | "version": "2.1.2",
978 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
979 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
980 | "dev": true
981 | },
982 | "semver": {
983 | "version": "5.5.1",
984 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
985 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
986 | "dev": true
987 | },
988 | "shebang-command": {
989 | "version": "1.2.0",
990 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
991 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
992 | "dev": true,
993 | "requires": {
994 | "shebang-regex": "1.0.0"
995 | }
996 | },
997 | "shebang-regex": {
998 | "version": "1.0.0",
999 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1000 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1001 | "dev": true
1002 | },
1003 | "signal-exit": {
1004 | "version": "3.0.2",
1005 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1006 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1007 | "dev": true
1008 | },
1009 | "slice-ansi": {
1010 | "version": "1.0.0",
1011 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
1012 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
1013 | "dev": true,
1014 | "requires": {
1015 | "is-fullwidth-code-point": "2.0.0"
1016 | }
1017 | },
1018 | "sprintf-js": {
1019 | "version": "1.0.3",
1020 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1021 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1022 | "dev": true
1023 | },
1024 | "string-width": {
1025 | "version": "2.1.1",
1026 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1027 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1028 | "dev": true,
1029 | "requires": {
1030 | "is-fullwidth-code-point": "2.0.0",
1031 | "strip-ansi": "4.0.0"
1032 | }
1033 | },
1034 | "string_decoder": {
1035 | "version": "1.1.1",
1036 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1037 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1038 | "dev": true,
1039 | "requires": {
1040 | "safe-buffer": "5.1.2"
1041 | }
1042 | },
1043 | "strip-ansi": {
1044 | "version": "4.0.0",
1045 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1046 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1047 | "dev": true,
1048 | "requires": {
1049 | "ansi-regex": "3.0.0"
1050 | },
1051 | "dependencies": {
1052 | "ansi-regex": {
1053 | "version": "3.0.0",
1054 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1055 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1056 | "dev": true
1057 | }
1058 | }
1059 | },
1060 | "strip-json-comments": {
1061 | "version": "2.0.1",
1062 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1063 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1064 | "dev": true
1065 | },
1066 | "supports-color": {
1067 | "version": "2.0.0",
1068 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1069 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1070 | "dev": true
1071 | },
1072 | "table": {
1073 | "version": "4.0.2",
1074 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
1075 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
1076 | "dev": true,
1077 | "requires": {
1078 | "ajv": "5.5.2",
1079 | "ajv-keywords": "2.1.1",
1080 | "chalk": "2.4.1",
1081 | "lodash": "4.17.10",
1082 | "slice-ansi": "1.0.0",
1083 | "string-width": "2.1.1"
1084 | }
1085 | },
1086 | "text-table": {
1087 | "version": "0.2.0",
1088 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1089 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1090 | "dev": true
1091 | },
1092 | "through": {
1093 | "version": "2.3.8",
1094 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1095 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1096 | "dev": true
1097 | },
1098 | "tmp": {
1099 | "version": "0.0.33",
1100 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1101 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1102 | "dev": true,
1103 | "requires": {
1104 | "os-tmpdir": "1.0.2"
1105 | }
1106 | },
1107 | "type-check": {
1108 | "version": "0.3.2",
1109 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1110 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1111 | "dev": true,
1112 | "requires": {
1113 | "prelude-ls": "1.1.2"
1114 | }
1115 | },
1116 | "typedarray": {
1117 | "version": "0.0.6",
1118 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1119 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
1120 | "dev": true
1121 | },
1122 | "util-deprecate": {
1123 | "version": "1.0.2",
1124 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1125 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1126 | "dev": true
1127 | },
1128 | "which": {
1129 | "version": "1.3.1",
1130 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1131 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1132 | "dev": true,
1133 | "requires": {
1134 | "isexe": "2.0.0"
1135 | }
1136 | },
1137 | "wordwrap": {
1138 | "version": "1.0.0",
1139 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1140 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
1141 | "dev": true
1142 | },
1143 | "wrappy": {
1144 | "version": "1.0.2",
1145 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1146 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1147 | "dev": true
1148 | },
1149 | "write": {
1150 | "version": "0.2.1",
1151 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
1152 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
1153 | "dev": true,
1154 | "requires": {
1155 | "mkdirp": "0.5.1"
1156 | }
1157 | },
1158 | "yallist": {
1159 | "version": "2.1.2",
1160 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1161 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1162 | "dev": true
1163 | }
1164 | }
1165 | }
1166 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "code-and-magick",
3 | "version": "15.0.0",
4 | "private": true,
5 | "description": "Учебный проект «Код и Магия» от HTML Academy",
6 | "repository": {
7 | "type": "git",
8 | "url": "git@github.com:htmlacademy-javascript/1098489-code-and-magick-17.git"
9 | },
10 | "bugs": {
11 | "url": "https://github.com/htmlacademy-javascript/1098489-code-and-magick-17/issues"
12 | },
13 | "devDependencies": {
14 | "eslint": "4.19.1",
15 | "eslint-config-htmlacademy": "0.5.2"
16 | },
17 | "license": "MIT",
18 | "dependencies": {},
19 | "scripts": {
20 | "test": "eslint js/"
21 | },
22 | "engines": {
23 | "node": "8.11"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------