a munch adventure
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

180 line
4.3 KiB

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