OSP Code Campaign [WIP] Way of the Sea - water travel -

Users who are viewing this thread

Here is a trigger, which automatically renames all ports, when the game starts. For example, a port near Jelkala will be renamed to "Jelkala's port".

##### F&B begin rename ports
(0.0, 0, ti_once, [],
[
      (try_for_range, ":port", ports_begin, ports_end),
(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", ":port"),
(le, ":dist", ":min_dist"),
(assign, ":min_dist", ":dist"),
(assign, ":target", ":closest_settlement"),
(try_end),
(str_store_party_name, s4, ":target"),
(party_set_name, ":port", "@{s4}'s port"),
      (try_end),

]),
#### F&B end rename ports


Thank you for the lighthouse icon, Cozur. The ports will look much better with a proper icon.

Bug fix:
Fixes the issue, where ai teleports back to nearest settlement, if their ai_object changes to hold
Replace the script "calculate_distances" with this version:
###############################################################################
######################### 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 . Since water travel is much faster, it travels directly.
(try_begin),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain", :cool:,
(party_get_current_terrain, ":terrain", ":target_center"),
# (neg|is_between, ":target_center", ports_begin, ports_end), #F&B bug hunting
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain", :cool:,
(party_set_ai_object, ":party_no", ":target_center"),
(assign, ":water_travel", 1),
(try_end),
(party_set_slot, ":party_no", slot_using_port, 0),
(eq, ":water_travel", 1),
#############################################################################
(else_try), ###################### Water-Land Route. Forces party to use a port.
### Checking that party is on water and target center on land.
(try_begin),
(party_get_current_terrain, ":terrain", ":party_no"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain", :cool:,
(party_get_current_terrain, ":terrain", ":target_center"),
(this_or_next|neg|eq, ":terrain", 0),
(neg|eq, ":terrain", :cool:,
(party_set_ai_object, ":party_no", ":target_center"),
(assign, ":water_travel", 1),
(try_end),
(eq, ":water_travel", 1),
######### Finding port closest to target center, to reduce land travel distance
(assign, ":closest_port_dist", 99999),
(try_for_range, ":port", "p_port_1", "p_spawn_points_end"),
(store_distance_to_party_from_party, ":distance", ":target_center", ":port"),
(lt, ":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-Land Route
##### Finding port closest to party
    (assign, ":closest_port_dist", 999999),   
(assign, ":min_dist", 99999),
    (assign, ":closest_exit_port_dist", 999999),
    (try_for_range, ":port", "p_port_1", "p_spawn_points_end"),
        (store_distance_to_party_from_party, ":distance", ":party_no", ":port"),
        (lt, ":distance", ":closest_port_dist"),
(assign, ":closest_port_dist", ":distance"),
        (assign, ":closest_port", ":port"),
      (try_end),   
#### Finding port closest to target

      (try_for_range, ":port", "p_port_1", "p_spawn_points_end"),
        (store_distance_to_party_from_party, ":distance_exit", ":target_center", ":port"),
        (lt, ":distance_exit", ":closest_exit_port_dist"),
(assign, ":closest_exit_port_dist", ":distance_exit"),
        (assign, ":closest_exit_port", ":port"),
      (try_end), 
##### Store distances
        (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),
##### Checking if party should use ports
(try_begin),
(le, ":closest_port_dist", ":direct_distance"),

(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"),
(else_try),
(party_set_slot, ":party_no", slot_using_port, 0),
(party_set_ai_object, ":party_no", ":target_center"),
(try_end),
(try_end), 
  ]),
######################### F&B end Script for AI using ports
################################################################################

and replace the two simple_triggers with this one:
######################### F&B begin Trigger for AI using ports
#################################################################################
##### Trigger, that moves units from port to settlement and back
(1,
[
(try_for_parties, ":party_no"),
(try_begin), #### moving party from land to sea
(party_slot_eq, ":party_no", slot_using_port, 1),
(party_get_slot, ":entry_center", ":party_no", slot_entry_center),
(store_distance_to_party_from_party, ":dist", ":party_no", ":entry_center"),
(le, ":dist", 1),
(party_get_icon, ":cur_icon", ":party_no"),
(party_set_slot, ":party_no", slot_party_save_icon, ":cur_icon"),
(party_get_slot, ":port", ":party_no", slot_entry_port),
(party_relocate_near_party, ":party_no", ":port", 0),
(party_set_icon, ":party_no", "icon_ship"),
(party_set_flags, ":party_no", pf_is_ship, 1),
(party_set_slot, ":party_no", slot_using_port, 2),
(party_get_slot, ":exit_port", ":party_no", slot_exit_port),
(party_set_ai_behavior, ":party_no", ai_bhvr_travel_to_party),
(party_set_ai_object, ":party_no", ":exit_port"),
(else_try), ### moving units from sea to land
(party_slot_eq, ":party_no", slot_using_port, 2),
(party_get_slot, ":exit_port", ":party_no", slot_exit_port),
(store_distance_to_party_from_party, ":dist", ":party_no", ":exit_port"),
(le, ":dist", 1),
(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", ":party_no"),
(le, ":dist", ":min_dist"),
(assign, ":min_dist", ":dist"),
(assign, ":target", ":closest_settlement"),
(try_end),
(party_relocate_near_party, ":party_no", ":target", 0),
(party_get_slot, ":icon", ":party_no", slot_party_save_icon),
(party_set_icon, ":party_no", ":icon"),
(party_set_flags, ":party_no", pf_is_ship, 0),
(party_set_slot, ":party_no", slot_exit_port, -1),
(party_set_slot, ":party_no", slot_using_port, 0),
(party_get_slot, ":target_center", ":party_no", slot_party_destination),
(party_set_ai_object, ":party_no", ":target_center"),
(try_end),
(try_end),
]),

######################### F&B end Trigger for AI using ports
 
The script calculate_distances has seen another update:

-Takes into account, that the party may be on land and it's target is on water.
-Strangest bug got fixed, where village farmer parties would travel to the player, stay for a while, as if they where visiting a town, before returning to their villages.

##########################################################
############# 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", :cool:,
(party_get_current_terrain, ":terrain", ":target_center"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain", :cool:,
(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", :cool:,
(party_get_current_terrain, ":terrain", ":target_center"),
(this_or_next|neg|eq, ":terrain", 0),
(neg|eq, ":terrain", :cool:,
(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", :cool:,
(party_get_current_terrain, ":terrain", ":target_center"),
(this_or_next|eq, ":terrain", 0),
(eq, ":terrain", :cool:,
(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
###############################################################################
 
You should put the code parts into a
Code:
code here
bracket, so people don't get confused and think the smileys are just there for kicks.
 
Dusk Voyager said:
Spoilers are way better IMO as long as you don't forget to tick the "don't use smileys" box.

You can do both though, like this:


Code:
Code here, question: Did Moby **** the whale steal other captains legs, and what did he do with them?
 
For stuff like this:

(party_set_slot, "$g_encountered_party", slot_party_ai_object, "$diplomacy_var"),

Are we meant to replace those also, or just the party_set_ai_object?
 
What if it's setting the ai object to -1?
(party_set_slot, ":marshal_party", slot_party_ai_object, -1),
 
You don't have to replace those lines which set slot_party_ai_object as -1. If you do replace them with the call_script part, the script would fail and just default back to setting the original party_ai_object, so to -1. slot_party_ai_object will be -1 either way. Of course, by not replacing those lines, you can save a few calculations.
 
Alright, thank you. One last thing, can you post the "port" menu? You have the code posted to go to it when the player encounters a port, but not the actual menu.

Edit: And a small bugfix, you should add (party_slot_eq, "$current_town", slot_village_infested_by_bandits, 0), to the village version of the water travel menu.
 
Port Menu:
Add it anywhere to module_game_menus
#### F&B begin water travel
("port", mnf_enable_hot_keys, "Do you wish to land here?", "none",
[],
[
("land",[],"Land here",
[
(assign, ":min_dist", 10000),
(try_for_range, ":center_no", centers_begin, centers_end),
(neg|party_slot_eq, ":center_no", slot_party_type, spt_port),
(store_distance_to_party_from_party, ":dist", ":center_no", "$g_encountered_party"),
(lt, ":dist", ":min_dist"),
(assign, ":min_dist", ":dist"),
(assign, "$g_closest_port", ":center_no"),
(try_end),
(party_relocate_near_party, "p_main_party", "$g_closest_port"),
(party_set_icon, "p_main_party", "icon_player"),
(party_set_flags, "p_main_party", pf_is_ship, 0),
(change_screen_return, 0),
]),
("port_leave",
[],
"Leave",
[(change_screen_return, 0)]),
]),
#### F&B end water travel
 
A couple more bugs.

1) The player is able to disembark/embark anywhere, my fix for that is replace the "disembark" menu with this:
  (
    "disembark",0,
    "...",
    "none",
    [
        (party_get_position, pos1, "p_main_party"),
        (map_get_water_position_around_position, pos2, pos1, 6),
        (party_set_position, "p_main_party", pos2),
(change_screen_return),],
    [
      ("disembark_no", [], "Continue.",
      [(change_screen_return),
        ]),
    ]
  ),

2) Lord patrolling around me (first image) http://imgur.com/a/6zALV

3) Some ai parties get stuck (second image) http://imgur.com/a/6zALV
 
Very clear feedback :grin:

1) You can simply delete this script, which opens the menu to disembark.
  ("game_on_disembark",
  [(jump_to_menu, "mnu_disembark"),
  ]),

2) Gotta have to look into it.

3) Already fixed for next update.

Gonna do some more bug hunting after college and upload another version, if no major issues occur.
 
Fire_and_Blood said:
Yes:
-search for "party_set_ai_object" in all module files.
-add the three lines
-delete the line with (party_set_ai_object. Or place a "#" in front of it, so that it gets ignored. "script_calculate_distances" will assign "party_set_ai_object". We don't want other code to override the scripts travel decision.

What should I do with the bolded line in this situation?

(2.0, 0, 0, [(store_random_party_of_template, reg(2), "pt_prisoner_train_party"),
              (party_is_in_any_town,reg(2)),
              ],
              [(store_faction_of_party, ":faction_no", reg(2)),
              (call_script,"script_cf_select_random_walled_center_with_faction", ":faction_no", -1),
              (party_set_ai_behavior,reg(2),ai_bhvr_travel_to_party),
              (party_set_ai_object,reg(2),reg0),
              (party_set_flags, reg(2), pf_default_behavior, 0),
            ]),
 
Back
Top Bottom