#################### F&B begin
("calculate_distances",
[
(assign, ":party_no", "$g_party_no"),
(assign, ":target_center", "$g_target_center"),
(try_begin), #### water-water
(party_is_active, ":party_no"),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(try_begin),
(party_get_slot, ":target", ":party_no", slot_party_destination),
(ge, ":target", 1),
(else_try),
(assign, ":target", ":target_center"),
(try_end),
(party_is_active, ":target"),
(party_get_current_terrain, ":terrain", ":target"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(party_set_ai_object, ":target", ":party_no"),
(else_try), ### water-land
(party_is_active, ":party_no"),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(try_begin),
(party_get_slot, ":target", ":party_no", slot_party_destination),
(ge, ":target", 1),
(else_try),
(assign, ":target", ":target_center"),
(try_end),
(party_is_active, ":target"),
(party_get_current_terrain, ":terrain", ":target"),
(this_or_next|neg|eq, ":terrain", 0),
(neg|eq, ":terrain",
,
(party_set_slot, ":party_no", slot_using_port, 2),
(assign, ":closest_port_dist", 99999),
(try_for_range, ":port", ports_begin, ports_end),
(store_distance_to_party_from_party, ":dist", ":port", ":target"),
(le, ":dist", ":closest_port_dist"),
(assign, ":closest_port_dist", ":dist"),
(assign, ":closest_port", ":port"),
(try_end),
(try_begin),
(party_get_ai_target_position, pos0, ":party_no"),
(gt, pos0, 0),
(party_set_slot, ":party_no", slot_ai_target_position, pos0),
(party_set_ai_target_position, ":party_no", -1),
(try_end),
(party_set_slot, ":party_no", slot_party_destination, "$g_target_center"),
(get_party_ai_behavior, ":behavior", ":party_no"),
(party_set_slot, ":party_no", slot_exit_port, ":closest_port"),
(party_set_slot, ":party_no", slot_ai_behavior, ":behavior"),
(party_set_ai_behavior, ":party_no", ai_bhvr_travel_to_party),
(party_set_ai_object, ":party_no", ":closest_port"),
(party_set_slot, ":party_no", slot_party_ai_object, ":closest_port"),
(else_try), ### land-water
(party_is_active, ":party_no"),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|neg|eq, ":terrain", 0),
(neg|eq, ":terrain",
,
(try_begin),
(party_get_slot, ":target", ":party_no", slot_party_destination),
(ge, ":target", 1),
(else_try),
(assign, ":target", ":target_center"),
(try_end),
(party_is_active, ":target"),
(party_get_current_terrain, ":terrain", ":target"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(party_set_slot, ":party_no", slot_using_port, 1),
(assign, ":closest_port_dist", 99999),
(try_for_range, ":port", ports_begin, ports_end),
(store_distance_to_party_from_party, ":dist", ":party_no"),
(le, ":dist", ":closest_port_dist"),
(assign, ":closest_port_dist", ":dist"),
(assign, ":closest_port", ":port"),
(try_end),
(party_set_slot, ":party_no", slot_entry_port, ":closest_port"),
(assign, ":closest_settlement_dist", 99999),
(try_for_range, ":target", centers_begin, centers_end),
(this_or_next|party_slot_eq, ":target", slot_party_type, spt_town),
(party_slot_eq, ":target", slot_party_type, spt_village),
(store_distance_to_party_from_party, ":dist", ":target", ":closest_port"),
(le, ":dist", ":closest_settlement_dist"),
(assign, ":closest_settlement_dist", ":dist"),
(assign, ":entry", ":target"),
(try_end),
(get_party_ai_behavior, ":behavior", ":party_no"),
(try_begin),
(party_get_ai_target_position, pos0, ":party_no"),
(gt, pos0, 0),
(party_set_slot, ":party_no", slot_ai_target_position, pos0),
(party_set_ai_target_position, ":party_no", -1),
(try_end),
(party_set_slot, ":party_no", slot_ai_behavior, ":behavior"),
(party_set_ai_behavior, ":party_no", ai_bhvr_travel_to_party),
(party_set_slot, ":party_no", slot_entry_center, ":entry"),
(party_set_ai_object, ":party_no", ":entry"),
(party_set_slot, ":party_no", slot_party_ai_object, ":entry"),
(else_try), ### land-water-land
(party_is_active, ":party_no"),
(assign, ":closest_port_dist", 99999),
(try_for_range, ":port", ports_begin, ports_end),
(store_distance_to_party_from_party, ":distance", ":party_no", ":port"),
(le, ":distance", ":closest_port_dist"),
(assign, ":closest_port_dist", ":distance"),
(assign, ":closest_port", ":port"),
(try_end),
(assign, ":closest_exit_port_dist", 99999),
(party_is_active, ":target_center"),
(try_for_range, ":port", ports_begin, ports_end),
(store_distance_to_party_from_party, ":distance", ":target_center", ":port"),
(le, ":distance", ":closest_exit_port_dist"),
(assign, ":closest_exit_port_dist", ":distance"),
(assign, ":closest_exit_port", ":port"),
(try_end),
(neg|eq, ":closest_port", ":closest_exit_port"), ## bug fix. for land->water->land, the ports should not be the same
(store_distance_to_party_from_party, ":distance_betw_ports", ":closest_exit_port", ":closest_port"),
(store_distance_to_party_from_party, ":direct_distance", ":party_no", ":target_center"),
(val_div, ":distance_betw_ports", 2),
(val_add, ":closest_port_dist", ":closest_exit_port_dist"),
(val_add, ":closest_port_dist", ":distance_betw_ports"),
(val_mul, ":direct_distance", 2),
(le, ":closest_port_dist", ":direct_distance"),
(assign, ":min_dist", 99999),
(try_for_range, ":closest_settlement", centers_begin, centers_end),
(this_or_next|party_slot_eq, ":closest_settlement", slot_party_type, spt_town),
(party_slot_eq, ":closest_settlement", slot_party_type, spt_village),
(store_distance_to_party_from_party, ":dist", ":closest_settlement", ":closest_port"),
(le, ":dist", ":min_dist"),
(assign, ":min_dist", ":dist"),
(assign, ":entry_fief", ":closest_settlement"),
(try_end),
(try_begin),
(party_get_ai_target_position, pos0, ":party_no"),
(gt, pos0, 0),
(party_set_slot, ":party_no", slot_ai_target_position, pos0),
(party_set_ai_target_position, ":party_no", -1),
(try_end),
(get_party_ai_behavior, ":behavior", ":party_no"),
(party_set_slot, ":party_no", slot_party_destination, ":target_center"),
(party_set_slot, ":party_no", slot_using_port, 1),
(party_set_slot, ":party_no", slot_entry_port, ":closest_port"),
(party_set_slot, ":party_no", slot_exit_port, ":closest_exit_port"),
(party_set_slot, ":party_no", slot_ai_behavior, ":behavior"),
(party_set_ai_behavior, ":party_no", ai_bhvr_travel_to_party),
(party_set_slot, ":party_no", slot_entry_center, ":entry_fief"),
(party_set_ai_object, ":party_no", ":entry_fief"),
(party_set_slot, ":party_no", slot_party_ai_object, ":entry_fief"),
(else_try), #land-land without ports
(party_set_ai_object, ":party_no", "$g_target_center"),
(party_set_slot, ":party_no", slot_exit_port, -1),
(party_set_slot, ":party_no", slot_entry_port, -1),
(party_set_slot, ":party_no", slot_using_port, -1),
(party_set_slot, ":party_no", slot_entry_center, -1),
(try_end),
]),
###F&B end