maedn.txt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. rankingtable = "halmaranks";
  2. registerRanking(rankingtable);
  3. all = list.new();
  4. teams = map.new();
  5. block_click_catcher = set.new();
  6. gamename = "§cMÄDN";
  7. air_item_type = "minecraft:air";
  8. pling_sound = sound.get("minecraft:block.note_block.pling");
  9. sound_category_ambient = sound.getCategory("ambient");
  10. gosub("setstart");
  11. player = script.getLeader();
  12. player_name = player.getName(player);
  13. gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
  14. gosub("setstart");
  15. air_item_type = "minecraft:air";
  16. colorwort = map.new();
  17. map.add(colorwort, "blue", "Blau");
  18. map.add(colorwort, "green", "Grün");
  19. map.add(colorwort, "yellow", "Gelb");
  20. map.add(colorwort, "red", "Rot");
  21. wool = map.new();
  22. map.add(wool, "blue", "minecraft:blue_wool");
  23. map.add(wool, "green", "minecraft:green_wool");
  24. map.add(wool, "yellow", "minecraft:yellow_wool");
  25. map.add(wool, "red", "minecraft:red_wool");
  26. colorcode_map = map.new();
  27. map.add(colorcode_map, "blue", "§9");
  28. map.add(colorcode_map, "green", "§2");
  29. map.add(colorcode_map, "yellow", "§e");
  30. map.add(colorcode_map, "red", "§c");
  31. gosub("lobbycore");
  32. goto("simplelobby");
  33. @lobby
  34. player.speak("all", gamename, concat("§6", player_name, " §rhat das Spiel betreten"));
  35. /*if(ggv(player, "maednplayed") == null) {
  36. sgv(player, "maednplayed", 0);
  37. }*/
  38. return;
  39. @leavelobby
  40. return;
  41. @finalstart
  42. player.speak("all", gamename, "§rDas Spiel läuft");
  43. block.setSign(gamesignloc, 2, concat(text.number(size), "/", text.number(maxplayers)));
  44. block.setSign(gamesignloc, 3, "§6Läuft");
  45. stablepos = map.new();
  46. aimpos = map.new();
  47. for(i = 0; i < list.getSize(colortext); i++) {
  48. color = list.getIndex(colortext, i);
  49. map.add(stablepos, color, list.new());
  50. map.add(aimpos, color, list.new());
  51. list = map.get(stablepos, color);
  52. list2 = map.get(aimpos, color);
  53. for(h = 0; h <= 3; h++) {
  54. list.add(list, true);
  55. list.add(list2, false);
  56. }
  57. }
  58. routepos = list.new();
  59. for(i = 0; i <= 39; i++) {
  60. list.add(routepos, null);
  61. }
  62. colorforplayer = map.new();
  63. for(h = 0; h < list.getSize(all); h++) {
  64. color = list.getIndex(colortext, h);
  65. p = list.getIndex(all, h);
  66. p_uuid = player.getUuid(p);
  67. display.add("all", h, concat(map.get(colorcode_map, color), player.getName(p)));
  68. map.add(colorforplayer, p_uuid, color);
  69. entity.teleport(p, map.get(tploc, color));
  70. templist = map.get(stable, color);
  71. i = 0;
  72. while(i < 4) {
  73. block.set(list.getIndex(templist, i++), map.get(wool, color));
  74. }
  75. }
  76. waitforplayer = list.getIndex(all, math.random(0, size - 1));
  77. waitforplayername = player.getName(waitforplayer);
  78. color = map.get(colorforplayer, player.getUuid(waitforplayer));
  79. colorcode = map.get(colorcode_map, color);
  80. player.speak("all", gamename, concat(colorcode, waitforplayername, "§r ist am Zug."));
  81. sound.spawnForPlayer(waitforplayer, pling_sound, sound_category_ambient);
  82. msg(waitforplayer, text.click("§r[§eZug beenden§r]", "/nextplayer"));
  83. phase = 0; //0 = muss noch würfeln; 1 = muss figur auswählen
  84. diced = 0;
  85. @checkgame
  86. wait();
  87. ignoreGoto(event);
  88. goto("checkgame");
  89. @block_click
  90. if(action == "left" && set.contains(block_click_catcher, player)) {
  91. set.remove(block_click_catcher, player);
  92. goto("checkgame");
  93. } else {
  94. set.add(block_click_catcher, player);
  95. }
  96. if(player != waitforplayer) {
  97. player.speak(player, gamename, "§rDu bist nicht am Zug");
  98. goto("checkgame");
  99. }
  100. //Würfelphase
  101. color = map.get(colorforplayer, player.getUuid(player));
  102. if(block_loc == würfelloc) {
  103. if(phase != 0) {
  104. player.speak(player, gamename, "§rDu hast bereits gewürfelt");
  105. goto("checkgame");
  106. }
  107. zahl = math.random(1, 6);
  108. player.speak("all", gamename, concat("§r", player_name, " hat eine §6", text.number(zahl), "§r gewürfelt"));
  109. //Überprüfung, ob Zugzwang durch Startfeldbelegung besteht
  110. index = map.get(startindex, color);
  111. if(list.getIndex(routepos, index) == color) { //Check ob Starteld durch eigene figur belegt
  112. player.speak(player, gamename, "§rEs besteht Zugzwang");
  113. if(list.getIndex(routepos, index + zahl) == color) {
  114. if(list.getIndex(routepos, index + zahl * 2) == color) {
  115. if(list.getIndex(routepos, index + zahl * 3) == color) {
  116. forcedblock = list.getIndex(route, index + zahl * 3);
  117. } else {
  118. forcedblock = list.getIndex(route, index + zahl * 2);
  119. }
  120. } else {
  121. forcedblock = list.getIndex(route, index + zahl);
  122. }
  123. } else {
  124. forcedblock = list.getIndex(route, index);
  125. }
  126. phase = 1;
  127. goto("checkgame");
  128. }
  129. //Wenn 6 gewürfelt, Zugzwang für Startfiguren festlegen
  130. if(zahl == 6) {
  131. if(getunitsathome(color) != 0) {
  132. forcedblock = "fromstable";
  133. phase = 1;
  134. player.speak(player, gamename, "§rEs besteht Zugzwang");
  135. goto("checkgame");
  136. }
  137. if(getsafeunits(color) == 3) {
  138. //wenn 4.figur vor ziel steht und nicht mehr weiter kann
  139. atmindex = list.getIndexOf(routepos, color); //Index der 4.Figur
  140. homeindex = map.get(homeindexes, color);
  141. if(atmindex <= homeindex && (atmindex + zahl) > homeindex) { //Überprüfung, ob Figur in Zugrichtung vorm Ziel steht und am Ziel vorbeifahren würde
  142. if((homeindex - atmindex) + 4 < zahl) { //Überprüfung, ob mit gewürfelter Zahl übers Ziel hinausgeschossen wird
  143. player.speak("all", gamename, "§rKein Zug möglich.");
  144. goto("nextplayer2");
  145. }
  146. finalaimindex = ((atmindex + zahl) - homeindex) - 1;
  147. list = map.get(aimpos, color);
  148. if(list.getIndex(list, finalaimindex) == true) {
  149. player.speak("all", gamename, "§rKein Zug möglich.");
  150. goto("nextplayer2");
  151. }
  152. }
  153. }
  154. phase = 1;
  155. goto("checkgame");
  156. }
  157. /*wenn gewürfelt wird, kann es vorkommen, dass ein zug erst mit einer 6 möglich ist
  158. Um eine 6 zu erlangen hat man 3 Würfelversuche*/
  159. if(zahl != 6) {
  160. if(getunitsathome(color) + getsafeunits(color) == 4) { //Check, ob alle Figuren zuhause bzw schon im Ziel
  161. if(++diced == 3) {
  162. player.speak("all", gamename, "§r3 mal hintereinander kein Zug möglich.");
  163. goto("nextplayer");
  164. } else {
  165. player.speak("all", gamename, "§rKein Zug möglich. Würfle erneut.");
  166. goto("checkgame");
  167. }
  168. }
  169. } else {
  170. diced = 0;
  171. }
  172. phase = 1;
  173. goto("checkgame");
  174. }
  175. //Zugphase
  176. if(block_type != map.get(wool, color)) { //check ob eigene figur
  177. goto("checkgame");
  178. }
  179. if(phase != 1) {
  180. player.speak(player, gamename, "§rDu musst zuerst würfeln");
  181. goto("checkgame");
  182. }
  183. if(forcedblock != null) {
  184. if(forcedblock == "fromstable") {
  185. templist = map.get(stable, color);
  186. if(list.contains(templist, block_loc)) {
  187. aimindex = map.get(startindex, color);
  188. doamove(aimindex);
  189. } else {
  190. player.speak(player, gamename, "§rEs besteht Zugzwang für eine Figur aus dem Startbereich");
  191. }
  192. goto("checkgame");
  193. }
  194. if(forcedblock == block_loc) {
  195. aimindex = list.getIndexOf(route, block_loc) + zahl;
  196. if(aimindex >= list.getSize(route)) {
  197. aimindex -= list.getSize(route);
  198. }
  199. doamove(aimindex);
  200. } else {
  201. player.speak(player, gamename, "§rStartfeld belegt. Es besteht Zugzwang für die Figur am Startfeld bzw für die Figur, welche die Figur am Startfeld am Zug hindert");
  202. }
  203. goto("checkgame");
  204. }
  205. templist = map.get(stable, color);
  206. if(list.contains(templist, block_loc)) { //wenn figur aus stall gewählt wird
  207. if(zahl != 6) {
  208. player.speak(player, gamename, "§rDu hast keine 6 gewürfelt");
  209. goto("checkgame");
  210. }
  211. }
  212. templist = map.get(aim, color);
  213. if(list.contains(templist, block_loc)) { //wenn figur aus ziel gewählt wird
  214. atmindex = list.getIndexOf(templist, block_loc);
  215. aimindex = atmindex + zahl;
  216. if(aimindex > 3) {
  217. player.speak(player, gamename, "§rZug nicht möglich"); //Fährt über Ziel hinaus
  218. goto("checkgame");
  219. }
  220. templist2 = map.get(aimpos, color);
  221. if(list.getIndex(templist2, aimindex) == true) {
  222. player.speak(player, gamename, "§rZug nicht möglich. Eigene Figur im Weg");
  223. goto("checkgame");
  224. }
  225. list.setIndex(templist2, atmindex, false);
  226. list.setIndex(templist2, aimindex, true);
  227. block.set(block_loc, air_item_type);
  228. block.set(list.getIndex(templist, aimindex), map.get(wool, color));
  229. goto("nextplayer");
  230. }
  231. if(list.getIndexOf(route, block_loc) == -1) {
  232. //nicht möglicher Fehler
  233. msg("dev", "§rFehler: MÄDN. Block angeklickt, welcher nicht auf Route ist");
  234. goto("checkgame");
  235. }
  236. aimindex = list.getIndexOf(route, block_loc) + zahl;
  237. if(aimindex >= list.getSize(route)) {
  238. aimindex -= list.getSize(route);
  239. }
  240. doamove(aimindex);
  241. goto("checkgame");
  242. @custom_command
  243. if(command == "nextplayer") {
  244. if(player != waitforplayer) {
  245. player.speak(player, gamename, "§rDu bist nicht am Zug");
  246. goto("checkgame");
  247. }
  248. if(phase != 1) {
  249. player.speak(player, gamename, "§rDu musst zuerst würfeln");
  250. goto("checkgame");
  251. }
  252. goto("nextplayer");
  253. }
  254. goto("checkgame");
  255. @block_place
  256. @block_break
  257. @player_is_attacked
  258. cancel = true;
  259. goto("checkgame");
  260. function doamove(aimindex) {
  261. zahl = $zahl;
  262. color = $color;
  263. block_loc = $block_loc;
  264. atmindex -= aimindex - zahl; //aktueller index = aimindex - zahl
  265. if(atmindex < 0) {
  266. atmindex += 40;
  267. }
  268. oppcolor = list.getIndex($routepos, aimindex); //Das ist gleichzeitig der Check, ob Zielfeld belegt ist
  269. //Check ob am Ziel vorbeifährt
  270. templist = map.get($stable, color);
  271. templist2 = map.get($aim, color);
  272. if(!(list.contains(templist, block_loc) || list.contains(templist2, block_loc))) { //Wenn Figur aus Start-/Ziel-Bereich gewählt, Überprüfung nicht notwendig
  273. homeindex = map.get($homeindexes, color);
  274. if(atmindex <= homeindex && (atmindex + zahl) > homeindex) { //Überprüfung, ob Figur in Zugrichtung vorm Ziel steht und am Ziel vorbeifahren würde
  275. if((homeindex - atmindex) + 4 < zahl) { //Überprüfung, ob mit gewürfelter Zahl übers Ziel hinausgeschossen wird
  276. player.speak($player, $gamename, "§rZug nicht möglich. Zieleinlauf zu kurz");
  277. goto("checkgame");
  278. }
  279. finalaimindex = ((atmindex + zahl) - homeindex) - 1;
  280. list = map.get($aimpos, color);
  281. if(list.getIndex(list, finalaimindex) == true) {
  282. player.speak($player, $gamename, "§rZieleinlauf nicht möglich. Eigene Figur im Weg");
  283. goto("checkgame");
  284. }
  285. list.setIndex(list, finalaimindex, true); //Spielfigur im Lageplan einschreiben
  286. list.setIndex($routepos, atmindex, null);
  287. templist = map.get($aim, color);
  288. block.set(list.getIndex(templist, finalaimindex), map.get($wool, color)); //Ziel mit Figur belegen
  289. block.set(block_loc, air_item_type); //Ursprung auf AIR setzen
  290. if(getsafeunits(color) == 4) {
  291. winnername = $player_name;
  292. winner = p;
  293. goto("win");
  294. }
  295. goto("nextplayer");
  296. }
  297. }
  298. if(color == oppcolor) {
  299. player.speak($player, $gamename, "§rZug nicht möglich. Eigene Figur im Weg");
  300. goto("checkgame");
  301. }
  302. index = map.get($startindex, color);
  303. //Überprüfung ob fremde figur geschlagen wird
  304. if(oppcolor != null) { //Zielfeld ist nicht belegt
  305. templist = map.get($stablepos, oppcolor);
  306. i = -1;
  307. while(inc("i") < list.getSize(templist)) {
  308. if(list.getIndex(templist, i) == false) {
  309. templist2 = map.get($stable, oppcolor);
  310. block.set(list.getIndex(templist2, i), map.get($wool, oppcolor));
  311. list.setIndex(templist, i, true);
  312. break;
  313. }
  314. }
  315. player.speak("all", $gamename, concat(map.get($colorcode_map, color), map.get($colorwort, color), "§r schlägt ", map.get($colorcode_map, oppcolor), map.get($colorwort, oppcolor)));
  316. }
  317. templist = map.get($stable, color);
  318. templist2 = map.get($stablepos, color);
  319. if(list.contains(templist, block_loc)) {
  320. tempindex = list.getIndexOf(templist, block_loc);
  321. list.setIndex(templist2, tempindex, false); //Spielfigur aus Lageplan entfernen
  322. } else {
  323. list.setIndex($routepos, atmindex, null); //Spielfigur aus Lageplan entfernen
  324. }
  325. list.setIndex($routepos, aimindex, color); //Spielfigur im Lageplan einschreiben
  326. loc = list.getIndex($route, aimindex);
  327. item = map.get($wool, color);
  328. block.set(loc, item); //Ziel mit Figur belegen
  329. block.set(block_loc, air_item_type); //Ursprung auf AIR setzen
  330. goto("nextplayer");
  331. }
  332. @nextplayer
  333. if(zahl == 6) {
  334. phase = 0;
  335. diced = 0;
  336. forcedblock = null;
  337. if(dicedasix == 3) {
  338. goto("nextplayer");
  339. }
  340. player.speak(player, gamename, "§rDu darfst nochmals würfeln");
  341. goto("checkgame");
  342. }
  343. @nextplayer2
  344. index = list.getIndexOf(all, waitforplayer) + 1;
  345. if(index >= list.getSize(all)) {
  346. index = 0;
  347. }
  348. waitforplayer = list.getIndex(all, index);
  349. waitforplayername = player.getName(waitforplayer);
  350. player.speak("all", gamename, concat("§6", waitforplayername, "§r ist nun am Zug"));
  351. phase = 0; //0 = muss noch würfeln; 1 = muss figur auswählen
  352. diced = 0;
  353. dicedasix = 0;
  354. forcedblock = null;
  355. goto("checkgame");
  356. function getunitsathome(color) {
  357. list = map.get($stablepos, color);
  358. amount = 0;
  359. i = 0;
  360. while(i < list.getSize(list)) {
  361. if(list.getIndex(list, i++) == true) {
  362. amount++;
  363. }
  364. }
  365. return(amount);
  366. }
  367. function getsafeunits(color) {
  368. list = map.get($aimpos, color);
  369. amount = 0;
  370. i = 0;
  371. while(i < list.getSize(list)) {
  372. if(list.getIndex(list, i++) == true) {
  373. amount++;
  374. }
  375. }
  376. return(amount);
  377. }
  378. @player_logout
  379. @player_giveup
  380. player.speak("all", gamename, concat("§6", player_name, " §rhat das Spiel verlassen"));
  381. //nicht gesendet?
  382. kickplayer(player);
  383. if(list.getSize(all) < minplayers) {
  384. winner = list.getIndex(all, 0);
  385. winnername = player.getName(winner);
  386. goto("win");
  387. }
  388. if(player == waitforplayer) {
  389. goto("nextplayer");
  390. }
  391. goto("checkgame");
  392. @win
  393. block.setSign(gamesignloc, 2, "0/4");
  394. block.setSign(gamesignloc, 3, "§2Wartet");
  395. for(i = 0; i <= 39; i++) {
  396. block.set(list.getIndex(route, i), air_item_type);
  397. }
  398. for(i = 0; i <= 3; i++) {
  399. color = list.getIndex(colortext, i);
  400. for(h = 0; h <= 3; h++) {
  401. templist = map.get(aim, color);
  402. block.set(list.getIndex(templist, h), air_item_type);
  403. }
  404. }
  405. player.speak("all", gamename, concat("§6", winnername, "§r hat gewonnen"));
  406. for(i = 0; i < list.getSize(all); i++) {
  407. p = list.getIndex(all, i);
  408. entity.teleport(p, gamesworldloc);
  409. resetplayer(p);
  410. /*player.speak(p, gamename, "§r---= Statistik dieses Spiels =---");
  411. uuid = player.getUuid(p);
  412. if(ggv(p, "maednplayed") == null) {
  413. sgv(p, "maednplayed", 0);
  414. }
  415. sgv(p, "maednplayed", ggv(p, "maednplayed") + 1); //alle gespielten spiele (geleavte spiele werden nicht gezählt)
  416. player.speak(p, gamename, "§rGespielte Spiele: ", ggv(p, "maednplayed"));
  417. wongames = gmap.get("maednranks", uuid);
  418. if(wongames == null) {
  419. wongames = 0;
  420. gmap.add("maednranks", uuid, wongames);
  421. }
  422. if(p == winner) {
  423. gmap.add("maednranks", uuid, ++wongames);
  424. }
  425. player.speak(p, gamename, "§rGewonnene Spiele: ", wongames);
  426. gmap.toTable("table", "maednranks");
  427. table.setSortColumn(table, 1);
  428. table.sort(table);
  429. table.reverse(table);
  430. table.setSortColumn(table, 0);
  431. player.speak(p, gamename, "§rDein Rang: ", table.getIndexOf(table, player.getUuid(player)) + 1);*/
  432. }
  433. term();