diff --git a/scripts/HTN/Trees/Red/ConvoyUnit.xml b/scripts/HTN/Trees/Red/ConvoyUnit.xml index 09a952bcb9092bd3c5afdcbea7c3e3aa443f9413..1a11e24c5481727d8625a7761edd2e939bbd1b39 100644 --- a/scripts/HTN/Trees/Red/ConvoyUnit.xml +++ b/scripts/HTN/Trees/Red/ConvoyUnit.xml @@ -57,6 +57,7 @@ goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyRet goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ReturnCompleted") goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyPackUp") goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyPackUpComplete") +goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyWaitAtBaseComplete") </Code> <Import /> </HTNNode> @@ -168,6 +169,8 @@ if state.isCommander(): <Code IsFile="false">from HTNBehaviors import SendUnitEventDelay from HTNBehaviors import SendEntityEvent import cxxi.model.behavior.PythonUtilities as PythonUtilities +from HTNBehaviors import SendEntityEventDelay +from HTNBehaviors import ConvertToJavaList # used whenver the unit finishes moving (any move) borg.redConvoysWaiting[state.getCurrentUnit().getName()].remove(info.getMyAssignedName()) @@ -197,25 +200,48 @@ if len(borg.redConvoysWaiting[state.getCurrentUnit().getName()])==0: SendUnitEventDelay(state.getCurrentUnit().getName(), "GoalTracker_MoveToPoint", ["CONVOY", randSpd, destName], borg.delay) borg.delay=1.0 + # log data + SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "CONVOY_ARRIVED_AT_ASSEMBLY" "" ])], 0) elif moveReason == "CONVOY": # setup off road - cmdName="" - if state.isCommander(): - cmdName = info.getMyAssignedName() - else: - cmdName = state.getCurrentCommander().getAssignedName() + destName = "EMPTY" + if len(borg.redConvoyDest[state.getCurrentUnit().getName()])>0: + destName = borg.redConvoyDest[state.getCurrentUnit().getName()][0] +# printMessage("LOC:"+str(destName), True) - # calculate how long on station they should be - borg.redNumSetups[state.getCurrentUnitName()]=borg.params_redNumSetups + SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "CONVOY_ARRIVED" "" ])], 0.001) - SendEntityEvent(cmdName, "GoalTracker_ConvoySetup", []) - borg.delay=1.0 - # log data - if state.isCommander(): - from HTNBehaviors import SendEntityEventDelay - from HTNBehaviors import ConvertToJavaList - SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "CONVOY_ARRIVED" "" ])], 0) + # note this assumes an ASSEMBLY_LOCATION has been inserted between each location + # also the head of the list is one location ahead hence we check the next location + # is an assembly location if we need to do setups here + if destName == "ASSEMBLY_LOCATION" or destName == "EMPTY": + cmdName="" + if state.isCommander(): + cmdName = info.getMyAssignedName() + else: + cmdName = state.getCurrentCommander().getAssignedName() + + # calculate how long on station they should be + borg.redNumSetups[state.getCurrentUnitName()]=borg.params_redNumSetups + + SendEntityEvent(cmdName, "GoalTracker_ConvoySetup", []) + + else: + # we're at an assembly location, just wait + cmdName="" + if state.isCommander(): + cmdName = info.getMyAssignedName() + else: + cmdName = state.getCurrentCommander().getAssignedName() + + # calculate how long we should wait + randVal = PythonUtilities._py_getRandomNumber("UNIFORM", [0.0, 1.0]) + waitTime = borg.params_redWaitAtBaseForMin + (borg.params_redWaitAtBaseForVar * randVal) + + SendEntityEventDelay(cmdName, "GoalTracker_ConvoyWaitAtBaseComplete", [], waitTime) + # log data + SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "WAIT_AT_BASE" "" ])], 0.001) </Code> <Import /> @@ -429,6 +455,45 @@ if state.isCommander(): from HTNBehaviors import SendEntityEventDelay from HTNBehaviors import ConvertToJavaList SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "PACKUP_COMPLETE" "" ])], 0) +</Code> + <Import /> + </HTNNode> + </HTNNode> + <HTNNode AllowMsg="true" Name="isGoalTracker_ConvoyWaitAtBaseComplete" Type="DEFAULT"> + <Parent>isGoalTracker_ConvoyReturn</Parent> + <Code IsFile="false">if state.getLastTrigger() == "doGoalTracker_ConvoyWaitAtBaseComplete": + _htn_precon_ret=1 +</Code> + <Import /> + <HTNNode AllowMsg="true" Name="waitComplete" Type="INTERRUPT"> + <Parent>isGoalTracker_ConvoyPackUp</Parent> + <Code IsFile="false">import cxxi.model.behavior.PythonUtilities as PythonUtilities +from HTNBehaviors import SendEntityEventDelay +from HTNBehaviors import ConvertToJavaList + +# complete the wait process + +# reset the setup count +borg.redUnitStatus[state.getCurrentUnitName()] = 0 + +# go to next destination + +# get a random speed +if borg.params_randSpdOverride > 0: + randSpd = borg.params_randSpdOverride +else: + randVal = PythonUtilities._py_getRandomNumber("UNIFORM", [0.0, 1.0]) + randSpd = borg.params_randSpdMin + (borg.params_randSpdVar * randVal) + +destName = borg.redConvoyDest[state.getCurrentUnit().getName()][0] +del borg.redConvoyDest[state.getCurrentUnit().getName()][0] + +SendUnitEventDelay(state.getCurrentUnit().getName(), "GoalTracker_MoveToPoint", ["CONVOY", randSpd, destName], borg.delay) +borg.delay=1.0 + +# log data +if state.isCommander(): + SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "WAIT_AT_BASE_COMPLETE" "" ])], 0) </Code> <Import /> </HTNNode> diff --git a/scripts/jump_start.py b/scripts/jump_start.py index 9e353e8d2c0bc395eff305997b73a4057ed4d5ed..cc3656cf88f3916c4be4af4614d9ef42c1d89b23 100644 --- a/scripts/jump_start.py +++ b/scripts/jump_start.py @@ -80,6 +80,10 @@ borg.params_useFakeConvoys = False # use random background traffic borg.params_useRandomMovers = False +# how long to wait at base between training locations +borg.params_redWaitAtBaseForMin = 120 +borg.params_redWaitAtBaseForVar = 0 + # this lets you set the number of destinations to use # if 0 it will be determined randomly how many to use # between 1 and 3