##########################################################
############# F&B begin Script for AI using ports
("calculate_distances",
[
(assign, ":party_no", "$g_party_no"),
(assign, ":target_center", "$g_target_center"),
(try_begin), ###water-water route
(try_begin),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(party_get_current_terrain, ":terrain", ":target_center"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(assign, ":water_travel", 1),
(try_end),
(eq, ":water_travel", 1),
(party_set_ai_object, ":target_center"),
(else_try), ###water-land route
(try_begin),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(party_get_current_terrain, ":terrain", ":target_center"),
(this_or_next|neg|eq, ":terrain", 0),
(neg|eq, ":terrain",
,
(assign, ":water_travel", 1),
(try_end),
(eq, ":water_travel", 1),
(assign, ":closest_port_dist", 99999),
(try_for_range, ":port", ports_begin, ports_end),
(store_distance_to_party_from_party, ":distance", ":port", ":target_center"),
(le, ":distance", ":closest_port_dist"),
(assign, ":closest_port_dist", ":distance"),
(assign, ":closest_port", ":port"),
(try_end),
(party_set_slot, ":party_no", slot_party_destination, ":target_center"),
(party_set_slot, ":party_no", slot_using_port, 2),
(party_set_slot, ":party_no", slot_exit_port, ":closest_port"),
(party_set_ai_object, ":party_no", ":closest_port"),
(else_try), ###land-water route
(try_begin),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|neg|eq, ":terrain", 0),
(neg|eq, ":terrain",
,
(party_get_current_terrain, ":terrain", ":target_center"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain",
,
(assign, ":water_travel", 3),
(try_end),
(eq, ":water_travel", 3),
(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),
(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_center, ":closest_port"),
(party_set_ai_object, ":party_no", ":closest_port"),
(else_try), ###land-water-land route
(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),
(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),
(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.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"),
(try_begin),
(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),
(party_set_slot, ":party_no", slot_party_destination, ":target_center"),
(party_set_slot, ":party_no", slot_exit_port, ":closest_exit_port"),
(party_set_slot, ":party_no", slot_entry_port, ":closest_port"),
(party_set_slot, ":party_no", slot_using_port, 1),
(party_set_slot, ":party_no", slot_entry_center, ":entry_fief"),
(party_set_ai_object, ":party_no", ":entry_fief"),
(try_end),
(else_try), ### land-land direct route
(party_set_slot, ":party_no", slot_party_destination, -1),
(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),
(party_set_ai_object, ":party_no", "$g_target_center"),
(try_end),
####### Debug. For some reason it's neccessary
(try_begin),
(neg|eq, "$g_target_center", "trp_player"),
(get_party_ai_object, ":ai_object", ":party_no"),
(eq, ":ai_object", "trp_player"),
(party_set_ai_object, ":party_no", "$g_target_center"),
(try_end),
]),
########### F&B end Script for AI using ports
###############################################################################