crunch
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

232 rindas
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. update(player.stomach.digest(amount));
  98. }
  99. function renderTime(time) {
  100. let suffix = (time < 43200) ? "AM" : "PM";
  101. let hour = Math.floor((time % 43200) / 3600);
  102. if (hour == 0)
  103. hour = 12;
  104. let minute = Math.floor(time / 60) % 60;
  105. if (minute < 9)
  106. minute = "0" + minute;
  107. return hour + ":" + minute + " " + suffix;
  108. }
  109. function move(direction) {
  110. let target = currentRoom.exits[direction];
  111. if (target == null) {
  112. alert("Tried to move to an empty room!");
  113. return;
  114. }
  115. moveTo(target,currentRoom.exitDescs[direction]);
  116. }
  117. function moveTo(room,desc="You go places lol") {
  118. actions = [];
  119. currentRoom = room;
  120. advanceTime(30);
  121. currentRoom.objects.forEach(function (object) {
  122. object.actions.forEach(function (action) {
  123. actions.push(action);
  124. });
  125. });
  126. update([desc,newline]);
  127. }
  128. window.addEventListener('load', function(event) {
  129. loadActions();
  130. loadCompass();
  131. loadDialog();
  132. currentRoom = createWorld();
  133. moveTo(currentRoom);
  134. updateDisplay();
  135. });
  136. function update(lines=[]) {
  137. let log = document.getElementById("log");
  138. for (let i=0; i<lines.length; i++) {
  139. let div = document.createElement("div");
  140. div.innerHTML = lines[i];
  141. log.appendChild(div);
  142. }
  143. log.scrollTop = log.scrollHeight;
  144. updateDisplay();
  145. }
  146. function dialogClicked(index) {
  147. currentDialog = currentDialog.choices[index].node;
  148. update([currentDialog.visit()]);
  149. if (currentDialog.choices.length == 0) {
  150. mode = "explore";
  151. updateDisplay();
  152. }
  153. }
  154. function loadDialog() {
  155. dialogButtons = Array.from( document.querySelectorAll(".dialog-button"));
  156. for (let i = 0; i < dialogButtons.length; i++) {
  157. dialogButtons[i].addEventListener("click", function() { dialogClicked(i); });
  158. }
  159. }
  160. function actionClicked(index) {
  161. actions[index].action();
  162. }
  163. function loadActions() {
  164. actionButtons = Array.from( document.querySelectorAll(".action-button"));
  165. for (let i = 0; i < actionButtons.length; i++) {
  166. actionButtons[i].addEventListener("click", function() { actionClicked(i); });
  167. }
  168. }
  169. function loadCompass() {
  170. dirButtons[NORTH_WEST] = document.getElementById("compass-north-west");
  171. dirButtons[NORTH_WEST].addEventListener("click", function() {
  172. move(NORTH_WEST);
  173. });
  174. dirButtons[NORTH] = document.getElementById("compass-north");
  175. dirButtons[NORTH].addEventListener("click", function() {
  176. move(NORTH);
  177. });
  178. dirButtons[NORTH_EAST] = document.getElementById("compass-north-east");
  179. dirButtons[NORTH_EAST].addEventListener("click", function() {
  180. move(NORTH_EAST);
  181. });
  182. dirButtons[WEST] = document.getElementById("compass-west");
  183. dirButtons[WEST].addEventListener("click", function() {
  184. move(WEST);
  185. });
  186. dirButtons[EAST] = document.getElementById("compass-east");
  187. dirButtons[EAST].addEventListener("click", function() {
  188. move(EAST);
  189. });
  190. dirButtons[SOUTH_WEST] = document.getElementById("compass-south-west");
  191. dirButtons[SOUTH_WEST].addEventListener("click", function() {
  192. move(SOUTH_WEST);
  193. });
  194. dirButtons[SOUTH] = document.getElementById("compass-south");
  195. dirButtons[SOUTH].addEventListener("click", function() {
  196. move(SOUTH);
  197. });
  198. dirButtons[SOUTH_EAST] = document.getElementById("compass-south-east");
  199. dirButtons[SOUTH_EAST].addEventListener("click", function() {
  200. move(SOUTH_EAST);
  201. });
  202. }