#Script checking whether it's shorter to use portal
("calculate_distances",
[(assign, ":party_no", "$g_party_no"),
(assign, ":target_center", "$g_target_center"),
(store_distance_to_party_from_party, ":dist_portal_1", ":party_no", "p_1"),
(store_distance_to_party_from_party, ":dist_portal_2", ":party_no", "p_2"),
(store_distance_to_party_from_party, ":dist_portal_3", ":party_no", "p_3"),
(store_distance_to_party_from_party, ":dist_portal_4", ":party_no", "p_4"),
(store_distance_to_party_from_party, ":dist_portal_5", ":party_no", "p_5"),
(store_distance_to_party_from_party, ":dist_portal_6", ":party_no", "p_6"),
(store_distance_to_party_from_party, ":dist_portal_7", ":party_no", "p_7"),
(store_distance_to_party_from_party, ":dist_portal_8", ":party_no", "p_8"),
(store_distance_to_party_from_party, ":dist_portal_9", ":party_no", "p_9"),
(store_distance_to_party_from_party, ":dist_portal_10", ":party_no", "p_10"),
(store_distance_to_party_from_party, ":dist_portal_11", ":party_no", "p_11"),
(store_distance_to_party_from_party, ":dist_portal_12", ":party_no", "p_12"),
################## Getting the xy coordinates of party, target & portals
(party_get_position, pos0, ":party_no"),
(position_get_x, ":party_x", pos0),
(position_get_y, ":party_y", pos0),
(party_get_position, pos1, ":target_center"),
(position_get_x, ":target_x", pos1),
(position_get_y, ":target_y", pos1),
(party_get_position, pos2, "p_1"), #only getting the coordinates from one part of each portal, since they are close together, so similar coordinates
(position_get_x, ":portal_1_x", pos2),
(position_get_y, ":portal_1_y", pos2),
(party_get_position, pos3, "p_3"),
(position_get_x, ":portal_2_x", pos3),
(position_get_y, ":portal_2_y", pos3),
(party_get_position, pos4, "p_5"),
(position_get_x, ":portal_3_x", pos4),
(position_get_y, ":portal_3_y", pos4),
(party_get_position, pos5, "p_7"),
(position_get_x, ":portal_4_x", pos5),
(position_get_y, ":portal_4_y", pos5),
(party_get_position, pos6, "p_9"),
(position_get_x, ":portal_5_x", pos6),
(position_get_y, ":portal_5_y", pos6),
(party_get_position, pos7, "p_11"),
(position_get_x, ":portal_6_x", pos7),
(position_get_y, ":portal_6_y", pos7),
################################ Creating an offset for the xy coordinates defined by party and target, to make the created rectangle larger, i.e. the portal can lay slightly outside and still be considered.
(try_begin), #this sets the lower limit lower and the upper limit higher. Used for the portal range check.
(le, ":party_x", ":target_x"),
(val_sub, ":party_x", 20), #in m. Ingame it uses cm though.
(val_add, ":target_x", 20), #the portal can be 20m outside of the range of party and target and still be considered for travel.
(else_try),
(val_sub, ":target_x", 20),
(val_add, ":party_x", 20),
(try_end),
(try_begin),
(le, ":party_y", ":target_y"),
(val_sub, ":party_y", 20),
(val_add, ":target_y", 20),
(else_try),
(val_sub, ":target_y", 20),
(val_add, ":party_y", 20),
(try_end),
##############################
(try_begin), #Checking if Portal 1 is inside rectangle
(this_or_next|is_between, ":portal_1_x", ":party_x", ":target_x"),
(is_between, ":portal_1_x", ":target_x", ":party_x"),
(this_or_next|is_between, ":portal_1_y", ":party_y", ":target_y"),
(is_between, ":portal_1_y", ":target_y", ":party_y"),
(assign, ":portal_1_in_range", 1),
(try_end),
(try_begin), #Checking if Portal 2 is inside rectangle
(this_or_next|is_between, ":portal_2_x", ":party_x", ":target_x"),
(is_between, ":portal_2_x", ":target_x", ":party_x"),
(this_or_next|is_between, ":portal_2_y", ":party_y", ":target_y"),
(is_between, ":portal_2_y", ":target_y", ":party_y"),
(assign, ":portal_2_in_range", 1),
(try_end),
(try_begin), #Checking if Portal 3 is inside rectangle
(this_or_next|is_between, ":portal_3_x", ":party_x", ":target_x"),
(is_between, ":portal_3_x", ":target_x", ":party_x"),
(this_or_next|is_between, ":portal_3_y", ":party_y", ":target_y"),
(is_between, ":portal_3_y", ":target_y", ":party_y"),
(assign, ":portal_3_in_range", 1),
(try_end),
(try_begin), #Checking if Portal 4 is inside rectangle
(this_or_next|is_between, ":portal_4_x", ":party_x", ":target_x"),
(is_between, ":portal_4_x", ":target_x", ":party_x"),
(this_or_next|is_between, ":portal_4_y", ":party_y", ":target_y"),
(is_between, ":portal_4_y", ":target_y", ":party_y"),
(assign, ":portal_4_in_range", 1),
(try_end),
(try_begin), #Checking if Portal 5 is inside rectangle
(this_or_next|is_between, ":portal_5_x", ":party_x", ":target_x"),
(is_between, ":portal_5_x", ":target_x", ":party_x"),
(this_or_next|is_between, ":portal_5_y", ":party_y", ":target_y"),
(is_between, ":portal_5_y", ":target_y", ":party_y"),
(assign, ":portal_5_in_range", 1),
(try_end),
(try_begin), #Checking if Portal 6 is inside rectangle
(this_or_next|is_between, ":portal_6_x", ":party_x", ":target_x"),
(is_between, ":portal_6_x", ":target_x", ":party_x"),
(this_or_next|is_between, ":portal_6_y", ":party_y", ":target_y"),
(is_between, ":portal_6_y", ":target_y", ":party_y"),
(assign, ":portal_6_in_range", 1),
(try_end),
####################################### checking whether the party would use a portal only if it is in range
(try_begin), #Would Party use Portal 1?
(eq, ":portal_1_in_range", 1),
(store_faction_of_party, ":faction_party", ":party_no"),
(store_faction_of_party, ":faction_portal", "p_castle_14"),
(store_relation, ":relation", ":faction_party", ":faction_portal"),
(try_begin),
(eq, ":faction_party", ":faction_portal"),
(assign, ":relation", 100),
(try_end),
(ge, ":relation", 0), #min relation requires to use this portal
(store_distance_to_party_from_party, ":dist_party_target", ":party_no", ":target_center"),
(try_begin),
(le, ":dist_portal_1", ":dist_portal_2"),
(assign, ":dist_party_entry", ":dist_portal_1"), # this makes the closer portal the entry and the other the out
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_2", ":target_center"),
(party_set_slot, "p_1", slot_would_portal_be_used_by_party, ":party_no"),
(else_try),
(assign, ":dist_party_entry", ":dist_portal_2"),
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_1", ":target_center"),
(party_set_slot, "p_2", slot_would_portal_be_used_by_party, ":party_no"),
(try_end),
(assign, ":dist6", ":dist_portal_out_target"),
(assign, ":dist8", ":dist_party_target"),
(val_add, ":dist_portal_out_target", ":dist_party_entry"), #Combine party->portal+portal->target
(try_begin), #This little fella makes units prioritize the portal, if they, or their target is near a portal
(this_or_next|le, ":dist_portal_1", 15),
(le, ":dist6", 15),
(val_mul, ":dist_party_target", 5),
(else_try),
(this_or_next|le, ":dist_portal_1", 30),
(le, ":dist6", 30),
(val_mul, ":dist_party_target", 3),
(else_try),
(this_or_next|le, ":dist_portal_1", 50),
(le, ":dist6", 50),
(val_mul, ":dist_party_target", 1.5),
(else_try),
(this_or_next|le, ":dist_portal_1", 100),
(le, ":dist6", 100),
(val_mul, ":dist_party_target", 1.2),
(else_try),
(val_mul, ":dist_party_target", 1),
(try_end),
(try_begin),
(this_or_next|le, ":dist8", ":dist6"),
(this_or_next|le, ":dist8", ":dist_portal_1"),
(le, ":dist_party_target", ":dist_portal_out_target"), #
(party_set_slot, "p_1", slot_would_portal_be_used_by_party, 0),
(party_set_slot, "p_2", slot_would_portal_be_used_by_party, 0),
(try_end),
(try_end),
##################################################
(try_begin), #Would Party use Portal 2?
(eq, ":portal_2_in_range", 1),
(store_faction_of_party, ":faction_party", ":party_no"),
(store_faction_of_party, ":faction_portal", "p_castle_16"),
(store_relation, ":relation", ":faction_party", ":faction_portal"),
(try_begin),
(eq, ":faction_party", ":faction_portal"),
(assign, ":relation", 100),
(try_end),
(ge, ":relation", 0), #min relation requires to use this portal
(store_distance_to_party_from_party, ":dist_party_target", ":party_no", ":target_center"),
(try_begin),
(le, ":dist_portal_3", ":dist_portal_4"),
(assign, ":dist_party_entry", ":dist_portal_3"), # this makes the closer portal the entry and the other the out
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_4", ":target_center"),
(party_set_slot, "p_3", slot_would_portal_be_used_by_party, ":party_no"),
(else_try),
(assign, ":dist_party_entry", ":dist_portal_3"),
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_3", ":target_center"),
(party_set_slot, "p_4", slot_would_portal_be_used_by_party, ":party_no"),
(try_end),
(assign, ":dist6", ":dist_portal_out_target"),
(assign, ":dist8", ":dist_party_target"),
(val_add, ":dist_portal_out_target", ":dist_party_entry"), #Combine party->portal+portal->target
(try_begin), #This little fella makes units prioritize the portal, if they, or their target is near a portal
(this_or_next|le, ":dist_portal_3", 15),
(le, ":dist6", 15),
(val_mul, ":dist_party_target", 5),
(else_try),
(this_or_next|le, ":dist_portal_3", 30),
(le, ":dist6", 30),
(val_mul, ":dist_party_target", 3),
(else_try),
(this_or_next|le, ":dist_portal_3", 50),
(le, ":dist6", 50),
(val_mul, ":dist_party_target", 1.5),
(else_try),
(this_or_next|le, ":dist_portal_3", 100),
(le, ":dist6", 100),
(val_mul, ":dist_party_target", 1.2),
(else_try),
(val_mul, ":dist_party_target", 1),
(try_end),
(try_begin),
(this_or_next|le, ":dist8", ":dist6"),
(this_or_next|le, ":dist8", ":dist_portal_3"),
(le, ":dist_party_target", ":dist_portal_out_target"),
(party_set_slot, "p_3", slot_would_portal_be_used_by_party, 0),
(party_set_slot, "p_4", slot_would_portal_be_used_by_party, 0),
(try_end),
(try_end),
########################
(try_begin), #Would Party use Portal 3?
(eq, ":portal_3_in_range", 1),
(store_faction_of_party, ":faction_party", ":party_no"),
(store_faction_of_party, ":faction_portal", "p_castle_29"),
(store_relation, ":relation", ":faction_party", ":faction_portal"),
(try_begin),
(eq, ":faction_party", ":faction_portal"),
(assign, ":relation", 100),
(try_end),
(ge, ":relation", 0), #min relation requires to use this portal
(store_distance_to_party_from_party, ":dist_party_target", ":party_no", ":target_center"),
(try_begin),
(le, ":dist_portal_5", ":dist_portal_6"),
(assign, ":dist_party_entry", ":dist_portal_5"), # this makes the closer portal the entry and the other the out
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_6", ":target_center"),
(party_set_slot, "p_5", slot_would_portal_be_used_by_party, ":party_no"),
(else_try),
(assign, ":dist_party_entry", ":dist_portal_6"),
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_5", ":target_center"),
(party_set_slot, "p_6", slot_would_portal_be_used_by_party, ":party_no"),
(try_end),
(assign, ":dist6", ":dist_portal_out_target"),
(assign, ":dist8", ":dist_party_target"),
(val_add, ":dist_portal_out_target", ":dist_party_entry"), #Combine party->portal+portal->target
(try_begin), #This little fella makes units prioritize the portal, if they, or their target is near a portal
(this_or_next|le, ":dist_portal_5", 15),
(le, ":dist6", 15),
(val_mul, ":dist_party_target", 5),
(else_try),
(this_or_next|le, ":dist_portal_5", 30),
(le, ":dist6", 30),
(val_mul, ":dist_party_target", 3),
(else_try),
(this_or_next|le, ":dist_portal_5", 50),
(le, ":dist6", 50),
(val_mul, ":dist_party_target", 1.5),
(else_try),
(this_or_next|le, ":dist_portal_5", 100),
(le, ":dist6", 100),
(val_mul, ":dist_party_target", 1.2),
(else_try),
(val_mul, ":dist_party_target", 1),
(try_end),
(try_begin),
(this_or_next|le, ":dist8", ":dist6"),
(this_or_next|le, ":dist8", ":dist_portal_5"),
(le, ":dist_party_target", ":dist_portal_out_target"), #
(party_set_slot, "p_5", slot_would_portal_be_used_by_party, 0),
(party_set_slot, "p_6", slot_would_portal_be_used_by_party, 0),
(try_end),
(try_end),
########################
(try_begin), #Would Party use Portal 4?
(eq, ":portal_4_in_range", 1),
(store_faction_of_party, ":faction_party", ":party_no"),
(store_faction_of_party, ":faction_portal", "p_castle_7"),
(store_relation, ":relation", ":faction_party", ":faction_portal"),
(try_begin),
(eq, ":faction_party", ":faction_portal"),
(assign, ":relation", 100),
(try_end),
(ge, ":relation", 0), #min relation requires to use this portal
(store_distance_to_party_from_party, ":dist_party_target", ":party_no", ":target_center"),
(try_begin),
(le, ":dist_portal_7", ":dist_portal_8"),
(assign, ":dist_party_entry", ":dist_portal_7"), # this makes the closer portal the entry and the other the out
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_8", ":target_center"),
(party_set_slot, "p_7", slot_would_portal_be_used_by_party, ":party_no"),
(else_try),
(assign, ":dist_party_entry", ":dist_portal_8"),
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_7", ":target_center"),
(party_set_slot, "p_8", slot_would_portal_be_used_by_party, ":party_no"),
(try_end),
(assign, ":dist6", ":dist_portal_out_target"),
(assign, ":dist8", ":dist_party_target"),
(val_add, ":dist_portal_out_target", ":dist_party_entry"), #Combine party->portal+portal->target
(try_begin), #This little fella makes units prioritize the portal, if they, or their target is near a portal
(this_or_next|le, ":dist_portal_7", 15),
(le, ":dist6", 15),
(val_mul, ":dist_party_target", 5),
(else_try),
(this_or_next|le, ":dist_portal_7", 30),
(le, ":dist6", 30),
(val_mul, ":dist_party_target", 3),
(else_try),
(this_or_next|le, ":dist_portal_7", 50),
(le, ":dist6", 50),
(val_mul, ":dist_party_target", 1.5),
(else_try),
(this_or_next|le, ":dist_portal_7", 100),
(le, ":dist6", 100),
(val_mul, ":dist_party_target", 1.2),
(else_try),
(val_mul, ":dist_party_target", 1),
(try_end),
(try_begin),
(this_or_next|le, ":dist8", ":dist6"),
(this_or_next|le, ":dist8", ":dist_portal_7"),
(le, ":dist_party_target", ":dist_portal_out_target"), #
(party_set_slot, "p_7", slot_would_portal_be_used_by_party, 0),
(party_set_slot, "p_8", slot_would_portal_be_used_by_party, 0),
(try_end),
(try_end),
########################
(try_begin), #Would Party use Portal 5?
(eq, ":portal_5_in_range", 1),
(store_faction_of_party, ":faction_party", ":party_no"),
(store_faction_of_party, ":faction_portal", "p_castle_1"),
(store_relation, ":relation", ":faction_party", ":faction_portal"),
(try_begin),
(eq, ":faction_party", ":faction_portal"),
(assign, ":relation", 100),
(try_end),
(ge, ":relation", 0), #min relation requires to use this portal
(store_distance_to_party_from_party, ":dist_party_target", ":party_no", ":target_center"),
(try_begin),
(le, ":dist_portal_9", ":dist_portal_10"),
(assign, ":dist_party_entry", ":dist_portal_9"), # this makes the closer portal the entry and the other the out
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_10", ":target_center"),
(party_set_slot, "p_9", slot_would_portal_be_used_by_party, ":party_no"),
(else_try),
(assign, ":dist_party_entry", ":dist_portal_10"),
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_9", ":target_center"),
(party_set_slot, "p_10", slot_would_portal_be_used_by_party, ":party_no"),
(try_end),
(assign, ":dist6", ":dist_portal_out_target"),
(assign, ":dist8", ":dist_party_target"),
(val_add, ":dist_portal_out_target", ":dist_party_entry"), #Combine party->portal+portal->target
(try_begin), #This little fella makes units prioritize the portal, if they, or their target is near a portal
(this_or_next|le, ":dist_portal_9", 15),
(le, ":dist6", 15),
(val_mul, ":dist_party_target", 5),
(else_try),
(this_or_next|le, ":dist_portal_9", 30),
(le, ":dist6", 30),
(val_mul, ":dist_party_target", 3),
(else_try),
(this_or_next|le, ":dist_portal_9", 50),
(le, ":dist6", 50),
(val_mul, ":dist_party_target", 1.5),
(else_try),
(this_or_next|le, ":dist_portal_9", 100),
(le, ":dist6", 100),
(val_mul, ":dist_party_target", 1.2),
(else_try),
(val_mul, ":dist_party_target", 1),
(try_end),
(try_begin),
(this_or_next|le, ":dist8", ":dist6"),
(this_or_next|le, ":dist8", ":dist_portal_9"),
(le, ":dist_party_target", ":dist_portal_out_target"), #
(party_set_slot, "p_9", slot_would_portal_be_used_by_party, 0),
(party_set_slot, "p_10", slot_would_portal_be_used_by_party, 0),
(try_end),
(try_end),
########################
(try_begin), #Would Party use Portal 6?
(eq, ":portal_6_in_range", 1),
(store_faction_of_party, ":faction_party", ":party_no"),
(store_faction_of_party, ":faction_portal", "p_castle_33"),
(store_relation, ":relation", ":faction_party", ":faction_portal"),
(try_begin),
(eq, ":faction_party", ":faction_portal"),
(assign, ":relation", 100),
(try_end),
(ge, ":relation", 0), #min relation requires to use this portal
(store_distance_to_party_from_party, ":dist_party_target", ":party_no", ":target_center"),
(try_begin),
(le, ":dist_portal_11", ":dist_portal_12"),
(assign, ":dist_party_entry", ":dist_portal_11"), # this makes the closer portal the entry and the other the out
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_12", ":target_center"),
(party_set_slot, "p_11", slot_would_portal_be_used_by_party, ":party_no"),
(else_try),
(assign, ":dist_party_entry", ":dist_portal_12"),
(store_distance_to_party_from_party, ":dist_portal_out_target", "p_11", ":target_center"),
(party_set_slot, "p_12", slot_would_portal_be_used_by_party, ":party_no"),
(try_end),
(assign, ":dist6", ":dist_portal_out_target"),
(assign, ":dist8", ":dist_party_target"),
(val_add, ":dist_portal_out_target", ":dist_party_entry"), #Combine: party->portal + portal->target
(try_begin), #This little fella makes units prioritize the portal, if they, or their target is near a portal
(this_or_next|le, ":dist_portal_11", 15),
(le, ":dist6", 15),
(val_mul, ":dist_party_target", 5),
(else_try),
(this_or_next|le, ":dist_portal_11", 30),
(le, ":dist6", 30),
(val_mul, ":dist_party_target", 3),
(else_try),
(this_or_next|le, ":dist_portal_11", 50),
(le, ":dist6", 50),
(val_mul, ":dist_party_target", 1.5),
(else_try),
(this_or_next|le, ":dist_portal_11", 100),
(le, ":dist6", 100),
(val_mul, ":dist_party_target", 1.2),
(else_try),
(val_mul, ":dist_party_target", 1),
(try_end),
(try_begin),
(this_or_next|le, ":dist8", ":dist6"),
(this_or_next|le, ":dist8", ":dist_portal_11"),
(le, ":dist_party_target", ":dist_portal_out_target"), #
(party_set_slot, "p_11", slot_would_portal_be_used_by_party, 0),
(party_set_slot, "p_12", slot_would_portal_be_used_by_party, 0),
(try_end),
(try_end),
###################################################################
########## Calculating which if any of the portals that the party would use is closest
(assign, ":closest_portal", 999999),
(try_for_range, ":portal", "p_1", "p_spawn_points_end"),
(party_slot_eq, ":portal", slot_would_portal_be_used_by_party, ":party_no"),
(store_distance_to_party_from_party, ":distance", ":party_no", ":portal"),
(lt, ":distance", ":closest_portal"),
(assign, ":closest_portal", ":portal"),
(try_end),
###########calc closest portal end
##################################### This checks, which portal entry has been assigned as the closest portal and then tells the party to move there.
(try_begin), #larger loop to assign slot_party_destination once at the end
(try_begin),
(eq, ":closest_portal", "p_1"),
(assign, ":target_portal", "p_1"),
(party_set_slot, ":party_no", slot_portal_using, 1),
(else_try),
(eq, ":closest_portal", "p_2"),
(assign, ":target_portal", "p_2"),
(party_set_slot, ":party_no", slot_portal_using, 2),
(else_try),
(eq, ":closest_portal", "p_3"),
(assign, ":target_portal", "p_3"),
(party_set_slot, ":party_no", slot_portal_using, 3),
(else_try),
(eq, ":closest_portal", "p_4"),
(assign, ":target_portal", "p_4"),
(party_set_slot, ":party_no", slot_portal_using, 4),
(else_try),
(eq, ":closest_portal", "p_5"),
(assign, ":target_portal", "p_5"),
(party_set_slot, ":party_no", slot_portal_using, 5),
(else_try),
(eq, ":closest_portal", "p_6"),
(assign, ":target_portal", "p_6"),
(party_set_slot, ":party_no", slot_portal_using, 6),
(else_try),
(eq, ":closest_portal", "p_7"),
(assign, ":target_portal", "p_7"),
(party_set_slot, ":party_no", slot_portal_using, 7),
(else_try),
(eq, ":closest_portal", "p_8"),
(assign, ":target_portal", "p_8"),
(party_set_slot, ":party_no", slot_portal_using,
,
(else_try),
(eq, ":closest_portal", "p_9"),
(assign, ":target_portal", "p_9"),
(party_set_slot, ":party_no", slot_portal_using, 9),
(else_try),
(eq, ":closest_portal", "p_10"),
(assign, ":target_portal", "p_10"),
(party_set_slot, ":party_no", slot_portal_using, 10),
(else_try),
(eq, ":closest_portal", "p_11"),
(assign, ":target_portal", "p_11"),
(party_set_slot, ":party_no", slot_portal_using, 11),
(else_try),
(eq, ":closest_portal", "p_12"),
(assign, ":target_portal", "p_12"),
(party_set_slot, ":party_no", slot_portal_using, 12),
(else_try),
(assign, ":target_portal", ":target_center"), #safety
(try_for_range, ":portal", "p_1", "p_spawn_points_end"),
(party_set_slot, ":portal", slot_would_portal_be_used_by_party, 0),
(try_end),
(try_end),
(party_set_slot, ":party_no", slot_party_destination, ":target_center"),
(party_set_ai_object, ":party_no", ":target_portal"),
(try_end),
]),