Advertisement
bakugo

splatoon-mkb.py

Apr 7th, 2019
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.17 KB | None | 0 0
  1. import sys
  2. import math
  3. import struct
  4. import socket
  5. import pygame
  6.  
  7. TARGET = ("192.168.1.10", 8080)
  8.  
  9. KEY_A            = (1 << 0)  # A
  10. KEY_B            = (1 << 1)  # B
  11. KEY_X            = (1 << 2)  # X
  12. KEY_Y            = (1 << 3)  # Y
  13. KEY_LSTICK       = (1 << 4)  # Left Stick Button
  14. KEY_RSTICK       = (1 << 5)  # Right Stick Button
  15. KEY_L            = (1 << 6)  # L
  16. KEY_R            = (1 << 7)  # R
  17. KEY_ZL           = (1 << 8)  # ZL
  18. KEY_ZR           = (1 << 9)  # ZR
  19. KEY_PLUS         = (1 << 10) # Plus
  20. KEY_MINUS        = (1 << 11) # Minus
  21. KEY_DLEFT        = (1 << 12) # D-Pad Left
  22. KEY_DUP          = (1 << 13) # D-Pad Up
  23. KEY_DRIGHT       = (1 << 14) # D-Pad Right
  24. KEY_DDOWN        = (1 << 15) # D-Pad Down
  25. KEY_LSTICK_LEFT  = (1 << 16) # Left Stick Left
  26. KEY_LSTICK_UP    = (1 << 17) # Left Stick Up
  27. KEY_LSTICK_RIGHT = (1 << 18) # Left Stick Right
  28. KEY_LSTICK_DOWN  = (1 << 19) # Left Stick Down
  29. KEY_RSTICK_LEFT  = (1 << 20) # Right Stick Left
  30. KEY_RSTICK_UP    = (1 << 21) # Right Stick Up
  31. KEY_RSTICK_RIGHT = (1 << 22) # Right Stick Right
  32. KEY_RSTICK_DOWN  = (1 << 23) # Right Stick Down
  33. KEY_SL_LEFT      = (1 << 24) # SL on Left Joy-Con
  34. KEY_SR_LEFT      = (1 << 25) # SR on Left Joy-Con
  35. KEY_SL_RIGHT     = (1 << 26) # SL on Right Joy-Con
  36. KEY_SR_RIGHT     = (1 << 27) # SR on Right Joy-Con
  37.  
  38. JOYSTICK_MAX  = (+0x8000)
  39. JOYSTICK_MIN  = (-0x8000)
  40.  
  41. def main(argv):
  42.     _socket = \
  43.         socket.socket(
  44.             socket.AF_INET,
  45.             socket.SOCK_DGRAM
  46.         )
  47.    
  48.     pygame.init()
  49.     pygame.event.set_grab(True)
  50.     pygame.display.set_caption("Splatoon MKB")
  51.    
  52.     clock = pygame.time.Clock()
  53.     screen = pygame.display.set_mode((500,500), 0)
  54.     font = pygame.font.SysFont("Consolas", 20)
  55.    
  56.     stop = False
  57.    
  58.     ticks = 0
  59.    
  60.     toggle_value = True
  61.     toggle_key_new = False
  62.     toggle_key_old = False
  63.    
  64.     while True:
  65.         for event in pygame.event.get():
  66.             if event.type == pygame.QUIT:
  67.                 stop = True
  68.        
  69.         input_keys = pygame.key.get_pressed()
  70.         input_mouse_btn = pygame.mouse.get_pressed()
  71.         input_mouse_pos = (
  72.             (pygame.mouse.get_pos()[0] - 250),
  73.             (pygame.mouse.get_pos()[1] - 250)
  74.         )
  75.        
  76.         # handle exit key
  77.         if input_keys[pygame.K_ESCAPE]:
  78.             stop = True
  79.        
  80.         # stop if necessary
  81.         if stop:
  82.             break
  83.        
  84.         # handle toggle key
  85.         toggle_key_new = input_keys[pygame.K_RSHIFT]
  86.        
  87.         if toggle_key_old != toggle_key_new:
  88.             if toggle_key_new:
  89.                 toggle_value = (toggle_value != True)
  90.            
  91.             toggle_key_old = toggle_key_new
  92.        
  93.         # defaults
  94.         packet_keys = 0
  95.         packet_joy_l_x = 0
  96.         packet_joy_l_y = 0
  97.         packet_joy_r_x = 0
  98.         packet_joy_r_y = 0
  99.        
  100.         # bind gameplay controls
  101.         if input_mouse_btn[0]:          packet_keys |= KEY_ZR          # shoot
  102.         if input_mouse_btn[2]:          packet_keys |= KEY_R           # use sub
  103.         if input_keys[pygame.K_SPACE]:  packet_keys |= KEY_B           # jump
  104.         if input_keys[pygame.K_LSHIFT]: packet_keys |= KEY_ZL          # swim
  105.         if input_keys[pygame.K_TAB]:    packet_keys |= KEY_X           # view map
  106.         if input_keys[pygame.K_e]:      packet_keys |= KEY_Y           # reset camera
  107.         if input_keys[pygame.K_q]:      packet_keys |= KEY_RSTICK      # use special
  108.         if input_keys[pygame.K_a]:      packet_joy_l_x += JOYSTICK_MIN # move left
  109.         if input_keys[pygame.K_d]:      packet_joy_l_x += JOYSTICK_MAX # move right
  110.         if input_keys[pygame.K_s]:      packet_joy_l_y += JOYSTICK_MIN # move backward
  111.         if input_keys[pygame.K_w]:      packet_joy_l_y += JOYSTICK_MAX # move forward
  112.        
  113.         # bind general menu controls
  114.         if input_keys[pygame.K_UP]:         packet_keys |= KEY_DUP
  115.         if input_keys[pygame.K_DOWN]:       packet_keys |= KEY_DDOWN
  116.         if input_keys[pygame.K_LEFT]:       packet_keys |= KEY_DLEFT
  117.         if input_keys[pygame.K_RIGHT]:      packet_keys |= KEY_DRIGHT
  118.         if input_keys[pygame.K_RETURN]:     packet_keys |= KEY_A
  119.         if input_keys[pygame.K_BACKSPACE]:  packet_keys |= KEY_B
  120.         if input_keys[pygame.K_1]:          packet_keys |= KEY_A
  121.         if input_keys[pygame.K_2]:          packet_keys |= KEY_B
  122.         if input_keys[pygame.K_3]:          packet_keys |= KEY_X
  123.         if input_keys[pygame.K_4]:          packet_keys |= KEY_Y
  124.         if input_keys[pygame.K_5]:          packet_keys |= KEY_PLUS
  125.         if input_keys[pygame.K_6]:          packet_keys |= KEY_MINUS
  126.        
  127.         # sensitivity
  128.         sens_x = 600
  129.         sens_y = 500
  130.        
  131.         # map mouse movement to joystick
  132.         packet_joy_r_x += (+(input_mouse_pos[0] * sens_x))
  133.         packet_joy_r_y += (-(input_mouse_pos[1] * sens_y))
  134.        
  135.         # bypass the high vertical deadzone (min 4916 to move)
  136.         if packet_joy_r_y > 0: packet_joy_r_y += (+(4916-sens_y))
  137.         if packet_joy_r_y < 0: packet_joy_r_y += (-(4916-sens_y))
  138.        
  139.         # give horizontal movement a start speed similar to vertical
  140.         if packet_joy_r_x > 0: packet_joy_r_x += (+600)
  141.         if packet_joy_r_x < 0: packet_joy_r_x += (-600)
  142.        
  143.         # add a curve to horizontal movement to make it closer to vertical
  144.         if packet_joy_r_x > 0: packet_joy_r_x = int(+(math.pow(+(packet_joy_r_x), 0.7) * 15))
  145.         if packet_joy_r_x < 0: packet_joy_r_x = int(-(math.pow(-(packet_joy_r_x), 0.7) * 15))
  146.        
  147.         # make sure joysticks don't overflow
  148.         if packet_joy_r_x > JOYSTICK_MAX: packet_joy_r_x = JOYSTICK_MAX
  149.         if packet_joy_r_x < JOYSTICK_MIN: packet_joy_r_x = JOYSTICK_MIN
  150.         if packet_joy_r_y > JOYSTICK_MAX: packet_joy_r_y = JOYSTICK_MAX
  151.         if packet_joy_r_y < JOYSTICK_MIN: packet_joy_r_y = JOYSTICK_MIN
  152.        
  153.         packet = b""
  154.         packet += struct.pack("<H", 0x3275)
  155.         packet += struct.pack("<Q", packet_keys)
  156.         packet += struct.pack("<i", packet_joy_l_x)
  157.         packet += struct.pack("<i", packet_joy_l_y)
  158.         packet += struct.pack("<i", packet_joy_r_x)
  159.         packet += struct.pack("<i", packet_joy_r_y)
  160.        
  161.         if toggle_value:
  162.             _socket.sendto(packet, TARGET)
  163.        
  164.         if pygame.key.get_focused():
  165.             pygame.mouse.set_pos((250,250))
  166.        
  167.         screen.fill((0,0,0))
  168.        
  169.         texts = [
  170.             "on: {}".format(toggle_value),
  171.             "keys: 0x{:08X}".format(packet_keys),
  172.             "mouse in: {:+04d} {:+04d}".format(*input_mouse_pos),
  173.             "mouse out: {:+07d} {:+07d}".format(packet_joy_r_x, packet_joy_r_y),
  174.         ]
  175.        
  176.         for idx, val in enumerate(texts):
  177.             screen.blit(font.render(val, True, (255,255,255)), (10,(6+(18*idx))))
  178.        
  179.         pygame.display.flip()
  180.        
  181.         clock.tick(60)
  182.        
  183.         ticks += 1
  184.        
  185.         continue
  186.    
  187.     return 0
  188.  
  189. if __name__ == "__main__":
  190.     sys.exit(main(sys.argv))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement