You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Dribble/scripts/utils/Behaviors.py

55 lines
2.2 KiB
Python

from agent.Base_Agent import Base_Agent as Agent
from scripts.commons.Script import Script
from scripts.commons.UI import UI
class Behaviors():
def __init__(self,script:Script) -> None:
self.script = script
self.player : Agent = None
def ask_for_behavior(self):
names, descriptions = self.player.behavior.get_all_behaviors()
UI.print_table( [names,descriptions], ["Behavior Name","Description"], numbering=[True,False])
choice, is_str_opt = UI.read_particle('Choose behavior ("" to skip 2 time steps, "b" to beam, ctrl+c to return): ',["","b"],int,[0,len(names)])
if is_str_opt: return choice #skip 2 time steps or quit
return names[choice]
def sync(self):
self.player.scom.commit_and_send( self.player.world.robot.get_command() )
self.player.scom.receive()
def beam(self):
self.player.scom.unofficial_beam((-2.5,0,self.player.world.robot.beam_height),0)
for _ in range(5):
self.sync()
def execute(self):
a = self.script.args
self.player = Agent(a.i, a.p, a.m, a.u, a.r, a.t) # Args: Server IP, Agent Port, Monitor Port, Uniform No., Robot Type, Team Name
behavior = self.player.behavior
self.beam()
self.player.scom.unofficial_set_play_mode("PlayOn")
# Special behaviors
special_behaviors = {"Step":(), "Basic_Kick":(0,), "Walk":((0.5,0),False,0,False,None), "Dribble":(None,None)}
while True:
behavior_name = self.ask_for_behavior()
if behavior_name == 0: # skip 2 time steps (user request)
self.sync()
self.sync()
elif behavior_name == 1: # beam
self.beam()
else:
if behavior_name in special_behaviors: # not using execute_to_completion to abort behavior after a timeout
duration = UI.read_int("For how many time steps [1,1000]? ", 1, 1001)
for _ in range(duration):
if behavior.execute(behavior_name, *special_behaviors[behavior_name]):
break # break if behavior ends
self.sync()
else:
behavior.execute_to_completion(behavior_name)