Ferries (Solved)

Users who are viewing this thread

Hey guys :smile: So I came across this VC issue: caravans and travelling priests that use ferries to go from Caer Dyf to Bosvenegh often turn back half the way and try again and again and again... it can last really long if they aren't lucky with the timing.
Here's the picture (they usually go like shown with the pink colour bc the trigger fires every 3 hours which is barely enough for them to cross the water, but eventually will go in the right, green direction): https://ibb.co/gTNKZDW

mb247.png


I found the trigger that does it and I'm thinking how to fix it best...On the one hand I definitely don't want to have them stuck there, on the other hand this script is supposed to make AI parties not get stuck on sea in general. Any advice?
Here's the code of the trigger (part 3.2 seems to cause it) :

Code:
  # script_map_sea_ai_3
  # Component: Ships and sea (map)
  # This script is called every 3h in a simple trigger
  # it is "having bandits go to lairs and back" + "heuristic/workaround trigger
  # to fix the problems which occurred to sea travel with the new executables"
  ("map_sea_ai_3",
    [#(display_message, "@{!}map_sea_ai_3..."),
      (try_for_parties, ":party_no"),
        # 1.CONDITIONS
        (gt, ":party_no", "p_spawn_points_end"),
        (party_get_template_id, ":party_template_id", ":party_no"),
        (neq, ":party_template_id", "pt_port"),
        (neq, ":party_template_id", "pt_landet_ships"),
        (party_is_active, ":party_no"),
      
        # 2.PIGGYBACKING
        (call_script, "script_bandits_go_to_lairs", ":party_no"),
      
        #3.1 GETTING DATA
        (get_party_ai_object, ":ai_object", ":party_no"),
        (get_party_ai_behavior, ":ai_behavior", ":party_no"),
      
        # 3.PARTIES ON SEA
        (try_begin),
          (party_slot_eq, ":party_no", slot_party_on_water, 1),
        
          (party_set_flags, ":party_no", pf_is_ship, 1),#fixing flags (fixing VC-1537 for old save games)
        
          #3.2 SCENARIOS (fixing hanging ships mentioned in VC-1216)
          (try_begin),
            # #scenario 0: Dont change AI while attacking or flee
            # (this_or_next|eq, ":ai_behavior", ai_bhvr_attack_party),
            # ( eq, ":ai_behavior", ai_bhvr_driven_by_party),
            # (display_message, "@{!}I dont change AI while attacking or flee"),
            # (assign, ":block", 1),
            # (else_try),
            #scenario 1: ai_object = port party
            (neq, ":ai_behavior", ai_bhvr_hold),
            (neq, ":ai_behavior", ai_bhvr_patrol_location),
            (neq, ":ai_behavior", ai_bhvr_travel_to_point),
            (call_script, "script_cf_is_port_party", ":ai_object"),
            (assign, ":block", 1),
          (else_try),
            #scenario 2: ai_object on land
            (neq, ":ai_object", -1),
            (neq, ":ai_behavior", ai_bhvr_hold),
            (neq, ":ai_behavior", ai_bhvr_patrol_location),
            (neq, ":ai_behavior", ai_bhvr_travel_to_point),
            (party_slot_eq, ":ai_object", slot_party_on_water, 0),
            (assign, ":block", 0),
            ###JC injection1
            (party_get_position, pos1, ":party_no"),
            (position_get_x, ":x_pos", pos1),
            ###TEST
            #(str_store_party_name, s10, ":party_no"),#caravans and travelling priests get stuck in a loop
            #(display_message, "@TEST: {s10} is landing."),
            ################         
            (call_script, "script_get_closest_port", ":ai_object", ":x_pos"),#JCINT
            (party_get_slot, ":port_party", reg0, slot_party_port_party),
          (else_try),
            #scenario x: parties who shouldn't be on the sea
            #(this_or_next|is_between, ":party_template_id", "pt_looters",
            #"pt_merchant_caravan"),
            (this_or_next | is_between, ":party_template_id", "pt_looters", "pt_deserters"),    #Deserters are now allowed to go on sea since they have a AI now
            (this_or_next | eq, ":party_template_id", "pt_sacerdotes_party"),
            (this_or_next | eq, ":party_template_id", "pt_routed_warriors"),
            (eq, ":party_template_id", "pt_paganos_party"),
            (assign, ":block", 0),
            ###JC injection1
            (party_get_position, pos1, ":party_no"),
            (position_get_x, ":x_pos", pos1),             
            ################         
            (call_script, "script_get_closest_port", ":party_no", ":x_pos"),#JCINT
            (party_get_slot, ":port_party", reg0, slot_party_port_party),
          (else_try),
            #scenario 3: target_position on land
            (eq, ":ai_behavior", ai_bhvr_travel_to_point),
            (party_get_ai_target_position, pos1, ":party_no"),
            (party_set_position, "p_temp_party", pos1),
            (party_get_current_terrain, ":terrain_type", "p_temp_party"),
            (neq, ":terrain_type", 0),
            (neq, ":terrain_type", 7),
            (neq, ":terrain_type", 8),
            (assign, ":block", 0),
            ###JC injection1
            (party_get_position, pos1, ":party_no"),
            (position_get_x, ":x_pos", pos1),         
            ################         
            (call_script, "script_get_closest_port", "p_temp_party", ":x_pos"),#JCINT
            (party_get_slot, ":port_party", reg0, slot_party_port_party),
          (else_try),
            #scenario 4: rest
            (assign, ":block", 1),
          (end_try),
          (eq, ":block", 0),
        
          #3.3 EXECUTING CONSEQUENCES
          (party_get_slot, ":ai_state", ":party_no", slot_party_ai_state),
          (party_set_slot, ":party_no", slot_party_ai_state_backup, ":ai_state"),
          (party_set_slot, ":party_no", slot_party_ai_object_backup, ":ai_object"),
          (party_set_slot, ":party_no", slot_party_ai_behavior_backup, ":ai_behavior"),
          (party_set_ai_behavior, ":party_no", ai_bhvr_travel_to_party),
          (party_set_ai_object, ":party_no", ":port_party"),
          # (party_set_slot, ":party_no", slot_party_ai_state, 0), # outcommented to
          # try fixing VC-1824
          (party_set_slot, ":party_no", slot_party_ai_object, ":port_party"),
        
          # 4.PARTIES ON LAND
        (else_try),
          (party_slot_eq, ":party_no", slot_party_on_water, 0),
        
          (try_begin),
            #4.1 SPECIAL SCENARIO: AI OBJECT ON WATER
            # Note: This was created for the new system of parties which travel to
            # their spawnpoints on sea But as long as all spawnpoints are
            # on rt_bridge it should also work without it
          
            #conditions
            (neq, ":ai_object", -1),
            (neq, ":ai_behavior", ai_bhvr_hold),
            (neq, ":ai_behavior", ai_bhvr_patrol_location),
            (neq, ":ai_behavior", ai_bhvr_travel_to_point),
            (get_party_ai_object, ":ai_object", ":party_no"),
            (party_get_slot, ":home", ":party_no", slot_party_spawn_point),
            (is_between, ":home", spawn_points_begin, spawn_points_end),# limiting this to motos parties
            (party_slot_eq, ":ai_object", slot_party_on_water, 1),
          
            #message
            (try_begin),
              (ge, "$vc_debug_mode", 2),
              (str_store_party_name, s1, ":party_no"),
              (display_message, "@{!}INFO: {s1} is in SPECIAL SCENARIO: AI OBJECT ON WATER"),
            (end_try),
          
            #consequences
            (get_party_ai_behavior, ":ai_behavior", ":party_no"),
            #(party_set_slot, ":party_no", slot_party_ai_state_backup, -1),
            (party_set_slot, ":party_no", slot_party_ai_object_backup, ":ai_object"),
            (party_set_slot, ":party_no", slot_party_ai_behavior_backup, ":ai_behavior"),
            ###JC injection1
            (party_get_position, pos1, ":party_no"),
            (position_get_x, ":x_pos", pos1),             
            ################         
            (call_script, "script_get_closest_port", ":party_no", ":x_pos"),#JCINT
            (party_set_slot, ":party_no", slot_party_ai_embarking_port, reg0),
            (party_get_position, pos1, reg0),
            (party_set_ai_target_position, ":party_no", pos1),
            (party_set_ai_behavior, ":party_no", ai_bhvr_travel_to_point),
          
          (else_try),
            # 4.2 SPECIAL SCENARIO LORD (VC-1679)
          
            #conditions
            (party_slot_eq, ":party_no", slot_party_type, spt_kingdom_hero_party),
            (party_get_slot, ":ai_state", ":party_no", slot_party_ai_state),
            (eq, ":ai_state", spai_accompanying_army),
            (party_get_slot, ":ai_object", ":party_no", slot_party_ai_object),
            (gt, ":ai_object", -1),
            (party_is_active, ":ai_object"),
            (party_slot_eq, ":ai_object", slot_party_on_water, 1),
          
            #consequences
            (get_party_ai_behavior, ":ai_behavior", ":party_no"),
            (party_set_slot, ":party_no", slot_party_ai_state_backup, ":ai_state"),
            (party_set_slot, ":party_no", slot_party_ai_object_backup, ":ai_object"),
            (party_set_slot, ":party_no", slot_party_ai_behavior_backup, ":ai_behavior"),
            ###JC injection1
            (party_get_position, pos1, ":party_no"),
            (position_get_x, ":x_pos", pos1),         
            ################         
            (call_script, "script_get_closest_port", ":party_no", ":x_pos"),#JCINT
            (party_set_slot, ":party_no", slot_party_ai_embarking_port, reg0),
            (party_get_position, pos1, reg0),
            (party_set_ai_target_position, ":party_no", pos1),
            (party_set_ai_behavior, ":party_no", ai_bhvr_travel_to_point),
          (end_try),
        (end_try),
      
      (end_try),]),
 
Last edited by a moderator:
Back
Top Bottom