a munch adventure
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

181 行
4.4 KiB

  1. "use strict"
  2. let activeModal = null;
  3. const newline = String.fromCharCode(160);
  4. const version = "0.1.1";
  5. let state;
  6. let refreshHook;
  7. function print(lines) {
  8. (lines.concat([newline])).forEach(line => {
  9. const log = document.querySelector("#log");
  10. const div = document.createElement("div");
  11. div.textContent = line;
  12. log.appendChild(div);
  13. });
  14. log.scrollTop = log.scrollHeight;
  15. }
  16. function refresh() {
  17. updateRoom(state);
  18. updateStatDisplay(state.info, "world");
  19. updateStatDisplay(state.player.stats, "player");
  20. updateStatDisplay(state.world[state.player.location].data.stats, "area");
  21. if (refreshHook) {
  22. refreshHook(state)
  23. }
  24. }
  25. function switchModal(to) {
  26. closeModal(activeModal);
  27. openModal(to);
  28. }
  29. function closeModal(modal) {
  30. const div = document.querySelector("#" + modal);
  31. div.classList.remove("modal");
  32. div.classList.add("hidden-modal");
  33. }
  34. function openModal(modal) {
  35. const div = document.querySelector("#" + modal);
  36. div.classList.remove("hidden-modal");
  37. div.classList.add("modal");
  38. activeModal = modal;
  39. }
  40. function returnToStart() {
  41. stopAllSound();
  42. stopAllTimers(state);
  43. setBackgroundColor(0, 0, 0);
  44. log.innerHTML = "";
  45. document.querySelector("#game").classList.remove("scene");
  46. document.querySelector("#game").classList.add("hidden-scene");
  47. document.querySelector("#pick").classList.remove("hidden-scene");
  48. document.querySelector("#pick").classList.add("scene");
  49. }
  50. // set up the game
  51. function init(story) {
  52. state = {
  53. player: {
  54. items: {
  55. keys: [
  56. ]
  57. },
  58. rooms: {
  59. },
  60. flags: {
  61. }
  62. },
  63. };
  64. initWorld(story, state);
  65. initGame(story, state);
  66. story.intro.setup(state);
  67. initGamePostSetup(state);
  68. refreshHook = story.refresh;
  69. story.intro.intro(state);
  70. goToRoom(story.intro.start, state);
  71. }
  72. // set up the load screen
  73. function initStart() {
  74. const versionFields = document.querySelectorAll(".version");
  75. const select = document.querySelector("#game-select");
  76. const options = {};
  77. versionFields.forEach(field => {
  78. field.textContent = "Version: " + version;
  79. });
  80. stories.forEach(story => {
  81. const option = document.createElement("option");
  82. option.value = story.id;
  83. option.textContent = story.name;
  84. select.appendChild(option);
  85. options[story.id] = story;
  86. })
  87. select.addEventListener("change", event => {
  88. const holder = document.querySelector("#tags");
  89. holder.innerHTML = "";
  90. const story = stories.filter(s => s.id == [event.target.value])[0];
  91. const tags = story.tags;
  92. initAudio(story);
  93. story.preload.forEach(sound => loadAudio(sound));
  94. tags.forEach(tag => {
  95. const div = document.createElement("div");
  96. div.textContent = tag;
  97. div.classList.add("tag");
  98. holder.appendChild(div);
  99. })
  100. });
  101. const start = document.querySelector("#start-button");
  102. start.addEventListener("click", (event) => {
  103. init(options[select.value]);
  104. document.querySelector("#pick").classList.remove("scene");
  105. document.querySelector("#pick").classList.add("hidden-scene");
  106. document.querySelector("#game").classList.remove("hidden-scene");
  107. document.querySelector("#game").classList.add("scene");
  108. });
  109. const gameMenuButton = document.querySelector("#game-menu-button");
  110. const menuSettings = document.querySelector("#menu-button-settings");
  111. const menuQuit = document.querySelector("#menu-button-quit");
  112. const menuResume = document.querySelector("#menu-button-resume");
  113. const menuSettingsVolume = document.querySelector("#menu-slider-volume");
  114. const menuSettingsClose = document.querySelector("#menu-button-settings-close");
  115. const menuQuitYes = document.querySelector("#menu-button-quit-yes");
  116. const menuQuitNo = document.querySelector("#menu-button-quit-no");
  117. gameMenuButton.addEventListener("click", () => openModal("menu"));
  118. menuSettings.addEventListener("click", () => switchModal("settings"));
  119. menuQuit.addEventListener("click", () => switchModal("quit"));
  120. menuResume.addEventListener("click", () => closeModal("menu"));
  121. menuSettingsVolume.addEventListener("input", () => {
  122. setVolume(parseFloat(menuSettingsVolume.value));
  123. })
  124. menuSettingsClose.addEventListener("click", () => switchModal("menu"));
  125. menuQuitYes.addEventListener("click", () => {
  126. closeModal("quit");
  127. returnToStart();
  128. });
  129. menuQuitNo.addEventListener("click", () => switchModal("menu"));
  130. }
  131. window.addEventListener("load", initStart);