XRWS          Àq   ¾_ext_01.cat ext_01.dat aiscripts/order.dock.xml 1139 1780891205 735caaa7742039e3a999ab8f55ab14b3
aiscripts/order.fight.escort.xml 69099 1780889443 b5de10de6baa20b81dbc8fdcda11cdb8
aiscripts/orders.base.xml 898 1780874704 79fba2fc1aa16e0fa8d0736d0f3eedab
md/escort_ai_globals.xml 2619 1780818293 b47ab0634e72f75d4df8197ed461c93a
md/escort_ai_menu.xml 10173 1780866376 7b4d44a2a4febf2f9eaca9a942109308
md/escort_ai_mod_options.xml 13354 1780818471 7972849a904a147749d97c0ac660ab22
md/escort_ai_update.xml 16989 1780867896 66f60eb80e69aeedacfa5d523a8f0cbd
<?xml version="1.0" encoding="utf-8"?>
<diff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="aiscripts-diff.xsd">

  <!-- Dock fail due to full dock goes away automatically after 1 second -->
  <add sel="//set_order_failed[@order='$thisship.order']" pos="after">
    <do_if value="$internalorder and @global.$escort_ai_autodock and $thisship.isplayerowned and not $thisship.iscapitalship and (@$thisship.defaultorder.id == 'Escort') and (@$thisship.order.id == 'DockAt') and ($thisship.order != $thisship.defaultorder)">
      <wait exact="1s"/>
      <clear_recurring_order_failure object="$thisship" id="$thisship.order.id"/>
    </do_if>
  </add>

  <!-- Home target can also issue dock fail when it is full -->
  <replace sel="//do_if[@value=&quot;(@$thisship.defaultorder.id == 'Escort') and @$thisship.allcommanders.indexof.{$destination}&quot;]/@value">(@$thisship.defaultorder.id == 'Escort') and (@$thisship.allcommanders.indexof.{$destination} or (@$thisship.defaultorder.$alf_home_target.isoperational and ($destination == $thisship.defaultorder.$alf_home_target)))</replace>

</diff>
<?xml version="1.0" encoding="utf-8"?>
<diff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="aiscripts-diff.xsd">

    <!-- The original AI codes are in 08.cat -->

	<!-- =====================================================================
		ALF home target param
	====================================================================== -->
	<add sel="//params/param[@name='debugchance']" pos="after">
		<param name="alf_home_target"
			default="$target"
			type="object"
			text="'ALF Home Target'"
			advanced="true">
			<input_param name="class" value="[class.ship]" />
		</param>
		<param name="alf_restart_tick"
			default="0"
			type="number"
			text="'ALF Restart Tick'"
			advanced="true" />
	</add>

	<!-- =====================================================================
		Set alf_home_target on Escort AI init/restart
	====================================================================== -->
	<add sel="//aiscript/init/set_value[@name='$starttime']" pos="before">
		<do_if value="not @$alf_home_target.isoperational">
			<do_if value="@this.assignedcontrolled.order.id == 'Escort' and @this.assignedcontrolled.order.$alf_home_target.isoperational">
				<set_value name="$alf_home_target" exact="this.assignedcontrolled.order.$alf_home_target" />
			</do_if>
			<do_elseif value="@this.assignedcontrolled.defaultorder.id == 'Escort' and @this.assignedcontrolled.defaultorder.$alf_home_target.isoperational">
				<set_value name="$alf_home_target" exact="this.assignedcontrolled.defaultorder.$alf_home_target" />
			</do_elseif>
			<do_else>
				<set_value name="$alf_home_target" exact="$target" />
			</do_else>
		</do_if>
		<do_if value="@this.assignedcontrolled.order.id == 'Escort' and not @this.assignedcontrolled.order.$alf_home_target.isoperational and @$alf_home_target.isoperational">
			<edit_order_param order="this.assignedcontrolled.order" param="'alf_home_target'" value="$alf_home_target" />
		</do_if>
		<do_if value="@this.assignedcontrolled.defaultorder.id == 'Escort' and not @this.assignedcontrolled.defaultorder.$alf_home_target.isoperational and @$alf_home_target.isoperational">
			<edit_order_param order="this.assignedcontrolled.defaultorder" param="'alf_home_target'" value="$alf_home_target" />
		</do_if>
	</add>

    <!-- =====================================================================
        Autodock toggle                     
    ====================================================================== -->
	<replace sel="//aiscript/init/set_value[@name='$iscarrierbased']">
		<do_if value="this.assignedcontrolled.iscapitalship">
			<set_value name="$iscarrierbased" exact="false" />
		</do_if>
		<do_else>
			<do_if value="@this.assignedcontrolled.isplayerowned">
				<do_if value="@global.$escort_ai_autodock">
					<set_value name="$iscarrierbased" exact="true" />
				</do_if>
				<do_else>
					<set_value name="$iscarrierbased" exact="((@$alf_home_target.type == shiptype.carrier) or this.assignedcontrolled.subordinategroupdockoverride)" />
				</do_else>
				<do_if value="@global.$escort_ai_log_autodock or not $alf_home_target?">
					<write_to_logbook
						category="general"
						title="'[' + player.age + '] ALF Escort AI: Autodock Update'"
						text="'ship=' + @this.assignedcontrolled.idcode + ' ' + @this.assignedcontrolled.knownname +
                        ' | cmd=' + @$target.idcode + ' ' + @$target.knownname +
                        ' | home=' + @$alf_home_target.idcode + ' ' + @$alf_home_target.knownname +
                        '\n| Autodock=' + $iscarrierbased +
                        ' | autodockFlag=' + @global.$escort_ai_autodock" />
				</do_if>
			</do_if>
			<do_else>
				<set_value name="$iscarrierbased" exact="((@$alf_home_target.type == shiptype.carrier) or this.assignedcontrolled.subordinategroupdockoverride)" />
			</do_else>
		</do_else>
	</replace>

	<!--Dock evaluation-->
	<replace sel="//aiscript/init/do_if[@value='$iscarrierbased and $target.isoperational']">
		<do_if value="not this.assignedcontrolled.iscapitalship and $iscarrierbased">
			<do_if value="@$alf_home_target.isoperational">
				<find_dockingbay name="$locdock" object="$alf_home_target">
					<match_dock size="this.assignedcontrolled.docksize" storage="false"/>
				</find_dockingbay>
				<do_if value="@$locdock.isoperational or this.assignedcontrolled.dock">
					<set_value name="$iscarrierbased" exact="true"/>
				</do_if>
				<do_else>
					<set_value name="$iscarrierbased" exact="false"/>
				</do_else>
				<remove_value name="$locdock"/>
			</do_if>
			<do_elseif value="$iscarrierbased and $target.isoperational">
				<find_dockingbay name="$locdock" object="$target">
					<match_dock size="this.assignedcontrolled.docksize" storage="false"/>
				</find_dockingbay>
				<do_if value="not @$locdock.isoperational">
					<set_value name="$iscarrierbased" exact="false"/>
				</do_if>
				<remove_value name="$locdock"/>
			</do_elseif>
		</do_if>
	</replace>


	<!-- =====================================================================
		ALF home target loss handler
	====================================================================== -->
	<add sel="//interrupts/handler[last()]" pos="after">
		<handler comment="ALF home target destroyed">
			<conditions>
				<event_object_destroyed object="if $alf_home_target? then $alf_home_target else $target" check="false" />
				<check_value value="$alf_home_target? and $alf_home_target != $target" />
			</conditions>
			<actions>
				<set_value name="$alf_home_target" exact="$target" />
				<do_if value="@this.assignedcontrolled.order.id == 'Escort'">
					<edit_order_param order="this.assignedcontrolled.order" param="'alf_home_target'" value="$target" />
				</do_if>
				<do_if value="@this.assignedcontrolled.defaultorder.id == 'Escort'">
					<edit_order_param order="this.assignedcontrolled.defaultorder" param="'alf_home_target'" value="$target" />
				</do_if>
				<abort_called_scripts resume="start" />
			</actions>
		</handler>
		<handler comment="ALF home target abandoned">
			<conditions>
				<event_object_abandoned object="if $alf_home_target? then $alf_home_target else $target" check="false" />
				<check_value value="$alf_home_target? and $alf_home_target != $target" />
			</conditions>
			<actions>
				<set_value name="$alf_home_target" exact="$target" />
				<do_if value="@this.assignedcontrolled.order.id == 'Escort'">
					<edit_order_param order="this.assignedcontrolled.order" param="'alf_home_target'" value="$target" />
				</do_if>
				<do_if value="@this.assignedcontrolled.defaultorder.id == 'Escort'">
					<edit_order_param order="this.assignedcontrolled.defaultorder" param="'alf_home_target'" value="$target" />
				</do_if>
				<abort_called_scripts resume="start" />
			</actions>
		</handler>
	</add>


	<!-- =====================================================================
		Home target replacing codes
	====================================================================== -->
    <!--RESUPPLY-->
	<replace sel="//library/actions[@name='CheckToRestock']//do_elseif[@value='@$iscarrierbased and ($target.trueowner == this.trueowner) and $target.cansupplyclass.{this.assignedcontrolled.class} and $target.shiptrader and $target.dockingallowed.{this.assignedcontrolled}']/@value">@$iscarrierbased and (if @$alf_home_target.isoperational then (($alf_home_target.trueowner == this.trueowner) and (@global.$escort_ai_resupply_anywhere or $alf_home_target.cansupplyclass.{this.assignedcontrolled.class}) and $alf_home_target.dockingallowed.{this.assignedcontrolled}) else (($target.trueowner == this.trueowner) and (@global.$escort_ai_resupply_anywhere or $target.cansupplyclass.{this.assignedcontrolled.class}) and $target.dockingallowed.{this.assignedcontrolled}))</replace>
	<replace sel="//library/actions[@name='CheckToRestock']//set_value[@name='$resupplier'][@exact='$target']/@exact">if @$alf_home_target.isoperational then $alf_home_target else $target</replace>
	<replace sel="//attention[@min='visible']//do_if[@value=&quot;event.name == 'event_object_dock_assigned' and $target.assigneddock.container.cansupplyclass.{this.assignedcontrolled.class} and ($target.assigneddock.container.owner == this.owner)&quot;]/@value">event.name == 'event_object_dock_assigned' and (if @$alf_home_target.isoperational then ($alf_home_target.assigneddock.container.cansupplyclass.{this.assignedcontrolled.class} and ($alf_home_target.assigneddock.container.owner == this.owner)) else ($target.assigneddock.container.cansupplyclass.{this.assignedcontrolled.class} and ($target.assigneddock.container.owner == this.owner)))</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value=&quot;event.name == 'event_object_dock_assigned' and $target.assigneddock.container.cansupplyclass.{this.assignedcontrolled.class} and ($target.assigneddock.container.owner == this.owner)&quot;]/@value">event.name == 'event_object_dock_assigned' and (if @$alf_home_target.isoperational then ($alf_home_target.assigneddock.container.cansupplyclass.{this.assignedcontrolled.class} and ($alf_home_target.assigneddock.container.owner == this.owner)) else ($target.assigneddock.container.cansupplyclass.{this.assignedcontrolled.class} and ($target.assigneddock.container.owner == this.owner)))</replace>

	<!--DOCK AT HOME SHIP: visible + unknown-->
	<replace sel="//attention[@min='visible']//do_if[@value='$iscarrierbased and @this.assignedcontrolled.dock.container != $target and (not this.assignedcontrolled.subordinates.count or not @$target.defencenpc.$blockingdockapproach.isoperational or @$target.defencenpc.$blockingdockapproach == this.assignedcontrolled)']/do_if[@value='this.ship.dock']/@value">this.ship.dock and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target}))</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value='$iscarrierbased and @this.assignedcontrolled.dock.container != $target and (not this.assignedcontrolled.subordinates.count or not @$target.defencenpc.$blockingdockapproach.isoperational or @$target.defencenpc.$blockingdockapproach == this.assignedcontrolled)']/do_if[@value='this.ship.dock']/@value">this.ship.dock and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target}))</replace>
	<replace sel="//attention[@min='visible']//do_if[@value='$iscarrierbased and @this.assignedcontrolled.dock.container != $target and (not this.assignedcontrolled.subordinates.count or not @$target.defencenpc.$blockingdockapproach.isoperational or @$target.defencenpc.$blockingdockapproach == this.assignedcontrolled)']/@value">$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target})) and (if @$alf_home_target.isoperational then (not this.assignedcontrolled.subordinates.count or not @$alf_home_target.defencenpc.$blockingdockapproach.isoperational or @$alf_home_target.defencenpc.$blockingdockapproach == this.assignedcontrolled) else (not this.assignedcontrolled.subordinates.count or not @$target.defencenpc.$blockingdockapproach.isoperational or @$target.defencenpc.$blockingdockapproach == this.assignedcontrolled))</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value='$iscarrierbased and @this.assignedcontrolled.dock.container != $target and (not this.assignedcontrolled.subordinates.count or not @$target.defencenpc.$blockingdockapproach.isoperational or @$target.defencenpc.$blockingdockapproach == this.assignedcontrolled)']/@value">$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target})) and (if @$alf_home_target.isoperational then (not this.assignedcontrolled.subordinates.count or not @$alf_home_target.defencenpc.$blockingdockapproach.isoperational or @$alf_home_target.defencenpc.$blockingdockapproach == this.assignedcontrolled) else (not this.assignedcontrolled.subordinates.count or not @$target.defencenpc.$blockingdockapproach.isoperational or @$target.defencenpc.$blockingdockapproach == this.assignedcontrolled))</replace>
	<replace sel="//attention[@min='visible']//create_order[@id=&quot;'DockAt'&quot;]/param[@name='destination'][@value='$target']/@value">if @$alf_home_target.isoperational then $alf_home_target else $target</replace>
	<replace sel="//attention[@min='unknown']//create_order[@id=&quot;'DockAt'&quot;]/param[@name='destination'][@value='$target']/@value">if @$alf_home_target.isoperational then $alf_home_target else $target</replace>

	<!--DOCKED AT HOME SHIP: use home target when checking current dock container-->
	<replace sel="//attention[@min='visible']//do_while[@value=&quot;$target.isoperational and (($target.isplayerowned) or $leaderpilot) and (this.assignedcontrolled.isformationwingman or ($iscarrierbased and @this.assignedcontrolled.dock.container == $target) or $target.dock or (((@$target.order.id == 'DockAndWait') or (@$target.order.id == 'DockAt')) and $target.hascontext.{$target.order.$destination.zone}))&quot;]/@value">$target.isoperational and (($target.isplayerowned) or $leaderpilot) and (this.assignedcontrolled.isformationwingman or ($iscarrierbased and ((@this.assignedcontrolled.dock.container == $target) or (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) or (if @$alf_home_target.isoperational then ($alf_home_target.dock or (((@$alf_home_target.order.id == 'DockAndWait') or (@$alf_home_target.order.id == 'DockAt')) and $alf_home_target.hascontext.{$alf_home_target.order.$destination.zone})) else ($target.dock or (((@$target.order.id == 'DockAndWait') or (@$target.order.id == 'DockAt')) and $target.hascontext.{$target.order.$destination.zone}))))</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value='($iscarrierbased and @this.assignedcontrolled.dock.container == $target) or (@$in_formation and not $objectinhighway?)']/@value">($iscarrierbased and ((@this.assignedcontrolled.dock.container == $target) or (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) or (@$in_formation and not $objectinhighway?)</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value='@this.assignedcontrolled.dock.container != $target']/@value">(@this.assignedcontrolled.dock.container != $target) and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target}))</replace>
	<replace sel="//attention[@min='visible']//do_elseif[@value='(@this.assignedcontrolled.dock.container != $target) and not this.assignedcontrolled.isformationwingman and not this.assignedcontrolled.dock and (player.age ge @$time_rejoinformation)']/@value">(@this.assignedcontrolled.dock.container != $target) and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target})) and not this.assignedcontrolled.isformationwingman and not this.assignedcontrolled.dock and (player.age ge @$time_rejoinformation)</replace>
	<replace sel="//attention[@min='visible']//do_elseif[@value=&quot;$target.dock or (((@$target.order.id == 'DockAndWait') or (@$target.order.id == 'DockAt')) and $target.hascontext.{$target.order.$destination.zone})&quot;]/@value">if @$alf_home_target.isoperational then ($alf_home_target.dock or (((@$alf_home_target.order.id == 'DockAndWait') or (@$alf_home_target.order.id == 'DockAt')) and $alf_home_target.hascontext.{$alf_home_target.order.$destination.zone})) else ($target.dock or (((@$target.order.id == 'DockAndWait') or (@$target.order.id == 'DockAt')) and $target.hascontext.{$target.order.$destination.zone}))</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value=&quot;not this.assignedcontrolled.isformationwingman and not this.assignedcontrolled.dock and not $target.dock and (((@$target.order.id != 'DockAndWait') and (@$target.order.id != 'DockAt')) or not $target.hascontext.{$target.order.$destination.zone}) and (player.age ge @$time_rejoinformation)&quot;]/@value">not this.assignedcontrolled.isformationwingman and not this.assignedcontrolled.dock and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target})) and (if @$alf_home_target.isoperational then (not $alf_home_target.dock and (((@$alf_home_target.order.id != 'DockAndWait') and (@$alf_home_target.order.id != 'DockAt')) or not $alf_home_target.hascontext.{$alf_home_target.order.$destination.zone})) else (not $target.dock and (((@$target.order.id != 'DockAndWait') and (@$target.order.id != 'DockAt')) or not $target.hascontext.{$target.order.$destination.zone}))) and (player.age ge @$time_rejoinformation)</replace>

	<!--DOCKED AT HOME SHIP: player non-capital autodock keeps ships docked at the ALF home target-->
	<replace sel="//attention[@min='visible']//do_elseif[@value='not $iscarrierbased and this.ship.dock']/@value">not $iscarrierbased and this.ship.dock and not (@this.assignedcontrolled.isplayerowned and not this.assignedcontrolled.iscapitalship and @global.$escort_ai_autodock and @$alf_home_target.isoperational and (($alf_home_target != $target) or (@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target}))</replace>
	<replace sel="//attention[@min='unknown']//do_elseif[@value='not $iscarrierbased and this.ship.dock']/@value">not $iscarrierbased and this.ship.dock and not (@this.assignedcontrolled.isplayerowned and not this.assignedcontrolled.iscapitalship and @global.$escort_ai_autodock and @$alf_home_target.isoperational and (($alf_home_target != $target) or (@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target}))</replace>

    <!--BLOCKING DOCK APPROACH: use home ship defence NPC-->
	<replace sel="//attention[@min='visible']//do_if[@value='not @$target.defencenpc.$blockingdockapproach.isoperational and this.assignedcontrolled.subordinates.count']">
		<do_if value="@this.assignedcontrolled.subordinates.count">
			<do_if value="@$alf_home_target.isoperational">
				<do_if value="not @$alf_home_target.defencenpc.$blockingdockapproach.isoperational">
					<set_value name="$alf_home_target.defencenpc.$blockingdockapproach" exact="this.assignedcontrolled"/>
				</do_if>
			</do_if>
			<do_else>
				<do_if value="not @$target.defencenpc.$blockingdockapproach.isoperational">
					<set_value name="$target.defencenpc.$blockingdockapproach" exact="this.assignedcontrolled"/>
				</do_if>
			</do_else>
		</do_if>
	</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value='not @$target.defencenpc.$blockingdockapproach.isoperational and this.assignedcontrolled.subordinates.count']">
		<do_if value="@this.assignedcontrolled.subordinates.count">
			<do_if value="@$alf_home_target.isoperational">
				<do_if value="not @$alf_home_target.defencenpc.$blockingdockapproach.isoperational">
					<set_value name="$alf_home_target.defencenpc.$blockingdockapproach" exact="this.assignedcontrolled"/>
				</do_if>
			</do_if>
			<do_else>
				<do_if value="not @$target.defencenpc.$blockingdockapproach.isoperational">
					<set_value name="$target.defencenpc.$blockingdockapproach" exact="this.assignedcontrolled"/>
				</do_if>
			</do_else>
		</do_if>
	</replace>

	<!--COMMANDER DOCKED: docked player carrierbased ships stay at home instead of following commander dock redirects-->
	<replace sel="//attention[@min='visible']//do_elseif[@value=&quot;(@$target.defaultorder.id == 'Escort') and $target.dock and ($target.order.id != 'Undock') and not this.assignedcontrolled.iscapitalship and ($target == this.assignedcontrolled.commander)&quot;]/@value">(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and (@$target.defaultorder.id == 'Escort') and $target.dock and ($target.order.id != 'Undock') and not this.assignedcontrolled.iscapitalship and ($target == this.assignedcontrolled.commander)</replace>
	<replace sel="//attention[@min='unknown']//do_elseif[@value=&quot;(@$target.defaultorder.id == 'Escort') and $target.dock and ($target.order.id != 'Undock') and not this.assignedcontrolled.iscapitalship and ($target == this.assignedcontrolled.commander)&quot;]/@value">(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and (@$target.defaultorder.id == 'Escort') and $target.dock and ($target.order.id != 'Undock') and not this.assignedcontrolled.iscapitalship and ($target == this.assignedcontrolled.commander)</replace>

	<!--DOCK EVENTS: use home ship for dock-related events while ALF home target is valid-->
	<replace sel="//attention[@min='visible']//event_object_undocked[@object='$target']">
		<check_any>
			<check_all>
				<event_object_undocked object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
			</check_all>
			<check_all>
				<event_object_undocked object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
			</check_all>
		</check_any>
	</replace>
	<replace sel="//attention[@min='unknown']//wait/interrupt/conditions/check_any/event_object_undocked[@object='$target']">
		<check_any>
			<check_all>
				<event_object_undocked object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
			</check_all>
			<check_all>
				<event_object_undocked object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
			</check_all>
		</check_any>
	</replace>
	<replace sel="//attention[@min='unknown']//move_to//interrupt/conditions/check_any/event_object_undocked[@object='$target']">
		<check_any>
			<check_all>
				<event_object_undocked object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
			</check_all>
			<check_all>
				<event_object_undocked object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
			</check_all>
		</check_any>
	</replace>
	<replace sel="//attention[@min='visible']//event_object_dock_assigned[@object='$target']">
		<check_any>
			<check_all>
				<event_object_dock_assigned object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
			</check_all>
			<check_all>
				<event_object_dock_assigned object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
			</check_all>
		</check_any>
	</replace>
	<replace sel="//attention[@min='unknown']//wait/interrupt/conditions/check_any/event_object_dock_assigned[@object='$target']">
		<check_any>
			<check_all>
				<event_object_dock_assigned object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
			</check_all>
			<check_all>
				<event_object_dock_assigned object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
			</check_all>
		</check_any>
	</replace>
	<replace sel="//attention[@min='unknown']//move_to//interrupt/conditions/check_any/event_object_dock_assigned[@object='$target']">
		<check_any>
			<check_all>
				<event_object_dock_assigned object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
			</check_all>
			<check_all>
				<event_object_dock_assigned object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
			</check_all>
		</check_any>
	</replace>
	<!--COMMANDER FAR AWAY: player carrierbased ships docked at home do not undock for distant follow-->
	<replace sel="//attention[@min='visible']/actions/do_if[@value='(this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)']/@value">(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and (if @$alf_home_target.isoperational then ((this.sector != $alf_home_target.sector) or (((not this.assignedcontrolled.iscapitalship and not $alf_home_target.zone.isclass.highway) or this.zone != $alf_home_target.zone) and this.assignedcontrolled.bboxdistanceto.{$alf_home_target} gt [10km, $formationparam].max)) else ((this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)))</replace>
	<replace sel="//attention[@min='visible']//do_if[@value='$target.isoperational']/do_if[@value='(this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)']/@value">(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and (if @$alf_home_target.isoperational then ((this.sector != $alf_home_target.sector) or (((not this.assignedcontrolled.iscapitalship and not $alf_home_target.zone.isclass.highway) or this.zone != $alf_home_target.zone) and this.assignedcontrolled.bboxdistanceto.{$alf_home_target} gt [10km, $formationparam].max)) else ((this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)))</replace>
	<replace sel="//attention[@min='unknown']/actions/do_if[@value='(this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)']/@value">(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and (if @$alf_home_target.isoperational then ((this.sector != $alf_home_target.sector) or (((not this.assignedcontrolled.iscapitalship and not $alf_home_target.zone.isclass.highway) or this.zone != $alf_home_target.zone) and this.assignedcontrolled.bboxdistanceto.{$alf_home_target} gt [10km, $formationparam].max)) else ((this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)))</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value='$target.isoperational']/do_if[@value='(this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)']/@value">(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and (if @$alf_home_target.isoperational then ((this.sector != $alf_home_target.sector) or (((not this.assignedcontrolled.iscapitalship and not $alf_home_target.zone.isclass.highway) or this.zone != $alf_home_target.zone) and this.assignedcontrolled.bboxdistanceto.{$alf_home_target} gt [10km, $formationparam].max)) else ((this.sector != $target.sector) or (((not this.assignedcontrolled.iscapitalship and not $target.zone.isclass.highway) or this.zone != $target.zone) and this.assignedcontrolled.bboxdistanceto.{$target} gt [10km, $formationparam].max)))</replace>
	<replace sel="//attention[@min='visible']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='destination'][@value='$target']/@value">if @$alf_home_target.isoperational then $alf_home_target else $target</replace>
	<replace sel="//attention[@min='unknown']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='destination'][@value='$target']/@value">if @$alf_home_target.isoperational then $alf_home_target else $target</replace>
	<replace sel="//attention[@min='visible']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='endintargetzone'][@value='this.assignedcontrolled.iscapitalship or $target.zone.isclass.highway']/@value">this.assignedcontrolled.iscapitalship or (if @$alf_home_target.isoperational then $alf_home_target.zone.isclass.highway else $target.zone.isclass.highway)</replace>
	<replace sel="//attention[@min='unknown']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='endintargetzone'][@value='this.assignedcontrolled.iscapitalship or $target.zone.isclass.highway']/@value">this.assignedcontrolled.iscapitalship or (if @$alf_home_target.isoperational then $alf_home_target.zone.isclass.highway else $target.zone.isclass.highway)</replace>
	<replace sel="//attention[@min='visible']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='radiusanchorspace'][@value='$target']/@value">if @$alf_home_target.isoperational then $alf_home_target else $target</replace>
	<replace sel="//attention[@min='unknown']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='radiusanchorspace'][@value='$target']/@value">if @$alf_home_target.isoperational then $alf_home_target else $target</replace>
	<replace sel="//attention[@min='visible']//do_if[@value='this.assignedcontrolled.gatedistance.{$target} ge 0']/@value">if @$alf_home_target.isoperational then (this.assignedcontrolled.gatedistance.{$alf_home_target} ge 0) else (this.assignedcontrolled.gatedistance.{$target} ge 0)</replace>
	<replace sel="//attention[@min='unknown']//do_if[@value='this.assignedcontrolled.gatedistance.{$target} ge 0']/@value">if @$alf_home_target.isoperational then (this.assignedcontrolled.gatedistance.{$alf_home_target} ge 0) else (this.assignedcontrolled.gatedistance.{$target} ge 0)</replace>

	<!--COMMANDER FAR AWAY EVENTS: zone-change wakeups follow home target, but player non-capital autodock blocks them-->
	<replace sel="//attention[@min='visible']//check_all[event_object_changed_zone[@object='$target']][check_value[@value='$target.zone.isclass.highway or $target.sector != this.sector']]">
		<check_any>
			<check_all>
				<event_object_changed_zone object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
				<check_value value="$target.zone.isclass.highway or $target.sector != this.sector"/>
			</check_all>
			<check_all>
				<event_object_changed_zone object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
				<check_value value="$alf_home_target.zone.isclass.highway or $alf_home_target.sector != this.sector"/>
			</check_all>
		</check_any>
	</replace>
	<replace sel="//attention[@min='unknown']//check_all[event_object_changed_zone[@object='$target']][check_value[@value='$target.zone.isclass.highway or $target.sector != this.sector']]">
		<check_any>
			<check_all>
				<event_object_changed_zone object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
				<check_value value="$target.zone.isclass.highway or $target.sector != this.sector"/>
			</check_all>
			<check_all>
				<event_object_changed_zone object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
				<check_value value="$alf_home_target.zone.isclass.highway or $alf_home_target.sector != this.sector"/>
			</check_all>
		</check_any>
	</replace>
	<replace sel="//attention[@min='unknown']//move_to//interrupt/conditions/check_any/event_object_changed_zone[@object='$target']">
		<check_any>
			<check_all>
				<event_object_changed_zone object="$target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and not (@$alf_home_target.isoperational and $alf_home_target != $target)"/>
			</check_all>
			<check_all>
				<event_object_changed_zone object="if $alf_home_target? then $alf_home_target else $target"/>
				<check_value value="(not @this.assignedcontrolled.isplayerowned or not @$iscarrierbased or (@$iscarrierbased and not (@$alf_home_target.isoperational and ((@this.assignedcontrolled.dock.container == $alf_home_target) or @this.assignedcontrolled.dock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.assigneddock.container == $alf_home_target) or @this.assignedcontrolled.assigneddock.container.hascontext.{$alf_home_target} or (@this.assignedcontrolled.container == $alf_home_target) or @this.assignedcontrolled.container.hascontext.{$alf_home_target} or @this.assignedcontrolled.hascontext.{$alf_home_target} or $alf_home_target.hascontext.{this.assignedcontrolled} or (@this.assignedcontrolled.parkedat == $alf_home_target) or @this.assignedcontrolled.parkedat.hascontext.{$alf_home_target} or (((@this.assignedcontrolled.order.id == 'DockAt') or (@this.assignedcontrolled.order.id == 'DockAndWait')) and @this.assignedcontrolled.order.$destination == $alf_home_target))))) and @$alf_home_target.isoperational and $alf_home_target != $target"/>
			</check_all>
		</check_any>
	</replace>

	<!-- =====================================================================
        COMMON: attack order target class changes
    ====================================================================== -->
    <replace sel="//do_elseif[@value='$assignment == assignment.bombardment and @$loccontact.iscapitalship']/@value">$assignment == assignment.bombardment and (@$loccontact.iscapitalship or $loccontact.isclass.station)</replace>
    <replace sel="//attention[@min='visible']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='targetclasses'][@value=&quot;if (this.assignedcontrolled.assignment == assignment.interception) then [class.ship_s, class.ship_m] else (if (this.assignedcontrolled.assignment == assignment.bombardment) then [class.ship_l, class.ship_xl] else [])&quot;]/@value">if (this.assignedcontrolled.assignment == assignment.interception) then [class.ship_s, class.ship_m] else (if (this.assignedcontrolled.assignment == assignment.bombardment) then [class.ship_l, class.ship_xl, class.station] else [])</replace>
    <replace sel="//attention[@min='unknown']//run_script[@name=&quot;'move.generic'&quot;]/param[@name='targetclasses'][@value=&quot;if (this.assignedcontrolled.assignment == assignment.interception) then [class.ship_s, class.ship_m] else (if (this.assignedcontrolled.assignment == assignment.bombardment) then [class.ship_l, class.ship_xl] else [])&quot;]/@value">if (this.assignedcontrolled.assignment == assignment.interception) then [class.ship_s, class.ship_m] else (if (this.assignedcontrolled.assignment == assignment.bombardment) then [class.ship_l, class.ship_xl, class.station] else [])</replace>
    <replace sel="//attention[@min='visible']//do_if[@value='this.assignedcontrolled.assignment == assignment.bombardment']/set_value[@name='$loctargetclasses'][@exact='[class.ship_l, class.ship_xl]']/@exact">[class.ship_l, class.ship_xl, class.station]</replace>
    <replace sel="//attention[@min='unknown']//do_if[@value='this.assignedcontrolled.assignment == assignment.bombardment']/set_value[@name='$loctargetclasses'][@exact='[class.ship_l, class.ship_xl]']/@exact">[class.ship_l, class.ship_xl, class.station]</replace>
    <replace sel="(//attention[@min='visible']//check_all[check_value[@value='$assignment == assignment.bombardment']])[1]/check_value[@value='event.param.isclass.ship and event.param.iscapitalship']/@value">event.param.isclass.station or (event.param.isclass.ship and event.param.iscapitalship)</replace>
    <replace sel="(//attention[@min='visible']//check_all[check_value[@value='$assignment == assignment.bombardment']])[2]/check_value[@value='event.param.isclass.ship and event.param.iscapitalship']/@value">event.param.isclass.station or (event.param.isclass.ship and event.param.iscapitalship)</replace>
    <replace sel="(//attention[@min='unknown']//check_all[check_value[@value='$assignment == assignment.bombardment']])[1]/check_value[@value='event.param.isclass.ship and event.param.iscapitalship']/@value">event.param.isclass.station or (event.param.isclass.ship and event.param.iscapitalship)</replace>
    <replace sel="(//attention[@min='unknown']//check_all[check_value[@value='$assignment == assignment.bombardment']])[2]/check_value[@value='event.param.isclass.ship and event.param.iscapitalship']/@value">event.param.isclass.station or (event.param.isclass.ship and event.param.iscapitalship)</replace>
    <replace sel="//do_if[contains(@value, 'carrier scramble') and contains(@value, 'event_player_changed_target')]/@value">((event.name == 'event_object_signalled') and (($params.{2} == 'break and attack') or ($params.{2} == 'carrier scramble'))) or ((event.name == 'event_object_enemy_found') and ($assignment == assignment.interception) and $enemy.isclass.ship and not $enemy.iscapitalship) or ((event.name == 'event_object_enemy_found') and ($assignment == assignment.bombardment) and (($enemy.isclass.ship and $enemy.iscapitalship) or $enemy.isclass.station)) or ((event.name == 'event_contained_object_relation_range_changed') and ((($assignment == assignment.interception) and not @$enemy.iscapitalship) or (($assignment == assignment.bombardment) and ($enemy.iscapitalship or $enemy.isclass.station)))) or (event.name == 'event_player_changed_target')</replace>
    <replace sel="//library/actions[@name='CreateAttackOrder']//param[@name='targetclasses']/@value">if ($assignment == assignment.defence) then [class.ship_xs, class.ship_s, class.ship_m, class.ship_l, class.ship_xl] else (if ($assignment == assignment.interception) then [class.ship_s, class.ship_m] else (if ($assignment == assignment.bombardment) then [class.ship_l, class.ship_xl, class.station] else []))</replace>


    <!-- =====================================================================
        COMMON: default pursue distance links to global vars
    ====================================================================== -->
    <replace sel="//params/param[@name='pursuedistance']/@default">if this.ship.isplayerowned then (if this.ship.assignment == assignment.defence then global.$escort_range_defence else if this.ship.assignment == assignment.attack then global.$escort_range_attack else if this.ship.assignment == assignment.interception then global.$escort_range_interception else if this.ship.assignment == assignment.bombardment then global.$escort_range_bombardment else 20km) else [@$target.maxradarrange, this.ship.maxradarrange, 1km].max</replace>


    <!-- =====================================================================
        LOGBOOK: attack order log
    ====================================================================== -->
    <add sel="//library/actions[@name='CreateAttackOrder']/do_elseif[@value='@$enemy.canbeattacked']/set_value[@name='$internalordercalled']" pos="before">
        <do_if value="(@this.assignedcontrolled.isplayerowned and global.$escort_ai_log_attack_order) or not $alf_home_target?">
            <write_to_logbook
                category="general"
                title="'[' + player.age + '] ALF Escort AI: Attack Order'"
                text="@this.assignedcontrolled.idcode + ' ' + @this.assignedcontrolled.knownname + '\n' +
                    'cmd=' + @$target.idcode + ' ' + @$target.knownname +
                    ' | home=' + @$alf_home_target.idcode + ' ' + @$alf_home_target.knownname +
                    ' | enemy=' + @$enemy.idcode + ' ' + @$enemy.knownname + '\n' +
                    'assignment=' + $assignment +
                    ' | pursueDist=' + $pursuedistance +
                    ' | enemyDist=' + (if @$target.exists and @$enemy.exists then $target.distanceto.{$enemy} else -1)" />
        </do_if>
    </add>

</diff>
<?xml version="1.0" encoding="utf-8"?>
<diff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="aiscripts-diff.xsd">

	<!--ALF home target: orders.base treats the Escort home target as a valid parking container.-->
	<replace sel="//do_elseif[@value=&quot;$object.order.id == 'Escort' and (not $object.allcommanders.indexof.{$parkingcontainer} or $object.parkedat)&quot;]/@value">$object.order.id == 'Escort' and not (@$object.order.$alf_home_target.isoperational and @$object.order.$target.isoperational and ($object.order.$alf_home_target != $object.order.$target) and (($parkingcontainer == $object.order.$alf_home_target) or @$parkingcontainer.hascontext.{$object.order.$alf_home_target} or @$object.order.$alf_home_target.hascontext.{$parkingcontainer})) and (not $object.allcommanders.indexof.{$parkingcontainer} or $object.parkedat)</replace>

</diff>
<?xml version="1.0" encoding="utf-8" ?>
<mdscript name="escort_ai_globals"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="md.xsd">
  <cues>
    <cue name="escort_range_create_globals" instantiate="true" namespace="this">
      <conditions>
        <check_any>
          <event_game_loaded />
          <event_game_started />
        </check_any>
      </conditions>
      <actions>
        <do_if value="not global.$escort_ai_autodock?">
          <set_value name="global.$escort_ai_autodock" exact="false"/>
        </do_if>
        <do_if value="not global.$escort_ai_resupply_anywhere?">
          <set_value name="global.$escort_ai_resupply_anywhere" exact="false"/>
        </do_if>

        <do_if value="not global.$escort_range_defence?">
          <set_value name="global.$escort_range_defence" exact="20km"/>
        </do_if>
        <do_if value="not global.$escort_range_attack?">
          <set_value name="global.$escort_range_attack" exact="20km"/>
        </do_if>
        <do_if value="not global.$escort_range_interception?">
          <set_value name="global.$escort_range_interception" exact="20km"/>
        </do_if>
        <do_if value="not global.$escort_range_bombardment?">
          <set_value name="global.$escort_range_bombardment" exact="20km"/>
        </do_if>

        <do_if value="not global.$escort_range_lastchange_time?">
          <set_value name="global.$escort_range_lastchange_time" exact="0s"/>
        </do_if>

        <do_if value="not global.$escort_ai_log_update?">
          <set_value name="global.$escort_ai_log_update" exact="false"/>
        </do_if>
        <do_if value="not global.$escort_ai_log_new_home?">
          <set_value name="global.$escort_ai_log_new_home" exact="false"/>
        </do_if>
        <do_if value="not global.$escort_ai_log_attack_order?">
          <set_value name="global.$escort_ai_log_attack_order" exact="false"/>
        </do_if>
        <do_if value="not global.$escort_ai_log_autodock?">
          <set_value name="global.$escort_ai_log_autodock" exact="false"/>
        </do_if>

        <write_to_logbook category="general"
                          title="'ALF Escort AI Range'"
                          text="'MD loaded. Defence=' + (global.$escort_range_defence / 1km)i + ' Attack=' + (global.$escort_range_attack / 1km)i + ' Interception=' + (global.$escort_range_interception / 1km)i + ' Bombardment=' + (global.$escort_range_bombardment / 1km)i + ' km'" />
      </actions>
    </cue>
  </cues>
</mdscript>
<?xml version="1.0" encoding="utf-8"?>
<mdscript name="escort_ai_menu"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../../src/md/md.xsd">

  <cues>

    <cue name="Add_Interact_Actions" instantiate="true">
      <conditions>
        <event_cue_signalled cue="md.Interact_Menu_API.Get_Actions" />
      </conditions>

      <actions>

        <!-- Clicked/right-clicked ship. This is the new escort target. -->
        <do_if value="event.param.$object? and event.param.$object.exists and event.param.$object.isclass.ship and event.param.$object.trueowner == faction.player">
          <set_value name="$home_target" exact="event.param.$object" />
          <create_list name="$ships_to_update" />
          <create_list name="$clicked_ship_to_remove_home" />
          <create_list name="$ships_to_remove_home" />

          <!-- Remove home target: clicked/right-clicked ship is part of the affected selection. -->
          <do_if value="$home_target.commander?">
            <set_value name="$order_home_target" exact="null" />
            <set_value name="$default_home_target" exact="null" />
            <set_value name="$needs_update" exact="false" />

            <do_if value="$home_target.order? and @$home_target.order.id == 'Escort' and @$home_target.order.$target.isoperational">
              <set_value name="$order_home_target" exact="$home_target.order.$target" />
              <set_value name="$needs_update" exact="true" />
            </do_if>

            <do_if value="$home_target.defaultorder? and @$home_target.defaultorder.id == 'Escort' and $home_target.defaultorder != $home_target.order and @$home_target.defaultorder.$target.isoperational">
              <set_value name="$default_home_target" exact="$home_target.defaultorder.$target" />
              <set_value name="$needs_update" exact="true" />
            </do_if>

            <do_if value="$needs_update">
              <append_to_list name="$clicked_ship_to_remove_home"
                  exact="table[
                    $ship = $home_target,
                    $order_home_target = $order_home_target,
                    $default_home_target = $default_home_target,
                    $remove_home = true
                  ]" />
              <append_to_list name="$ships_to_remove_home"
                  exact="table[
                    $ship = $home_target,
                    $order_home_target = $order_home_target,
                    $default_home_target = $default_home_target,
                    $remove_home = true
                  ]" />
            </do_if>

            <remove_value name="$order_home_target" />
            <remove_value name="$default_home_target" />
            <remove_value name="$needs_update" />
          </do_if>

          <do_if value="event.param.$selectedplayerships?">
            <do_for_each name="$selectedship" in="event.param.$selectedplayerships">
              <set_value name="$order_home_target" exact="null" />
              <set_value name="$default_home_target" exact="null" />
              <set_value name="$needs_update" exact="false" />

              <!-- Selected ship must be a valid player ship under a commander/fleet. -->
              <do_if value="$selectedship and $selectedship.exists and $selectedship.isclass.ship and not $selectedship.iscapitalship and $selectedship.trueowner == faction.player and $selectedship.commander?">
                <!-- Active Escort order: set alf_home_target to clicked escort target. -->
                <do_if value="$selectedship.order? and @$selectedship.order.id == 'Escort'">
                  <set_value name="$order_home_target" exact="$home_target" />
                  <set_value name="$needs_update" exact="true" />
                </do_if>

                <!-- Default Escort order: set alf_home_target to clicked escort target. If defaultorder == order, active update already covers it. -->
                <do_if value="$selectedship.defaultorder? and @$selectedship.defaultorder.id == 'Escort' and $selectedship.defaultorder != $selectedship.order">
                  <set_value name="$default_home_target" exact="$home_target" />
                  <set_value name="$needs_update" exact="true" />
                </do_if>
              </do_if>

              <!-- Add one prepared update entry per selected ship. -->
              <do_if value="$needs_update">
                <append_to_list name="$ships_to_update"
                    exact="table[
                      $ship = $selectedship,
                      $order_home_target = $order_home_target,
                      $default_home_target = $default_home_target
                    ]" />
              </do_if>

              <remove_value name="$order_home_target" />
              <remove_value name="$default_home_target" />
              <remove_value name="$needs_update" />

              <!-- Remove home target: selected ships are also affected. -->
              <set_value name="$order_home_target" exact="null" />
              <set_value name="$default_home_target" exact="null" />
              <set_value name="$needs_update" exact="false" />

              <do_if value="$selectedship and $selectedship.exists and $selectedship.isclass.ship and $selectedship.trueowner == faction.player and $selectedship.commander?">
                <do_if value="$selectedship.order? and @$selectedship.order.id == 'Escort' and @$selectedship.order.$target.isoperational">
                  <set_value name="$order_home_target" exact="$selectedship.order.$target" />
                  <set_value name="$needs_update" exact="true" />
                </do_if>

                <do_if value="$selectedship.defaultorder? and @$selectedship.defaultorder.id == 'Escort' and $selectedship.defaultorder != $selectedship.order and @$selectedship.defaultorder.$target.isoperational">
                  <set_value name="$default_home_target" exact="$selectedship.defaultorder.$target" />
                  <set_value name="$needs_update" exact="true" />
                </do_if>
              </do_if>

              <do_if value="$needs_update">
                <append_to_list name="$ships_to_remove_home"
                    exact="table[
                      $ship = $selectedship,
                      $order_home_target = $order_home_target,
                      $default_home_target = $default_home_target,
                      $remove_home = true
                    ]" />
              </do_if>

              <remove_value name="$order_home_target" />
              <remove_value name="$default_home_target" />
              <remove_value name="$needs_update" />
            </do_for_each>
          </do_if>

          <!-- Only add right-click menu action if at least one selected ship can be updated. -->
          <do_if value="$ships_to_update.count">
            <signal_cue_instantly
                cue="md.Interact_Menu_API.Add_Action"
                param="table[
                  $id = 'alf_set_home_target',
                  $section = 'selected_orders_all',
                  $text = 'Set this ship as home target',
                  $callback = md.escort_ai_menu.new_home_target,
                  $echo = table[$ships_to_update = $ships_to_update]
                ]" />

            <do_if value="global.$escort_ai_log_new_home">
              <do_for_each name="$ship_to_update" in="$ships_to_update">
                <write_to_logbook
                    category="general"
                    title="'[ ' + player.age + ' ] ALF Escort AI: Ships selected for home target update'"
                    text="'ShipID: ' + @$ship_to_update.$ship.idcode + ' | cmd=' + @$ship_to_update.$ship.commander.idcode +
                          ' | AO Escort: ' + (if @$ship_to_update.$order_home_target.isoperational then @$ship_to_update.$order_home_target.idcode else 'null') +
                          ' | DO Escort: ' + (if @$ship_to_update.$default_home_target.isoperational then @$ship_to_update.$default_home_target.idcode else 'null')" />
              </do_for_each>
            </do_if>
          </do_if>

          <!-- Remove home target resets alf_home_target back to each Escort order's target. -->
          <do_if value="$clicked_ship_to_remove_home.count and not event.param.$selectedplayerships?">
            <signal_cue_instantly
                cue="md.Interact_Menu_API.Add_Action"
                param="table[
                  $id = 'alf_remove_home_target_main',
                  $section = 'main',
                  $text = 'Remove home target',
                  $callback = md.escort_ai_menu.new_home_target,
                  $echo = table[$ships_to_update = $clicked_ship_to_remove_home]
                ]" />
          </do_if>

          <do_if value="$ships_to_remove_home.count">
            <signal_cue_instantly
                cue="md.Interact_Menu_API.Add_Action"
                param="table[
                  $id = 'alf_remove_home_target',
                  $section = 'selected_orders_all',
                  $text = 'Remove home target',
                  $callback = md.escort_ai_menu.new_home_target,
                  $echo = table[$ships_to_update = $ships_to_remove_home]
                ]" />
          </do_if>

          <remove_value name="$home_target" />
          <remove_value name="$ships_to_update" />
          <remove_value name="$clicked_ship_to_remove_home" />
          <remove_value name="$ships_to_remove_home" />
        </do_if>
      </actions>
    </cue>

    <cue name="new_home_target" instantiate="true">
      <conditions>
        <event_cue_signalled />
      </conditions>
      <actions>
        <do_if value="event.param.$echo? and event.param.$echo.$ships_to_update? and event.param.$echo.$ships_to_update.count">
          <signal_cue_instantly
              cue="md.escort_ai_update.alf_update_home_target"
              param="table[
                $ships_to_update = event.param.$echo.$ships_to_update,
                $log = global.$escort_ai_log_new_home
              ]" />
        </do_if>
      </actions>
    </cue>

  </cues>
</mdscript>
<?xml version="1.0" encoding="utf-8"?>
<mdscript name="escort_ai_mod_options"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="md.xsd">
  <cues>

    <cue name="Create_Options_Menu" instantiate="true">
      <conditions>
        <event_cue_signalled cue="md.Simple_Menu_API.Reloaded" />
      </conditions>
      <actions>
        <signal_cue_instantly cue="md.Simple_Menu_API.Register_Options_Menu"
            param="table[
              $id      = 'escort_ai_menu',
              $title   = 'Escort AI Settings',
              $onOpen  = Create_Menu,
              $columns = 2
            ]" />
        <reset_cue cue="this" />
      </actions>
    </cue>

    <cue name="Create_Menu"
        instantiate="true"
        namespace="this">
      <conditions>
        <event_cue_signalled />
      </conditions>
      <actions>

        <!-- Force autodock if enabled. -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Force escort autodock'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_CheckBox"
            param="table[
              $id = 'escort_ai_autodock',
              $checked = global.$escort_ai_autodock,
              $col = 2,
              $width = 'Helper.standardButtonHeight',
              $height = 'Helper.standardButtonHeight',
              $echo = table[$global='$escort_ai_autodock', $label='Force escort autodock'],
              $onClick = OnChange_Flag
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Force escort resupply anywhere'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_CheckBox"
            param="table[
              $id = 'escort_ai_resupply_anywhere',
              $checked = global.$escort_ai_resupply_anywhere,
              $col = 2,
              $width = 'Helper.standardButtonHeight',
              $height = 'Helper.standardButtonHeight',
              $echo = table[$global='$escort_ai_resupply_anywhere', $label='Force escort resupply anywhere'],
              $onClick = OnChange_Flag
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Log autodock actions in player logbook'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_CheckBox"
            param="table[
              $id = 'escort_ai_log_autodock',
              $checked = global.$escort_ai_log_autodock,
              $col = 2,
              $width = 'Helper.standardButtonHeight',
              $height = 'Helper.standardButtonHeight',
              $echo = table[$global='$escort_ai_log_autodock', $label='Autodock action logbook logging'],
              $onClick = OnChange_Flag
            ]" />


        <!-- Spacer -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" 
            param="table[ $selectable = false, $interactive = false, $borderBelow = true ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[ $col = 1, $colSpan = 2, $text = ' ', $minRowHeight = 4 ]" />


        <!-- Range settings -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row"
            param="table[
              $selectable = false,
              $interactive = false
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col     = 1,
              $colSpan = 2,
              $text    = 'Escort Pursue Range Settings'
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Defence'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Slider"
            param="table[
              $id = 'escort_range_defence',
              $col = 2,
              $min = 5,
              $max = 80,
              $start = global.$escort_range_defence / 1km,
              $step = 1,
              $suffix = ' km',
              $echo = table[$key='defence'],
              $onSliderCellConfirm = OnChange_Range
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Attack'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Slider"
            param="table[
              $id = 'escort_range_attack',
              $col = 2,
              $min = 5,
              $max = 80,
              $start = global.$escort_range_attack / 1km,
              $step = 1,
              $suffix = ' km',
              $echo = table[$key='attack'],
              $onSliderCellConfirm = OnChange_Range
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Interception'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Slider"
            param="table[
              $id = 'escort_range_interception',
              $col = 2,
              $min = 5,
              $max = 80,
              $start = global.$escort_range_interception / 1km,
              $step = 1,
              $suffix = ' km',
              $echo = table[$key='interception'],
              $onSliderCellConfirm = OnChange_Range
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Bombardment'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Slider"
            param="table[
              $id = 'escort_range_bombardment',
              $col = 2,
              $min = 5,
              $max = 80,
              $start = global.$escort_range_bombardment / 1km,
              $step = 1,
              $suffix = ' km',
              $echo = table[$key='bombardment'],
              $onSliderCellConfirm = OnChange_Range
            ]" />


        <!-- Spacer -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" 
            param="table[ $selectable = false, $interactive = false, $borderBelow = true ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[ $col = 1, $colSpan = 2, $text = ' ', $minRowHeight = 4 ]" />


        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Button"
            param="table[
              $col = 1,
              $colSpan = 2,
              $text = table[$text = 'Update autodock and pursue range on all player owned ships'],
              $onClick = md.escort_ai_update.alf_update_autodock_and_range
            ]" />


        <!-- Spacer -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" 
            param="table[ $selectable = false, $interactive = false, $borderBelow = true ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[ $col = 1, $colSpan = 2, $text = ' ', $minRowHeight = 4 ]" />


        <!-- Debug logbook option -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Log setting changes in player logbook'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_CheckBox"
            param="table[
              $id = 'escort_ai_log_update',
              $checked = global.$escort_ai_log_update,
              $col = 2,
              $width = 'Helper.standardButtonHeight',
              $height = 'Helper.standardButtonHeight',
              $echo = table[$global='$escort_ai_log_update', $label='Setting change logbook logging'],
              $onClick = OnChange_Flag
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Log home target changes in player logbook'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_CheckBox"
            param="table[
              $id = 'escort_ai_log_new_home',
              $checked = global.$escort_ai_log_new_home,
              $col = 2,
              $width = 'Helper.standardButtonHeight',
              $height = 'Helper.standardButtonHeight',
              $echo = table[$global='$escort_ai_log_new_home', $label='New home logbook logging'],
              $onClick = OnChange_Flag
            ]" />

        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[
              $col  = 1,
              $text = 'Log attack orders in player logbook'
            ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_CheckBox"
            param="table[
              $id = 'escort_ai_log_attack_order',
              $checked = global.$escort_ai_log_attack_order,
              $col = 2,
              $width = 'Helper.standardButtonHeight',
              $height = 'Helper.standardButtonHeight',
              $echo = table[$global='$escort_ai_log_attack_order', $label='Attack order logbook logging'],
              $onClick = OnChange_Flag
            ]" />


        <!-- Spacer -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row"
            param="table[ $selectable = false, $interactive = false, $borderBelow = true ]" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Text"
            param="table[ $col = 1, $colSpan = 2, $text = ' ', $minRowHeight = 4 ]" />


        <!-- alf_home_target patch -->
        <signal_cue_instantly cue="md.Simple_Menu_API.Add_Row" />
        <signal_cue_instantly cue="md.Simple_Menu_API.Make_Button"
            param="table[
              $col = 1,
              $colSpan = 2,
              $text = table[$text = 'Patch home target for all ships in game'],
              $onClick = md.escort_ai_update.alf_patch_home_target
            ]" />


	  </actions>
    </cue>

    <cue name="OnChange_Range" instantiate="true" namespace="this">
      <conditions>
        <event_cue_signalled />
      </conditions>
      <actions>
          <set_value name="global.$escort_range_lastchange_time" exact="player.age" />

          <do_if value="event.param.$echo.$key == 'defence'">
            <set_value name="global.$escort_range_defence" exact="event.param.$value * 1km" />
          </do_if>
          <do_elseif value="event.param.$echo.$key == 'attack'">
            <set_value name="global.$escort_range_attack" exact="event.param.$value * 1km" />
          </do_elseif>
          <do_elseif value="event.param.$echo.$key == 'interception'">
            <set_value name="global.$escort_range_interception" exact="event.param.$value * 1km" />
          </do_elseif>
          <do_elseif value="event.param.$echo.$key == 'bombardment'">
            <set_value name="global.$escort_range_bombardment" exact="event.param.$value * 1km" />
          </do_elseif>

          <do_if value="global.$escort_ai_log_update">
            <write_to_logbook category="general"
                              title="'[ ' + player.age + ' ] ALF Escort AI: Pursue Range'"
                              text="'Changed ' + event.param.$echo.$key + ' to ' + event.param.$value + ' km'" />
          </do_if>
      </actions>
    </cue>

    <cue name="OnChange_Flag" instantiate="true" namespace="this">
      <conditions>
        <event_cue_signalled />
      </conditions>
      <actions>
        <set_value name="$global" exact="if event.param.$echo.$global? then event.param.$echo.$global else '$' + event.param.$id" />
        <set_value name="$label" exact="if event.param.$echo.$label? then event.param.$echo.$label else event.param.$id" />

        <set_value name="global.{$global}" exact="event.param.$checked" />
        <set_value name="global.$escort_range_lastchange_time" exact="player.age" />

        <write_to_logbook category="general"
                          title="'[ ' + player.age + ' ] ALF Escort AI: Mod Settings'"
                          text="$label + ' ' + (if event.param.$checked then 'enabled' else 'disabled')" />

      </actions>
    </cue>

  </cues>
</mdscript>
<?xml version="1.0" encoding="utf-8"?>
<mdscript name="escort_ai_update"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="md.xsd">
  <cues>

    <!-- =====================================================================
        Update autodock for all player owned ships
    ===================================================================== -->
    <cue name="alf_update_autodock_and_range" instantiate="true" namespace="this">
      <conditions>
        <event_cue_signalled />
      </conditions>
      <actions>
        <create_list name="$commanders" />

        <!-- Find all player-owned ships in the galaxy -->
        <find_ship name="$allplayerships"
                  class="[class.ship_xs, class.ship_s, class.ship_m, class.ship_l, class.ship_xl]"
                  owner="faction.player"
                  multiple="true"
                  space="player.galaxy" />

        <!-- Filter for root commander ships -->
        <do_if value="$allplayerships.count">
          <do_for_each name="$ship" in="$allplayerships">
            <do_if value="$ship and $ship.exists and $ship.isclass.ship and $ship.trueowner == faction.player and @$ship.subordinates.count and (($ship.commander == null) or @$ship.commander.isclass.station)">
              <append_to_list name="$commanders" exact="$ship" />
            </do_if>
          </do_for_each>
        </do_if>
        <remove_value name="$allplayerships" />


        <!-- Find subs of each commander upto 3 layers down -->
        <create_list name="$subordinates" />
        <create_list name="$updatedsubords" />

        <do_if value="$commanders?">
          <do_for_each name="$commander" in="$commanders">

              <!-- Depth 1: commander subordinates -->
              <do_for_each name="$x" in="$commander.subordinates">
                <do_if value="$x and $x.exists and $x.isclass.ship and $x.trueowner == faction.player">

                  <do_if value="$x.assignment == assignment.defence or $x.assignment == assignment.attack or $x.assignment == assignment.interception or $x.assignment == assignment.bombardment">
                    <append_to_list name="$subordinates" exact="table[$ship = $x, $assignment = $x.assignment]" />
                  </do_if>

                  <!-- Depth 2: subordinate subordinates -->
                  <do_if value="@$x.subordinates.count">
                    <do_for_each name="$y" in="$x.subordinates">
                      <do_if value="$y and $y.exists and $y.isclass.ship and $y.trueowner == faction.player">

                        <do_if value="$y.assignment == assignment.defence or $y.assignment == assignment.attack or $y.assignment == assignment.interception or $y.assignment == assignment.bombardment">
                          <append_to_list name="$subordinates" exact="table[$ship = $y, $assignment = $y.assignment]" />
                        </do_if>

                        <!-- Depth 3: subordinate subordinate subordinates -->
                        <do_if value="@$y.subordinates.count">
                          <do_for_each name="$z" in="$y.subordinates">
                            <do_if value="$z and $z.exists and $z.isclass.ship and $z.trueowner == faction.player">

                              <do_if value="$z.assignment == assignment.defence or $z.assignment == assignment.attack or $z.assignment == assignment.interception or $z.assignment == assignment.bombardment">
                                <append_to_list name="$subordinates" exact="table[$ship = $z, $assignment = $z.assignment]" />
                              </do_if>

                            </do_if>
                          </do_for_each>
                        </do_if>

                      </do_if>
                    </do_for_each>
                  </do_if>

                </do_if>
              </do_for_each>

          </do_for_each>
        </do_if>

        <!-- Log collected ships -->
        <do_if value="global.$escort_ai_log_update">
          <set_value name="$commanderIndex" exact="0" />
          <do_for_each name="$commander" in="$commanders">
            <set_value name="$commanderIndex" exact="$commanderIndex + 1" />
            <write_to_logbook
              category="general"
              title="'[ ' + player.age + ' ] ALF Escort AI: Update starting for commanders'"
              text="'Commander ' + $commanderIndex + ': ' + @$commander.idcode + ' ' + @$commander.knownname" />
          </do_for_each>
          <remove_value name="$commanderIndex" />

          <set_value name="$collectedIndex" exact="0" />
          <do_for_each name="$subord" in="$subordinates">
            <set_value name="$collectedIndex" exact="$collectedIndex + 1" />
            <write_to_logbook
              category="general"
              title="'[ ' + player.age + ' ] ALF Escort AI: Collected Ships under commanders'"
              text="'Ship ' + $collectedIndex + ': ' + @$subord.$ship.idcode + ' ' + @$subord.$ship.knownname + ' | assignment=' + $subord.$assignment" />
          </do_for_each>
          <remove_value name="$collectedIndex" />
        </do_if>


        <!-- Update collected ships -->
        <do_for_each name="$subord" in="$subordinates">
          <set_value name="$ship" exact="$subord.$ship" />
          <set_value name="$assignment" exact="$subord.$assignment" />
          <set_value name="$range" exact="null" />

          <do_if value="$assignment == assignment.defence">
            <set_value name="$range" exact="global.$escort_range_defence" />
          </do_if>
          <do_elseif value="$assignment == assignment.attack">
            <set_value name="$range" exact="global.$escort_range_attack" />
          </do_elseif>
          <do_elseif value="$assignment == assignment.interception">
            <set_value name="$range" exact="global.$escort_range_interception" />
          </do_elseif>
          <do_elseif value="$assignment == assignment.bombardment">
            <set_value name="$range" exact="global.$escort_range_bombardment" />
          </do_elseif>

          <do_if value="$range?">
            <set_value name="$didupdate" exact="false" />

            <do_if value="$ship.order? and @$ship.order.id == 'Escort'">
              <edit_order_param order="$ship.order" param="'pursuedistance'" value="$range" />
              <edit_order_param order="$ship.order" param="'alf_restart_tick'" value="if @$ship.order.$alf_restart_tick == 0 then 1 else 0" />
                          
              <set_value name="$didupdate" exact="true" />
            </do_if>

            <do_if value="$ship.defaultorder? and @$ship.defaultorder.id == 'Escort'">
              <edit_order_param order="$ship.defaultorder" param="'pursuedistance'" value="$range" />

              <set_value name="$didupdate" exact="true" />
            </do_if>

            <do_if value="$didupdate">
              <append_to_list name="$updatedsubords" exact="table[$ship = $ship, $assignment = $assignment]" />
            </do_if>

            <remove_value name="$didupdate" />
          </do_if>

          <remove_value name="$ship" />
          <remove_value name="$assignment" />
          <remove_value name="$range" />
        </do_for_each>

        <do_if value="global.$escort_ai_log_update">
          <set_value name="$updatedIndex" exact="0" />
          <do_for_each name="$updatedsub" in="$updatedsubords">
            <set_value name="$ship" exact="$updatedsub.$ship" />
            <set_value name="$assignment" exact="$updatedsub.$assignment" />
            <set_value name="$updatedIndex" exact="$updatedIndex + 1" />
            <write_to_logbook
                category="general"
                title="'[ ' + player.age + ' ] ALF Escort AI: Ship Behaviors'"
                text="'Updated ' + $updatedIndex + ': ' + @$ship.idcode + ' ' + @$ship.knownname + '| assignment=' + $assignment +
                  '\n| currentRange=' + (if $ship.order? and @$ship.order.id == 'Escort' then $ship.order.$pursuedistance else 'null') +
                  ' | defaultRange=' + (if $ship.defaultorder? and @$ship.defaultorder.id == 'Escort' then $ship.defaultorder.$pursuedistance else 'null')" />
          </do_for_each>
          <remove_value name="$updatedIndex" />
        </do_if>

        <remove_value name="$commanders" />
        <remove_value name="$subordinates" />
        <remove_value name="$updatedsubords" />

      </actions>
    </cue>


    <!-- =====================================================================
        One time patch to update alf_home_target
    ===================================================================== -->
    <cue name="alf_patch_home_target" instantiate="true">
      <conditions>
        <event_cue_signalled />
      </conditions>

      <actions>
        <write_to_logbook
            category="general"
            title="'[ ' + player.age + ' ] ALF Escort AI: Home Target Patch Requested'" />

        <find_ship name="$allships"
            class="[class.ship_xs, class.ship_s, class.ship_m, class.ship_l, class.ship_xl]"
            multiple="true"
            space="player.galaxy" />

        <create_list name="$ships_to_update" />

        <write_to_logbook
            category="general"
            title="'[ ' + player.age + ' ] ALF Escort AI: Home Target Patch Started'"
            text="'Total ships found: ' + $allships.count" />

        <do_if value="$allships.count">
          <do_for_each name="$ship" in="$allships">

            <set_value name="$order_home_target" exact="null" />
            <set_value name="$default_home_target" exact="null" />
            <set_value name="$need_update" exact="false" />

            <!-- Active Escort order: missing/null/dead alf_home_target gets patched to active order target -->
            <do_if value="$ship.order? and @$ship.order.id == 'Escort' and @$ship.order.$target.isoperational">
              <set_value name="$order_home_target" exact="if @$ship.order.$alf_home_target.isoperational then $ship.order.$alf_home_target else $ship.order.$target" />
              <set_value name="$need_update" exact="true" />
            </do_if>

            <!-- Default Escort order: missing/null/dead alf_home_target gets patched to default order target -->
            <do_if value="$ship.defaultorder? and @$ship.defaultorder.id == 'Escort' and $ship.defaultorder != $ship.order and @$ship.defaultorder.$target.isoperational">
              <set_value name="$default_home_target" exact="if @$ship.defaultorder.$alf_home_target.isoperational then $ship.defaultorder.$alf_home_target else $ship.defaultorder.$target" />
              <set_value name="$need_update" exact="true" />
            </do_if>

            <!-- Add one composite update ship_to_update per ship -->
            <do_if value="$need_update">
              <append_to_list name="$ships_to_update"
                  exact="table[
                    $ship = $ship,
                    $order_home_target = $order_home_target,
                    $default_home_target = $default_home_target
                  ]" />
            </do_if>

            <remove_value name="$order_home_target" />
            <remove_value name="$default_home_target" />
            <remove_value name="$need_update" />

          </do_for_each>
        </do_if>

        <do_if value="$ships_to_update.count">
          <write_to_logbook
              category="general"
              title="'[ ' + player.age + ' ] ALF Escort AI: Home Target Patch Queued'"
              text="'Ships requiring patch: ' + $ships_to_update.count + ' / ' + $allships.count" />

          <signal_cue_instantly
              cue="md.escort_ai_update.alf_update_home_target"
              param="table[
                $ships_to_update = $ships_to_update,
                $log = true
              ]" />
        </do_if>

        <do_else>
          <write_to_logbook
              category="general"
              title="'[ ' + player.age + ' ] ALF Escort AI: Home Target Patch Complete'"
              text="'No ships require home target patching. Total ships scanned: ' + $allships.count" />
        </do_else>

        <remove_value name="$ships_to_update" />
        <remove_value name="$allships" />
      </actions>
    </cue>


    <!-- =====================================================================
        Actual update logic
    ===================================================================== -->
    <cue name="alf_update_home_target" instantiate="true">
      <conditions>
        <event_cue_signalled />
      </conditions>

      <actions>
        <set_value name="$ships_to_update" exact="event.param.$ships_to_update" />
        <set_value name="$log" exact="event.param.$log" />

        <do_if value="$ships_to_update? and $ships_to_update.count">
          <set_value name="$fixed_count" exact="0" />

          <do_for_each name="$ship_to_update" in="$ships_to_update">

            <set_value name="$ship" exact="$ship_to_update.$ship" />
            <set_value name="$active_fixed" exact="false" />
            <set_value name="$default_fixed" exact="false" />

            <!-- Active order: Update if passed param is not null -->
            <do_if value="@$ship_to_update.$order_home_target.isoperational and @$ship.order.id == 'Escort'">
              <edit_order_param order="$ship.order" param="'alf_home_target'" value="$ship_to_update.$order_home_target" />
              <edit_order_param order="$ship.order" param="'alf_restart_tick'" value="if @$ship.order.$alf_restart_tick == 0 then 1 else 0" />
              <set_value name="$active_fixed" exact="true" />
            </do_if>

            <!-- Default order: Update if passed param is not null -->
            <do_if value="@$ship_to_update.$default_home_target.isoperational and @$ship.defaultorder.id == 'Escort'">
              <edit_order_param order="$ship.defaultorder" param="'alf_home_target'" value="$ship_to_update.$default_home_target" />
              <edit_order_param order="$ship.defaultorder" param="'alf_restart_tick'" value="if @$ship.defaultorder.$alf_restart_tick == 0 then 1 else 0" />
              <set_value name="$default_fixed" exact="true" />
            </do_if>

            <!-- One count/log per ship if active/default was updated -->
            <do_if value="$active_fixed or $default_fixed">
              <set_value name="$fixed_count" exact="$fixed_count + 1" />

              <do_if value="@$ship_to_update.$remove_home and $ship.order? and ($ship.order.id == 'DockAt' or $ship.order.id == 'DockAndWait')">
                <cancel_order order="$ship.order" />
              </do_if>

              <do_if value="$log">
                <write_to_logbook
                    category="general"
                    title="'[ ' + player.age + ' ] ALF Escort AI: Home Target Updated'"
                    text="'Updated ship ' + $fixed_count + '=' + @$ship.idcode + ' ' + @$ship.knownname +
                          '\nactive updated=' + $active_fixed +
                          ' | active home=' + (if @$ship_to_update.$order_home_target.isoperational then @$ship_to_update.$order_home_target.idcode + ' ' + @$ship_to_update.$order_home_target.knownname else 'null') +
                          '\ndefault updated=' + $default_fixed +
                          ' | default home=' + (if @$ship_to_update.$default_home_target.isoperational then @$ship_to_update.$default_home_target.idcode + ' ' + @$ship_to_update.$default_home_target.knownname else 'null')" />
              </do_if>
            </do_if>

            <remove_value name="$ship" />
            <remove_value name="$active_fixed" />
            <remove_value name="$default_fixed" />

          </do_for_each>

          <do_if value="$log">
            <write_to_logbook
                category="general"
                title="'[ ' + player.age + ' ] ALF Escort AI: Home Target Update Complete'"
                text="'Ships updated: ' + $fixed_count + ' / update entries received: ' + $ships_to_update.count" />
          </do_if>

          <remove_value name="$fixed_count" />
        </do_if>

        <do_else>
          <do_if value="$log">
            <write_to_logbook
                category="general"
                title="'[ ' + player.age + ' ] ALF Escort AI: Home Target Update Complete'"
                text="'No update entries received.'" />
          </do_if>
        </do_else>

        <remove_value name="$ships_to_update" />
        <remove_value name="$log" />
      </actions>
    </cue>



  </cues>
</mdscript>
<?xml version="1.0" encoding="utf-8"?>
<content id="" name="" description="" author="NamelessCosmicDust" version="005" date="2026-06-07" save="false" lastupdate="">
  <text language="44" name="Alf Escort AI tweak" description="Adjustable Escort Range and Docking Control" author="NamelessCosmicDust"/>
  <dependency version="800"/>
  <dependency id="sn_mod_support_apis" optional="true"/>
  <dependency id="ws_2042901274" optional="true" name="SirNukes Mod Support APIs"/>
</content>
