munch
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

234 řádky
6.6 KiB

  1. let currentRoom = null;
  2. let currentDialog = null;
  3. let dirButtons = [];
  4. let actionButtons = [];
  5. let mode = "explore";
  6. let actions = [];
  7. let time = 9*60*60;
  8. let newline = " ";
  9. let player = new Player();
  10. function updateExploreCompass() {
  11. for (let i = 0; i < dirButtons.length; i++) {
  12. let button = dirButtons[i];
  13. if (currentRoom.exits[i] == null) {
  14. button.disabled = true;
  15. button.classList.remove("active-compass-button");
  16. button.classList.add("inactive-button");
  17. button.innerHTML = "";
  18. } else {
  19. button.disabled = false;
  20. button.classList.remove("inactive-button");
  21. button.classList.add("active-compass-button");
  22. button.innerHTML = currentRoom.exits[i].name;
  23. }
  24. }
  25. }
  26. function updateExploreActions() {
  27. for (let i = 0; i < actionButtons.length; i++) {
  28. if (i < actions.length) {
  29. actionButtons[i].disabled = false;
  30. actionButtons[i].innerHTML = actions[i].name;
  31. actionButtons[i].classList.remove("inactive-button");
  32. actionButtons[i].classList.add("active-button");
  33. }
  34. else {
  35. actionButtons[i].disabled = true;
  36. actionButtons[i].innerHTML = "";
  37. actionButtons[i].classList.remove("active-button");
  38. actionButtons[i].classList.add("inactive-button");
  39. }
  40. }
  41. }
  42. function updateExplore() {
  43. updateExploreCompass();
  44. updateExploreActions();
  45. }
  46. function updateCombat() {
  47. }
  48. function updateDialog() {
  49. let list = document.getElementById("dialog");
  50. while(list.firstChild) {
  51. list.removeChild(list.firstChild);
  52. }
  53. for (let i = 0; i < currentDialog.choices.length; i++) {
  54. let li = document.createElement("li");
  55. let button = document.createElement("button");
  56. button.classList.add("dialog-button");
  57. button.innerHTML = currentDialog.choices[i].text;
  58. button.addEventListener("click", function() { dialogClicked(i); });
  59. li.appendChild(button);
  60. list.appendChild(li);
  61. }
  62. }
  63. function updateDisplay() {
  64. switch(mode) {
  65. case "explore":
  66. document.getElementById("selector-explore").style.display = "flex";
  67. document.getElementById("selector-combat").style.display = "none";
  68. document.getElementById("selector-dialog").style.display = "none";
  69. updateExplore();
  70. break;
  71. case "combat":
  72. document.getElementById("selector-explore").style.display = "none";
  73. document.getElementById("selector-combat").style.display = "flex";
  74. document.getElementById("selector-dialog").style.display = "none";
  75. updateCombat();
  76. break;
  77. case "dialog":
  78. document.getElementById("selector-explore").style.display = "none";
  79. document.getElementById("selector-combat").style.display = "none";
  80. document.getElementById("selector-dialog").style.display = "flex";
  81. updateDialog();
  82. break;
  83. }
  84. document.getElementById("time").innerHTML = "Time: " + renderTime(time);
  85. document.getElementById("stat-name").innerHTML = "Name: " + player.name;
  86. document.getElementById("stat-health").innerHTML = "Health: " + player.health + "/" + player.maxHealth;
  87. document.getElementById("stat-fullness").innerHTML = "Fullness: " + player.fullness + "/" + player.maxFullness;
  88. }
  89. function advanceTime(amount) {
  90. time = (time + amount) % 86400;
  91. update(player.stomach.digest(amount));
  92. }
  93. function renderTime(time) {
  94. let suffix = (time < 43200) ? "AM" : "PM";
  95. let hour = Math.floor((time % 43200) / 3600);
  96. if (hour == 0)
  97. hour = 12;
  98. let minute = Math.floor(time / 60) % 60;
  99. if (minute < 9)
  100. minute = "0" + minute;
  101. return hour + ":" + minute + " " + suffix;
  102. }
  103. function move(direction) {
  104. let target = currentRoom.exits[direction];
  105. if (target == null) {
  106. alert("Tried to move to an empty room!");
  107. return;
  108. }
  109. moveTo(target,currentRoom.exitDescs[direction]);
  110. }
  111. function moveTo(room,desc="You go places lol") {
  112. actions = [];
  113. currentRoom = room;
  114. advanceTime(30);
  115. currentRoom.objects.forEach(function (object) {
  116. object.actions.forEach(function (action) {
  117. actions.push(action);
  118. });
  119. });
  120. update([desc,newline]);
  121. }
  122. window.addEventListener('load', function(event) {
  123. loadActions();
  124. loadCompass();
  125. loadDialog();
  126. currentRoom = createWorld();
  127. moveTo(currentRoom);
  128. updateDisplay();
  129. });
  130. function update(lines=[]) {
  131. let log = document.getElementById("log");
  132. for (let i=0; i<lines.length; i++) {
  133. let div = document.createElement("div");
  134. div.innerHTML = lines[i];
  135. log.appendChild(div);
  136. }
  137. log.scrollTop = log.scrollHeight;
  138. updateDisplay();
  139. }
  140. function startDialog(dialog) {
  141. mode = "dialog";
  142. currentDialog = dialog;
  143. update([currentDialog.text]);
  144. currentDialog.visit();
  145. updateDisplay();
  146. }
  147. function dialogClicked(index) {
  148. currentDialog = currentDialog.choices[index].node;
  149. update([currentDialog.text]);
  150. currentDialog.visit();
  151. if (currentDialog.choices.length == 0) {
  152. mode = "explore";
  153. updateDisplay();
  154. }
  155. }
  156. function loadDialog() {
  157. dialogButtons = Array.from( document.querySelectorAll(".dialog-button"));
  158. for (let i = 0; i < dialogButtons.length; i++) {
  159. dialogButtons[i].addEventListener("click", function() { dialogClicked(i); });
  160. }
  161. }
  162. function actionClicked(index) {
  163. actions[index].action();
  164. }
  165. function loadActions() {
  166. actionButtons = Array.from( document.querySelectorAll(".action-button"));
  167. for (let i = 0; i < actionButtons.length; i++) {
  168. actionButtons[i].addEventListener("click", function() { actionClicked(i); });
  169. }
  170. }
  171. function loadCompass() {
  172. dirButtons[NORTH_WEST] = document.getElementById("compass-north-west");
  173. dirButtons[NORTH_WEST].addEventListener("click", function() {
  174. move(NORTH_WEST);
  175. });
  176. dirButtons[NORTH] = document.getElementById("compass-north");
  177. dirButtons[NORTH].addEventListener("click", function() {
  178. move(NORTH);
  179. });
  180. dirButtons[NORTH_EAST] = document.getElementById("compass-north-east");
  181. dirButtons[NORTH_EAST].addEventListener("click", function() {
  182. move(NORTH_EAST);
  183. });
  184. dirButtons[WEST] = document.getElementById("compass-west");
  185. dirButtons[WEST].addEventListener("click", function() {
  186. move(WEST);
  187. });
  188. dirButtons[EAST] = document.getElementById("compass-east");
  189. dirButtons[EAST].addEventListener("click", function() {
  190. move(EAST);
  191. });
  192. dirButtons[SOUTH_WEST] = document.getElementById("compass-south-west");
  193. dirButtons[SOUTH_WEST].addEventListener("click", function() {
  194. move(SOUTH_WEST);
  195. });
  196. dirButtons[SOUTH] = document.getElementById("compass-south");
  197. dirButtons[SOUTH].addEventListener("click", function() {
  198. move(SOUTH);
  199. });
  200. dirButtons[SOUTH_EAST] = document.getElementById("compass-south-east");
  201. dirButtons[SOUTH_EAST].addEventListener("click", function() {
  202. move(SOUTH_EAST);
  203. });
  204. }