Downloads containing Race.mut

Downloads
Name Author Game Mode Rating
JJ2+ Only: Race.mut PurpleJazz Mutator N/A Download file

File preview

  1. #pragma name "Race.mut"
  2.  
  3. class warp {
  4.         int xTile, yTile;
  5. }
  6. array<warp> Warps;
  7.  
  8. uint lapDelay = 0;
  9.  
  10. array<uint64> lapTimes(0, 0);
  11. array<uint> laps(0, 0);
  12. uint64 currLapTime = 0;
  13. uint64 totalLapTime = 0;
  14. array<uint64> bestLapTime(1, 25200);
  15.  
  16. string formatTime(uint64 time) {
  17.         return (time / (70 * 60)) + ':' + formatInt(time / 70 % 60, '0', 2) + ':' + formatInt(time * 100 / 7 % 1000, '0', 3);
  18. }
  19.  
  20. array<string> positions = {"1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th", "30th", "31st", "32nd"};
  21. uint playerPosition = 0;
  22. array<bool> hasFinished(32, false);
  23. array<string> playerRanking(32, "1st");
  24. bool finished = false;
  25. bool onLastLap = false;
  26.  
  27. bool raceNotStarted = false;
  28.  
  29. float cameraX = 0;
  30. float cameraY = 0;
  31.  
  32. bool pressOnce = false;
  33.  
  34. class Waypoint {
  35.         float xPos, yPos;
  36. }
  37. array<Waypoint> Waypoints;
  38.  
  39. void onLevelLoad() {
  40.         jjAnimSets[ANIM::BRIDGE].load();
  41.         //jjObjectPresets[OBJECT::BOUNCEONCE].behavior = Waypoint();
  42. }
  43.  
  44. void onLevelBegin() {
  45.         for (int x = 0; x < jjLayerWidth[4]; x++) {
  46.                 for (int y = 0; y < jjLayerHeight[4]; y++) {
  47.                         if (jjEventGet(x, y) == AREA::WARP && jjParameterGet(x, y, 16, 1) == 1) {
  48.                                 warp Finish;
  49.                                 Finish.xTile = x;
  50.                                 Finish.yTile = y;
  51.                                 Warps.insertLast(Finish);
  52.                         }
  53.                 }
  54.         }
  55.        
  56.         cameraX = jjLocalPlayers[0].xPos;
  57.         cameraY = jjLocalPlayers[0].yPos;
  58.        
  59.         if (jjIsServer) {
  60.                 if (jjEventGet(0, 0) == 255 && jjParameterGet(0, 0, 0, 5) > 0) {
  61.                         int maxLap = jjParameterGet(0, 0, 0, 8);
  62.                         if (jjMaxScore != maxLap) jjChat("/maxscore " + maxLap);
  63.                 }
  64.         }
  65.        
  66.         for (int i = 0; i < jjLocalPlayerCount; i++) {
  67.                 jjLocalPlayers[i].score = 1;
  68.         }
  69. }
  70.  
  71. void onPlayer(jjPLAYER@ play) {
  72.         if ((jjGameState == GAME::STOPPED || jjGameState == GAME::PREGAME) && jjGameTicks == 2) raceNotStarted = true;
  73.        
  74.         if (jjIsServer && jjGameTicks == 2) updateName(play, play.score, (play.score <= jjMaxScore? false:true), playerRanking[play.playerID]);
  75.  
  76.         if (raceNotStarted) {
  77.                 if (jjGameState == GAME::STARTED) {
  78.                         play.cameraUnfreeze(true);
  79.                         raceNotStarted = false;
  80.                         play.invisibility = false;
  81.                         play.noFire = false;
  82.                         play.xPos = play.xOrg;
  83.                         play.yPos = play.yOrg;
  84.                         play.blink = 70;
  85.                 } else {
  86.                         play.xPos = 0;
  87.                         play.yPos = 0;
  88.                         play.keyJump = play.keyRun = false;
  89.                         if (!play.isConnecting) play.noFire = true;
  90.                         play.buttstomp = 121;
  91.                         play.invisibility = true;
  92.                        
  93.                         play.cameraFreeze(cameraX, cameraY, true, jjGameTicks <= 2? true:false);
  94.                        
  95.                         if (!play.keyLeft && !play.keyRight && !play.keyUp && !play.keyDown) {
  96.                                 if (jjKey[0x01]) {
  97.                                         cameraX = jjMouseX + play.cameraX;
  98.                                         cameraY = jjMouseY + play.cameraY;
  99.                                 }
  100.                         }
  101.                        
  102.                         if (play.keyLeft && cameraX > 0) cameraX -= 16;
  103.                         else if (play.keyRight && cameraX < jjLayerWidth[4]*32) cameraX += 16;
  104.                                
  105.                         if (play.keyUp && cameraY > 0) cameraY -= 16;
  106.                         else if (play.keyDown && cameraY < jjLayerHeight[4]*32) cameraY += 16;
  107.                 }
  108.         }
  109.        
  110.         if (jjKey[0x02]) {
  111.                 if (!pressOnce) {
  112.                         Waypoint newWaypoint;
  113.                         newWaypoint.xPos = jjMouseX + play.cameraX;
  114.                         newWaypoint.yPos = jjMouseY + play.cameraY;
  115.                         Waypoints.insertLast(newWaypoint);
  116.                         pressOnce = true;
  117.                 }
  118.         } else {
  119.                 pressOnce = false;
  120.         }
  121.        
  122.         if (jjKey[0x2E]) {
  123.                 for (uint i = 1; i < Waypoints.length(); i++) {
  124.                         Waypoints.removeAt(i);
  125.                 }
  126.         }
  127.        
  128.         if (play.health > 0 && play.health < jjMaxHealth) play.health = jjMaxHealth; //immortality from weapons
  129.  
  130.         if ((jjGameState == GAME::STARTED || jjGameState == GAME::OVERTIME) && !finished && !play.isSpectating && !play.isIdle) {
  131.                 totalLapTime++;
  132.                 currLapTime++;
  133.         }
  134.        
  135.         for (uint i = 0; i < Warps.length(); i++) {
  136.                 warp@ Finish = Warps[i];
  137.                 if ((int(play.xPos)/32 == Finish.xTile && int(play.yPos)/32 == Finish.yTile) && play.score <= (jjMaxScore+1)) {
  138.                         if (lapDelay == 0) {
  139.                                 play.score++;
  140.                                 lapDelay = 140;
  141.                                 if (play.score <= (jjMaxScore+1)) lapTimes.insertLast(currLapTime);
  142.                                 updateName(play, play.score, (play.score <= jjMaxScore? false:true), playerRanking[play.playerID]);
  143.                                 if (!jjIsServer) {
  144.                                         if (play.score <= (jjMaxScore+1)) {
  145.                                                 jjSTREAM packet;
  146.                                                 packet.push(play.score);
  147.                                                 packet.push(totalLapTime);
  148.                                                 uint64 lapTime = currLapTime;
  149.                                                 packet.push(lapTime);
  150.                                                 jjSendPacket(packet);
  151.                                         }
  152.                                 } else {
  153.                                         if (currLapTime < bestLapTime[0] && play.score > 1 && play.score <= (jjMaxScore+1)) {
  154.                                                 bestLapTime.insertLast(currLapTime);
  155.                                                 array<string> results;
  156.                                                 string name = play.nameUnformatted;
  157.                                                 while (jjRegexMatch(name, """(.*)\[(1?\d{1,2}|1st|2nd|3rd|4th|5th|6th|7th|8th|9th|10th|11th|12th|13th|14th|15th|16th|17th|18th|19th|20th|21st|22nd|23rd|24th|25th|26th|27th|28th|29th|30th|31st|32nd)\](\|*\*)?""", results)) {
  158.                                                         name = results[1];
  159.                                                         jjAlert("|||" + name + " has set a new best lap time of " + formatTime(currLapTime) + "!", true, STRING::SMALL);
  160.                                                 }
  161.                                         }
  162.                                 }
  163.                         } else if (lapDelay == 138) {
  164.                                 currLapTime = 0;
  165.                                 laps.insertLast(play.score - 1);
  166.                         }
  167.                 }
  168.         }
  169.         if (lapDelay > 0) lapDelay--;
  170.        
  171.         if (play.score == jjMaxScore) {
  172.                 setFinishWarp();
  173.         }
  174.        
  175.         if (play.warpID == 256 && jjGameTicks > 2 && play.score <= (jjMaxScore+1)) {
  176.                 if (!jjIsServer) {
  177.                         if (lapDelay == 140 && play.score <= (jjMaxScore+1)) {
  178.                                 jjSTREAM packet;
  179.                                 packet.push(play.score);
  180.                                 packet.push(totalLapTime);
  181.                                 uint64 lapTime = currLapTime;
  182.                                 packet.push(lapTime);
  183.                                 jjSendPacket(packet);
  184.                         }
  185.                 } else {
  186.                         if (!hasFinished[play.playerID] && play.score <= (jjMaxScore+1)) {
  187.                                 array<string> results;
  188.                                 string name = play.nameUnformatted;
  189.                                 while (jjRegexMatch(name, """(.*)\[(1?\d{1,2}|1st|2nd|3rd|4th|5th|6th|7th|8th|9th|10th|11th|12th|13th|14th|15th|16th|17th|18th|19th|20th|21st|22nd|23rd|24th|25th|26th|27th|28th|29th|30th|31st|32nd)\](\|*\*)?""", results)) {
  190.                                         name = results[1];
  191.                                         jjAlert("|||" + name + " has finished in " + positions[playerPosition] + " place! (" + formatTime(totalLapTime) + ")", true, STRING::SMALL);
  192.                                 }
  193.                                 playerPosition++;
  194.                                 hasFinished[play.playerID] = true;
  195.                                 updateName(play, play.score, (play.score <= jjMaxScore? false:true), positions[playerPosition-1]);
  196.                         }
  197.                 }
  198.                 finished = true;
  199.         }
  200.        
  201.         if (jjIsServer) bestLapTime.sortAsc();
  202. }
  203.  
  204. void setFinishWarp() {
  205.         if (!onLastLap) {
  206.                 for (int x = 0; x < jjLayerWidth[4]; x++) {
  207.                         for (int y = 0; y < jjLayerHeight[4]; y++) {
  208.                                 if (jjEventGet(x, y) == AREA::WARP && jjParameterGet(x, y, 16, 1) == 1 && jjParameterGet(x, y, 0, 8) != 255) {
  209.                                         jjParameterSet(x, y, 0, 8, 255);
  210.                                 }
  211.                         }
  212.                 }
  213.                 onLastLap = true;
  214.         }
  215. }
  216.  
  217. void onMain() {
  218.         if (jjIsServer) {
  219.                 for (int i = 1; i < 32; i++) {
  220.                         jjPLAYER@ play = jjPlayers[i];
  221.                         if (play.isConnecting && play.isActive) updateName(play, 1, false, "");
  222.                 }
  223.         }
  224. }
  225.  
  226. void onReceive(jjSTREAM &in packet, int clientID) {
  227.         if (jjIsServer) {
  228.                 int playerLap;
  229.                 uint64 clientTime;
  230.                 uint64 clientLapTime;
  231.                 packet.pop(playerLap);
  232.                 packet.pop(clientTime);
  233.                 packet.pop(clientLapTime);
  234.                 jjPLAYER@ play = jjPlayers[clientID];
  235.                 play.score = playerLap;
  236.                
  237.                 if (!hasFinished[play.playerID] && playerLap > jjMaxScore) {
  238.                 array<string> results;
  239.                         string name = play.nameUnformatted;
  240.                         while (jjRegexMatch(name, """(.*)\[(1?\d{1,2}|1st|2nd|3rd|4th|5th|6th|7th|8th|9th|10th|11th|12th|13th|14th|15th|16th|17th|18th|19th|20th|21st|22nd|23rd|24th|25th|26th|27th|28th|29th|30th|31st|32nd)\](\|*\*)?""", results)) {
  241.                                 name = results[1];
  242.                                 jjAlert("|||" + name + " has finished in " + positions[playerPosition] + " place! (" + formatTime(clientTime) + ")", true, STRING::SMALL);
  243.                         }
  244.                         playerPosition++;
  245.                         hasFinished[play.playerID] = true;
  246.                         playerRanking[play.playerID] = positions[playerPosition - 1];
  247.                 }
  248.                
  249.                 updateName(play, playerLap, (playerLap <= jjMaxScore? false:true), playerRanking[play.playerID]);
  250.                        
  251.                 if (clientLapTime < bestLapTime[0] && playerLap > 1) {
  252.                         bestLapTime.insertLast(clientLapTime);
  253.                         array<string> results;
  254.                         string name = play.nameUnformatted;
  255.                         while (jjRegexMatch(name, """(.*)\[(1?\d{1,2}|1st|2nd|3rd|4th|5th|6th|7th|8th|9th|10th|11th|12th|13th|14th|15th|16th|17th|18th|19th|20th|21st|22nd|23rd|24th|25th|26th|27th|28th|29th|30th|31st|32nd)\](\|*\*)?""", results)) {
  256.                                 name = results[1];
  257.                                 jjAlert("|||" + name + " has set a new best lap time of " + formatTime(clientLapTime) + "!", true, STRING::SMALL);
  258.                         }
  259.                 }
  260.                        
  261.         }
  262. }
  263.  
  264. void updateName(jjPLAYER@ play, uint lap, bool finished, string pos) {
  265.         array<string> results;
  266.         string name = play.nameUnformatted;
  267.         while (jjRegexMatch(name, """(.*)\[(1?\d{1,2}|1st|2nd|3rd|4th|5th|6th|7th|8th|9th|10th|11th|12th|13th|14th|15th|16th|17th|18th|19th|20th|21st|22nd|23rd|24th|25th|26th|27th|28th|29th|30th|31st|32nd)\](\|*\*)?""", results)) {
  268.                 name = results[1];
  269.         }
  270.         string nick = name;
  271.         if (!finished)
  272.                 nick += ("[" + lap + "]");
  273.         else nick += ("[" + pos + "]");
  274.  
  275.         if (play.name != nick)
  276.                 play.setName(nick);
  277. }
  278.  
  279. bool onDrawHealth(jjPLAYER@ play, jjCANVAS@ canvas) {
  280.         if (!jjLocalPlayers[0].isSpectating && !jjLocalPlayers[0].isIdle) {
  281.                 if (!raceNotStarted) {
  282.                         canvas.drawString(8, jjGameMode == GAME::BATTLE? 40 : 68, play.score <= jjMaxScore? "Lap " + play.score + " / " + jjMaxScore : "|Finished!", STRING::MEDIUM, STRING::NORMAL);
  283.                         canvas.drawString(10, jjGameMode == GAME::BATTLE? 68 : 96, "" + formatTime(totalLapTime), STRING::MEDIUM, STRING::NORMAL);
  284.                         for (uint i = 0; i < laps.length(); i++) {
  285.                                 canvas.drawString(8, ((jjGameMode == GAME::BATTLE? 98 : 126) + (i * 16)), "||||" + laps[i] + ". " + formatTime(lapTimes[i]), STRING::SMALL, STRING::NORMAL);
  286.                         }
  287.                 } else {
  288.                         canvas.drawString(244 - (jjResolutionWidth <= 640? 80:0), 152, "Race not started yet!", STRING::MEDIUM, STRING::NORMAL);
  289.                         canvas.drawString(84 - (jjResolutionWidth <= 640? 84:0), 190, "|Use the |||movement keys||||| or |||left click and drag||||| to move the camera", STRING::SMALL, STRING::NORMAL);
  290.                         canvas.drawString(172 - (jjResolutionWidth <= 640? 80:0), 206, "|Click the |||right mouse button||||| to set ||waypoints", STRING::SMALL, STRING::NORMAL);
  291.                         canvas.drawString(222 - (jjResolutionWidth <= 640? 80:0), 222, "|Press |||delete||||| to erase all ||waypoints", STRING::SMALL, STRING::NORMAL);
  292.                 }
  293.         }
  294.         return true;
  295. }
  296.  
  297. void onDrawLayer4(jjPLAYER@ play, jjCANVAS@ canvas) {
  298.         for (uint i = 0; i < Waypoints.length(); i++) {
  299.                 Waypoint@ waypoint = Waypoints[i];
  300.                 jjDrawResizedSprite(waypoint.xPos, waypoint.yPos, ANIM::BRIDGE, 5, 0, 2, 2, SPRITE::NORMAL);
  301.         }
  302. }
  303.