You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.8 KiB
131 lines
3.8 KiB
6 years ago
|
"""
|
||
|
this file is part of blup. it provides an easy way
|
||
|
to determine the direction the player is leaning
|
||
|
"""
|
||
|
from enum import Enum
|
||
|
import struct
|
||
|
|
||
|
Direction = Enum('BalanceDirection',
|
||
|
['LEFT', 'RIGHT', 'UP', 'DOWN',
|
||
|
'CENTER', 'QUIT'])
|
||
|
|
||
|
|
||
|
def sanitize_threshold(threshold):
|
||
|
"""
|
||
|
function to make sure the threshold is positive
|
||
|
threshold -- the given (untrusted) treshold
|
||
|
"""
|
||
|
if threshold < 0:
|
||
|
threshold = abs(threshold)
|
||
|
return threshold
|
||
|
|
||
|
|
||
|
class BalanceSocket(object):
|
||
|
def __init__(self, balance_server_socket):
|
||
|
self.socket = balance_server_socket
|
||
|
|
||
|
def close(self):
|
||
|
self.socket.close()
|
||
|
|
||
|
def _get_raw_data(self):
|
||
|
self.socket.send(b'a')
|
||
|
data = self.socket.recv(4)
|
||
|
p0x, p0y, p1x, p1y = struct.unpack('bbbb', data)
|
||
|
return p0x, p0y, p1x, p1y
|
||
|
|
||
|
|
||
|
class BalanceUtil(BalanceSocket):
|
||
|
def __init__(self, balance_server_socket, player_id):
|
||
|
"""
|
||
|
BalanceUtil object
|
||
|
balance_socket -- (ip, port) of the balance server
|
||
|
player_id -- id of the player
|
||
|
"""
|
||
|
super(BalanceUtil, self).__init__(balance_server_socket)
|
||
|
self.player_id = player_id
|
||
|
|
||
|
def _get_raw_player_data(self):
|
||
|
self.socket.send(b'a')
|
||
|
data = self.socket.recv(4)
|
||
|
p0x, p0y, p1x, p1y = struct.unpack('bbbb', data)
|
||
|
if self.player_id == 0:
|
||
|
return p0x, p0y
|
||
|
else:
|
||
|
return p1x, p1y
|
||
|
|
||
|
def get_player_ready(self):
|
||
|
"""
|
||
|
check if someone is on the board
|
||
|
:return: true if someone is on the board
|
||
|
"""
|
||
|
p_x, p_y = self._get_raw_player_data()
|
||
|
return p_x > -128 or p_y > -128
|
||
|
|
||
|
def get_raw_2dir_y(self):
|
||
|
"""
|
||
|
Get raw 2-directional data from the y axis of the board.
|
||
|
e.g. determine how fast the paddle is supposed to move
|
||
|
in balance pong
|
||
|
:return: raw y axis balance value
|
||
|
"""
|
||
|
x_bal, y_bal = self._get_raw_player_data()
|
||
|
return y_bal
|
||
|
|
||
|
def get_2dir_y(self, threshold):
|
||
|
threshold = sanitize_threshold(threshold)
|
||
|
x_bal, y_bal = self._get_raw_player_data()
|
||
|
if x_bal == -128 or y_bal == -128:
|
||
|
return Direction.QUIT
|
||
|
elif abs(y_bal) < threshold:
|
||
|
return Direction.CENTER
|
||
|
elif y_bal > 0:
|
||
|
return Direction.UP
|
||
|
else:
|
||
|
return Direction.DOWN
|
||
|
|
||
|
def get_raw_2dir_x(self):
|
||
|
x_bal, y_bal = self._get_raw_player_data()
|
||
|
return x_bal
|
||
|
|
||
|
def get_2dir_x(self, threshold):
|
||
|
threshold = sanitize_threshold(threshold)
|
||
|
x_bal, y_bal = self._get_raw_player_data()
|
||
|
if x_bal == -128 or y_bal == -128:
|
||
|
return Direction.QUIT
|
||
|
elif abs(x_bal) < threshold:
|
||
|
return Direction.CENTER
|
||
|
elif x_bal > 0:
|
||
|
return Direction.RIGHT
|
||
|
else:
|
||
|
return Direction.LEFT
|
||
|
|
||
|
def get_raw_4dir(self):
|
||
|
return self._get_raw_player_data()
|
||
|
|
||
|
def get_4dir(self, threshold):
|
||
|
"""
|
||
|
Get evaluated 4-directional data of the board
|
||
|
e.g. determine the direction and rotation or drop move
|
||
|
in balance tetris
|
||
|
|
||
|
threshold -- deadzone of the board where nothing is
|
||
|
supposed to happen
|
||
|
:return: Enum Direction value of direction or event
|
||
|
"""
|
||
|
threshold = sanitize_threshold(threshold)
|
||
|
x_bal, y_bal = self._get_raw_player_data()
|
||
|
if x_bal == -128 or y_bal == -128:
|
||
|
return Direction.QUIT
|
||
|
elif abs(x_bal) < threshold and abs(y_bal) < threshold:
|
||
|
return Direction.CENTER
|
||
|
elif abs(x_bal) < abs(y_bal):
|
||
|
if y_bal > 0:
|
||
|
return Direction.UP
|
||
|
else:
|
||
|
return Direction.DOWN
|
||
|
else:
|
||
|
if x_bal > 0:
|
||
|
return Direction.RIGHT
|
||
|
else:
|
||
|
return Direction.LEFT
|