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.
 
 
 

273 lines
7.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. let attacks = [];
  11. attacks.push(new punchAttack(player));
  12. attacks.push(new flankAttack(player));
  13. function round(number, digits) {
  14. return Math.round(number * Math.pow(10,digits)) / Math.pow(10,digits);
  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. let list = document.getElementById("combat");
  54. while(list.firstChild) {
  55. list.removeChild(list.firstChild);
  56. }
  57. for (let i = 0; i < attacks.length; i++) {
  58. let li = document.createElement("li");
  59. let button = document.createElement("button");
  60. button.classList.add("combat-button");
  61. button.innerHTML = attacks[i].name;
  62. button.addEventListener("click", function() { attackClicked(i) });
  63. li.appendChild(button);
  64. list.appendChild(li);
  65. }
  66. }
  67. function updateDialog() {
  68. let list = document.getElementById("dialog");
  69. while(list.firstChild) {
  70. list.removeChild(list.firstChild);
  71. }
  72. for (let i = 0; i < currentDialog.choices.length; i++) {
  73. let li = document.createElement("li");
  74. let button = document.createElement("button");
  75. button.classList.add("dialog-button");
  76. button.innerHTML = currentDialog.choices[i].text;
  77. button.addEventListener("click", function() { dialogClicked(i); });
  78. li.appendChild(button);
  79. list.appendChild(li);
  80. }
  81. }
  82. function updateDisplay() {
  83. switch(mode) {
  84. case "explore":
  85. document.getElementById("selector-explore").style.display = "flex";
  86. document.getElementById("selector-combat").style.display = "none";
  87. document.getElementById("selector-dialog").style.display = "none";
  88. updateExplore();
  89. break;
  90. case "combat":
  91. document.getElementById("selector-explore").style.display = "none";
  92. document.getElementById("selector-combat").style.display = "flex";
  93. document.getElementById("selector-dialog").style.display = "none";
  94. updateCombat();
  95. break;
  96. case "dialog":
  97. document.getElementById("selector-explore").style.display = "none";
  98. document.getElementById("selector-combat").style.display = "none";
  99. document.getElementById("selector-dialog").style.display = "flex";
  100. updateDialog();
  101. break;
  102. }
  103. document.getElementById("time").innerHTML = "Time: " + renderTime(time);
  104. document.getElementById("stat-name").innerHTML = "Name: " + player.name;
  105. document.getElementById("stat-health").innerHTML = "Health: " + player.health + "/" + player.maxHealth;
  106. document.getElementById("stat-fullness").innerHTML = "Fullness: " + round(player.fullness(),0);
  107. }
  108. function advanceTime(amount) {
  109. time = (time + amount) % 86400;
  110. update(player.stomach.digest(amount));
  111. }
  112. function renderTime(time) {
  113. let suffix = (time < 43200) ? "AM" : "PM";
  114. let hour = Math.floor((time % 43200) / 3600);
  115. if (hour == 0)
  116. hour = 12;
  117. let minute = Math.floor(time / 60) % 60;
  118. if (minute < 9)
  119. minute = "0" + minute;
  120. return hour + ":" + minute + " " + suffix;
  121. }
  122. function move(direction) {
  123. let target = currentRoom.exits[direction];
  124. if (target == null) {
  125. alert("Tried to move to an empty room!");
  126. return;
  127. }
  128. moveTo(target,currentRoom.exitDescs[direction]);
  129. }
  130. function moveTo(room,desc="You go places lol") {
  131. actions = [];
  132. currentRoom = room;
  133. advanceTime(30);
  134. currentRoom.objects.forEach(function (object) {
  135. object.actions.forEach(function (action) {
  136. actions.push(action);
  137. });
  138. });
  139. update([desc,newline]);
  140. currentRoom.visit();
  141. }
  142. window.addEventListener('load', function(event) {
  143. loadActions();
  144. loadCompass();
  145. loadDialog();
  146. currentRoom = createWorld();
  147. moveTo(currentRoom);
  148. updateDisplay();
  149. });
  150. function update(lines=[]) {
  151. let log = document.getElementById("log");
  152. for (let i=0; i<lines.length; i++) {
  153. let div = document.createElement("div");
  154. div.innerHTML = lines[i];
  155. log.appendChild(div);
  156. }
  157. log.scrollTop = log.scrollHeight;
  158. updateDisplay();
  159. }
  160. function startCombat(opponent) {
  161. mode = "combat";
  162. currentFoe = opponent;
  163. update(["Oh shit it's a " + opponent.description()]);
  164. }
  165. function attackClicked(index) {
  166. update([attacks[index].attack(currentFoe)]);
  167. if (currentFoe.health <= 0) {
  168. update(["The " + currentFoe.description() + " falls to the ground!"]);
  169. startDialog(new FallenFoe(currentFoe));
  170. }
  171. }
  172. function startDialog(dialog) {
  173. mode = "dialog";
  174. currentDialog = dialog;
  175. update([currentDialog.text]);
  176. currentDialog.visit();
  177. updateDisplay();
  178. }
  179. function dialogClicked(index) {
  180. currentDialog = currentDialog.choices[index].node;
  181. update([currentDialog.text]);
  182. currentDialog.visit();
  183. if (currentDialog.choices.length == 0) {
  184. mode = "explore";
  185. updateDisplay();
  186. }
  187. }
  188. function loadDialog() {
  189. dialogButtons = Array.from( document.querySelectorAll(".dialog-button"));
  190. for (let i = 0; i < dialogButtons.length; i++) {
  191. dialogButtons[i].addEventListener("click", function() { dialogClicked(i); });
  192. }
  193. }
  194. function actionClicked(index) {
  195. actions[index].action();
  196. }
  197. function loadActions() {
  198. actionButtons = Array.from( document.querySelectorAll(".action-button"));
  199. for (let i = 0; i < actionButtons.length; i++) {
  200. actionButtons[i].addEventListener("click", function() { actionClicked(i); });
  201. }
  202. }
  203. function loadCompass() {
  204. dirButtons[NORTH_WEST] = document.getElementById("compass-north-west");
  205. dirButtons[NORTH_WEST].addEventListener("click", function() {
  206. move(NORTH_WEST);
  207. });
  208. dirButtons[NORTH] = document.getElementById("compass-north");
  209. dirButtons[NORTH].addEventListener("click", function() {
  210. move(NORTH);
  211. });
  212. dirButtons[NORTH_EAST] = document.getElementById("compass-north-east");
  213. dirButtons[NORTH_EAST].addEventListener("click", function() {
  214. move(NORTH_EAST);
  215. });
  216. dirButtons[WEST] = document.getElementById("compass-west");
  217. dirButtons[WEST].addEventListener("click", function() {
  218. move(WEST);
  219. });
  220. dirButtons[EAST] = document.getElementById("compass-east");
  221. dirButtons[EAST].addEventListener("click", function() {
  222. move(EAST);
  223. });
  224. dirButtons[SOUTH_WEST] = document.getElementById("compass-south-west");
  225. dirButtons[SOUTH_WEST].addEventListener("click", function() {
  226. move(SOUTH_WEST);
  227. });
  228. dirButtons[SOUTH] = document.getElementById("compass-south");
  229. dirButtons[SOUTH].addEventListener("click", function() {
  230. move(SOUTH);
  231. });
  232. dirButtons[SOUTH_EAST] = document.getElementById("compass-south-east");
  233. dirButtons[SOUTH_EAST].addEventListener("click", function() {
  234. move(SOUTH_EAST);
  235. });
  236. }