munch
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.
 
 
 

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