
APT.all-test.MOUTBot.execute-mission.defend.determine-defensive-room-position.soar Maven / Gradle / Ivy
## Overview of heuristics for picking a defensive position in a room
## 0. Propose all nodes in a room
## 0.5 compute range from threat doors to that position
## 1. Reject threat doors of distance 1
## 2. Prefer doors and to other positions
## 3. Prefer connectors to other positions except doors.
## 4. Prefer positions that are farther away, up to defensive-position-far
## Don't want to be close, but don't want to be too far.
## 5. Avoid windows
## What is missing is if are near a door, probably don't want to be at door,
## but maybe at a corner near the door?
## Doesn't calculate dominate positions at all.
sp {defend*propose*determine-defensive-room-position
(state ^name defend
^top-state.map.current-area.node
^objective.defensive-position )
( -^position
^area-achieved true
^type room)
( ^type door)
-->
( ^operator +, = 40)
( ^name determine-defensive-room-position
^node
^type )
}
sp {defend*propose*determine-defensive-room-position*possible-nodes
(state ^name defend
^possible-offset-door-node
^objective.defensive-position )
( -^position
^area-achieved true
^type room)
-->
( ^operator +, = 50)
( ^name determine-defensive-room-position
^node
^type offset-door-node)
}
sp {defend*compare*determine-defensive-room*reject*threat-door
(state ^name defend
^top-state.map.current-area.threat-door
^operator +)
( ^node
^distance 1)
( ^name determine-defensive-room-position
^node )
-->
( ^operator -)
}
sp {defend*elaborate*determine-defensive-room-position*range
(state ^operator +
^top-state.map.current-area.threat-door.node.position )
( ^node.position )
( ^x
^y )
( ^x
^y )
-->
( ^range (compute-range ))}
sp {defend*elaborate*determine-defensive-room-position*closest-range
(state ^operator +)
( ^name determine-defensive-room-position
^range
-^range { < })
-->
( ^closest-range )}
sp {defend*compare*determine-defensive-room-reject-too-close
(state ^name defend
^top-state.parameters.offset-test
^operator +)
( ^name determine-defensive-room-position
^closest-range <
^type )
-->
( ^operator -)
}
sp {defend*elaborate*determine-defensive-room-team*range
(state ^operator +
^top-state.io.input-link )
( ^agent.team
^objects.entity )
( ^position
^team )
( ^name determine-defensive-room-position
^node.position )
( ^x
^y )
( ^x
^y )
-->
( ^teammate-range (compute-range ))}
sp {defend*compare*determine-defensive-room-reject-too-close*team
(state ^name defend
^operator +)
( ^name determine-defensive-room-position
^node
^teammate-range < 20)
-->
(write (crlf) |Reject node because too close to team member.| )
( ^operator -)
}
sp {defend*compare*determine-defensive-room-help-close*team
(state ^name defend
^operator +)
( ^name determine-defensive-room-position
^node
^teammate-range { > 20 < 200 })
-->
(write (crlf) |Prefer node because close to team member.| )
( ^operator = 100)
}
sp {apply*determine-defensive-room-position
(state ^operator
^objective.defensive-position )
( ^name determine-defensive-room-position
^node )
( ^position )
-->
( ^position
^node )
}
#
© 2015 - 2025 Weber Informatics LLC | Privacy Policy