├── .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 | HTML Academy 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 |

54 | Code and Magick 55 | Code and magick 56 |

57 |

58 | Это игра, где главного героя, которым вам предстоит управлять и изменять заклинаниями окружающий мир зовут 59 | Пендальф Синий. 60 | Вместе с ним вас ждет увлекательное приключение… 61 |

62 | 63 |
64 | 65 |
66 | 67 |
68 |
69 | 70 | 162 | 163 | 167 | 168 | 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 | --------------------------------------------------------------------------------