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.
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
7 months ago
|
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)
|