Slime Volleyball Mods

If Slime Volleyball has million fans, then I'm one of them. If Slime Volleyball has one fan, then I'm THAT ONE. If Slime Volleyball has no fans, that means I'm dead.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Slime Volleyball Mods
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  If Slime Volleyball has million fans, then I'm one of them. If Slime Volleyball has one fan, then I'm THAT ONE. If Slime Volleyball has no fans, that means I'm dead.
// @author       You
// @match        https://www.cwest.net/games/slime-volleyball/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=cwest.net
// @grant        none
// @license      MIT
// ==/UserScript==

/*
TODO:
- fix ball-net collision (not sure if possible, annoyingly hard coded)
- normal graphics compatibility
- add serve mode (a way to infinitely test ways to serve the ball)
*/

/*
IDEAS LIST:
- Teleportation gimmick. Turn slime-net collision off, and if you're on the other side and press some key then you teleport to the middle of your side. Maybe add cooldown
- Modify slime jump height
- Double jump?
*/
var netToggle= false;
var flightToggle = false;
localStorage.setItem('net',0);
localStorage.setItem('ballsize',25);
localStorage.setItem('slimesize',100);
localStorage.setItem('flight',0);
localStorage.setItem('gravity',2);
var gravity = 2;
var slimesize = 100;
var ballsize = 25;
var srx,slx;
var bx,by;
var ob;
var interval = 50;
var span = document.getElementById('btnOptions');
addEventListener("keydown", function(e) {
  //console.log("keydown '" + e.keyCode + "'");
  if(e.keyCode == 70) { // toggle net on/off, key F
      if (!netToggle){
    localStorage.setItem('net',1);
          netToggle = true;
          optionUpdate();
      }else{
              localStorage.setItem('net',0);
          netToggle = false;
          optionUpdate();
      }

  }
  else if(e.keyCode == 66){ // make slimes bigger, key B
      slimesize += 10;
      localStorage.setItem('slimesize',slimesize);
      slimeLeft.radius = slimesize;
      slimeRight.radius = slimesize;
      optionUpdate();
  }
  else if(e.keyCode == 78){// make slimes smaller, key N
      slimesize -= 10;
      slimeLeft.radius = slimesize;
      slimeRight.radius = slimesize;
      localStorage.setItem('slimesize',slimesize);
      //updateSlime(slimeLeft, 50+((slimesize-100)/2) , 445-((slimesize-100)/2));
      //updateSlime(slimeRight, 555+((slimesize-100)/2), 950-((slimesize-100)/2));
      optionUpdate();
  }
  else if(e.keyCode == 72){ // make ball bigger, key H
      ballsize += 5;
        JS.extend(ball, { radius: ballsize});
      localStorage.setItem('ballsize',ballsize);
      optionUpdate();
  }
  else if(e.keyCode == 74){ // make ball smaller, key J
      ballsize -= 5;
      JS.extend(ball, { radius: ballsize});
      localStorage.setItem('ballsize',ballsize);
      optionUpdate();

  }
  else if(e.keyCode == 75){ // speed up game (will probably lag out), key K
      interval += 5;
      clearInterval(gameIntervalObject);
      clearInterval(gameIntervalObject);
      gameIntervalObject = setInterval(gameIteration, 1000/interval);
      optionUpdate();
  }
  else if(e.keyCode == 76){ // slow down game, key L
      interval -= 5;
      clearInterval(gameIntervalObject);
      clearInterval(gameIntervalObject);
      gameIntervalObject = setInterval(gameIteration, 1000/interval);
      optionUpdate();
  }
  else if(e.keyCode == 89) { // toggle flight, key Y
      if (!flightToggle){
    localStorage.setItem('flight',1);
          flightToggle = true;
          optionUpdate();
      }else{
              localStorage.setItem('flight',0);
          flightToggle = false;
          optionUpdate();
      }

  }

}, false);
function optionUpdate(){
    span.textContent =`SV Modded (${interval} t/s, ${slimesize} slimesize, ${ballsize} ballsize, net is ${!netToggle}, flight is ${flightToggle}), gravity is ${gravity.toFixed(1)}`;
}


function updateFrame() {

    if(onePlayer){slimeAI.move(!1);updateSlimeVelocitiesWithDoubleKeys(slimeLeft,KEY_A,KEY_LEFT,KEY_D,KEY_RIGHT,KEY_W,KEY_UP);updateSlimeVelocities(slimeRight,slimeAI.movement,slimeAI.jumpSet)}else{updateSlimeVelocitiesWithKeys(slimeLeft,KEY_A,KEY_D,KEY_W);updateSlimeVelocitiesWithKeys(slimeRight,KEY_LEFT,KEY_RIGHT,KEY_UP);};
    var ssize = parseInt(localStorage.getItem('slimesize'));
    if (localStorage.getItem('net') == 1){
    updateSlime(slimeLeft, 0, 1000);
    updateSlime(slimeRight, 0, 1000);}
    else{
      updateSlime(slimeLeft, 50+((ssize-100)/2) , 445-((ssize-100)/2));
      updateSlime(slimeRight, 555+((ssize-100)/2), 950-((ssize-100)/2));
    }
    if (updateBall()) {
    return;
    }
}
function updateBall() {
  var bsize = parseInt(localStorage.getItem('ballsize'));
  ball.velocityY = Math.max(ball.velocityY - 1, -MAX_VELOCITY_Y); // gravity

  var oldX = ball.x;

  ball.x += ball.velocityX;
  ball.y += ball.velocityY;

  collisionBallSlime(slimeLeft);
  collisionBallSlime(slimeRight);

  // handle wall hits
  if (keysDown[KEY_DELETE] && oldX > 500 && ball.x <= 500) {
    ball.x = 500;
    ball.velocityX = -ball.velocityX;
  }
  else if (ball.x < (bsize/2)+2) {
    ball.x = bsize/2+2;
    ball.velocityX = -ball.velocityX;
  }
  else if (ball.x > (1000-(bsize/2))-2){
    ball.x = (1000-(bsize/2))-2;
    ball.velocityX = -ball.velocityX;
  }
  // hits the post
    if (ball.x > 500-((bsize/2)+7.5) && ball.x < 507.5+((bsize/2)) && ball.y < 127.5+(bsize/2)) {
    // bounces off top of net
    if (ball.velocityY < 0 && ball.y > 117.5+(bsize/2)) {
      ball.velocityY *= -1;
      ball.y = 130;
    }
    else if (ball.x < 500) { // hits side of net
      ball.x = 500-((bsize/2)+7.5);
      ball.velocityX = ball.velocityX >= 0 ? -ball.velocityX : ball.velocityX;
    }
    else {
      ball.x = 500+((bsize/2)+7.5);
      ball.velocityX = ball.velocityX <= 0 ? -ball.velocityX : ball.velocityX;
    }
  }

  // Check for end of point
  if (ball.y < 0) {
    if (ball.x > 500) {
      leftWon = true;
      slimeLeftScore++;
      // slimeRightScore -= slimeRightScore ? 1 : 0;
    }
    else {
      leftWon = false;
      // slimeLeftScore -= slimeLeftScore ? 1 : 0;
      slimeRightScore++;
    }
    endPoint()
    return true;
  }
  return false;
}
function updateSlimeVelocitiesWithKeys(s,left,right,up) {
  // update velocities
  // I LOVE LOCAL STORAGE I LOVE LOCAL STORAGE
  var fto = parseInt(localStorage.getItem('flight'))
  s.velocityX = keysDown[left]
    ? keysDown[right] ? 0 : -8
    : keysDown[right] ? 8 : 0;
  if(fto == 1 && keysDown[up]){ s.velocityY = 15;}
  else if (s.y == 0 && keysDown[up]) {
    s.velocityY = 31;
  }
}
function updateSlime(s, leftLimit, rightLimit) {
  if (s.velocityX != 0) {
    s.x += s.velocityX;
    if (s.x < leftLimit) {
      s.x = leftLimit;
    }
    else if (s.x > rightLimit) {
      s.x = rightLimit;
    }
  }
  if (s.velocityY != 0 || s.y > 0) {
    s.velocityY -= 2;
    s.y += s.velocityY;
    if (s.y < 0) {
      s.y = 0;
      s.velocityY = 0;
    }
  }
}
function embedFunction(s) {
document.body.appendChild(document.createElement('script'))
.innerHTML=s.toString().replace(/([\s\S]*?return;){2}([\s\S]*)}/,'$2');
}

embedFunction(updateFrame);
embedFunction(updateBall);
embedFunction(updateSlime);
embedFunction(updateSlimeVelocitiesWithKeys);