Ramaraunt1

Untitled

May 6th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 726.47 KB | None | 0 0
  1. from header_common import *
  2. from header_operations import *
  3. from module_constants import *
  4. from header_parties import *
  5. from header_skills import *
  6. from header_mission_templates import *
  7. from header_items import *
  8. from header_triggers import *
  9. from header_terrain_types import *
  10. from header_music import *
  11. from header_map_icons import *
  12. from header_sounds import *
  13. import header_debug as dbg
  14. import header_lazy_evaluation as lazy
  15. import math
  16.  
  17. ####################################################################################################################
  18. # scripts is a list of script records.
  19. # Each script record contns the following two fields:
  20. # 1) Script id: The prefix "script_" will be inserted when referencing scripts.
  21. # 2) Operation block: This must be a valid operation block. See header_operations.py for reference.
  22. ####################################################################################################################
  23.  
  24. scripts = []
  25. scripts.extend([
  26.  
  27. ("game_start", []), # single player only, not used
  28.  
  29. ("game_get_use_string", # clients: called by the game when the local player is aiming at a usable scene prop
  30. [(store_script_param, ":instance_id", 1),
  31.  
  32. (try_begin),
  33. (multiplayer_is_server),
  34. (get_player_agent_no, ":my_agent_id"),
  35. (assign, ":stock_count_update_time", 0),
  36. (else_try), # if the targeted prop has a stock count and enough time has passed since the last update, request the current count from the server
  37. (multiplayer_get_my_player, ":my_player_id"),
  38. (player_is_active, ":my_player_id"),
  39. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  40. (scene_prop_get_slot, ":stock_count_update_time", ":instance_id", slot_scene_prop_stock_count_update_time),
  41. (neq, "$g_game_type", "mt_quick_battle"),
  42. (neq, ":stock_count_update_time", 0),
  43. (store_mission_timer_a, ":current_time"),
  44. (gt, ":current_time", ":stock_count_update_time"),
  45. (val_add, ":current_time", stock_count_check_interval),
  46. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count_update_time, ":current_time"),
  47. (multiplayer_send_int_to_server, client_event_request_stock_count, ":instance_id"),
  48. (try_end),
  49.  
  50. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  51. (scene_prop_get_slot, ":use_string", ":instance_id", slot_scene_prop_use_string),
  52. (try_begin), # if the targeted prop is an item stockpile
  53. (is_between, ":item_id", all_items_begin, all_items_end),
  54. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  55. (assign, ":gold_value", reg0),
  56. (assign, ":gold_multiplier", reg1),
  57.  
  58. (try_begin),
  59. (gt, ":use_string", 0),
  60. (try_begin), # for banners, get the associated faction name
  61. (eq, ":use_string", "str_buy_banner_faction"),
  62. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  63. (str_store_faction_name, s1, reg0),
  64. (str_store_string, s0, ":use_string"),
  65. (else_try), # for the export stations in the feudalism game type, display the castle that will benefit
  66. (eq, "$g_game_type", "mt_feudalism"),
  67. (eq, ":use_string", "str_export"),
  68. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  69. (gt, reg1, -1),
  70. (call_script, "script_str_store_castle_name", s1, reg1),
  71. (str_store_string, s0, "str_export_for_s1"),
  72. (else_try), # for props with a custom use string set
  73. (str_store_item_name, s1, ":item_id"),
  74. (assign, reg1, ":gold_value"),
  75. (str_store_string, s0, ":use_string"),
  76. (try_end),
  77. (else_try), # for props with a stock count
  78. (neq, ":stock_count_update_time", 0),
  79. (try_begin),
  80. (eq, "$g_game_type", "mt_quick_battle"),
  81. (str_store_string, s0, "str_buy_sell"),
  82. (else_try),
  83. (eq, "$g_game_type", "mt_no_money"),
  84. (str_store_string, s0, "str_take_put_craft"),
  85. (else_try),
  86. (str_store_string, s0, "str_buy_sell_craft"),
  87. (else_try),
  88. (try_end),
  89. (else_try), # for unlimited buying stations
  90. (try_begin),
  91. (eq, "$g_game_type", "mt_no_money"),
  92. (str_store_string, s0, "str_take"),
  93. (else_try),
  94. (str_store_string, s0, "str_buy"),
  95. (try_end),
  96. (try_end),
  97.  
  98. (try_begin), # store extra information for script game_get_item_extra_text, called by the show_item_details operation
  99. (neq, ":stock_count_update_time", 0),
  100. (try_begin),
  101. (neq, "$g_game_type", "mt_quick_battle"),
  102. (scene_prop_get_slot, "$g_extra_item_details_1_value", ":instance_id", slot_scene_prop_stock_count),
  103. (assign, "$g_extra_item_details_1_string_id", "str_stock_count_reg0"),
  104. (assign, "$g_extra_item_details_1_color", 0xFF8888DD),
  105. (try_begin), # if a crafting stockpile, calculate the extra reward
  106. (neq, "$g_game_type", "mt_no_money"),
  107. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_resource_stockpile, 0),
  108. (call_script, "script_scene_prop_get_item_crafting_refund_reward", ":instance_id"),
  109. (assign, "$g_extra_item_details_2_value", reg1),
  110. (assign, "$g_extra_item_details_2_value_2", reg2),
  111. (try_begin),
  112. (neq, "$g_game_type", "mt_feudalism"),
  113. (assign, "$g_extra_item_details_2_string_id", "str_crafting_refund_reg0_reward_reg1"),
  114. (else_try),
  115. (assign, "$g_extra_item_details_2_string_id", "str_crafting_reward_reg1"),
  116. (try_end),
  117. (try_begin),
  118. (gt, "$g_extra_item_details_2_value_2", 0),
  119. (assign, "$g_extra_item_details_2_color", 0xFFAADD11),
  120. (else_try),
  121. (assign, "$g_extra_item_details_2_color", 0xFF888888),
  122. (try_end),
  123. (else_try), # otherwise if a resource stockpile, check if full or nearly so
  124. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_resource_stockpile, 1),
  125. (prop_instance_get_variation_id_2, ":stock_limit", ":instance_id"),
  126. (val_div, ":stock_limit", 10),
  127. (val_mul, ":stock_limit", 100),
  128. (try_begin),
  129. (eq, ":stock_limit", 0),
  130. (else_try),
  131. (ge, "$g_extra_item_details_1_value", ":stock_limit"),
  132. (str_store_string, s0, "str_stockpile_full"),
  133. (else_try),
  134. (val_mul, ":stock_limit", 9),
  135. (val_div, ":stock_limit", 10),
  136. (ge, "$g_extra_item_details_1_value", ":stock_limit"),
  137. (str_store_string, s0, "str_stockpile_nearly_full"),
  138. (try_end),
  139. (try_end),
  140. (try_end),
  141. (try_begin), # calculate the selling price
  142. (neq, "$g_game_type", "mt_no_money"),
  143. (this_or_next|neq, "$g_game_type", "mt_feudalism"),
  144. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_resource_stockpile, 0),
  145. (call_script, "script_calculate_stockpile_taxed_price", ":instance_id", ":gold_value"),
  146. (assign, "$g_extra_item_details_3_value", reg0),
  147. (assign, "$g_extra_item_details_3_string_id", "str_selling_price_reg0"),
  148. (assign, "$g_extra_item_details_3_color", 0xFFAA7777),
  149. (try_end),
  150. (try_end),
  151.  
  152. (agent_get_look_position, pos3, ":my_agent_id"),
  153. (position_get_screen_projection, pos4, pos3),
  154. (show_item_details, ":item_id", pos4, ":gold_multiplier"),
  155.  
  156. (else_try), # if the targeted prop is a training station, display all the stats
  157. (scene_prop_get_slot, ":troop_id", ":instance_id", slot_scene_prop_troop_id),
  158. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  159. (str_store_troop_name_plural, s1, ":troop_id"),
  160. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  161. (assign, ":faction_id", reg0),
  162. (str_store_faction_name, s2, ":faction_id"),
  163. (try_begin),
  164. (gt, ":use_string", 0),
  165. (str_store_string, s0, ":use_string"),
  166. (else_try),
  167. (str_store_string, s0, "str_troop_train"),
  168. (try_end),
  169. (multiplayer_get_my_player, ":player_id"),
  170. (try_begin),
  171. (call_script, "script_cf_can_change_faction", ":player_id", ":faction_id"),
  172. (call_script, "script_cf_player_can_use_troop", ":player_id", ":troop_id"),
  173. (else_try),
  174. (str_store_string, s0, "str_troop_not_available"),
  175. (try_end),
  176. (try_begin),
  177. (neq, "$g_game_type", "mt_no_money"),
  178. (scene_prop_get_slot, ":gold_cost", ":instance_id", slot_scene_prop_gold_value),
  179. (gt, ":gold_cost", 0),
  180. (assign, reg10, ":gold_cost"),
  181. (str_store_string, s0, "str_troop_cost"),
  182. (try_end),
  183. (store_attribute_level, reg10, ":troop_id", ca_strength),
  184. (store_attribute_level, reg11, ":troop_id", ca_agility),
  185. (str_store_string, s0, "str_troop_strength_agility"),
  186. (call_script, "script_store_troop_skills_description", ":troop_id"),
  187. (store_proficiency_level, reg10, ":troop_id", wpt_one_handed_weapon),
  188. (store_proficiency_level, reg11, ":troop_id", wpt_two_handed_weapon),
  189. (store_proficiency_level, reg12, ":troop_id", wpt_polearm),
  190. (store_proficiency_level, reg13, ":troop_id", wpt_archery),
  191. (store_proficiency_level, reg14, ":troop_id", wpt_crossbow),
  192. (store_proficiency_level, reg15, ":troop_id", wpt_throwing),
  193. (str_store_string, s0, "str_troop_weapon_proficiencies"),
  194.  
  195. (else_try), # for winches, select action string depending on relative position
  196. (this_or_next|eq, ":use_string", "str_winch_lower"),
  197. (eq, ":use_string", "str_winch_drop"),
  198. (call_script, "script_winch_get_direction", ":my_agent_id", ":instance_id"),
  199. (gt, reg0, 0),
  200. (str_store_string, s0, "str_winch_raise"),
  201. (else_try), # for carts, select action string depending on relative position
  202. (eq, ":use_string", "str_attach"),
  203. (call_script, "script_cart_choose_action", ":my_agent_id", ":instance_id"),
  204. (try_begin),
  205. (eq, reg0, 1),
  206. (str_store_string, s0, "str_access"),
  207. (else_try),
  208. (eq, reg0, 0),
  209. (str_store_string, s0, "str_not_close_enough"),
  210. (else_try),
  211. (str_store_string, s0, "str_attach"),
  212. (try_end),
  213. (else_try), # for item destroying piles, adjust string for attached carts or wielded items
  214. (eq, ":use_string", "str_destroy_s1"),
  215. (agent_get_horse, ":attach_agent_id", ":my_agent_id"),
  216. (try_begin),
  217. (le, ":attach_agent_id", -1),
  218. (assign, ":attach_agent_id", ":my_agent_id"),
  219. (try_end),
  220. (agent_get_attached_scene_prop, ":attached_instance_id", ":attach_agent_id"),
  221. (try_begin),
  222. (prop_instance_is_valid, ":attached_instance_id"),
  223. (str_store_string, s0, "str_destroy_all_items_cart"),
  224. (else_try),
  225. (agent_get_wielded_item, ":wielded_item_id", ":my_agent_id", 0),
  226. (try_begin),
  227. (is_between, ":wielded_item_id", all_items_begin, all_items_end),
  228. (str_store_item_name, s1, ":wielded_item_id"),
  229. (else_try),
  230. (agent_get_wielded_item, ":shield_item_id", ":my_agent_id", 1),
  231. (is_between, ":shield_item_id", all_items_begin, all_items_end),
  232. (str_store_item_name, s1, ":shield_item_id"),
  233. (else_try),
  234. (str_clear, s1),
  235. (try_end),
  236. (str_store_string, s0, ":use_string"),
  237. (try_end),
  238.  
  239. (else_try), # for custom use strings, store the gold value and stock count slots for insertion into it
  240. (gt, ":use_string", 0),
  241. (scene_prop_get_slot, reg1, ":instance_id", slot_scene_prop_gold_value),
  242. (scene_prop_get_slot, reg2, ":instance_id", slot_scene_prop_stock_count),
  243. (str_store_string, s0, ":use_string"),
  244.  
  245. (else_try), # for castle signs, calculate the name to display
  246. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":instance_id"),
  247. (eq, ":scene_prop_id", "spr_pw_castle_sign"),
  248. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  249. (try_begin),
  250. (gt, reg1, -1),
  251. (call_script, "script_str_store_castle_name", s0, reg1),
  252. (str_store_faction_name, s1, reg0),
  253. (str_store_string, s0, "str_s0__s1_"),
  254. (else_try),
  255. (prop_instance_get_variation_id_2, ":name_string_id", ":instance_id"),
  256. (val_add, ":name_string_id", castle_names_begin),
  257. (val_min, ":name_string_id", castle_names_end),
  258. (str_store_string, s0, ":name_string_id"),
  259. (try_end),
  260.  
  261. (else_try), #RAMARAUNT ADD for ledger
  262. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":instance_id"),
  263. (eq, ":scene_prop_id", "spr_pws_castle_faction_interest_ledger"),
  264. (call_script, "script_scene_prop_ledger_get_money", ":instance_id"),
  265. (assign, reg45, reg0),
  266. (assign, reg46, reg1),
  267. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  268. (str_store_faction_name, s11, reg0),
  269. (call_script, "script_return_money_chest_last_user_string", reg0),
  270. (str_store_string, s0, "str_interest_ledger_string"),
  271.  
  272.  
  273. (else_try), # -1 clears the use string
  274. (eq, ":use_string", -1),
  275. (str_clear, s0),
  276. (else_try), # otherwise fall back to the default string
  277. (str_store_string, s0, "str_use"),
  278. (try_end),
  279.  
  280. (try_begin), # find the base scene prop a linked prop is targeted
  281. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_show_linked_hit_points, 1),
  282. (scene_prop_get_slot, "$g_show_hit_points_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  283. (prop_instance_is_valid, "$g_show_hit_points_instance_id"),
  284. (else_try),
  285. (assign, "$g_show_hit_points_instance_id", ":instance_id"),
  286. (try_end),
  287. (scene_prop_get_slot, "$g_scene_prop_full_hit_points", "$g_show_hit_points_instance_id", slot_scene_prop_full_hit_points),
  288. (try_begin), # set values to display the hit points bar presentation
  289. (gt, "$g_scene_prop_full_hit_points", 0),
  290. (scene_prop_get_hit_points, "$g_scene_prop_hit_points", "$g_show_hit_points_instance_id"),
  291. (gt, "$g_scene_prop_hit_points", "$g_scene_prop_full_hit_points"),
  292. (assign, "$g_scene_prop_full_hit_points", "$g_scene_prop_hit_points"),
  293. (scene_prop_set_slot, "$g_show_hit_points_instance_id", slot_scene_prop_full_hit_points, "$g_scene_prop_hit_points"),
  294. (try_end),
  295. ]),
  296.  
  297. ("store_troop_skills_description", []), # dynamically generate a string listing a troop's skills
  298. ("initialize_item_slots", []), # save or calculate item attributes into item slots, for use in calculations in scripts while the game is running
  299.  
  300. ("game_quick_start", # called by the game when starting multiplayer mode, before connecting to a server; used to setup static module data
  301. [
  302. (call_script, "script_initialize_troop_equipment_slots"),
  303. (call_script, "script_initialize_item_slots"),
  304. (call_script, "script_initialize_banner_info"),
  305. (call_script, "script_initialize_game_rules"),
  306. (call_script, "script_initialize_animation_menu_strings"),
  307. (call_script, "script_initialize_animation_durations"),
  308. (call_script, "script_store_profile_troop_equipment"),
  309. ]),
  310.  
  311. ("game_set_multiplayer_mission_end", # called when the mission ends
  312. [
  313. (assign, "$g_game_ended", 1),
  314. (assign, "$g_stats_chart_opened_manually", 0),
  315. (try_begin),
  316. (neg|is_presentation_active, "prsnt_tabbed_stats_chart"),
  317. (start_presentation, "prsnt_tabbed_stats_chart"),
  318. (try_end),
  319. ]),
  320.  
  321. ("game_enable_cheat_menu", []),
  322.  
  323. ("game_get_console_command", # server: called when console commands are entered (other than hard coded ones)
  324. [(store_script_param, ":command", 1),
  325. (store_script_param, ":value", 2),
  326.  
  327. (try_begin),
  328. (call_script, "script_cf_execute_command", ":command", ":value"),
  329. (call_script, "script_store_command_string", ":command", reg1),
  330. (else_try),
  331. (str_store_string, s0, reg0),
  332. (try_end),
  333. ]),
  334.  
  335. ("game_event_party_encounter", []),
  336. ("game_event_simulate_battle", []),
  337. ("game_event_battle_end", []),
  338. ("game_get_item_buy_price_factor", []),
  339. ("game_get_item_sell_price_factor", []),
  340. ("game_event_buy_item", []),
  341. ("game_event_sell_item", []),
  342. ("game_get_troop_wage", []),
  343. ("game_get_total_wage", []),
  344. ("game_get_join_cost", []),
  345. ("game_get_upgrade_xp", []),
  346. ("game_get_upgrade_cost", []),
  347. ("game_get_prisoner_price", []),
  348. ("game_check_prisoner_can_be_sold", []),
  349. ("game_get_morale_of_troops_from_faction", []),
  350. ("game_event_detect_party", []),
  351. ("game_event_undetect_party", []),
  352. ("game_get_statistics_line", []),
  353. ("game_get_date_text", []),
  354. ("game_get_money_text", []),
  355. ("game_get_party_companion_limit", []),
  356. ("game_reset_player_party_name", []),
  357. ("game_get_troop_note", []),
  358. ("game_get_center_note", []),
  359. ("game_get_faction_note", []),
  360. ("game_get_quest_note", []),
  361. ("game_get_info_page_note", []),
  362.  
  363. ("game_get_scene_name", # return scene names for display in the server list
  364. [(store_script_param, ":scene_no", 1),
  365. (try_begin),
  366. (multiplayer_is_dedicated_server), # on clients return nothing, so the server will always be asked in case of custom names
  367. (is_between, ":scene_no", scenes_begin, scenes_end),
  368. (store_sub, ":string_id", ":scene_no", scenes_begin),
  369. (val_add, ":string_id", scene_names_begin),
  370. (str_store_string, s0, ":string_id"),
  371. (try_end),
  372. ]),
  373.  
  374. ("game_get_mission_template_name",
  375. [(store_script_param, ":mission_template_no", 1),
  376. (try_begin),
  377. (is_between, ":mission_template_no", game_type_mission_templates_begin, game_type_mission_templates_end),
  378. (store_add, ":string_id", ":mission_template_no", game_type_names_begin),
  379. (str_store_string, s0, ":string_id"),
  380. (try_end),
  381. ]),
  382.  
  383. ("game_receive_url_response", # called by the game when a response is received from a web server, if used
  384. [(store_script_param, ":integer_count", 1),
  385. (store_script_param, ":string_count", 2),
  386.  
  387. (try_begin),
  388. (ge, ":integer_count", 1),
  389. (assign, "$g_name_server_enabled", 1),
  390. (assign, ":return_code", reg0),
  391. (try_begin), # negative return codes are internal or configuration errors, not requiring action
  392. (lt, ":return_code", 0),
  393. (try_begin),
  394. (eq, ":return_code", -1),
  395. (ge, ":string_count", 1),
  396. (server_add_message_to_log, "str_name_server_input_error_parameter_s0"),
  397. (else_try),
  398. (server_add_message_to_log, "str_name_server_error_code_reg0"),
  399. (try_end),
  400. (else_try),
  401. (ge, ":integer_count", 3),
  402. (assign, ":player_id", reg1),
  403. (assign, ":unique_id", reg2),
  404. (player_is_active, ":player_id"),
  405. (player_get_unique_id, ":player_unique_id", ":player_id"),
  406. (eq, ":player_unique_id", ":unique_id"),
  407. (try_begin), # normal name server responses
  408. (ge, ":return_code", 0),
  409. (try_begin), # admin permissions were received
  410. (ge, ":integer_count", 4),
  411. (player_is_admin, ":player_id"),
  412. (assign, ":admin_permissions", reg3),
  413. (val_max, ":admin_permissions", 0),
  414. (call_script, "script_player_set_admin_permissions", ":player_id", ":admin_permissions"),
  415. (multiplayer_send_int_to_player, ":player_id", server_event_admin_set_permissions, ":admin_permissions"),
  416. (try_end),
  417. (neq, ":return_code", 0),
  418. (assign, ":rejection_string_id", -1),
  419. (try_begin), # deal with kicking a player for various reasons
  420. (eq, ":return_code", 4),
  421. (assign, ":rejection_string_id", "str_kicked_not_registered"),
  422. (else_try),
  423. (eq, ":return_code", 3),
  424. (assign, ":rejection_string_id", "str_kicked_using_invalid_name"),
  425. (else_try),
  426. (eq, ":return_code", 2),
  427. (assign, ":rejection_string_id", "str_kicked_using_other_clan_tag"),
  428. (else_try),
  429. (eq, ":return_code", 1),
  430. (assign, ":rejection_string_id", "str_kicked_using_other_players_name"),
  431. (try_end),
  432. (neq, ":rejection_string_id", -1),
  433. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":rejection_string_id", preset_message_error|preset_message_log),
  434. (store_mission_timer_a, ":time"), # kick the player after a short delay to try ensure they see the rejection message
  435. (val_add, ":time", name_server_kick_delay_interval),
  436. (player_set_slot, ":player_id", slot_player_kick_at_time, ":time"),
  437. (str_store_string, s10, ":rejection_string_id"),
  438. (try_begin),
  439. (lt, ":string_count", 1),
  440. (str_store_string, s0, "str_empty_string"),
  441. (try_end),
  442. (server_add_message_to_log, "str_name_server_log_s10"),
  443. (try_end),
  444. (else_try),
  445. (eq, ":return_code", 0), # reply from server startup check
  446. (else_try),
  447. (server_add_message_to_log, "str_name_server_invalid_response"),
  448. (try_end),
  449. (try_end),
  450. ]),
  451.  
  452. ("game_get_cheat_mode", []),
  453.  
  454. ("game_receive_network_message", # called by the game whenever a custom network message is received, both clients and servers
  455. [(store_script_param, ":sender_player_id", 1),
  456. (store_script_param, ":event_type", 2),
  457.  
  458. (try_begin), # section of events received by clients from the server
  459. (neg|multiplayer_is_server),
  460. (try_begin), # displays preset messages sent from the server as a module string id, rather than the actual text
  461. (eq, ":event_type", server_event_preset_message),
  462. (store_script_param, ":string_id", 3),
  463. (store_script_param, ":flags", 4),
  464. (store_script_param, ":value_1", 5),
  465. (store_script_param, ":value_2", 6),
  466. (call_script, "script_preset_message", ":string_id", ":flags", ":value_1", ":value_2"),
  467. (else_try), # play a non 3D interface sound
  468. (eq, ":event_type", server_event_play_sound),
  469. (store_script_param, ":sound_id", 3),
  470. (try_begin),
  471. (is_between, ":sound_id", 0, "snd_sounds_end"),
  472. (play_sound, ":sound_id"),
  473. (try_end),
  474. (else_try), # play a sound at the location of a scene prop
  475. (eq, ":event_type", server_event_scene_prop_play_sound),
  476. (store_script_param, ":instance_id", 3),
  477. (assign, ":sound_id", ":instance_id"),
  478. (val_rshift, ":sound_id", net_sound_shift), # sound id is the higher bits
  479. (val_and, ":instance_id", net_sound_mask), # instance id is lower bits
  480. (try_begin),
  481. (is_between, ":sound_id", 0, "snd_sounds_end"),
  482. (prop_instance_is_valid, ":instance_id"),
  483. (prop_instance_get_position, pos1, ":instance_id"),
  484. (play_sound_at_position, ":sound_id", pos1),
  485. (try_end),
  486. (else_try), # hear someone vomit RAMARAUNT ADD
  487. (eq, ":event_type", server_event_player_has_vomited),
  488. (store_script_param, ":player_id", 3),
  489. (try_begin),
  490. (eq, ":player_id", -1),
  491. (display_message, "str_you_vomit", lockpicking_success_color),
  492. (else_try),
  493. (str_store_player_username, s1, ":player_id"),
  494. (str_store_string, s2, "str_he_vomit"),
  495. (display_message, s2, lockpicking_success_color),
  496. (try_end),
  497. (else_try), # hear someone cough RAMARAUNT ADD
  498. (eq, ":event_type", server_event_player_has_coughed),
  499. (store_script_param, ":player_id", 3),
  500. (try_begin),
  501. (eq, ":player_id", -1),
  502. (display_message, "str_you_cough", lockpicking_success_color),
  503. (else_try),
  504. (str_store_player_username, s1, ":player_id"),
  505. (str_store_string, s2, "str_he_cough"),
  506. (display_message, s2, lockpicking_success_color),
  507. (try_end),
  508. (else_try), # illness update RAMARAUNT ADD
  509. (eq, ":event_type", server_event_illness_update),
  510. (store_script_param, ":illness_id", 3),
  511. (store_script_param, ":progression", 4),
  512.  
  513. (try_begin),
  514. (eq, ":illness_id", 1), #cold
  515. (try_begin),
  516. (eq, ":progression", 25),
  517. (display_message, "str_slightly_sick", lockpicking_success_color),
  518. (else_try),
  519. (eq, ":progression", 75),
  520. (display_message, "str_very_sick", lockpicking_success_color),
  521. (else_try),
  522. (eq, ":progression", 74),
  523. (display_message, "str_starting_to_feel_better", lockpicking_success_color),
  524. (else_try),
  525. (eq, ":progression", 1),
  526. (display_message, "str_not_sick_anymore", lockpicking_success_color),
  527. (try_end),
  528. (else_try),
  529. (eq, ":illness_id", 2), #flu
  530. (try_begin),
  531. (eq, ":progression", 25),
  532. (display_message, "str_flu_begin", lockpicking_success_color),
  533. (else_try),
  534. (eq, ":progression", 50),
  535. (display_message, "str_flu_ache", lockpicking_success_color),
  536. (else_try),
  537. (eq, ":progression", 75),
  538. (display_message, "str_flu_pain", lockpicking_success_color),
  539. (else_try),
  540. (eq, ":progression", 49),
  541. (display_message, "str_flu_better_stomach", lockpicking_success_color),
  542. (else_try),
  543. (eq, ":progression", 24),
  544. (display_message, "str_flu_almost_gone", lockpicking_success_color),
  545. (else_try),
  546. (eq, ":progression", 1),
  547. (display_message, "str_flu_gone", lockpicking_success_color),
  548. (try_end),
  549. (else_try),
  550. (eq, ":illness_id", 3), #plague
  551. (try_begin),
  552. (eq, ":progression", 25),
  553. (display_message, "str_plague_slight_rash", lockpicking_success_color),
  554. (else_try),
  555. (eq, ":progression", 50),
  556. (display_message, "str_plague_vomiting", lockpicking_success_color),
  557. (else_try),
  558. (eq, ":progression", 75),
  559. (display_message, "str_plague_agony", lockpicking_success_color),
  560. (else_try),
  561. (eq, ":progression", 49),
  562. (display_message, "str_plague_stomach_better", lockpicking_success_color),
  563. (else_try),
  564. (eq, ":progression", 24),
  565. (display_message, "str_plague_turning_around", lockpicking_success_color),
  566. (else_try),
  567. (eq, ":progression", 1),
  568. (display_message, "str_plague_cured", lockpicking_success_color),
  569. (try_end),
  570. (try_end),
  571. (else_try), # display lockpicking message RAMARAUNT ADD
  572. (eq, ":event_type", server_event_lockpick),
  573. (store_script_param, ":fail", 3),
  574. (try_begin),
  575. (eq, ":fail", 0),
  576. (display_message, "str_pick_fail", lockpicking_fail_color),
  577. (else_try),
  578. (eq, ":fail", 1),
  579. (display_message, "str_pick_success", lockpicking_success_color),
  580. (try_end),
  581. (else_try), #drunkeness client update RAMARAUNT
  582. (eq, ":event_type", server_event_drunk_update_client),
  583. (store_script_param, ":drunkeness", 3),
  584. (store_script_param, ":drinkingyes", 4),
  585. (try_begin),
  586. (eq, ":drinkingyes", 1),
  587. (display_message, "str_drink_swig"),
  588. (try_end),
  589. (try_begin),
  590. (ge, ":drunkeness", 90),
  591. (display_message, "str_drink_dazed"),
  592. (else_try),
  593. (ge, ":drunkeness", 75),
  594. (display_message, "str_drink_sick"),
  595. (else_try),
  596. (ge, ":drunkeness", 60),
  597. (display_message, "str_drink_wobbly"),
  598. (else_try),
  599. (ge, ":drunkeness", 30),
  600. (display_message, "str_drink_tipsy"),
  601. (else_try),
  602. (display_message, "str_drink_fine"),
  603. (try_end),
  604. (else_try), #plague death event
  605. (eq, ":event_type", server_event_died_from_illness),
  606. (store_script_param, ":player_id_death", 3),
  607. (str_store_player_username, s0, ":player_id_death"),
  608. (display_message, "str_global_ck_plague", lockpicking_success_color),
  609. (else_try), # play a sound at a position, the coordinate values packed into one integer for a smaller network message
  610. (eq, ":event_type", server_event_play_sound_at_position),
  611. (store_script_param, ":sound_id", 3),
  612. (store_script_param, ":packed_position", 4),
  613. (try_begin), # extract sound id and position x,y,z from one number
  614. (is_between, ":sound_id", 0, "snd_sounds_end"),
  615. (assign, ":pos_x", ":packed_position"),
  616. (val_and, ":pos_x", net_pack_3_mask_1),
  617. (assign, ":pos_y", ":packed_position"),
  618. (val_and, ":pos_y", net_pack_3_mask_2),
  619. (val_rshift, ":pos_y", net_pack_3_shift_2),
  620. (assign, ":pos_z", ":packed_position"),
  621. (val_and, ":pos_z", net_pack_3_mask_3),
  622. (val_rshift, ":pos_z", net_pack_3_shift_3),
  623. (val_sub, ":pos_z", net_pack_3_value_upper_bound / 2),
  624. (set_fixed_point_multiplier, 1),
  625. (position_set_x, pos1, ":pos_x"),
  626. (position_set_y, pos1, ":pos_y"),
  627. (position_set_z, pos1, ":pos_z"),
  628. (set_fixed_point_multiplier, 100),
  629. (play_sound_at_position, ":sound_id", pos1),
  630. (try_end),
  631. (else_try), # equip the visual armor mesh on an agent
  632. (eq, ":event_type", server_event_agent_equip_armor),
  633. (store_script_param, ":agent_id", 3),
  634. (store_script_param, ":item_id", 4),
  635. (try_begin),
  636. (agent_is_active, ":agent_id"),
  637. (agent_is_alive, ":agent_id"),
  638. (try_begin),
  639. (gt, ":item_id", -1),
  640. (call_script, "script_agent_equip_armor", ":agent_id", ":item_id"),
  641. (else_try),
  642. (call_script, "script_agent_clean_blood", ":agent_id"),
  643. (try_end),
  644. (try_end),
  645. (else_try), # set a player slot on the client, from the server
  646. (eq, ":event_type", server_event_player_set_slot),
  647. (store_script_param, ":player_id", 3),
  648. (store_script_param, ":slot_no", 4),
  649. (store_script_param, ":value", 5),
  650. (try_begin),
  651. (player_is_active, ":player_id"),
  652. (player_set_slot, ":player_id", ":slot_no", ":value"),
  653. (multiplayer_get_my_player, ":my_player_id"),
  654. (try_begin), # if the player's faction is changed, reset other related slots
  655. (eq, ":slot_no", slot_player_faction_id),
  656. (player_set_slot, ":player_id", slot_player_is_lord, 0),
  657. (player_set_slot, ":player_id", slot_player_has_faction_door_key, 0),
  658. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 0),
  659. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 0),
  660. (player_set_slot, ":player_id", slot_player_can_faction_announce, 0),
  661. (store_script_param, ":change_faction_type", 6),
  662. (try_begin),
  663. (eq, ":change_faction_type", change_faction_type_outlawed),
  664. (try_begin),
  665. (eq, ":player_id", ":my_player_id"),
  666. (call_script, "script_preset_message", "str_you_have_been_outlawed", preset_message_faction|preset_message_log, ":value", 0),
  667. (music_set_situation, mtf_sit_town_infiltrate),
  668. (else_try),
  669. (str_store_player_username, s0, ":player_id"),
  670. (faction_get_color, ":color", "fac_outlaws"),
  671. (display_message, "str_s0_has_been_outlawed", ":color"),
  672. (try_end),
  673. (else_try),
  674. (eq, ":player_id", ":my_player_id"),
  675. (call_script, "script_preset_message", "str_joined_the_s1", preset_message_faction|preset_message_log, ":value", 0),
  676. (try_end),
  677. (try_begin), # if changing faction without changing troop (respawning), re-equip armor to trigger redrawing heraldry
  678. (eq, ":change_faction_type", change_faction_type_no_respawn),
  679. (call_script, "script_player_redraw_heraldic_items", ":player_id"),
  680. (try_end),
  681. (try_begin), # adjust the music style for commoners, outlaws, factions
  682. (eq, ":player_id", ":my_player_id"),
  683. (try_begin),
  684. (ge, ":value", castle_factions_begin),
  685. (music_set_culture, mtf_culture_3),
  686. (else_try),
  687. (eq, ":value", "fac_outlaws"),
  688. (music_set_culture, mtf_culture_2),
  689. (else_try),
  690. (music_set_culture, mtf_culture_1),
  691. (try_end),
  692. (try_end),
  693. (else_try),
  694. (eq, ":slot_no", slot_player_outlaw_rating),
  695. (eq, ":player_id", ":my_player_id"),
  696. (faction_get_color, ":color", "fac_outlaws"),
  697. (assign, reg1, ":value"),
  698. (display_message, "str_your_outlaw_rating_now_reg1", ":color"),
  699. (else_try),
  700. (eq, ":slot_no", slot_player_is_lord),
  701. (eq, ":value", 1),
  702. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  703. (get_max_players, ":max_players"),
  704. (try_for_range, ":other_player_id", 1, ":max_players"), # remove the status of any previous lord of the faction
  705. (neq, ":other_player_id", ":player_id"),
  706. (player_is_active, ":other_player_id"),
  707. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":faction_id"),
  708. (player_set_slot, ":other_player_id", slot_player_is_lord, 0),
  709. (try_end),
  710. (try_begin), # if the local player is now lord of their faction, set various slots that have already been set on the server
  711. (eq, ":player_id", ":my_player_id"),
  712. (call_script, "script_preset_message", "str_you_are_now_lord_of_s1", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  713. (player_set_slot, ":my_player_id", slot_player_has_faction_door_key, 1),
  714. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 1),
  715. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 1),
  716. (player_set_slot, ":player_id", slot_player_can_faction_announce, 1),
  717. (player_set_slot, ":player_id", slot_player_faction_chat_muted, 0),
  718. (else_try), # for other players, just display an announcement
  719. (eq, "$g_preset_message_display_enabled", 1),
  720. (str_store_player_username, s10, ":player_id"),
  721. (call_script, "script_preset_message", "str_s10_now_lord_of_s1", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  722. (try_end),
  723. (try_end),
  724. (try_end),
  725. (else_try), # set a troop slot on the client, from the server
  726. (eq, ":event_type", server_event_troop_set_slot),
  727. (store_script_param, ":troop_id", 3),
  728. (store_script_param, ":slot_no", 4),
  729. (store_script_param, ":value", 5),
  730. (troop_get_slot, ":old_value", ":troop_id", ":slot_no"),
  731. (troop_set_slot, ":troop_id", ":slot_no", ":value"),
  732. (try_begin),
  733. (eq, ":troop_id", "trp_mission_data"),
  734. (eq, "$g_preset_message_display_enabled", 1),
  735. (is_between, ":slot_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  736. (call_script, "script_preset_message", "str_s1_captured_s2", preset_message_faction_castle|preset_message_big|preset_message_log, ":value", ":slot_no"),
  737. (multiplayer_get_my_player, ":my_player_id"),
  738. (player_is_active, ":my_player_id"),
  739. (player_get_slot, ":my_faction_id", ":my_player_id", slot_player_faction_id),
  740. (try_begin),
  741. (eq, ":value", ":my_faction_id"),
  742. (music_set_situation, mtf_sit_victorious),
  743. (else_try),
  744. (eq, ":old_value", ":my_faction_id"),
  745. (music_set_situation, mtf_sit_encounter_hostile),
  746. (try_end),
  747. (try_end),
  748. (else_try), # set a scene prop slot on the client, from the server
  749. (eq, ":event_type", server_event_scene_prop_set_slot),
  750. (store_script_param, ":instance_id", 3),
  751. (store_script_param, ":slot_no", 4),
  752. (store_script_param, ":value", 5),
  753. (store_script_param, ":slot_range_end", 6),
  754. (try_begin),
  755. (prop_instance_is_valid, ":instance_id"),
  756. (try_begin),
  757. (ge, ":slot_no", 0),
  758. (scene_prop_set_slot, ":instance_id", ":slot_no", ":value"),
  759. (is_between, ":slot_range_end", slot_scene_prop_inventory_begin, slot_scene_prop_inventory_end),
  760. (store_add, ":slot_range_begin", ":slot_no", 1), # messages to change inventory slots can be ranges of repeated values, for efficiency
  761. (ge, ":slot_range_begin", slot_scene_prop_inventory_begin),
  762. (try_for_range, ":current_slot_no", ":slot_range_begin", ":slot_range_end"),
  763. (scene_prop_set_slot, ":instance_id", ":current_slot_no", ":value"),
  764. (try_end),
  765. (try_end), # if the scene prop updated is the inventory currently being accessed, store the changed slots for refreshing the presentation
  766. (eq, ":instance_id", "$g_show_inventory_instance_id"),
  767. (try_begin), # negative numbers mark removed items
  768. (le, ":slot_range_end", -1),
  769. (store_mul, ":slot_moved_from", ":slot_range_end", -1),
  770. (is_between, ":slot_moved_from", slot_scene_prop_inventory_mod_begin, slot_scene_prop_inventory_mod_end),
  771. (scene_prop_set_slot, ":instance_id", ":slot_moved_from", -1),
  772. (assign, "$g_show_inventory_update_needed", 1),
  773. (else_try), # otherwise the item was added to the inventory
  774. (is_between, ":slot_no", slot_scene_prop_inventory_mod_begin, slot_scene_prop_inventory_mod_end),
  775. (assign, "$g_show_inventory_update_needed", 1),
  776. (try_end),
  777. (try_end),
  778. (else_try), # set a faction slot on the client, from the server
  779. (eq, ":event_type", server_event_faction_set_slot),
  780. (store_script_param, ":faction_id", 3),
  781. (store_script_param, ":slot_no", 4),
  782. (store_script_param, ":value", 5),
  783. (try_begin),
  784. (is_between, ":faction_id", factions_begin, factions_end),
  785. (faction_get_slot, ":previous_value", ":faction_id", ":slot_no"),
  786. (faction_set_slot, ":faction_id", ":slot_no", ":value"),
  787. (try_begin),
  788. (eq, ":slot_no", slot_faction_banner_mesh),
  789. (call_script, "script_faction_set_color_from_banner", ":faction_id", ":value"),
  790. (call_script, "script_faction_redraw_heraldic_items", ":faction_id"),
  791. (else_try),
  792. (ge, ":slot_no", slot_faction_relations_begin),
  793. (eq, "$g_preset_message_display_enabled", 1),
  794. (store_sub, ":other_faction_id", ":slot_no", slot_faction_relations_begin),
  795. (lt, ":other_faction_id", factions_end),
  796. (call_script, "script_display_faction_relation_change", ":faction_id", ":other_faction_id", ":previous_value", ":value"),
  797. (try_end),
  798. (try_end),
  799. (else_try), # set an agent slot on the client, from the server
  800. (eq, ":event_type", server_event_agent_set_slot),
  801. (store_script_param, ":agent_id", 3),
  802. (store_script_param, ":slot_no", 4),
  803. (store_script_param, ":value", 5),
  804. (try_begin),
  805. (agent_is_active, ":agent_id"),
  806. (agent_set_slot, ":agent_id", ":slot_no", ":value"),
  807. (try_end),
  808. (else_try), # attach or detach a scene prop to or from an agent (used for carts)
  809. (eq, ":event_type", server_event_set_attached_scene_prop),
  810. (store_script_param, ":agent_id", 3),
  811. (store_script_param, ":instance_id", 4),
  812. (try_begin),
  813. (agent_is_active, ":agent_id"),
  814. (agent_get_attached_scene_prop, ":previous_instance_id", ":agent_id"),
  815. (try_begin),
  816. (prop_instance_is_valid, ":previous_instance_id"),
  817. (scene_prop_set_slot, ":previous_instance_id", slot_scene_prop_attached_to_agent, -1),
  818. (try_end),
  819. (agent_set_attached_scene_prop, ":agent_id", ":instance_id"),
  820. (prop_instance_is_valid, ":instance_id"),
  821. (scene_prop_set_slot, ":instance_id", slot_scene_prop_attached_to_agent, ":agent_id"),
  822. (try_end),
  823. (else_try), # showing the presentation for accessing the inventory of a scene prop
  824. (eq, ":event_type", server_event_show_inventory),
  825. (store_script_param, ":instance_id", 3),
  826. (try_begin), # showing
  827. (gt, ":instance_id", 0),
  828. (prop_instance_is_valid, ":instance_id"),
  829. (assign, "$g_show_inventory_instance_id", ":instance_id"),
  830. (try_for_range, ":mod_slot", slot_scene_prop_inventory_mod_begin, slot_scene_prop_inventory_obj_begin),
  831. (scene_prop_set_slot, ":instance_id", ":mod_slot", 0), # clear slots that notify modifications
  832. (try_end),
  833. (val_add, "$g_last_inventory_unique_id", 1), # this value can be different between server and clients, but is only used locally
  834. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_unique_id, "$g_last_inventory_unique_id"),
  835. (start_presentation, "prsnt_show_inventory"),
  836. (else_try), # hiding, when now out of range or similar
  837. (eq, ":instance_id", -1),
  838. (is_presentation_active, "prsnt_show_inventory"),
  839. (assign, "$g_show_inventory_update_needed", -1),
  840. (try_end),
  841. (else_try), # the server replied that a chat message was received, so if matching the latest message, mark as not requring resending
  842. (eq, ":event_type", server_event_chat_message_recieved),
  843. (store_script_param, ":chat_event_type", 3),
  844. (try_begin),
  845. (troop_get_slot, ":last_chat_event_type", "trp_last_chat_message", slot_last_chat_message_event_type),
  846. (val_and, ":last_chat_event_type", net_chat_event_mask),
  847. (val_and, ":chat_event_type", net_chat_event_mask),
  848. (eq, ":chat_event_type", ":last_chat_event_type"),
  849. (troop_set_slot, "trp_last_chat_message", slot_last_chat_message_not_recieved, 0),
  850. (try_end),
  851. (else_try), # display normal local chat
  852. (eq, ":event_type", server_event_local_chat),
  853. (neg|str_is_empty, s0),
  854. (display_message, s0, local_chat_color),
  855. (call_script, "script_chat_overlay_add_to_local_buffer", local_chat_color),
  856. (else_try), # display shouting in local chat
  857. (eq, ":event_type", server_event_local_chat_shout),
  858. (neg|str_is_empty, s0),
  859. (display_message, s0, local_chat_shout_color),
  860. (call_script, "script_chat_overlay_add_to_local_buffer", local_chat_shout_color),
  861. (else_try), # change the name of the faction which has been previously marked
  862. (eq, ":event_type", server_event_faction_set_name),
  863. (try_begin),
  864. (neg|str_is_empty, s0),
  865. (troop_get_slot, ":faction_id", "trp_mission_data", slot_mission_data_faction_to_change_name_of),
  866. (troop_set_slot, "trp_mission_data", slot_mission_data_faction_to_change_name_of, 0),
  867. (is_between, ":faction_id", castle_factions_begin, factions_end),
  868. (str_store_faction_name, s10, ":faction_id"),
  869. (faction_set_name, ":faction_id", s0),
  870. (eq, "$g_preset_message_display_enabled", 1),
  871. (call_script, "script_preset_message", "str_s10_now_known_as_s1", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  872. (try_end),
  873. (else_try), # update the global variables for server settings on the client
  874. (eq, ":event_type", server_event_return_game_rules),
  875. (store_script_param, ":command", 3),
  876. (store_script_param, ":value", 4),
  877. (try_begin),
  878. (call_script, "script_cf_execute_command", ":command", ":value"),
  879. (try_end),
  880. (else_try), # store the server name
  881. (eq, ":event_type", server_event_return_server_name),
  882. (server_set_name, s0),
  883. (else_try), # store the server password
  884. (eq, ":event_type", server_event_return_password),
  885. (server_set_password, s0),
  886. (else_try), # set the stats of existing players when connecting to a server
  887. (eq, ":event_type", server_event_set_player_score_kill_death),
  888. (store_script_param, ":player_id", 3),
  889. (store_script_param, ":score", 4),
  890. (store_script_param, ":kills", 5),
  891. (store_script_param, ":deaths", 6),
  892. (try_begin),
  893. (player_is_active, ":player_id"),
  894. (player_set_score, ":player_id", ":score"),
  895. (player_set_kill_count, ":player_id", ":kills"),
  896. (player_set_death_count, ":player_id", ":deaths"),
  897. (try_end),
  898. (else_try), # show the poll presentation
  899. (eq, ":event_type", server_event_show_poll),
  900. (store_script_param, ":poll_type", 3),
  901. (store_script_param, ":requester_player_id", 4),
  902. (store_script_param, ":value_1", 5),
  903. (store_script_param, ":value_2", 6),
  904. (call_script, "script_show_poll", ":poll_type", ":requester_player_id", ":value_1", ":value_2"),
  905. (else_try), # update the local player's gold amount manually when greater than the game engine limit (13171)
  906. (eq, ":event_type", server_event_set_overflow_gold),
  907. (store_script_param, ":gold_value", 3),
  908. (try_begin),
  909. (neq, "$g_game_type", "mt_no_money"),
  910. (is_between, ":gold_value", max_correctly_displayed_gold + 1, max_possible_gold),
  911. (assign, "$g_overflow_gold_value", ":gold_value"),
  912. (multiplayer_get_my_player, ":my_player_id"),
  913. (player_set_gold, ":my_player_id", ":gold_value"),
  914. (else_try),
  915. (assign, "$g_overflow_gold_value", 0),
  916. (try_end),
  917. (else_try), # display faction chat and announcements
  918. (is_between, ":event_type", server_event_faction_chat, server_event_faction_chat_announce + 1),
  919. (try_begin),
  920. (neg|str_is_empty, s0),
  921. (multiplayer_get_my_player, ":player_id"),
  922. (player_is_active, ":player_id"),
  923. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  924. (is_between, ":faction_id", castle_factions_begin, factions_end),
  925. (faction_get_color, ":color", ":faction_id"),
  926. (display_message, s0, ":color"),
  927. (try_begin),
  928. (eq, ":event_type", server_event_faction_chat_announce),
  929. (str_store_string_reg, s11, s0),
  930. (start_presentation, "prsnt_faction_lord_message"),
  931. (try_end),
  932. (val_add, "$g_chat_overlay_faction_buffer_stored", 1),
  933. (try_begin),
  934. (neg|is_between, "$g_chat_overlay_faction_buffer_stored", chat_overlay_ring_buffer_begin, chat_overlay_ring_buffer_end),
  935. (assign, "$g_chat_overlay_faction_buffer_stored", chat_overlay_ring_buffer_begin),
  936. (try_end),
  937. (troop_set_plural_name, "$g_chat_overlay_faction_buffer_stored", s0),
  938. (troop_set_slot, "$g_chat_overlay_faction_buffer_stored", slot_chat_overlay_faction_color, ":color"),
  939. (try_end),
  940. (else_try), # display admin chat and announcemnts
  941. (is_between, ":event_type", server_event_admin_chat, server_event_admin_chat_announce + 1),
  942. (neg|str_is_empty, s0),
  943. (display_message, s0, admin_chat_color),
  944. (try_begin),
  945. (eq, ":event_type", server_event_admin_chat_announce),
  946. (str_store_string_reg, s12, s0),
  947. (start_presentation, "prsnt_admin_message"),
  948. (try_end),
  949. (else_try), # convert the packed permissions value into player slots, to limit menu items displayed and similar
  950. (eq, ":event_type", server_event_admin_set_permissions),
  951. (store_script_param, ":permissions", 3),
  952. (multiplayer_get_my_player, ":player_id"),
  953. (player_is_active, ":player_id"),
  954. (call_script, "script_player_set_admin_permissions", ":player_id", ":permissions"),
  955. (else_try), # play a local animation and / or sound
  956. (eq, ":event_type", server_event_local_animation),
  957. (store_script_param, ":player_id", 3),
  958. (store_script_param, ":string_id", 4),
  959. (try_begin),
  960. (player_is_active, ":player_id"),
  961. (is_between, ":string_id", animation_strings_begin, animation_strings_end),
  962. (str_store_player_username, s1, ":player_id"),
  963. (str_store_string, s0, ":string_id"),
  964. (display_message, "str_log_animation", local_animation_color),
  965. (try_end),
  966. (else_try), # update the client side hit points bar when looking at the scene prop; values less than 0 clear attached missiles
  967. (eq, ":event_type", server_event_update_scene_prop_hit_points),
  968. (store_script_param, ":instance_id", 3),
  969. (store_script_param, ":hit_points", 4),
  970. (try_begin),
  971. (prop_instance_is_valid, ":instance_id"),
  972. (try_begin),
  973. (ge, ":hit_points", 0),
  974. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  975. (else_try),
  976. (prop_instance_clear_attached_missiles, ":instance_id"),
  977. (scene_prop_get_slot, ":linked_instance_id_1", ":instance_id", slot_scene_prop_linked_scene_prop_1),
  978. (prop_instance_is_valid, ":linked_instance_id_1"),
  979. (prop_instance_clear_attached_missiles, ":linked_instance_id_1"),
  980. (scene_prop_get_slot, ":linked_instance_id_2", ":instance_id", slot_scene_prop_linked_scene_prop_2),
  981. (prop_instance_is_valid, ":linked_instance_id_2"),
  982. (prop_instance_clear_attached_missiles, ":linked_instance_id_2"),
  983. (try_end),
  984. (try_end),
  985. (try_end),
  986.  
  987. (else_try), # section of events received by server from the clients
  988. (multiplayer_is_server),
  989. (try_begin), # handle players requesting to attach a cart to themselves or a horse
  990. (eq, ":event_type", client_event_attach_scene_prop),
  991. (store_script_param, ":instance_id", 3),
  992. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  993. (try_begin),
  994. (agent_is_active, ":agent_id"),
  995. (agent_is_alive, ":agent_id"),
  996. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  997. (eq, ":weapon", -1),
  998. (agent_get_wielded_item, ":shield", ":agent_id", 1),
  999. (eq, ":shield", -1),
  1000. (try_begin), # detach the currently attached scene prop
  1001. (eq, ":instance_id", 0),
  1002. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  1003. (try_begin),
  1004. (eq, ":horse_agent_id", -1),
  1005. (assign, ":attach_agent_id", ":agent_id"),
  1006. (else_try),
  1007. (assign, ":attach_agent_id", ":horse_agent_id"),
  1008. (try_end),
  1009. (call_script, "script_cf_attach_cart", ":attach_agent_id", -1, ":agent_id"),
  1010. (else_try), # try attach
  1011. (prop_instance_is_valid, ":instance_id"),
  1012. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_required_horse, 0),
  1013. (call_script, "script_cart_choose_action", ":agent_id", ":instance_id"),
  1014. (try_begin), # cart is in range
  1015. (neq, reg0, 0),
  1016. (else_try), # if admin wearing special armor, allow attaching from a greater range
  1017. (player_is_admin, ":sender_player_id"),
  1018. (agent_get_item_slot, ":body_item_id", ":agent_id", ek_body),
  1019. (this_or_next|eq, ":body_item_id", "itm_invisible_body"),
  1020. (eq, ":body_item_id", "itm_black_armor"),
  1021. (agent_get_position, pos1, ":agent_id"),
  1022. (prop_instance_get_position, pos2, ":instance_id"),
  1023. (position_get_z, ":agent_z", pos1),
  1024. (position_set_z, pos2, ":agent_z"),
  1025. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1026. (le, ":sq_distance", sq(max_distance_admin_cart)),
  1027. (else_try),
  1028. (assign, ":instance_id", -1),
  1029. (try_end),
  1030. (neq, ":instance_id", -1),
  1031. (call_script, "script_cf_use_cart", ":agent_id", ":instance_id", -1),
  1032. (try_end),
  1033. (try_end),
  1034. (else_try), #posting local message about dropping 20 percent RAMARAUNT ADD
  1035. (eq, ":event_type", client_event_local_twenty),
  1036. (store_script_param, ":my_gold", 3),
  1037. (try_begin),
  1038. (neq, ":my_gold", 0),
  1039. (str_store_player_username, s15, ":sender_player_id"),
  1040. (str_store_string, s0, "str_drops_twenty_percent"),
  1041. (else_try),
  1042. (eq, ":my_gold", 0),
  1043. (str_store_player_username, s15, ":sender_player_id"),
  1044. (str_store_string, s0, "str_has_no_gold"),
  1045. (try_end),
  1046. (player_get_agent_id, ":sender_agent_id",":sender_player_id"),
  1047. (agent_get_position, pos1, ":sender_agent_id"),
  1048. (position_move_z, pos1, 160),
  1049. (try_for_agents, ":other_agent_id"), # send the chat message to other players whoose agents are close enough
  1050. (agent_is_alive, ":other_agent_id"),
  1051. (neg|agent_is_non_player, ":other_agent_id"),
  1052. (agent_get_player_id, ":other_player_id", ":other_agent_id"),
  1053. (player_is_active, ":other_player_id"),
  1054. (agent_get_position, pos2, ":other_agent_id"),
  1055. (position_move_z, pos2, 160),
  1056. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1057. (le, ":sq_distance", sq(max_distance_local_chat)),
  1058. (this_or_next|le, ":sq_distance", sq(ambient_distance_local_chat)),
  1059. (position_has_line_of_sight_to_position, pos1, pos2),
  1060. (multiplayer_send_string_to_player, ":other_player_id", server_event_local_chat, s0),
  1061. (try_end),
  1062. (else_try), # handle players sending control messages for scene props (only ships)
  1063. (eq, ":event_type", client_event_control_scene_prop),
  1064. (store_script_param, ":instance_id", 3),
  1065. (store_script_param, ":forwards", 4),
  1066. (store_script_param, ":rotation", 5),
  1067. (try_begin),
  1068. (prop_instance_is_valid, ":instance_id"),
  1069. (call_script, "script_cf_control_ship", ":sender_player_id", ":instance_id", ":forwards", ":rotation"),
  1070. (try_end),
  1071. (else_try), # reply with the current stock count of a scene prop
  1072. (eq, ":event_type", client_event_request_stock_count),
  1073. (store_script_param, ":instance_id", 3),
  1074. (try_begin),
  1075. (prop_instance_is_valid, ":instance_id"),
  1076. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  1077. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  1078. (try_end),
  1079. (else_try), # transfer an item within the player's equipment and the scene prop's inventory
  1080. (eq, ":event_type", client_event_transfer_inventory),
  1081. (store_script_param, ":instance_id", 3),
  1082. (store_script_param, ":from_slot", 4),
  1083. (store_script_param, ":to_slot", 5),
  1084. (store_script_param, ":item_id", 6),
  1085. (call_script, "script_transfer_inventory", ":sender_player_id", ":instance_id", ":from_slot", ":to_slot", ":item_id"),
  1086. (else_try), # transfer money between the player and a money chest
  1087. (eq, ":event_type", client_event_transfer_gold),
  1088. (try_begin),
  1089. (neq, "$g_game_type", "mt_no_money"),
  1090. (store_script_param, ":instance_id", 3),
  1091. (store_script_param, ":gold_value", 4),
  1092. (call_script, "script_cf_use_castle_money_chest", ":sender_player_id", ":instance_id", ":gold_value"),
  1093. (try_end),
  1094. (else_try), # set the type of the next chat message to be received (since string messages can't have additional information)
  1095. (eq, ":event_type", client_event_chat_message_type),
  1096. (store_script_param, ":chat_event_type", 3),
  1097. (try_begin),
  1098. (player_is_active, ":sender_player_id"), # check to ensure the chat event number isn't outdated (from messages received out of order)
  1099. (call_script, "script_cf_chat_event_is_new", ":chat_event_type", ":sender_player_id"),
  1100. (player_set_slot, ":sender_player_id", slot_player_next_chat_event_type, ":chat_event_type"),
  1101. (try_end),
  1102. (else_try), # chat string received from a client, from a range of event numbers to keep them in order
  1103. (is_between, ":event_type", client_event_chat_message_begin, client_event_chat_message_end),
  1104. (try_begin),
  1105. (player_is_active, ":sender_player_id"),
  1106. (multiplayer_send_int_to_player, ":sender_player_id", server_event_chat_message_recieved, ":event_type"), # confirm to the sending client that the message was received
  1107. (call_script, "script_cf_chat_event_is_new", ":event_type", ":sender_player_id"),
  1108. (try_begin),
  1109. (eq, reg0, 1),
  1110. (player_get_slot, ":chat_event_type", ":sender_player_id", slot_player_next_chat_event_type),
  1111. (assign, ":chat_event_param_1", ":chat_event_type"), # extract the chat event and extra parameter from on number
  1112. (val_rshift, ":chat_event_param_1", net_chat_param_1_shift),
  1113. (val_rshift, ":chat_event_type", net_chat_type_shift),
  1114. (val_and, ":chat_event_type", net_chat_event_mask),
  1115. (else_try),
  1116. (assign, ":chat_event_type", chat_event_type_local),
  1117. (try_end),
  1118. (call_script, "script_chat_event_increment", ":event_type"), # store the next chat event number expected from the player
  1119. (player_set_slot, ":sender_player_id", slot_player_next_chat_event_type, reg0),
  1120. (neg|str_is_empty, s0),
  1121. (try_begin),
  1122. (is_between, ":chat_event_type", chat_event_type_local, chat_event_type_local_shout + 1),
  1123. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1124. (gt, ":agent_id", -1),
  1125. (agent_is_alive, ":agent_id"),
  1126. (str_store_player_username, s1, ":sender_player_id"),
  1127. (str_store_string, s0, "str_chat_format"),
  1128. (server_add_message_to_log, "str_local_chat_log_format"),
  1129. (try_begin),
  1130. (eq, ":chat_event_type", chat_event_type_local_shout),
  1131. (assign, ":max_sq_distance", sq(max_distance_local_chat_shout)),
  1132. (assign, ":ambient_sq_distance", sq(ambient_distance_local_chat_shout)),
  1133. (assign, ":server_event", server_event_local_chat_shout),
  1134. (else_try),
  1135. (assign, ":max_sq_distance", sq(max_distance_local_chat)),
  1136. (assign, ":ambient_sq_distance", sq(ambient_distance_local_chat)),
  1137. (assign, ":server_event", server_event_local_chat),
  1138. (try_end),
  1139. (set_fixed_point_multiplier, 100),
  1140. (agent_get_position, pos1, ":agent_id"),
  1141. (position_move_z, pos1, 160),
  1142. (try_for_agents, ":other_agent_id"), # send the chat message to other players whoose agents are close enough
  1143. (agent_is_alive, ":other_agent_id"),
  1144. (neg|agent_is_non_player, ":other_agent_id"),
  1145. (agent_get_player_id, ":other_player_id", ":other_agent_id"),
  1146. (player_is_active, ":other_player_id"),
  1147. (agent_get_position, pos2, ":other_agent_id"),
  1148. (position_move_z, pos2, 160),
  1149. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1150. (le, ":sq_distance", ":max_sq_distance"),
  1151. (this_or_next|le, ":sq_distance", ":ambient_sq_distance"),
  1152. (position_has_line_of_sight_to_position, pos1, pos2),
  1153. (multiplayer_send_string_to_player, ":other_player_id", ":server_event", s0),
  1154. (try_end),
  1155. (else_try), # event type to change a faction's name (not really a chat message, but uses the system for more reliability)
  1156. (eq, ":chat_event_type", chat_event_type_set_faction_name),
  1157. (player_get_slot, ":faction_id", ":sender_player_id", slot_player_faction_id),
  1158. (player_get_unique_id, ":unique_id", ":sender_player_id"),
  1159. (try_begin),
  1160. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  1161. (call_script, "script_cf_check_enough_gold", ":sender_player_id", faction_cost_change_name),
  1162. (call_script, "script_player_adjust_gold", ":sender_player_id", faction_cost_change_name, -1),
  1163. (faction_set_name, ":faction_id", s0),
  1164. (faction_set_slot, ":faction_id", slot_faction_name_is_custom, 1),
  1165. (get_max_players, ":max_players"),
  1166. (try_for_range, ":player_id", 1, ":max_players"),
  1167. (player_is_active, ":player_id"),
  1168. (multiplayer_send_3_int_to_player, ":player_id", server_event_troop_set_slot, "trp_mission_data", slot_mission_data_faction_to_change_name_of, ":faction_id"),
  1169. (multiplayer_send_string_to_player, ":player_id", server_event_faction_set_name, s0),
  1170. (try_end),
  1171. (try_end),
  1172. (else_try),
  1173. (is_between, ":chat_event_type", chat_event_type_faction, chat_event_type_faction_announce + 1),
  1174. (player_get_slot, ":faction_id", ":sender_player_id", slot_player_faction_id),
  1175. (try_begin),
  1176. (is_between, ":faction_id", castle_factions_begin, factions_end),
  1177. (player_slot_eq, ":sender_player_id", slot_player_faction_chat_muted, 0),
  1178. (str_store_player_username, s1, ":sender_player_id"),
  1179. (str_store_string, s0, "str_chat_format"),
  1180. (str_store_faction_name, s2, ":faction_id"),
  1181. (server_add_message_to_log, "str_faction_chat_log_format"),
  1182. (try_begin),
  1183. (eq, ":chat_event_type", chat_event_type_faction_announce),
  1184. (player_slot_eq, ":sender_player_id", slot_player_can_faction_announce, 1),
  1185. (assign, ":server_event", server_event_faction_chat_announce),
  1186. (else_try),
  1187. (assign, ":server_event", server_event_faction_chat),
  1188. (try_end),
  1189. (get_max_players, ":max_players"),
  1190. (try_for_range, ":other_player_id", 1, ":max_players"),
  1191. (player_is_active, ":other_player_id"),
  1192. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":faction_id"),
  1193. (multiplayer_send_string_to_player, ":other_player_id", ":server_event", s0),
  1194. (try_end),
  1195. (try_end),
  1196. (else_try),
  1197. (is_between, ":chat_event_type", chat_event_type_admin, chat_event_type_admin_announce + 1),
  1198. (assign, ":target_player_id", ":chat_event_param_1"),
  1199. (assign, ":chat_string_id", -1),
  1200. (try_begin), # admins using admin chat
  1201. (player_is_admin, ":sender_player_id"),
  1202. (try_begin),
  1203. (eq, ":target_player_id", 0),
  1204. (try_begin), # announcements, check the admin has permission
  1205. (eq, ":chat_event_type", chat_event_type_admin_announce),
  1206. (player_slot_eq, ":sender_player_id", slot_player_admin_no_announce, 0),
  1207. (assign, ":chat_string_id", "str_admin_announcement_format"),
  1208. (else_try), # admin chat between admins
  1209. (eq, ":target_player_id", 0),
  1210. (assign, ":chat_string_id", "str_admin_chat_format"),
  1211. (try_end),
  1212. (else_try), # from an admin, directly to a specific player
  1213. (player_is_active, ":target_player_id"),
  1214. (str_store_player_username, s2, ":target_player_id"),
  1215. (assign, ":chat_string_id", "str_admin_chat_to_player_format"),
  1216. (try_end),
  1217. (else_try), # for players using admin chat, don't allow targeted messages
  1218. (assign, ":chat_string_id", "str_admin_chat_player_format"),
  1219. (assign, ":target_player_id", 0),
  1220. (try_end),
  1221. (try_begin),
  1222. (gt, ":chat_string_id", -1),
  1223. (str_store_player_username, s1, ":sender_player_id"),
  1224. (str_store_string, s10, ":chat_string_id"),
  1225. (server_add_message_to_log, s10),
  1226. (get_max_players, ":max_players"),
  1227. (try_for_range, ":other_player_id", 1, ":max_players"),
  1228. (player_is_active, ":other_player_id"),
  1229. (assign, ":server_event", server_event_admin_chat), # default to normal messages
  1230. (assign, ":swapped", 0),
  1231. (try_begin),
  1232. (eq, ":chat_string_id", "str_admin_announcement_format"),
  1233. (assign, ":server_event", server_event_admin_chat_announce),
  1234. (else_try),
  1235. (eq, ":other_player_id", ":sender_player_id"),
  1236. (else_try),
  1237. (player_is_admin, ":other_player_id"),
  1238. (else_try), # if the current player is targeted, swap to a different format
  1239. (eq, ":other_player_id", ":target_player_id"),
  1240. (str_store_string_reg, s11, s10),
  1241. (assign, ":swapped", 1),
  1242. (str_store_string, s10, "str_admin_chat_format"),
  1243. (try_begin),
  1244. (eq, ":chat_event_type", chat_event_type_admin_announce),
  1245. (assign, ":server_event", server_event_admin_chat_announce),
  1246. (try_end),
  1247. (else_try),
  1248. (assign, ":server_event", -1),
  1249. (try_end),
  1250. (gt, ":server_event", -1),
  1251. (multiplayer_send_string_to_player, ":other_player_id", ":server_event", s10),
  1252. (try_begin), # if the format was swapped, swap it back for other players
  1253. (eq, ":swapped", 1),
  1254. (str_store_string_reg, s10, s11),
  1255. (try_end),
  1256. (try_end),
  1257. (try_end),
  1258. (try_end),
  1259. (try_end),
  1260. (else_try), # faction administration actions by the lord
  1261. (eq, ":event_type", client_event_faction_admin_action),
  1262. (store_script_param, ":action", 3),
  1263. (store_script_param, ":value_1", 4),
  1264. (try_begin),
  1265. (call_script, "script_cf_faction_admin_action", ":action", ":sender_player_id", ":value_1"),
  1266. (try_end),
  1267. (else_try), # client requesting to drop a money bag
  1268. (eq, ":event_type", client_event_drop_money_bag),
  1269. (try_begin),
  1270. (neq, "$g_game_type", "mt_no_money"),
  1271. (store_script_param, ":gold_amount", 3),
  1272. (try_begin), # for positive amounts, drop a money bag
  1273. (gt, ":gold_amount", 0),
  1274. (call_script, "script_cf_drop_money_bag_item", ":sender_player_id", ":gold_amount"),
  1275. (else_try), # for negative amounts, check the admin has permission then spawn them the absolute money amount
  1276. (lt, ":gold_amount", 0),
  1277. (player_is_admin, ":sender_player_id"),
  1278. (player_slot_eq, ":sender_player_id", slot_player_admin_no_gold, 0),
  1279. (val_mul, ":gold_amount", -1),
  1280. (call_script, "script_player_adjust_gold", ":sender_player_id", ":gold_amount", 1),
  1281. (assign, reg0, ":gold_amount"),
  1282. (str_store_string, s3, "str_log_admin_cheat_money"),
  1283. (str_store_player_username, s0, ":sender_player_id"),
  1284. (player_get_unique_id, reg0, ":sender_player_id"),
  1285. (server_add_message_to_log, "str_log_admin_target_self"),
  1286. (try_end),
  1287. (try_end),
  1288. (else_try), # requesting a spawn point or switching spectator status
  1289. (eq, ":event_type", client_event_request_spawn_point),
  1290. (store_script_param, ":spawn_point", 3),
  1291. (try_begin), # positive values are spawn points
  1292. (gt, ":spawn_point", 0),
  1293. (player_set_slot, ":sender_player_id", slot_player_requested_spawn_point, ":spawn_point"),
  1294. (store_script_param, ":restart_as_peasant", 4),
  1295. (try_begin),
  1296. (eq, ":restart_as_peasant", 1),
  1297. (player_set_troop_id, ":sender_player_id", "trp_peasant"),
  1298. (call_script, "script_change_faction", ":sender_player_id", "fac_commoners", change_faction_type_respawn),
  1299. (try_end),
  1300. (else_try),
  1301. (try_begin), # if the player hasn't requested to spawn after connecting to the server
  1302. (player_slot_eq, ":sender_player_id", slot_player_requested_spawn_point, -1),
  1303. (player_set_slot, ":sender_player_id", slot_player_requested_spawn_point, 0),
  1304. (else_try), # otherwise, toggle spectator status
  1305. (player_get_team_no, ":player_team", ":sender_player_id"),
  1306. (eq, ":player_team", team_spectators),
  1307. (player_set_team_no, ":sender_player_id", team_default),
  1308. (try_begin), # clean up spawn state if the player's agent was faded out without resetting it
  1309. (player_slot_eq, ":sender_player_id", slot_player_spawn_state, player_spawn_state_alive),
  1310. (player_get_agent_id, ":agent_id", ":player_id"),
  1311. (this_or_next|neg|agent_is_active, ":agent_id"),
  1312. (neg|agent_is_alive, ":agent_id"),
  1313. (player_set_slot, ":sender_player_id", slot_player_spawn_state, player_spawn_state_dead),
  1314. (try_end),
  1315. (else_try),
  1316. (player_set_team_no, ":sender_player_id", team_spectators),
  1317. (try_end),
  1318. (try_end),
  1319. (else_try), # reply with game rules
  1320. (eq, ":event_type", client_event_request_game_rules),
  1321. (store_script_param, ":admin_request", 3),
  1322. (call_script, "script_player_return_game_rules", ":sender_player_id", ":admin_request"),
  1323. (else_try), # handle admins changing game rules (server settings)
  1324. (eq, ":event_type", client_event_admin_set_game_rule),
  1325. (try_begin),
  1326. (player_is_admin, ":sender_player_id"),
  1327. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1328. (store_script_param, ":command", 3),
  1329. (store_script_param, ":value", 4),
  1330. (store_script_param, ":value_2", 5),
  1331. (call_script, "script_cf_execute_command", ":command", ":value", ":value_2"),
  1332. (try_end),
  1333. (else_try), # handle admins changing the server name
  1334. (eq, ":event_type", client_event_admin_set_server_name),
  1335. (try_begin),
  1336. (player_is_admin, ":sender_player_id"),
  1337. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1338. (server_get_renaming_server_allowed, ":renaming_allowed"),
  1339. (eq, ":renaming_allowed", 1),
  1340. (server_set_name, s0),
  1341. (try_end),
  1342. (else_try), # handle admins changing the server password
  1343. (eq, ":event_type", client_event_admin_set_password),
  1344. (try_begin),
  1345. (player_is_admin, ":sender_player_id"),
  1346. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1347. (server_set_password, s0),
  1348. (try_end),
  1349. (else_try), # handle admins changing the server welcome message (for newly connecting players)
  1350. (eq, ":event_type", client_event_admin_set_welcome_message),
  1351. (try_begin),
  1352. (player_is_admin, ":sender_player_id"),
  1353. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1354. (server_set_welcome_message, s0),
  1355. (try_end),
  1356. (else_try), # handle the use of admin tools
  1357. (eq, ":event_type", client_event_admin_action),
  1358. (store_script_param, ":admin_action", 3),
  1359. (store_script_param, ":target_player_id", 4),
  1360. (try_begin),
  1361. (call_script, "script_cf_admin_action", ":admin_action", ":sender_player_id", ":target_player_id"),
  1362. (try_end),
  1363. (else_try), # handle requests for a poll
  1364. (eq, ":event_type", client_event_request_poll),
  1365. (store_script_param, ":poll_type", 3),
  1366. (store_script_param, ":value_1", 4),
  1367. (store_script_param, ":value_2", 5),
  1368. (call_script, "script_request_poll", ":poll_type", ":sender_player_id", ":value_1", ":value_2"),
  1369. (else_try), # store poll votes from players
  1370. (eq, ":event_type", client_event_poll_vote),
  1371. (store_script_param, ":vote", 3),
  1372. (call_script, "script_poll_vote", ":sender_player_id", ":vote"),
  1373. (else_try), # handle admins spawning items for themselves
  1374. (eq, ":event_type", client_event_admin_equip_item),
  1375. (store_script_param, ":item_id", 3),
  1376. (try_begin),
  1377. (player_is_admin, ":sender_player_id"),
  1378. (player_slot_eq, ":sender_player_id", slot_player_admin_no_all_items, 0),
  1379. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1380. (agent_is_active, ":agent_id"),
  1381. (agent_is_alive, ":agent_id"),
  1382. (is_between, ":item_id", all_items_begin, all_items_end),
  1383. (item_get_type, ":item_type", ":item_id"),
  1384. (try_begin), # spawn animals near the admin's position
  1385. (eq, ":item_type", itp_type_horse),
  1386. (agent_get_position, pos1, ":agent_id"),
  1387. (position_move_x, pos1, 50),
  1388. (try_begin),
  1389. (neg|item_slot_eq, ":item_id", slot_item_animal_adult_item_id, 0),
  1390. (call_script, "script_cf_spawn_herd_animal", ":item_id", -1),
  1391. (else_try),
  1392. (set_spawn_position, pos1),
  1393. (spawn_horse, ":item_id"),
  1394. (try_end),
  1395. (else_try),
  1396. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  1397. (store_sub, ":player_slot", ":item_type", itp_type_head_armor),
  1398. (val_add, ":player_slot", slot_player_equip_head),
  1399. (player_set_slot, ":sender_player_id", ":player_slot", ":item_id"),
  1400. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  1401. (else_try),
  1402. (agent_equip_item, ":agent_id", ":item_id"),
  1403. (try_end),
  1404. (str_store_item_name, s4, ":item_id"),
  1405. (str_store_string, s3, "str_log_admin_cheat_item"),
  1406. (str_store_player_username, s0, ":sender_player_id"),
  1407. (player_get_unique_id, reg0, ":sender_player_id"),
  1408. (server_add_message_to_log, "str_log_admin_target_self"),
  1409. (try_end),
  1410. (else_try), # handle players requesting to drop or toggle armor items
  1411. (eq, ":event_type", client_event_toggle_drop_armor),
  1412. (store_script_param, ":equip_slot", 3),
  1413. (try_begin),
  1414. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1415. (agent_is_active, ":agent_id"),
  1416. (agent_is_alive, ":agent_id"),
  1417. (is_between, ":equip_slot", ek_head, ek_gloves + 1),
  1418. (store_sub, ":item_id", ":equip_slot", ek_head), # calculate the dummy item for messaging clients to remove that slot
  1419. (val_add, ":item_id", "itm_no_head"),
  1420. (store_add, ":player_slot", ":equip_slot", slot_player_equip_head - ek_head),
  1421. (agent_get_item_slot, ":equipped_item_id", ":agent_id", ":equip_slot"),
  1422. (try_begin), # if nothing is equipped in the slot
  1423. (lt, ":equipped_item_id", all_items_begin),
  1424. (try_begin), # if not gloves or head armor, do nothing
  1425. (neq, ":equip_slot", ek_head),
  1426. (neq, ":equip_slot", ek_gloves),
  1427. (assign, ":item_id", -1),
  1428. (else_try), # otherwise, get the stored item id to put it back on
  1429. (player_get_slot, ":item_id", ":sender_player_id", ":player_slot"),
  1430. (val_abs, ":item_id"),
  1431. (lt, ":item_id", all_items_begin),
  1432. (assign, ":item_id", -1),
  1433. (try_end),
  1434. (else_try), # if something is equipped in the slot and it is not gloves or head armor, clear the stored item id
  1435. (neq, ":equip_slot", ek_head),
  1436. (neq, ":equip_slot", ek_gloves),
  1437. (player_set_slot, ":sender_player_id", ":player_slot", 0),
  1438. (agent_get_position, pos1, ":agent_id"),
  1439. (try_begin), # try find a previously used corpse item close enough to put the item in
  1440. (agent_get_slot, ":corpse_instance_id", ":agent_id", slot_agent_storage_corpse_instance_id),
  1441. (prop_instance_is_valid, ":corpse_instance_id"),
  1442. (neg|scene_prop_slot_eq, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, 0),
  1443. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":corpse_instance_id"),
  1444. (eq, ":scene_prop_id", "itm_agent_corpse"),
  1445. (prop_instance_get_position, pos2, ":corpse_instance_id"),
  1446. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1447. (le, ":sq_distance", sq(max_distance_to_use)),
  1448. (assign, ":loop_end", slot_scene_prop_inventory_begin + corpse_inventory_slots),
  1449. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":loop_end"),
  1450. (scene_prop_slot_eq, ":corpse_instance_id", ":inventory_slot", 0),
  1451. (assign, ":loop_end", -1),
  1452. (try_end),
  1453. (eq, ":loop_end", -1),
  1454. (else_try), # otherwise spawn a new corpse item
  1455. (set_spawn_position, pos1),
  1456. (spawn_item, "itm_agent_corpse", imod_rusty, "$g_spawn_item_prune_time"),
  1457. (assign, ":corpse_instance_id", reg0),
  1458. (agent_set_slot, ":agent_id", slot_agent_storage_corpse_instance_id, ":corpse_instance_id"),
  1459. (prop_instance_set_position, ":corpse_instance_id", pos1),
  1460. (store_mission_timer_a, ":prune_time"),
  1461. (val_add, ":prune_time", "$g_spawn_item_prune_time"),
  1462. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_prune_time, ":prune_time"),
  1463. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_count, corpse_inventory_slots),
  1464. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_max_length, corpse_inventory_max_length),
  1465. (val_add, "$g_last_inventory_unique_id", 1),
  1466. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, "$g_last_inventory_unique_id"),
  1467. (assign, ":inventory_slot", slot_scene_prop_inventory_begin),
  1468. (try_end),
  1469. (scene_prop_set_slot, ":corpse_instance_id", ":inventory_slot", ":equipped_item_id"),
  1470. (try_end),
  1471. (try_begin), # if necessary, equip or remove the armor
  1472. (gt, ":item_id", -1),
  1473. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  1474. (try_end),
  1475. (try_end),
  1476. (else_try), # handle accessing armor to loot from corpses
  1477. (eq, ":event_type", client_event_agent_loot_armor),
  1478. (store_script_param, ":corpse_instance_id", 3),
  1479. (try_begin),
  1480. (prop_instance_is_valid, ":corpse_instance_id"),
  1481. (neg|scene_prop_slot_eq, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, 0),
  1482. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":corpse_instance_id"),
  1483. (eq, ":scene_prop_id", "itm_agent_corpse"),
  1484. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1485. (agent_is_active, ":agent_id"),
  1486. (agent_is_alive, ":agent_id"),
  1487. (agent_get_position, pos1, ":agent_id"),
  1488. (prop_instance_get_position, pos2, ":corpse_instance_id"),
  1489. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1490. (le, ":sq_distance", sq(max_distance_to_loot)),
  1491. (call_script, "script_cf_use_inventory", ":agent_id", ":corpse_instance_id", 0),
  1492. (try_end),
  1493. (else_try), # handle player requests to reveal their money pouch to another player
  1494. (eq, ":event_type", client_event_reveal_money_pouch),
  1495. (try_begin),
  1496. (neq, "$g_game_type", "mt_no_money"),
  1497. (store_script_param, ":target_agent_id", 3),
  1498. (agent_is_active, ":target_agent_id"),
  1499. (agent_is_alive, ":target_agent_id"),
  1500. (agent_get_player_id, ":target_player_id", ":target_agent_id"),
  1501. (player_is_active, ":target_player_id"),
  1502. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1503. (agent_is_active, ":agent_id"),
  1504. (agent_is_alive, ":agent_id"),
  1505. (store_mission_timer_a, ":time"), # don't allow spamming pouch reveal messages
  1506. (player_get_slot, ":last_action_time", ":sender_player_id", slot_player_last_action_time),
  1507. (store_sub, ":interval", ":time", ":last_action_time"),
  1508. (ge, ":interval", repeat_action_min_interval),
  1509. (player_set_slot, ":sender_player_id", slot_player_last_action_time, ":time"),
  1510. (agent_get_position, pos1, ":agent_id"),
  1511. (agent_get_position, pos2, ":target_agent_id"),
  1512. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1513. (lt, ":sq_distance", sq(max_distance_to_use)),
  1514. (player_get_gold, ":approximate_gold", ":sender_player_id"),
  1515. (assign, ":multiplier", 1), # repeatedly divide by 10, discarding the remainder, until only the most significant figure remains, then multiply back to the approximate value
  1516. (assign, ":loop_end", int(math.log10(max_possible_gold))),
  1517. (try_for_range, ":unused", 0, ":loop_end"),
  1518. (lt, ":approximate_gold", 10),
  1519. (assign, ":loop_end", -1),
  1520. (val_mul, ":approximate_gold", ":multiplier"),
  1521. (else_try),
  1522. (val_mul, ":multiplier", 10),
  1523. (val_div, ":approximate_gold", 10),
  1524. (try_end),
  1525. (multiplayer_send_4_int_to_player, ":target_player_id", server_event_preset_message, "str_s1_reveals_money_pouch_containing_about_reg1", preset_message_player|preset_message_chat_log|preset_message_yellow, ":sender_player_id", ":approximate_gold"),
  1526. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_preset_message, "str_you_reveal_money_pouch_to_s1", preset_message_player|preset_message_chat_log|preset_message_yellow, ":target_player_id"),
  1527. (str_store_player_username, s1, ":sender_player_id"),
  1528. (str_store_player_username, s2, ":target_player_id"),
  1529. (assign, reg1, ":approximate_gold"),
  1530. (server_add_message_to_log, "str_s1_revealed_money_pouch_containing_reg1_to_s2"),
  1531. (try_end),
  1532. (else_try), # handle animation requests
  1533. (eq, ":event_type", client_event_request_animation),
  1534. (store_script_param, ":string_id", 3),
  1535. (try_begin),
  1536. (call_script, "script_cf_try_execute_animation", ":sender_player_id", ":string_id", 0),
  1537. (try_end),
  1538. (try_end),
  1539. (try_end),
  1540. ]),
  1541.  
  1542. ("game_get_multiplayer_server_option_for_mission_template", # server option values in the popup over entries in the server list
  1543. [#(store_script_param, ":mission_template_id", 1),
  1544. (store_script_param, ":option_index", 2),
  1545.  
  1546. (try_begin),
  1547. (eq, ":option_index", 0),
  1548. (server_get_ghost_mode, reg0),
  1549. (set_trigger_result, 1),
  1550. (else_try),
  1551. (eq, ":option_index", 1),
  1552. (server_get_control_block_dir, reg0),
  1553. (set_trigger_result, 1),
  1554. (else_try),
  1555. (eq, ":option_index", 2),
  1556. (server_get_combat_speed, reg0),
  1557. (set_trigger_result, 1),
  1558. (else_try),
  1559. (eq, ":option_index", 3),
  1560. (assign, reg0, "$g_game_time_limit"),
  1561. (set_trigger_result, 1),
  1562. (else_try),
  1563. (eq, ":option_index", 4),
  1564. (assign, reg0, "$g_respawn_period"),
  1565. (set_trigger_result, 1),
  1566. (else_try),
  1567. (eq, ":option_index", 5),
  1568. (assign, reg0, "$g_starting_gold_multiplier"),
  1569. (set_trigger_result, 1),
  1570. (else_try),
  1571. (eq, ":option_index", 6),
  1572. (assign, reg0, "$g_combat_gold_multiplier"),
  1573. (set_trigger_result, 1),
  1574. (else_try),
  1575. (eq, ":option_index", 7),
  1576. (assign, reg0, "$g_scene_num_castle_factions"),
  1577. (set_trigger_result, 1),
  1578. (else_try),
  1579. (eq, ":option_index", 8),
  1580. (assign, reg0, "$g_victory_condition"),
  1581. (set_trigger_result, 1),
  1582. (else_try),
  1583. (eq, ":option_index", 9),
  1584. (assign, reg0, "$g_force_weather"),
  1585. (set_trigger_result, 1),
  1586. (else_try),
  1587. (eq, ":option_index", 10),
  1588. (assign, reg0, "$g_full_respawn_health"),
  1589. (set_trigger_result, 1),
  1590. (else_try),
  1591. (eq, ":option_index", 11),
  1592. (assign, reg0, "$g_max_herd_animal_count"),
  1593. (set_trigger_result, 1),
  1594. (try_end),
  1595. ]),
  1596.  
  1597. ("game_multiplayer_server_option_for_mission_template_to_string", # server option strings in the popup over entries in the server list
  1598. [#(store_script_param, ":mission_template_id", 1),
  1599. (store_script_param, ":option_index", 2),
  1600. (store_script_param, ":option_value", 3), # the corresponding value from the above script
  1601.  
  1602. (str_clear, s0),
  1603. (try_begin),
  1604. (eq, ":option_index", 0),
  1605. (str_store_string, s0, "str_ghost_mode"),
  1606. (try_begin),
  1607. (eq, ":option_value", 0),
  1608. (str_store_string, s1, "str_free"),
  1609. (else_try),
  1610. (eq, ":option_value", 1),
  1611. (str_store_string, s1, "str_stick_to_any_player"),
  1612. (else_try),
  1613. (eq, ":option_value", 2),
  1614. (str_store_string, s1, "str_stick_to_team_members"),
  1615. (else_try),
  1616. (str_store_string, s1, "str_stick_to_team_members_view"),
  1617. (try_end),
  1618. (str_store_string, s0, "str_s0_s1"),
  1619. (else_try),
  1620. (eq, ":option_index", 1),
  1621. (str_store_string, s0, "str_control_block_direction"),
  1622. (try_begin),
  1623. (eq, ":option_value", 0),
  1624. (str_store_string, s1, "str_automatic"),
  1625. (else_try),
  1626. (str_store_string, s1, "str_by_mouse_movement"),
  1627. (try_end),
  1628. (str_store_string, s0, "str_s0_s1"),
  1629. (else_try),
  1630. (eq, ":option_index", 2),
  1631. (str_store_string, s0, "str_combat_speed"),
  1632. (try_begin),
  1633. (eq, ":option_value", 0),
  1634. (str_store_string, s1, "str_combat_speed_0"),
  1635. (else_try),
  1636. (eq, ":option_value", 1),
  1637. (str_store_string, s1, "str_combat_speed_1"),
  1638. (else_try),
  1639. (eq, ":option_value", 2),
  1640. (str_store_string, s1, "str_combat_speed_2"),
  1641. (else_try),
  1642. (eq, ":option_value", 3),
  1643. (str_store_string, s1, "str_combat_speed_3"),
  1644. (else_try),
  1645. (str_store_string, s1, "str_combat_speed_4"),
  1646. (try_end),
  1647. (str_store_string, s0, "str_s0_s1"),
  1648. (else_try),
  1649. (eq, ":option_index", 3),
  1650. (str_store_string, s0, "str_game_time_limit"),
  1651. (assign, reg0, ":option_value"),
  1652. (str_store_string, s0, "str_s0_reg0"),
  1653. (else_try),
  1654. (eq, ":option_index", 4),
  1655. (str_store_string, s0, "str_respawn_period"),
  1656. (assign, reg0, ":option_value"),
  1657. (str_store_string, s0, "str_s0_reg0"),
  1658. (else_try),
  1659. (eq, ":option_index", 5),
  1660. (str_store_string, s0, "str_starting_gold"),
  1661. (assign, reg0, ":option_value"),
  1662. (str_store_string, s0, "str_s0_reg0"),
  1663. (else_try),
  1664. (eq, ":option_index", 6),
  1665. (str_store_string, s0, "str_combat_gold_bonus"),
  1666. (assign, reg0, ":option_value"),
  1667. (str_store_string, s0, "str_s0_reg0"),
  1668. (else_try),
  1669. (eq, ":option_index", 7),
  1670. (assign, reg0, ":option_value"),
  1671. (str_store_string, s0, "str_number_of_factions_reg0"),
  1672. (else_try),
  1673. (eq, ":option_index", 8),
  1674. (try_begin),
  1675. (ge, ":option_value", 1),
  1676. (assign, reg0, ":option_value"),
  1677. (str_store_string, s0, "str_victory_condition_castles"),
  1678. (else_try),
  1679. (str_store_string, s0, "str_victory_condition_none"),
  1680. (try_end),
  1681. (else_try),
  1682. (eq, ":option_index", 9),
  1683. (str_store_string, s0, "str_force_default_armor"),
  1684. (try_begin),
  1685. (eq, ":option_value", 2),
  1686. (str_store_string, s1, "str_dynamic"),
  1687. (else_try),
  1688. (eq, ":option_value", 1),
  1689. (str_store_string, s1, "str_always_raining"),
  1690. (else_try),
  1691. (str_store_string, s1, "str_always_fine"),
  1692. (try_end),
  1693. (str_store_string, s0, "str_s0_s1"),
  1694. (else_try),
  1695. (eq, ":option_index", 10),
  1696. (try_begin),
  1697. (eq, ":option_value", 0),
  1698. (str_store_string, s0, "str_respawn_with_partial_health"),
  1699. (else_try),
  1700. (str_store_string, s0, "str_respawn_with_full_health"),
  1701. (try_end),
  1702. (else_try),
  1703. (eq, ":option_index", 11),
  1704. (assign, reg0, ":option_value"),
  1705. (str_store_string, s0, "str_herd_animal_limit_reg0"),
  1706. (else_try),
  1707. (val_add, ":option_index", 1),
  1708. (try_end),
  1709. ]),
  1710.  
  1711. ("game_multiplayer_event_duel_offered", []),
  1712.  
  1713. ("game_get_multiplayer_game_type_enum",
  1714. [
  1715. (assign, reg0, game_type_mission_templates_begin),
  1716. (store_sub, reg1, game_type_mission_templates_begin, game_type_mission_templates_end),
  1717. ]),
  1718.  
  1719. ("game_multiplayer_get_game_type_mission_template",
  1720. [(store_script_param, ":game_type", 1),
  1721. (try_begin),
  1722. (is_between, ":game_type", game_type_mission_templates_begin, game_type_mission_templates_end),
  1723. (assign, reg0, ":game_type"),
  1724. (else_try),
  1725. (assign, reg0, -1),
  1726. (try_end),
  1727. ]),
  1728.  
  1729. ("game_get_party_prisoner_limit", []),
  1730.  
  1731. ("game_get_item_extra_text", # called by the game when the show_item_details operation is called. set_result_string is for the text displayed, set_trigger result for the color
  1732. [(store_script_param, ":item_id", 1),
  1733. (store_script_param, ":extra_text_id", 2), # repeatedly called with this set to the numbers 0 through 7
  1734. #(store_script_param, ":item_modifier", 3), # item modifiers are not used for adjusting stats in this mod - they aren't supported by all necessary operations
  1735.  
  1736. (try_begin),
  1737. (eq, ":extra_text_id", 0),
  1738. (assign, "$g_extra_item_details_show_modifiers", 0),
  1739. (item_get_slot, reg1, ":item_id", slot_item_difficulty),
  1740. (try_begin),
  1741. (gt, reg1, 0), # skip showing agent modifiers if the item has no skill requirements
  1742. (multiplayer_get_my_player, ":my_player"),
  1743. (player_get_agent_id, ":agent_id", ":my_player"),
  1744. (agent_get_troop_id, ":troop_id", ":agent_id"),
  1745. (assign, "$g_extra_item_details_cannot_use", 0),
  1746. (item_get_type, ":item_type", ":item_id"),
  1747. (try_begin), # for horses, just show if the required riding skill is met
  1748. (eq, ":item_type", itp_type_horse),
  1749. (try_begin),
  1750. (le, reg1, 10),
  1751. (assign, "$g_extra_item_details_cannot_use", 1),
  1752. (set_result_string, "str_requires_riding_reg1"),
  1753. (store_skill_level, ":troop_level", "skl_riding", ":troop_id"),
  1754. (try_end),
  1755. (else_try), # for other item types, check for stat modifiers
  1756. (try_begin),
  1757. (eq, ":item_type", itp_type_bow),
  1758. (set_result_string, "str_requires_power_draw_reg1"),
  1759. (store_skill_level, ":troop_level", "skl_power_draw", ":troop_id"),
  1760. (else_try),
  1761. (eq, ":item_type", itp_type_thrown),
  1762. (set_result_string, "str_requires_power_throw_reg1"),
  1763. (store_skill_level, ":troop_level", "skl_power_throw", ":troop_id"),
  1764. (else_try),
  1765. (set_result_string, "str_requires_strength_reg1"),
  1766. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  1767. (try_end), # store modifiers for displaying on the next lines
  1768. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 1, 0),
  1769. (assign, "$g_extra_item_details_cannot_use", reg10),
  1770. (assign, "$g_extra_item_details_damage", reg11),
  1771. (assign, "$g_extra_item_details_speed", reg12),
  1772. (assign, "$g_extra_item_details_accuracy", reg13),
  1773. (assign, "$g_extra_item_details_reload", reg14),
  1774. (assign, "$g_extra_item_details_show_modifiers", 1),
  1775. (try_end),
  1776. (try_begin),
  1777. (ge, ":troop_level", reg1),
  1778. (set_trigger_result, 0xFF33DD11),
  1779. (else_try),
  1780. (eq, "$g_extra_item_details_cannot_use", 0),
  1781. (set_trigger_result, 0xFFFFBB22),
  1782. (else_try),
  1783. (set_trigger_result, 0xFFFF4422),
  1784. (try_end),
  1785. (try_end),
  1786. (else_try), # show stored damage and speed modifers
  1787. (eq, ":extra_text_id", 1),
  1788. (try_begin),
  1789. (eq, "$g_extra_item_details_show_modifiers", 1),
  1790. (this_or_next|neq, "$g_extra_item_details_damage", 100),
  1791. (neq, "$g_extra_item_details_speed", 100),
  1792. (assign, reg1, "$g_extra_item_details_damage"),
  1793. (assign, reg2, "$g_extra_item_details_speed"),
  1794. (set_result_string, "str_damage_reg1_speed_reg2"),
  1795. (try_begin),
  1796. (eq, "$g_extra_item_details_cannot_use", 0),
  1797. (set_trigger_result, 0xFFFFBB22),
  1798. (else_try),
  1799. (set_trigger_result, 0xFFFF4422),
  1800. (try_end),
  1801. (try_end),
  1802. (else_try), # show stored accuracy and reload modifiers
  1803. (eq, ":extra_text_id", 2),
  1804. (try_begin),
  1805. (eq, "$g_extra_item_details_show_modifiers", 1),
  1806. (this_or_next|neq, "$g_extra_item_details_accuracy", 100),
  1807. (neq, "$g_extra_item_details_reload", 100),
  1808. (assign, reg1, "$g_extra_item_details_accuracy"),
  1809. (assign, reg2, "$g_extra_item_details_reload"),
  1810. (set_result_string, "str_accuracy_reg1_reload_reg2"),
  1811. (try_begin),
  1812. (eq, "$g_extra_item_details_cannot_use", 0),
  1813. (set_trigger_result, 0xFFFFBB22),
  1814. (else_try),
  1815. (set_trigger_result, 0xFFFF4422),
  1816. (try_end),
  1817. (try_end),
  1818. (else_try), # display whether the item is available to females only
  1819. (eq, ":extra_text_id", 3),
  1820. (item_get_slot, ":item_gender", ":item_id", slot_item_gender),
  1821. (try_begin),
  1822. (eq, ":item_gender", tf_female),
  1823. (set_result_string, "str_womens_clothes"),
  1824. (try_begin),
  1825. (neg|multiplayer_is_server),
  1826. (multiplayer_get_my_player, ":my_player"),
  1827. (player_get_gender, ":my_gender", ":my_player"),
  1828. (eq, ":my_gender", ":item_gender"),
  1829. (set_trigger_result, 0xFF33DD11),
  1830. (else_try),
  1831. (set_trigger_result, 0xFFFF4422),
  1832. (try_end),
  1833. (try_end),
  1834. (else_try), # custom details set by targeted scene props; the variables are reset after use for the next unrelated item details displayed
  1835. (eq, ":extra_text_id", 4),
  1836. (gt, "$g_extra_item_details_1_string_id", -1),
  1837. (assign, reg0, "$g_extra_item_details_1_value"),
  1838. (set_result_string, "$g_extra_item_details_1_string_id"),
  1839. (set_trigger_result, "$g_extra_item_details_1_color"),
  1840. (assign, "$g_extra_item_details_1_string_id", -1),
  1841. (else_try),
  1842. (eq, ":extra_text_id", 5),
  1843. (gt, "$g_extra_item_details_2_string_id", -1),
  1844. (assign, reg0, "$g_extra_item_details_2_value"),
  1845. (assign, reg1, "$g_extra_item_details_2_value_2"),
  1846. (set_result_string, "$g_extra_item_details_2_string_id"),
  1847. (set_trigger_result, "$g_extra_item_details_2_color"),
  1848. (assign, "$g_extra_item_details_2_string_id", -1),
  1849. (else_try),
  1850. (eq, ":extra_text_id", 6),
  1851. (gt, "$g_extra_item_details_3_string_id", -1),
  1852. (assign, reg0, "$g_extra_item_details_3_value"),
  1853. (set_result_string, "$g_extra_item_details_3_string_id"),
  1854. (set_trigger_result, "$g_extra_item_details_3_color"),
  1855. (assign, "$g_extra_item_details_3_string_id", -1),
  1856. (try_end),
  1857. ]),
  1858.  
  1859. ("game_on_disembark", []),
  1860. ("game_context_menu_get_buttons", []),
  1861. ("game_event_context_menu_button_clicked", []),
  1862. ("game_get_skill_modifier_for_troop", []),
  1863. ("game_check_party_sees_party", []),
  1864. ("game_get_party_speed_multiplier", []),
  1865. ("game_troop_upgrades_button_clicked", []),
  1866. ("game_character_screen_requested", []),
  1867.  
  1868. ("game_missile_launch", # called by the game whenever a missile is shot or thrown
  1869. [#(store_script_param, ":agent_id", 1),
  1870. #(store_script_param, ":agent_weapon_item_id", 2),
  1871. #(store_script_param, ":missile_weapon_item_id", 3),
  1872. #(store_script_param, ":missile_item_id", 4),
  1873.  
  1874. ]),
  1875.  
  1876. ("game_missile_dives_into_water", # called by the game whenever a missle drops below water level
  1877. [#(store_script_param, ":missile_item_id", 1),
  1878. #(store_script_param, ":unknown", 2),
  1879.  
  1880. (try_begin),
  1881. (neg|multiplayer_is_server),
  1882. (init_position, pos2),
  1883. (position_copy_origin, pos2, pos1),
  1884. (particle_system_burst_no_sync, "psys_game_water_splash_2", pos2, 10),
  1885. (try_end),
  1886. ]),
  1887.  
  1888. ("get_random_equipment", # get a random item inside a range of ids, that is not women only clothing; store in reg0
  1889. [(store_script_param, ":begin_item_id", 1),
  1890. (store_script_param, ":end_item_id", 2),
  1891.  
  1892. (assign, ":end_slot", 0),
  1893. (try_for_range, ":item_id", ":begin_item_id", ":end_item_id"),
  1894. (item_slot_eq, ":item_id", slot_item_gender, 0),
  1895. (troop_set_slot, "trp_temp_array", ":end_slot", ":item_id"),
  1896. (val_add, ":end_slot", 1),
  1897. (try_end),
  1898. (store_random_in_range, ":random_slot", 0, ":end_slot"),
  1899. (troop_get_slot, reg0, "trp_temp_array", ":random_slot"),
  1900. ]),
  1901.  
  1902. ("store_profile_troop_equipment", # store random body and leg armor items for the profile selection presentation
  1903. [
  1904. (call_script, "script_get_random_equipment", "itm_linen_tunic", "itm_tribal_warrior_outfit"),
  1905. (assign, "$g_profile_troop_body_item", reg0),
  1906. (call_script, "script_get_random_equipment", "itm_sarranid_boots_a", "itm_khergit_leather_boots"),
  1907. (assign, "$g_profile_troop_foot_item", reg0),
  1908. ]),
  1909.  
  1910. ("add_troop_to_cur_tableau_for_profile", # setup the tableau for the profile selection presentation
  1911. [(store_script_param, ":troop_no",1),
  1912. (set_fixed_point_multiplier, 100),
  1913.  
  1914. (cur_tableau_clear_override_items),
  1915. (cur_tableau_set_camera_parameters, 1, 4, 6, 10, 10000),
  1916.  
  1917. (init_position, pos5),
  1918. (assign, ":cam_height", 105),
  1919. (assign, ":camera_distance", 380),
  1920. (assign, ":camera_yaw", -15),
  1921. (assign, ":camera_pitch", -18),
  1922. (assign, ":animation", "anim_stand_man"),
  1923.  
  1924. (position_set_z, pos5, ":cam_height"),
  1925. (position_rotate_x, pos5, -90),
  1926. (position_rotate_z, pos5, 180),
  1927. (position_rotate_y, pos5, ":camera_yaw"),
  1928. (position_rotate_x, pos5, ":camera_pitch"),
  1929. (position_move_z, pos5, ":camera_distance", 0),
  1930. (position_move_x, pos5, 5, 0),
  1931.  
  1932. (profile_get_banner_id, ":profile_banner"),
  1933. (assign, "$g_current_profile_banner_id", ":profile_banner"),
  1934. (try_begin),
  1935. (val_and, ":profile_banner", profile_banner_id_mask),
  1936. (val_add, ":profile_banner", banner_meshes_begin),
  1937. (is_between, ":profile_banner", banner_meshes_begin, banner_meshes_end),
  1938. (ge, ":profile_banner", 0),
  1939. (init_position, pos2),
  1940. (position_set_x, pos2, -175),
  1941. (position_set_y, pos2, -300),
  1942. (position_set_z, pos2, 180),
  1943. (position_rotate_x, pos2, 90),
  1944. (position_rotate_y, pos2, -15),
  1945. (cur_tableau_add_mesh, ":profile_banner", pos2, 0, 0),
  1946. (try_end),
  1947.  
  1948. (troop_clear_inventory, ":troop_no"),
  1949. (troop_add_item, ":troop_no", "$g_profile_troop_body_item"),
  1950. (troop_add_item, ":troop_no", "$g_profile_troop_foot_item"),
  1951. (troop_equip_items, ":troop_no"),
  1952.  
  1953. (init_position, pos2),
  1954. (try_begin),
  1955. (troop_is_hero, ":troop_no"),
  1956. (cur_tableau_add_troop, ":troop_no", pos2, ":animation", -1),
  1957. (else_try),
  1958. (store_mul, ":random_seed", ":troop_no", 126233),
  1959. (val_mod, ":random_seed", 1000),
  1960. (val_add, ":random_seed", 1),
  1961. (cur_tableau_add_troop, ":troop_no", pos2, ":animation", ":random_seed"),
  1962. (try_end),
  1963. (cur_tableau_set_camera_position, pos5),
  1964.  
  1965. (copy_position, pos8, pos5),
  1966. (position_rotate_x, pos8, -90),
  1967. (position_rotate_z, pos8, 30),
  1968. (position_rotate_x, pos8, -60),
  1969. (cur_tableau_add_sun_light, pos8, 175,150,125),
  1970. ]),
  1971.  
  1972. ("store_command_string", # store in s0 the appropriate command description and value
  1973. [(store_script_param, ":command", 1), # the command number
  1974. (store_script_param, reg1, 2), # the value to be displayed
  1975.  
  1976. (try_begin),
  1977. (is_between, ":command", commands_module_system_begin, commands_module_system_end),
  1978. (store_sub, ":command_string_id", ":command", commands_module_system_begin),
  1979. (store_mod, ":get_or_set", ":command_string_id", 2),
  1980. (val_div, ":command_string_id", 2),
  1981. (val_add, ":command_string_id", commands_module_system_names_begin),
  1982. (str_store_string, s0, ":command_string_id"),
  1983. (try_begin),
  1984. (eq, ":get_or_set", 1),
  1985. (str_store_string, s0, "str_set_s0"),
  1986. (try_end),
  1987. (str_store_string, s0, "str_s0_reg1"),
  1988. (else_try),
  1989. (is_between, ":command", commands_napoleonic_wars_begin, commands_napoleonic_wars_end),
  1990. (store_sub, ":command_string_id", ":command", commands_napoleonic_wars_begin),
  1991. (val_add, ":command_string_id", commands_napoleonic_wars_names_begin),
  1992. (str_store_string, s0, ":command_string_id"),
  1993. (str_store_string, s0, "str_set_s0"),
  1994. (str_store_string, s0, "str_s0_reg1"),
  1995. (else_try),
  1996. (str_store_string, s0, "str_no_string"),
  1997. (try_end),
  1998. ]),
  1999.  
  2000. ("cf_execute_command", # get or set a server setting, on the server or clients, ensuring the value is valid
  2001. [(store_script_param, ":command", 1),
  2002. (store_script_param, ":value", 2),
  2003.  
  2004. (assign, ":error_string_id", 0),
  2005. (try_begin),
  2006. (eq, ":command", command_get_bot_count),
  2007. (assign, ":value", "$g_bot_count"),
  2008. (else_try),
  2009. (eq, ":command", command_set_bot_count),
  2010. (val_max, ":value", 0),
  2011. (assign, "$g_bot_count", ":value"),
  2012. (call_script, "script_check_spawn_bots", -1),
  2013. (else_try),
  2014. (eq, ":command", command_get_round_max_seconds),
  2015. (assign, ":value", "$g_spawn_item_prune_time"),
  2016. (else_try),
  2017. (eq, ":command", command_set_round_max_seconds),
  2018. (val_clamp, ":value", 0, 86401),
  2019. (assign, "$g_spawn_item_prune_time", ":value"),
  2020. (else_try),
  2021. (eq, ":command", command_get_respawn_period),
  2022. (assign, ":value", "$g_respawn_period"),
  2023. (else_try),
  2024. (eq, ":command", command_set_respawn_period),
  2025. (try_begin),
  2026. (is_between, ":value", min_respawn_period, max_respawn_period),
  2027. (assign, "$g_respawn_period", ":value"),
  2028. (else_try),
  2029. (assign, ":error_string_id", "str_invalid_respawn_period"),
  2030. (try_end),
  2031. (else_try),
  2032. (eq, ":command", command_get_num_bots_voteable),
  2033. (assign, ":value", "$g_max_herd_animal_count"),
  2034. (else_try),
  2035. (eq, ":command", command_set_num_bots_voteable),
  2036. (val_max, ":value", 0),
  2037. (assign, "$g_max_herd_animal_count", ":value"),
  2038. (call_script, "script_check_kill_excess_animals"),
  2039. (else_try),
  2040. (eq, ":command", command_get_maps_voteable),
  2041. (assign, ":value", "$g_scenes_voteable"),
  2042. (else_try),
  2043. (eq, ":command", command_set_maps_voteable),
  2044. (val_clamp, ":value", 0, 2),
  2045. (assign, "$g_scenes_voteable", ":value"),
  2046. (else_try),
  2047. (eq, ":command", command_get_kick_voteable),
  2048. (assign, ":value", "$g_kick_voteable"),
  2049. (else_try),
  2050. (eq, ":command", command_set_kick_voteable),
  2051. (val_clamp, ":value", 0, 2),
  2052. (assign, "$g_kick_voteable", ":value"),
  2053. (else_try),
  2054. (eq, ":command", command_get_ban_voteable),
  2055. (assign, ":value", "$g_ban_voteable"),
  2056. (else_try),
  2057. (eq, ":command", command_set_ban_voteable),
  2058. (val_clamp, ":value", 0, 2),
  2059. (assign, "$g_ban_voteable", ":value"),
  2060. (else_try),
  2061. (eq, ":command", command_get_valid_vote_ratio),
  2062. (assign, ":value", "$g_valid_vote_ratio"),
  2063. (else_try),
  2064. (eq, ":command", command_set_valid_vote_ratio),
  2065. (val_clamp, ":value", 50, 101),
  2066. (assign, "$g_valid_vote_ratio", ":value"),
  2067. (else_try),
  2068. (eq, ":command", command_get_starting_gold),
  2069. (assign, ":value", "$g_starting_gold_multiplier"),
  2070. (else_try),
  2071. (eq, ":command", command_set_starting_gold),
  2072. (val_clamp, ":value", 0, 10001),
  2073. (assign, "$g_starting_gold_multiplier", ":value"),
  2074. (else_try),
  2075. (eq, ":command", command_get_combat_gold_bonus),
  2076. (assign, ":value", "$g_combat_gold_multiplier"),
  2077. (else_try),
  2078. (eq, ":command", command_set_combat_gold_bonus),
  2079. (val_clamp, ":value", 0, 10001),
  2080. (assign, "$g_combat_gold_multiplier", ":value"),
  2081. (else_try),
  2082. (eq, ":command", command_get_force_default_armor),
  2083. (assign, ":value", "$g_force_weather"),
  2084. (else_try),
  2085. (eq, ":command", command_set_force_default_armor),
  2086. (val_clamp, ":value", 0, 3),
  2087. (assign, "$g_force_weather", ":value"),
  2088. (else_try),
  2089. (eq, ":command", command_get_map_time_limit),
  2090. (assign, ":value", "$g_game_time_limit"),
  2091. (else_try),
  2092. (eq, ":command", command_set_map_time_limit),
  2093. (val_clamp, ":value", 5, 40321),
  2094. (assign, "$g_game_time_limit", ":value"),
  2095. (else_try),
  2096. (eq, ":command", command_get_team_point_limit),
  2097. (assign, ":value", "$g_victory_condition"),
  2098. (else_try),
  2099. (eq, ":command", command_set_team_point_limit),
  2100. (val_clamp, ":value", 0, 1441),
  2101. (assign, "$g_victory_condition", ":value"),
  2102. (else_try),
  2103. (eq, ":command", command_get_disallow_ranged_weapons),
  2104. (assign, ":value", "$g_full_respawn_health"),
  2105. (else_try),
  2106. (eq, ":command", command_set_disallow_ranged_weapons),
  2107. (val_clamp, ":value", 0, 2),
  2108. (assign, "$g_full_respawn_health", ":value"),
  2109. (else_try),
  2110. (eq, ":command", command_get_max_players),
  2111. (server_get_max_num_players, ":value"),
  2112. (else_try),
  2113. (eq, ":command", command_set_max_players),
  2114. (try_begin),
  2115. (is_between, ":value", min_num_players, max_num_players),
  2116. (server_set_max_num_players, ":value"),
  2117. (else_try),
  2118. (assign, ":error_string_id", "str_invalid_max_players"),
  2119. (try_end),
  2120. (else_try),
  2121. (eq, ":command", command_get_ghost_mode),
  2122. (server_get_ghost_mode, ":value"),
  2123. (else_try),
  2124. (eq, ":command", command_set_ghost_mode),
  2125. (val_clamp, ":value", 0, 2),
  2126. (server_set_ghost_mode, ":value"),
  2127. (else_try),
  2128. (eq, ":command", command_get_control_block_direction),
  2129. (server_get_control_block_dir, ":value"),
  2130. (else_try),
  2131. (eq, ":command", command_set_control_block_direction),
  2132. (val_clamp, ":value", 0, 2),
  2133. (server_set_control_block_dir, ":value"),
  2134. (else_try),
  2135. (eq, ":command", command_get_combat_speed),
  2136. (server_get_combat_speed, ":value"),
  2137. (else_try),
  2138. (eq, ":command", command_set_combat_speed),
  2139. (val_clamp, ":value", 0, 5),
  2140. (server_set_combat_speed, ":value"),
  2141. (else_try),
  2142. (eq, ":command", command_get_add_to_game_servers_list),
  2143. (server_get_add_to_game_servers_list, ":value"),
  2144. (else_try),
  2145. (eq, ":command", command_set_add_to_game_servers_list),
  2146. (val_clamp, ":value", 0, 2),
  2147. (server_set_add_to_game_servers_list, ":value"),
  2148. (else_try),
  2149. (eq, ":command", command_get_anti_cheat),
  2150. (server_get_anti_cheat, ":value"),
  2151. (else_try),
  2152. (eq, ":command", command_set_anti_cheat),
  2153. (val_clamp, ":value", 0, 2),
  2154. (server_set_anti_cheat, ":value"),
  2155. (else_try),
  2156. (eq, ":command", command_get_renaming_server_allowed),
  2157. (server_get_renaming_server_allowed, ":value"),
  2158. (else_try),
  2159. (eq, ":command", command_set_renaming_server_allowed),
  2160. (val_clamp, ":value", 0, 2),
  2161. (assign, "$g_renaming_server_allowed", ":value"),
  2162. (else_try),
  2163. (eq, ":command", command_get_changing_game_type_allowed),
  2164. (server_get_changing_game_type_allowed, ":value"),
  2165. (else_try),
  2166. (eq, ":command", command_set_changing_game_type_allowed),
  2167. (val_clamp, ":value", 0, 2),
  2168. (assign, "$g_changing_game_type_allowed", ":value"),
  2169. (else_try),
  2170. (eq, ":command", command_start_scene),
  2171. (try_begin),
  2172. (is_between, ":value", scenes_begin, scenes_end),
  2173. (assign, "$g_next_scene", ":value"),
  2174. (store_script_param, "$g_next_game_type", 3),
  2175. (else_try),
  2176. (assign, ":error_string_id", "str_invalid_scene"),
  2177. (try_end),
  2178. (else_try),
  2179. (eq, ":command", command_open_admin_panel),
  2180. (start_presentation, "prsnt_game_multiplayer_admin_panel"),
  2181. (else_try),
  2182. (eq, ":command", command_open_game_rules),
  2183. (start_presentation, "prsnt_game_rules"),
  2184. (else_try),
  2185. (eq, ":command", command_set_server_mission_timer),
  2186. (assign, "$g_server_mission_timer_when_player_joined", ":value"),
  2187. (call_script, "script_after_client_is_setup"),
  2188. (else_try),
  2189. (eq, ":command", command_scale_squad),
  2190. (val_clamp, ":value", 0, 101),
  2191. (assign, "$g_initial_stockpile_multiplier", ":value"),
  2192. (else_try),
  2193. (assign, ":error_string_id", "str_command_not_implemented"),
  2194. (try_end),
  2195. (assign, reg0, ":error_string_id"),
  2196. (assign, reg1, ":value"),
  2197. (eq, ":error_string_id", 0),
  2198. (try_begin),
  2199. (multiplayer_is_server),
  2200. (call_script, "script_cf_command_should_update_clients", ":command"),
  2201. (get_max_players, ":max_players"),
  2202. (try_for_range, ":player_id", 1, ":max_players"),
  2203. (player_is_active, ":player_id"),
  2204. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, ":command", ":value"),
  2205. (try_end),
  2206. (try_end),
  2207. (eq, ":error_string_id", 0),
  2208. ]),
  2209.  
  2210. ("cf_command_should_update_clients", # succeeds if the command should be applied on all clients when changed on the server
  2211. [(store_script_param, ":command", 1),
  2212.  
  2213. (is_between, ":command", commands_module_system_begin, commands_module_system_end),
  2214. (this_or_next|eq, ":command", command_set_force_default_armor),
  2215. (this_or_next|eq, ":command", command_set_respawn_period),
  2216. (this_or_next|eq, ":command", command_set_num_bots_voteable),
  2217. (this_or_next|eq, ":command", command_set_maps_voteable),
  2218. (this_or_next|eq, ":command", command_set_factions_voteable),
  2219. (this_or_next|eq, ":command", command_set_kick_voteable),
  2220. (this_or_next|eq, ":command", command_set_ban_voteable),
  2221. (this_or_next|eq, ":command", command_set_force_default_armor),
  2222. (eq, ":command", command_set_disallow_ranged_weapons),
  2223. ]),
  2224.  
  2225. ("player_return_game_rules", # return server settings to a player when requested
  2226. [(store_script_param, ":player_id", 1),
  2227. (store_script_param, ":admin_request", 2), # if 1, also return settings private to admins
  2228.  
  2229. (try_begin),
  2230. (this_or_next|eq, ":admin_request", 0),
  2231. (player_is_admin, ":player_id"),
  2232. (this_or_next|eq, ":admin_request", 0),
  2233. (player_slot_eq, ":player_id", slot_player_admin_no_panel, 0),
  2234. (server_get_max_num_players, ":max_num_players"),
  2235. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_max_players, ":max_num_players"),
  2236. (server_get_anti_cheat, ":anti_cheat"),
  2237. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_anti_cheat, ":anti_cheat"),
  2238. (server_get_ghost_mode, ":ghost_mode"),
  2239. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_ghost_mode, ":ghost_mode"),
  2240. (server_get_control_block_dir, ":control_block_dir"),
  2241. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_control_block_direction, ":control_block_dir"),
  2242. (server_get_combat_speed, ":combat_speed"),
  2243. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_combat_speed, ":combat_speed"),
  2244. (server_get_add_to_game_servers_list, ":add_to_servers_list"),
  2245. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_add_to_game_servers_list, ":add_to_servers_list"),
  2246. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_valid_vote_ratio, "$g_valid_vote_ratio"),
  2247. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_starting_gold, "$g_starting_gold_multiplier"),
  2248. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_combat_gold_bonus, "$g_combat_gold_multiplier"),
  2249. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_force_default_armor, "$g_force_weather"),
  2250. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_map_time_limit, "$g_game_time_limit"),
  2251. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_team_point_limit, "$g_victory_condition"),
  2252. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_bot_count, "$g_bot_count"),
  2253. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_num_bots_voteable, "$g_max_herd_animal_count"),
  2254. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_round_max_seconds, "$g_spawn_item_prune_time"),
  2255. (str_store_server_name, s0),
  2256. (multiplayer_send_string_to_player, ":player_id", server_event_return_server_name, s0),
  2257. (try_begin),
  2258. (eq, ":admin_request", 0),
  2259. (multiplayer_send_int_to_player, ":player_id", server_event_return_game_rules, command_open_game_rules),
  2260. (else_try),
  2261. (server_get_renaming_server_allowed, "$g_renaming_server_allowed"),
  2262. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_renaming_server_allowed, "$g_renaming_server_allowed"),
  2263. (server_get_changing_game_type_allowed, "$g_changing_game_type_allowed"),
  2264. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_changing_game_type_allowed, "$g_changing_game_type_allowed"),
  2265. (str_store_server_password, s0),
  2266. (multiplayer_send_string_to_player, ":player_id", server_event_return_password, s0),
  2267. (multiplayer_send_int_to_player, ":player_id", server_event_return_game_rules, command_open_admin_panel),
  2268. (try_end),
  2269. (try_end),
  2270. ]),
  2271.  
  2272. ("initialize_game_rules", # set module default settings before loading the server configuration
  2273. [
  2274. (assign, "$g_respawn_period", 5),
  2275. (assign, "$g_scenes_voteable", 0),
  2276. (assign, "$g_kick_voteable", 1),
  2277. (assign, "$g_ban_voteable", 1),
  2278. (assign, "$g_valid_vote_ratio", 51),
  2279. (assign, "$g_starting_gold_multiplier", 100),
  2280. (assign, "$g_combat_gold_multiplier", 100),
  2281. (assign, "$g_force_weather", 2),
  2282. (assign, "$g_game_time_limit", 1440),
  2283. (assign, "$g_victory_condition", 0),
  2284. (assign, "$g_name_server_enabled", 0),
  2285. (assign, "$g_spawn_item_prune_time", 600),
  2286. (assign, "$g_full_respawn_health", 0),
  2287. (assign, "$g_max_herd_animal_count", 20),
  2288. (assign, "$g_initial_stockpile_multiplier", 50),
  2289. (troop_set_slot, "trp_serf", slot_troop_ranking, 0),
  2290. (troop_set_slot, "trp_peasant", slot_troop_ranking, 1),
  2291. (troop_set_slot, "trp_militia", slot_troop_ranking, 2),
  2292. (troop_set_slot, "trp_huntsman", slot_troop_ranking, 4),
  2293. (troop_set_slot, "trp_craftsman", slot_troop_ranking, 6),
  2294. (troop_set_slot, "trp_healer", slot_troop_ranking, 8),
  2295. (troop_set_slot, "trp_herdsman", slot_troop_ranking, 9),
  2296. (troop_set_slot, "trp_traveler", slot_troop_ranking, 10),
  2297. (troop_set_slot, "trp_ruffian", slot_troop_ranking, 12),
  2298. (troop_set_slot, "trp_brigand", slot_troop_ranking, 14),
  2299. (troop_set_slot, "trp_mercenary", slot_troop_ranking, 19),
  2300. (troop_set_slot, "trp_footman", slot_troop_ranking, 20),
  2301. (troop_set_slot, "trp_archer", slot_troop_ranking, 21),
  2302. (troop_set_slot, "trp_crossbowman", slot_troop_ranking, 22),
  2303. (troop_set_slot, "trp_lancer", slot_troop_ranking, 23),
  2304. (troop_set_slot, "trp_sailor", slot_troop_ranking, 24),
  2305. (troop_set_slot, "trp_engineer", slot_troop_ranking, 30),
  2306. (troop_set_slot, "trp_doctor", slot_troop_ranking, 35),
  2307. (troop_set_slot, "trp_master_smith", slot_troop_ranking, 36),
  2308. (troop_set_slot, "trp_sergeant", slot_troop_ranking, 40),
  2309. (troop_set_slot, "trp_man_at_arms", slot_troop_ranking, 41),
  2310. (troop_set_slot, "trp_lord", slot_troop_ranking, 99),
  2311. (troop_set_slot, "trp_godlike_hero", slot_troop_ranking, 100),
  2312. (troop_set_slot, "trp_peasant", slot_troop_spawn_health_percent, 100),
  2313. (troop_set_slot, "trp_serf", slot_troop_spawn_health_percent, 100),
  2314. (troop_set_slot, "trp_militia", slot_troop_spawn_health_percent, 70),
  2315. (troop_set_slot, "trp_huntsman", slot_troop_spawn_health_percent, 70),
  2316. (troop_set_slot, "trp_craftsman", slot_troop_spawn_health_percent, 80),
  2317. (troop_set_slot, "trp_healer", slot_troop_spawn_health_percent, 90),
  2318. (troop_set_slot, "trp_footman", slot_troop_spawn_health_percent, 40),
  2319. (troop_set_slot, "trp_archer", slot_troop_spawn_health_percent, 40),
  2320. (troop_set_slot, "trp_crossbowman", slot_troop_spawn_health_percent, 40),
  2321. (troop_set_slot, "trp_lancer", slot_troop_spawn_health_percent, 40),
  2322. (troop_set_slot, "trp_man_at_arms", slot_troop_spawn_health_percent, 35),
  2323. (troop_set_slot, "trp_sergeant", slot_troop_spawn_health_percent, 35),
  2324. (troop_set_slot, "trp_engineer", slot_troop_spawn_health_percent, 50),
  2325. (troop_set_slot, "trp_master_smith", slot_troop_spawn_health_percent, 35),
  2326. (troop_set_slot, "trp_doctor", slot_troop_spawn_health_percent, 70),
  2327. (troop_set_slot, "trp_sailor", slot_troop_spawn_health_percent, 50),
  2328. (troop_set_slot, "trp_traveler", slot_troop_spawn_health_percent, 70),
  2329. (troop_set_slot, "trp_herdsman", slot_troop_spawn_health_percent, 80),
  2330. (troop_set_slot, "trp_lord", slot_troop_spawn_health_percent, 30),
  2331. (troop_set_slot, "trp_ruffian", slot_troop_spawn_health_percent, 55),
  2332. (troop_set_slot, "trp_brigand", slot_troop_spawn_health_percent, 55),
  2333. (troop_set_slot, "trp_mercenary", slot_troop_spawn_health_percent, 80),
  2334. (troop_set_slot, "trp_godlike_hero", slot_troop_spawn_health_percent, 100),
  2335. (assign, "$g_extra_item_details_1_string_id", -1),
  2336. (assign, "$g_extra_item_details_2_string_id", -1),
  2337. ]),
  2338.  
  2339. ("initialize_scene_globals", # reset global values to initial values when starting a mission
  2340. [
  2341. (assign, "$g_game_ended", 0),
  2342. (assign, "$g_victory_condition_time", 0),
  2343. (assign, "$g_spawn_marker_count", 0),
  2344. (assign, "$g_spawned_bot_count", 0),
  2345. (assign, "$g_overflow_gold_value", 0),
  2346. (assign, "$g_loop_player_id", 0),
  2347. (assign, "$g_loop_player_check_outlaw", 0),
  2348. (assign, "$g_loop_player_check_outlaw_time", 0),
  2349. (assign, "$g_loop_agent_last_checked", 0),
  2350. (assign, "$g_loop_agent_check_time", 0),
  2351. (assign, "$g_loop_horse_check", 0),
  2352. (assign, "$g_loop_horse_check_time", 0),
  2353. (assign, "$g_loop_health_check", 0),
  2354. (assign, "$g_loop_health_check_time", 0),
  2355. (troop_set_slot, "trp_ship_array", slot_ship_array_count, 0),
  2356. (troop_set_slot, "trp_ship_array", slot_ship_array_collision_props_count, 0),
  2357. (troop_set_slot, "trp_cart_array", slot_array_count, 0),
  2358. (troop_set_slot, "trp_removed_scene_props", slot_array_count, 0),
  2359. (assign, "$g_loop_ship_to_check", 0),
  2360. (assign, "$g_loop_ship_check_time", 0),
  2361. (assign, "$g_ambient_sound_instance_no", 0),
  2362. (assign, "$g_rain_sound_channel", -1),
  2363. (assign, "$g_show_inventory_instance_id", 0),
  2364. (assign, "$g_last_inventory_unique_id", 0),
  2365. (assign, "$g_loop_animal_herd_to_move", 0),
  2366. (assign, "$g_loop_animal_herd_leader", -1),
  2367. (assign, "$g_loop_animal_herd_begin", 0),
  2368. (assign, "$g_time_last_herd_animal_disappeared", 0),
  2369. (assign, "$g_recent_nearby_deaths_factor", 0),
  2370. (assign, "$g_player_has_spawned_after_connecting", 0),
  2371. (faction_set_slot, "fac_1", slot_faction_banner_mesh, "mesh_banner_kingdom_f"),
  2372. (faction_set_slot, "fac_2", slot_faction_banner_mesh, "mesh_banner_kingdom_b"),
  2373. (faction_set_slot, "fac_3", slot_faction_banner_mesh, "mesh_banner_kingdom_a"),
  2374. (faction_set_slot, "fac_4", slot_faction_banner_mesh, "mesh_banner_kingdom_d"),
  2375. (faction_set_slot, "fac_5", slot_faction_banner_mesh, "mesh_banner_kingdom_e"),
  2376. (faction_set_slot, "fac_6", slot_faction_banner_mesh, "mesh_banner_kingdom_c"),
  2377. (faction_set_slot, "fac_7", slot_faction_banner_mesh, "mesh_banner_kingdom_g"),
  2378. (faction_set_slot, "fac_8", slot_faction_banner_mesh, "mesh_banner_a03"),
  2379. (faction_set_name, "fac_1", "str_fac_1_default_name"),
  2380. (faction_set_name, "fac_2", "str_fac_2_default_name"),
  2381. (faction_set_name, "fac_3", "str_fac_3_default_name"),
  2382. (faction_set_name, "fac_4", "str_fac_4_default_name"),
  2383. (faction_set_name, "fac_5", "str_fac_5_default_name"),
  2384. (faction_set_name, "fac_6", "str_fac_6_default_name"),
  2385. (faction_set_name, "fac_7", "str_fac_7_default_name"),
  2386. (faction_set_name, "fac_8", "str_fac_8_default_name"),
  2387. (store_sub, ":slot_relations_end", factions_end, factions_begin),
  2388. (val_add, ":slot_relations_end", slot_faction_relations_begin),
  2389. (try_for_range, ":faction_id", factions_begin, factions_end),
  2390. (faction_set_slot, ":faction_id", slot_faction_is_active, 0),
  2391. (faction_set_slot, ":faction_id", slot_faction_is_locked, 0),
  2392. (faction_set_slot, ":faction_id", slot_faction_name_is_custom, 0),
  2393. (faction_set_slot, ":faction_id", slot_faction_lord_player_uid, 0),
  2394. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, 0),
  2395. (faction_set_slot, ":faction_id", slot_faction_poll_end_time, 0),
  2396. (try_for_range, ":relations_slot", slot_faction_relations_begin, ":slot_relations_end"),
  2397. (faction_set_slot, ":faction_id", ":relations_slot", 0),
  2398. (try_end),
  2399. (try_end),
  2400. (faction_set_slot, factions_end, slot_faction_poll_end_time, 0),
  2401. (troop_set_slot, "trp_inactive_players_array", slot_player_array_size, 0),
  2402. (troop_set_slot, "trp_last_chat_message", slot_last_chat_message_event_type, 0),
  2403. (troop_set_slot, "trp_last_chat_message", slot_last_chat_message_not_recieved, 0),
  2404. (str_clear, s0),
  2405. (try_for_range, ":chat_overlay_troop_id", chat_overlay_ring_buffer_begin, chat_overlay_ring_buffer_end),
  2406. (troop_set_name, ":chat_overlay_troop_id", s0),
  2407. (troop_set_plural_name, ":chat_overlay_troop_id", s0),
  2408. (try_end),
  2409. (assign, "$g_chat_overlay_local_buffer_stored", chat_overlay_ring_buffer_begin),
  2410. (assign, "$g_chat_overlay_faction_buffer_stored", chat_overlay_ring_buffer_begin),
  2411. ]),
  2412.  
  2413. ("preset_message", # display a message built into the module, using a string id and parameters
  2414. [(store_script_param, "$g_preset_message_string_id", 1),
  2415. (store_script_param, ":flags", 2),
  2416. (store_script_param, "$g_preset_message_value_1", 3),
  2417. (store_script_param, "$g_preset_message_value_2", 4),
  2418.  
  2419. (assign, ":color", ":flags"), # unpack the color from the flags parameter
  2420. (val_and, ":color", preset_message_color_mask),
  2421. (try_begin),
  2422. (eq, ":color", preset_message_white),
  2423. (assign, "$g_preset_message_color", 0xFFFFFFFF),
  2424. (else_try),
  2425. (eq, ":color", preset_message_red),
  2426. (assign, "$g_preset_message_color", 0xFFFF4422),
  2427. (else_try),
  2428. (eq, ":color", preset_message_green),
  2429. (assign, "$g_preset_message_color", 0xFF33DD11),
  2430. (else_try),
  2431. (eq, ":color", preset_message_blue),
  2432. (assign, "$g_preset_message_color", 0xFFFF4422),
  2433. (else_try),
  2434. (eq, ":color", preset_message_yellow),
  2435. (assign, "$g_preset_message_color", 0xFFFFEE11),
  2436. (try_end),
  2437.  
  2438. (assign, "$g_preset_message_type", ":flags"), # unpack the type from the flags parameter
  2439. (val_and, "$g_preset_message_type", preset_message_type_mask),
  2440. (try_begin),
  2441. (eq, "$g_preset_message_type", preset_message_read_object),
  2442. (try_begin),
  2443. (gt, "$g_preset_message_value_1", 0),
  2444. (assign, "$g_presentation_read_object_button_string_id", "$g_preset_message_value_1"),
  2445. (else_try),
  2446. (assign, "$g_presentation_read_object_button_string_id", "str_done"),
  2447. (try_end),
  2448. (start_presentation, "prsnt_read_object"),
  2449. (else_try),
  2450. (assign, "$g_preset_message_params", ":flags"),
  2451. (val_and, "$g_preset_message_params", preset_message_params_mask),
  2452.  
  2453. # keep the same as in prsnt_preset_message_* - unfortunately scripts and presentations are not run in order
  2454. (try_begin),
  2455. (eq, "$g_preset_message_params", preset_message_item),
  2456. (is_between, "$g_preset_message_value_1", 1, all_items_end),
  2457. (str_store_item_name, s1, "$g_preset_message_value_1"),
  2458. (assign, reg1, "$g_preset_message_value_2"),
  2459. (else_try),
  2460. (eq, "$g_preset_message_params", preset_message_agent),
  2461. (agent_is_active, "$g_preset_message_value_1"),
  2462. (str_store_agent_name, s1, "$g_preset_message_value_1"),
  2463. (assign, reg1, "$g_preset_message_value_2"),
  2464. (else_try),
  2465. (eq, "$g_preset_message_params", preset_message_player),
  2466. (player_is_active, "$g_preset_message_value_1"),
  2467. (str_store_player_username, s1, "$g_preset_message_value_1"),
  2468. (assign, reg1, "$g_preset_message_value_2"),
  2469. (else_try),
  2470. (is_between, "$g_preset_message_params", preset_message_faction, preset_message_faction_castle + 1),
  2471. (is_between, "$g_preset_message_value_1", factions_begin, factions_end),
  2472. (str_store_faction_name, s1, "$g_preset_message_value_1"),
  2473. (faction_get_color, "$g_preset_message_color", "$g_preset_message_value_1"),
  2474. (eq, "$g_preset_message_params", preset_message_faction_castle),
  2475. (call_script, "script_str_store_castle_name", s2, "$g_preset_message_value_2"),
  2476. (else_try),
  2477. (assign, reg1, "$g_preset_message_value_1"),
  2478. (assign, reg2, "$g_preset_message_value_2"),
  2479. (try_end),
  2480. # end keep same
  2481.  
  2482. (assign, ":log", ":flags"), # check whether to save in the chat log
  2483. (val_and, ":log", preset_message_log),
  2484. (try_begin),
  2485. (eq, ":log", preset_message_log),
  2486. (display_message, "$g_preset_message_string_id", "$g_preset_message_color"),
  2487. (try_end),
  2488.  
  2489. (assign, ":fail_sound", ":flags"),
  2490. (val_and, ":fail_sound", preset_message_fail_sound),
  2491. (try_begin),
  2492. (eq, ":fail_sound", preset_message_fail_sound),
  2493. (play_sound, "snd_failure"),
  2494. (try_end),
  2495.  
  2496. (try_begin),
  2497. (eq, "$g_preset_message_display_enabled", 0),
  2498. (else_try),
  2499. (eq, "$g_preset_message_type", preset_message_small),
  2500. (start_presentation, "prsnt_preset_message_small"),
  2501. (else_try),
  2502. (eq, "$g_preset_message_type", preset_message_big),
  2503. (start_presentation, "prsnt_preset_message_big"),
  2504. (try_end),
  2505. (try_end),
  2506. ]),
  2507.  
  2508. ("chat_event_increment", # store the next chat event number in reg0, wrapping around from the end back to the start
  2509. [(store_script_param, reg0, 1),
  2510.  
  2511. (val_and, reg0, net_chat_event_mask),
  2512. (try_begin),
  2513. (this_or_next|ge, reg0, client_event_chat_message_end - 1),
  2514. (lt, reg0, client_event_chat_message_begin),
  2515. (assign, reg0, client_event_chat_message_begin),
  2516. (else_try),
  2517. (val_add, reg0, 1),
  2518. (try_end),
  2519. ]),
  2520.  
  2521. ("cf_chat_event_is_new", # check whether a chat event is probably new or old, depending on the event number
  2522. [(store_script_param, ":event", 1),
  2523. (store_script_param, ":player_id", 2),
  2524.  
  2525. (val_and, ":event", net_chat_event_mask),
  2526. (player_get_slot, ":next_event", ":player_id", slot_player_next_chat_event_type),
  2527. (val_and, ":next_event", net_chat_event_mask),
  2528. (try_begin),
  2529. (eq, ":event", ":next_event"),
  2530. (assign, ":continue", 1),
  2531. (assign, ":type_valid", 1),
  2532. (else_try),
  2533. (assign, ":type_valid", 0),
  2534. (store_sub, ":event_difference", ":event", ":next_event"),
  2535. (try_begin),
  2536. (lt, ":event_difference", 0),
  2537. (val_add, ":event_difference", client_event_chat_message_end - client_event_chat_message_begin),
  2538. (try_end),
  2539. (lt, ":event_difference", (client_event_chat_message_end - client_event_chat_message_begin) / 2),
  2540. (assign, ":continue", 1),
  2541. (else_try),
  2542. (assign, ":continue", 0),
  2543. (try_end),
  2544. (assign, reg0, ":type_valid"),
  2545. (eq, ":continue", 1),
  2546. ]),
  2547.  
  2548. ("chat_overlay_add_to_local_buffer", # add messages to the buffer for the overlay for local and faction chat
  2549. [(store_script_param, ":color", 1), # the color of the message
  2550.  
  2551. (val_add, "$g_chat_overlay_local_buffer_stored", 1),
  2552. (try_begin),
  2553. (neg|is_between, "$g_chat_overlay_local_buffer_stored", chat_overlay_ring_buffer_begin, chat_overlay_ring_buffer_end),
  2554. (assign, "$g_chat_overlay_local_buffer_stored", chat_overlay_ring_buffer_begin),
  2555. (try_end),
  2556. (troop_set_name, "$g_chat_overlay_local_buffer_stored", s0),
  2557. (troop_set_slot, "$g_chat_overlay_local_buffer_stored", slot_chat_overlay_local_color, ":color"),
  2558. ]),
  2559.  
  2560. ("cf_no_input_presentation_active", # check that no presentation is active that should be grabbing keyboard or mouse input
  2561. [
  2562. (neg|is_presentation_active, "prsnt_chat_box"),
  2563. (neg|is_presentation_active, "prsnt_show_inventory"),
  2564. (neg|is_presentation_active, "prsnt_money_bag"),
  2565. (neg|is_presentation_active, "prsnt_tabbed_stats_chart"),
  2566. (neg|is_presentation_active, "prsnt_escape_menu"),
  2567. (neg|is_presentation_active, "prsnt_action_menu"),
  2568. (neg|is_presentation_active, "prsnt_animation_menu"),
  2569. (neg|is_presentation_active, "prsnt_animation_menu_no_mouse_grab"),
  2570. (neg|is_presentation_active, "prsnt_poll_menu"),
  2571. (neg|is_presentation_active, "prsnt_list_players"),
  2572. (neg|is_presentation_active, "prsnt_list_scenes"),
  2573. (neg|is_presentation_active, "prsnt_list_factions"),
  2574. (neg|is_presentation_active, "prsnt_faction_banner_selection"),
  2575. (neg|is_presentation_active, "prsnt_admin_menu"),
  2576. (neg|is_presentation_active, "prsnt_faction_admin_menu"),
  2577. (neg|is_presentation_active, "prsnt_game_multiplayer_admin_panel"),
  2578. (neg|is_presentation_active, "prsnt_game_rules"),
  2579. (neg|is_presentation_active, "prsnt_admin_item_select"),
  2580. ]),
  2581.  
  2582. ("initialize_banner_info", # store background colors for all the banners in an array
  2583. [
  2584. (troop_set_slot, "trp_banner_background_color_array", 0, 0xFFAAAA99), # plain white for scene props and item icons
  2585. (troop_set_slot, "trp_banner_background_color_array", 1, 0xFF554433), # brown for commoners and outlaws
  2586. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a01", 0xFF8f4531),
  2587. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a02", 0xFFd9d7d1),
  2588. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a03", 0xFF373736),
  2589. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a04", 0xFFa48b28),
  2590. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a05", 0xFF497735),
  2591. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a06", 0xFF82362d),
  2592. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a07", 0xFF793329),
  2593. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a08", 0xFF262521),
  2594. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a09", 0xFFd9dad1),
  2595. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a10", 0xFF524563),
  2596. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a11", 0xFF91312c),
  2597. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a12", 0xFFafa231),
  2598. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a13", 0xFF706d3c),
  2599. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a14", 0xFFd6d3ce),
  2600. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a15", 0xFFd6d3ce),
  2601. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a16", 0xFF394584),
  2602. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a17", 0xFF42662e),
  2603. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a18", 0xFFdfded6),
  2604. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a19", 0xFF292724),
  2605. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a20", 0xFF58611b),
  2606. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a21", 0xFF313a67),
  2607. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b01", 0xFF9c924a),
  2608. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b02", 0xFF998b39),
  2609. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b03", 0xFF365168),
  2610. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b04", 0xFFd6d3ce),
  2611. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b05", 0xFF94a642),
  2612. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b06", 0xFF944131),
  2613. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b07", 0xFF893b34),
  2614. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b08", 0xFF425510),
  2615. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b09", 0xFF94452e),
  2616. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b10", 0xFF475a94),
  2617. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b11", 0xFFd1b231),
  2618. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b12", 0xFFe1e2df),
  2619. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b13", 0xFF997c1e),
  2620. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b14", 0xFFc6b74d),
  2621. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b15", 0xFFad9a18),
  2622. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b16", 0xFF212421),
  2623. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b17", 0xFF8c2021),
  2624. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b18", 0xFF4d7136),
  2625. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b19", 0xFF395d84),
  2626. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b20", 0xFF527539),
  2627. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b21", 0xFF9c3c39),
  2628. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c01", 0xFF42518c),
  2629. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c02", 0xFFa46a2c),
  2630. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c03", 0xFF9f5141),
  2631. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c04", 0xFF2c6189),
  2632. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c05", 0xFF556421),
  2633. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c06", 0xFF9d621e),
  2634. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c07", 0xFFdeded6),
  2635. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c08", 0xFF6e4891),
  2636. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c09", 0xFF313031),
  2637. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c10", 0xFFdedfd9),
  2638. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c11", 0xFF865a29),
  2639. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c12", 0xFF8c3821),
  2640. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c13", 0xFF524273),
  2641. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c14", 0xFFd1cec6),
  2642. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c15", 0xFF604283),
  2643. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c16", 0xFF395584),
  2644. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c17", 0xFF6b4139),
  2645. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c18", 0xFF47620d),
  2646. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c19", 0xFFd6d7d6),
  2647. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c20", 0xFF2e2f2c),
  2648. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c21", 0xFF313031),
  2649. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d01", 0xFF7e3f2e),
  2650. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d02", 0xFF343434),
  2651. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d03", 0xFF3c496b),
  2652. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d04", 0xFFd9d8d1),
  2653. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d05", 0xFF99823c),
  2654. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d06", 0xFF9f822e),
  2655. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d07", 0xFF393839),
  2656. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d08", 0xFFa54931),
  2657. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d09", 0xFFdfdcd6),
  2658. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d10", 0xFF9f4a36),
  2659. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d11", 0xFF8c7521),
  2660. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d12", 0xFF9f4631),
  2661. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d13", 0xFF793324),
  2662. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d14", 0xFF395076),
  2663. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d15", 0xFF2c2b2c),
  2664. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d16", 0xFF657121),
  2665. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d17", 0xFF7e3121),
  2666. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d18", 0xFF76512e),
  2667. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d19", 0xFFe7e3de),
  2668. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d20", 0xFF947921),
  2669. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d21", 0xFF4d7b7c),
  2670. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e01", 0xFF343331),
  2671. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e02", 0xFFa74d36),
  2672. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e03", 0xFFe7e3de),
  2673. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e04", 0xFFd6d8ce),
  2674. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e05", 0xFF3e4d67),
  2675. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e06", 0xFF9f842e),
  2676. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e07", 0xFF4d6994),
  2677. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e08", 0xFF4a6118),
  2678. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e09", 0xFF943c29),
  2679. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e10", 0xFF394479),
  2680. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e11", 0xFF343331),
  2681. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e12", 0xFF3f4d5d),
  2682. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e13", 0xFF4a6489),
  2683. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e14", 0xFF313031),
  2684. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e15", 0xFFd6d7ce),
  2685. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e16", 0xFFc69e00),
  2686. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e17", 0xFF638e52),
  2687. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e18", 0xFFdcdbd3),
  2688. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e19", 0xFFdbdcd3),
  2689. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e20", 0xFF843831),
  2690. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e21", 0xFF8c3421),
  2691. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f01", 0xFF8f4631),
  2692. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f02", 0xFF672a29),
  2693. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f03", 0xFF4f6d86),
  2694. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f04", 0xFF978021),
  2695. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f05", 0xFF5d6c29),
  2696. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f06", 0xFFa55d4a),
  2697. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f07", 0xFF315184),
  2698. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f08", 0xFF3f4e9d),
  2699. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f09", 0xFF525918),
  2700. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f10", 0xFF52496b),
  2701. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f11", 0xFF00928c),
  2702. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f12", 0xFF4a699c),
  2703. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f13", 0xFF76713f),
  2704. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f14", 0xFF8f2e2c),
  2705. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f15", 0xFF60492e),
  2706. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f16", 0xFF735531),
  2707. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f17", 0xFF315d84),
  2708. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f18", 0xFF393c39),
  2709. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f19", 0xFF42824a),
  2710. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f20", 0xFF733829),
  2711. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f21", 0xFF9c5542),
  2712. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g01", 0xFFc39d31),
  2713. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g02", 0xFFcbb670),
  2714. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g03", 0xFF394a18),
  2715. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g04", 0xFF372708),
  2716. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g05", 0xFF9a6810),
  2717. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g06", 0xFFb27910),
  2718. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g07", 0xFF8c8621),
  2719. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g08", 0xFF975a03),
  2720. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g09", 0xFF2c2924),
  2721. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g10", 0xFFaa962c),
  2722. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g11", 0xFFa2822e),
  2723. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g12", 0xFF7b8a8c),
  2724. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g13", 0xFF3c0908),
  2725. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g14", 0xFF24092c),
  2726. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g15", 0xFF671e14),
  2727. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g16", 0xFF103042),
  2728. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g17", 0xFF4a4500),
  2729. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g18", 0xFF703324),
  2730. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g19", 0xFF24293c),
  2731. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g20", 0xFF5d6966),
  2732. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g21", 0xFF521c08),
  2733. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h01", 0xFFbdae39),
  2734. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h02", 0xFF5d689f),
  2735. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h03", 0xFF526518),
  2736. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h04", 0xFFbabbb2),
  2737. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h05", 0xFFdedede),
  2738. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h06", 0xFF38383a),
  2739. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h07", 0xFF3a4273),
  2740. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h08", 0xFF272727),
  2741. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h09", 0xFFd82929),
  2742. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h10", 0xFF313031),
  2743. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h11", 0xFF9e3e35),
  2744. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h12", 0xFF831119),
  2745. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h13", 0xFF458fd6),
  2746. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h14", 0xFFffffff),
  2747. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h15", 0xFF586617),
  2748. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h16", 0xFFbe3630),
  2749. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h17", 0xFFbdbaad),
  2750. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h18", 0xFF293052),
  2751. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h19", 0xFF908b0b),
  2752. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h20", 0xFF2d2d2d),
  2753. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h21", 0xFF272727),
  2754. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i01", 0xFF840008),
  2755. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i02", 0xFFb0880d),
  2756. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i03", 0xFFb5ae94),
  2757. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i04", 0xFFfcdc1b),
  2758. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i05", 0xFF948908),
  2759. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i06", 0xFF630408),
  2760. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i07", 0xFF9f9300),
  2761. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i08", 0xFFbaa773),
  2762. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i09", 0xFFbdbeb5),
  2763. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i10", 0xFF9c9a94),
  2764. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i11", 0xFFd3ceaa),
  2765. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i12", 0xFF393e57),
  2766. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i13", 0xFF570a0a),
  2767. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i14", 0xFF303030),
  2768. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i15", 0xFF730908),
  2769. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i16", 0xFF2d690e),
  2770. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i17", 0xFF892418),
  2771. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i18", 0xFF292f4f),
  2772. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i19", 0xFF0a1458),
  2773. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i20", 0xFFd2c297),
  2774. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i21", 0xFF2a2a2a),
  2775. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j01", 0xFF737373),
  2776. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j02", 0xFF772020),
  2777. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j03", 0xFF812528),
  2778. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j04", 0xFF7b1f10),
  2779. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j05", 0xFF41250e),
  2780. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j06", 0xFF981817),
  2781. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j07", 0xFF841f14),
  2782. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j08", 0xFF2b3234),
  2783. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j09", 0xFF591d1d),
  2784. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j10", 0xFF622419),
  2785. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j11", 0xFF950404),
  2786. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j12", 0xFF950404),
  2787. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j13", 0xFFd7d8cb),
  2788. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j14", 0xFF7e6d1d),
  2789. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j15", 0xFF932c1d),
  2790. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j16", 0xFF4e1d15),
  2791. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j17", 0xFF9fa28f),
  2792. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j18", 0xFF1762ac),
  2793. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j19", 0xFF2d462f),
  2794. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j20", 0xFF183f21),
  2795. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j21", 0xFF730000),
  2796. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k01", 0xFF2539ad),
  2797. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k02", 0xFF6b0000),
  2798. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k03", 0xFF252525),
  2799. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k04", 0xFF2b3153),
  2800. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k05", 0xFF7b1212),
  2801. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k06", 0xFFbabbb2),
  2802. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k07", 0xFF6b140b),
  2803. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k08", 0xFFecebe9),
  2804. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k09", 0xFF2b4e7f),
  2805. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k10", 0xFF626157),
  2806. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k11", 0xFF201f1c),
  2807. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k12", 0xFF5b241b),
  2808. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k13", 0xFFa11111),
  2809. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k14", 0xFFb67c0e),
  2810. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k15", 0xFF836e1c),
  2811. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k16", 0xFF2b3962),
  2812. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k17", 0xFFbabbb2),
  2813. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k18", 0xFF3d0101),
  2814. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k19", 0xFF47908c),
  2815. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k20", 0xFF3f7084),
  2816. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k21", 0xFF989c90),
  2817. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l01", 0xFF5a1901),
  2818. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l02", 0xFF3f495d),
  2819. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l03", 0xFFa56118),
  2820. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l04", 0xFF10283c),
  2821. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l05", 0xFF434238),
  2822. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l06", 0xFF0d3717),
  2823. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l07", 0xFF263944),
  2824. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l08", 0xFF3d1b50),
  2825. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l09", 0xFF8b171a),
  2826. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l10", 0xFF2f154d),
  2827. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l11", 0xFF001943),
  2828. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l12", 0xFFc9cac6),
  2829. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l13", 0xFFe9cd12),
  2830. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l14", 0xFFa02d35),
  2831. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l15", 0xFFb0b0a7),
  2832. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l16", 0xFF6b0809),
  2833. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l17", 0xFF2d5b01),
  2834. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l18", 0xFF861102),
  2835. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l19", 0xFFaa3811),
  2836. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l20", 0xFF3e1b50),
  2837. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l21", 0xFF2c4151),
  2838. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m01", 0xFF00006d),
  2839. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m02", 0xFF680605),
  2840. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m03", 0xFFcfc3a7),
  2841. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m04", 0xFFed8720),
  2842. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m05", 0xFF946f22),
  2843. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m06", 0xFF003278),
  2844. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m07", 0xFFbabbb2),
  2845. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m08", 0xFF313031),
  2846. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m09", 0xFF762221),
  2847. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m10", 0xFF555555),
  2848. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m11", 0xFF004388),
  2849. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m12", 0xFF313031),
  2850. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m13", 0xFFbabbb2),
  2851. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_a", 0xFF316184),
  2852. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_b", 0xFFd6d3bd),
  2853. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_c", 0xFF633039),
  2854. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_d", 0xFF3f6c2e),
  2855. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_e", 0xFFc6a64a),
  2856. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_f", 0xFF5a2421),
  2857. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_g", 0xFF86411e),
  2858. (troop_set_slot, "trp_banner_background_color_array", "mesh_banners_default_a", 0xFF242424),
  2859. ]),
  2860.  
  2861. ("item_set_banner", # called from triggers of heraldic items and scene props
  2862. [(store_script_param, ":tableau_id", 1), # in module_tableau_materials
  2863. (store_script_param, ":agent_id", 2),
  2864. #(store_script_param, ":troop_id", 3), # used in Native, but unused in this mod
  2865.  
  2866. (try_begin),
  2867. (agent_is_active, ":agent_id"),
  2868. (agent_get_player_id, ":player_id", ":agent_id"),
  2869. (player_is_active, ":player_id"),
  2870. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  2871. (try_begin),
  2872. (ge, ":player_faction_id", castle_factions_begin),
  2873. (faction_get_slot, ":banner_mesh", ":player_faction_id", slot_faction_banner_mesh),
  2874. (gt, ":banner_mesh", 0),
  2875. (else_try), # banner mesh 1 is for a plain brown background
  2876. (assign, ":banner_mesh", 1),
  2877. (try_end),
  2878. (else_try), # banner mesh 0 is for a plain white background
  2879. (assign, ":banner_mesh", 0),
  2880. (try_end),
  2881. (cur_item_set_tableau_material, ":tableau_id", ":banner_mesh"),
  2882. ]),
  2883.  
  2884. ("cf_add_item_to_troop_equipment_slots", # store a troop default item in slots for easy selection by the random equipment scripts
  2885. [(store_script_param, ":troop_id", 1),
  2886. (store_script_param, ":item_id", 2),
  2887.  
  2888. (item_get_type, ":item_type", ":item_id"),
  2889. (try_begin),
  2890. (eq, ":item_type", itp_type_one_handed_wpn),
  2891. (assign, ":equipment_slot_begin", slot_troop_equipment_one_hand_begin),
  2892. (else_try),
  2893. (is_between, ":item_type", itp_type_two_handed_wpn, itp_type_polearm + 1),
  2894. (assign, ":equipment_slot_begin", slot_troop_equipment_two_hand_begin),
  2895. (else_try),
  2896. (is_between, ":item_type", itp_type_bow, itp_type_thrown + 1),
  2897. (assign, ":equipment_slot_begin", slot_troop_equipment_ranged_begin),
  2898. (else_try),
  2899. (is_between, ":item_type", itp_type_arrows, itp_type_bolts + 1),
  2900. (assign, ":equipment_slot_begin", slot_troop_equipment_ammo_begin),
  2901. (else_try),
  2902. (eq, ":item_type", itp_type_shield),
  2903. (assign, ":equipment_slot_begin", slot_troop_equipment_shield_begin),
  2904. (else_try),
  2905. (eq, ":item_type", itp_type_head_armor),
  2906. (assign, ":equipment_slot_begin", slot_troop_equipment_head_begin),
  2907. (else_try),
  2908. (eq, ":item_type", itp_type_body_armor),
  2909. (assign, ":equipment_slot_begin", slot_troop_equipment_body_begin),
  2910. (else_try),
  2911. (eq, ":item_type", itp_type_foot_armor),
  2912. (assign, ":equipment_slot_begin", slot_troop_equipment_foot_begin),
  2913. (else_try),
  2914. (eq, ":item_type", itp_type_hand_armor),
  2915. (assign, ":equipment_slot_begin", slot_troop_equipment_hand_begin),
  2916. (else_try),
  2917. (eq, ":item_type", itp_type_horse),
  2918. (assign, ":equipment_slot_begin", slot_troop_equipment_horse_begin),
  2919. (else_try),
  2920. (assign, ":equipment_slot_begin", -1),
  2921. (try_end),
  2922. (neq, ":equipment_slot_begin", -1),
  2923.  
  2924. (troop_get_slot, ":equipment_slot_count", ":troop_id", ":equipment_slot_begin"),
  2925. (lt, ":equipment_slot_count", troop_slot_count_per_equipment_type - 1),
  2926. (val_add, ":equipment_slot_count", 1),
  2927. (troop_set_slot, ":troop_id", ":equipment_slot_begin", ":equipment_slot_count"),
  2928. (val_add, ":equipment_slot_begin", ":equipment_slot_count"),
  2929. (troop_set_slot, ":troop_id", ":equipment_slot_begin", ":item_id"),
  2930. ]),
  2931.  
  2932. ("initialize_troop_equipment_slots", # set troop default item slots from the hard coded inventory, for use with random equipment scripts
  2933. [
  2934. (try_begin),
  2935. (multiplayer_is_server),
  2936. (try_for_range, ":troop_id", playable_troops_begin, playable_troops_end),
  2937. (troop_get_inventory_capacity, ":capacity", ":troop_id"),
  2938. (try_for_range, ":inv_slot", 0, ":capacity"),
  2939. (troop_get_inventory_slot, ":item_id", ":troop_id", ":inv_slot"),
  2940. (gt, ":item_id", 0),
  2941. (call_script, "script_cf_add_item_to_troop_equipment_slots", ":troop_id", ":item_id"),
  2942. (try_end),
  2943. (try_end),
  2944. (try_end),
  2945. ]),
  2946.  
  2947. ("cf_troop_get_random_equipment", # store in reg0 a random item of a certain type from the troop's default equipment
  2948. [(store_script_param, ":troop_id", 1),
  2949. (store_script_param, ":slot_begin", 2), # the type of item: slot_troop_equipment_*
  2950.  
  2951. (troop_get_slot, ":item_count", ":troop_id", ":slot_begin"),
  2952. (gt, ":item_count", 0),
  2953. (val_add, ":slot_begin", 1),
  2954. (store_add, ":slot_end", ":slot_begin", ":item_count"),
  2955. (store_random_in_range, ":random_slot", ":slot_begin", ":slot_end"),
  2956. (troop_get_slot, reg0, ":troop_id", ":random_slot"),
  2957. ]),
  2958.  
  2959. ("cf_player_add_default_troop_item", # server: check if the player has any existing item saved in a module slot, using a random default item if not
  2960. [(store_script_param, ":player_id", 1), # must be valid
  2961. (store_script_param, ":player_slot", 2), # slot_player_equip_*
  2962. (store_script_param, ":troop_id", 3),
  2963. (store_script_param, ":troop_slot", 4), # the type of item: slot_troop_equipment_*
  2964.  
  2965. (player_get_slot, ":existing_item_id", ":player_id", ":player_slot"),
  2966. (lt, ":existing_item_id", all_items_begin),
  2967. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", ":troop_slot"),
  2968. (val_mul, reg0, -1),
  2969. (player_set_slot, ":player_id", ":player_slot", reg0),
  2970. ]),
  2971.  
  2972. ("player_add_default_troop_items", # server: fill player weapon slots with default items, if there are none equipped already
  2973. [(store_script_param, ":player_id", 1), # must be valid
  2974. (store_script_param, ":troop_id", 2),
  2975.  
  2976. (assign, ":free_slots", 0), # find the first free slot
  2977. (assign, ":free_slots_begin", slot_player_equip_end),
  2978. (try_for_range, ":player_slot", slot_player_equip_item_0, slot_player_equip_head),
  2979. (player_get_slot, ":existing_item_id", ":player_id", ":player_slot"),
  2980. (lt, ":existing_item_id", all_items_begin),
  2981. (val_min, ":free_slots_begin", ":player_slot"),
  2982. (val_add, ":free_slots", 1),
  2983. (try_end),
  2984. (assign, ":ranged_count", 0),
  2985. (try_begin), # try add ranged weapons if in the troop defaults
  2986. (ge, ":free_slots", 2), # only if there are at least 2 free slots, for weapon and ammo
  2987. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_ranged_begin),
  2988. (assign, ":ranged_item_id", reg0),
  2989. (item_get_type, ":ranged_item_type", ":ranged_item_id"),
  2990. (try_begin), # thrown needs no ammo
  2991. (eq, ":ranged_item_type", itp_type_thrown),
  2992. (assign, ":ranged_count", 1),
  2993. (else_try), # otherwise check for the correct ammo
  2994. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_ammo_begin),
  2995. (assign, ":ammo_item_id", reg0),
  2996. (val_sub, ":ranged_item_type", itp_type_bow - itp_type_arrows),
  2997. (assign, ":ammo_slot_end", slot_troop_equipment_ammo_begin + troop_slot_count_per_equipment_type + 1),
  2998. (try_for_range, ":ammo_slot", slot_troop_equipment_ammo_begin + 1, ":ammo_slot_end"), # check over all ammo slots for the correct type
  2999. (item_get_type, ":ammo_item_type", ":ammo_item_id"),
  3000. (eq, ":ammo_item_type", ":ranged_item_type"),
  3001. (assign, ":ammo_slot_end", -1), # exit loop if found
  3002. (assign, ":ranged_count", 2),
  3003. (else_try),
  3004. (troop_get_slot, ":ammo_item_id", ":troop_id", ":ammo_slot"), # otherwise check the next slot
  3005. (try_end),
  3006. (try_end),
  3007. (try_end),
  3008. (store_sub, ":free_melee_slots", ":free_slots", ":ranged_count"),
  3009. (assign, ":one_hand_added", 0),
  3010. (assign, ":shield_added", 0),
  3011. (assign, ":two_hand_added", 0),
  3012. (assign, ":two_hand_item_id", 0),
  3013. (assign, ":ranged_added", 0),
  3014. (assign, ":ammo_added", 0),
  3015. (try_for_range, ":slot_counter", 0, ":free_slots"), # loop over the remaining free slots, adding different types of default weapons if possible
  3016. (try_begin),
  3017. (lt, ":slot_counter", ":free_melee_slots"),
  3018. (eq, ":one_hand_added", 0),
  3019. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_one_hand_begin),
  3020. (val_add, ":one_hand_added", 1),
  3021. (else_try),
  3022. (lt, ":slot_counter", ":free_melee_slots"),
  3023. (eq, ":shield_added", 0),
  3024. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_shield_begin),
  3025. (val_add, ":shield_added", 1),
  3026. (else_try),
  3027. (lt, ":slot_counter", ":free_melee_slots"),
  3028. (le, ":two_hand_added", 1),
  3029. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_two_hand_begin),
  3030. (neq, reg0, ":two_hand_item_id"),
  3031. (val_add, ":two_hand_added", 1),
  3032. (assign, ":two_hand_item_id", reg0),
  3033. (else_try),
  3034. (ge, ":ranged_count", 1),
  3035. (eq, ":ranged_added", 0),
  3036. (assign, reg0, ":ranged_item_id"),
  3037. (val_add, ":ranged_added", 1),
  3038. (else_try),
  3039. (ge, ":ranged_count", 2),
  3040. (eq, ":ammo_added", 0),
  3041. (assign, reg0, ":ammo_item_id"),
  3042. (val_add, ":ammo_added", 1),
  3043. (else_try),
  3044. (assign, ":free_slots", -1),
  3045. (try_end),
  3046. (gt, ":free_slots", -1),
  3047. (val_mul, reg0, -1), # multiply the item id by -1 to identify it as a default item, just for the module player slots, so it can be overwritten by new default items when changing troop
  3048. (player_set_slot, ":player_id", ":free_slots_begin", reg0),
  3049. (val_add, ":free_slots_begin", 1),
  3050. (assign, ":free_slots_end", slot_player_equip_head), # find the number of the next free slot
  3051. (try_for_range, ":next_free_slot", ":free_slots_begin", ":free_slots_end"),
  3052. (player_get_slot, ":existing_item_id", ":player_id", ":next_free_slot"),
  3053. (lt, ":existing_item_id", all_items_begin),
  3054. (assign, ":free_slots_begin", ":next_free_slot"),
  3055. (assign, ":free_slots_end", -1),
  3056. (try_end),
  3057. (try_begin),
  3058. (neq, ":free_slots_end", -1), # if no more free slots found, end the loop
  3059. (assign, ":free_slots", -1),
  3060. (try_end),
  3061. (try_end),
  3062. (try_begin),
  3063. (call_script, "script_cf_player_add_default_troop_item", ":player_id", slot_player_equip_horse, ":troop_id", slot_troop_equipment_horse_begin),
  3064. (try_end),
  3065. ]),
  3066.  
  3067. ("player_add_default_troop_armor", # server: fill player armor slots with default items, if there are none equipped already
  3068. [(store_script_param, ":player_id", 1), # must be valid
  3069. (store_script_param, ":troop_id", 2),
  3070.  
  3071. (assign, ":troop_slot", slot_troop_equipment_head_begin),
  3072. (try_for_range, ":player_slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  3073. (try_begin),
  3074. (call_script, "script_cf_player_add_default_troop_item", ":player_id", ":player_slot", ":troop_id", ":troop_slot"),
  3075. (try_end),
  3076. (val_add, ":troop_slot", troop_slot_count_per_equipment_type), # jump to the beginning troop equipment slot for the next type
  3077. (try_end),
  3078. ]),
  3079.  
  3080. ("set_random_spawn_position", # set a spawn position at ground level within the specified range of pos1; overwrites pos10
  3081. [(store_script_param, ":range", 1),
  3082.  
  3083. (store_mul, ":negative_range", ":range", -1),
  3084. (init_position, pos10),
  3085. (position_copy_origin, pos10, pos1),
  3086. (store_random_in_range, ":offset", ":negative_range", ":range"),
  3087. (position_move_x, pos10, ":offset"),
  3088. (store_random_in_range, ":offset", ":negative_range", ":range"),
  3089. (position_move_y, pos10, ":offset"),
  3090. (store_random_in_range, ":offset", 0, 360),
  3091. (position_rotate_z, pos10, ":offset"),
  3092. (position_set_z_to_ground_level, pos10),
  3093. (set_spawn_position, pos10),
  3094. ]),
  3095.  
  3096. ("player_add_equipped_items", # server: when respawning and possibly changing troop, calculate the combination of usable previously equipped items and new default items
  3097. [(store_script_param, ":player_id", 1), # must be valid
  3098. (store_script_param, ":troop_id", 2),
  3099.  
  3100. (player_get_agent_id, ":agent_id", ":player_id"),
  3101. (try_begin),
  3102. (agent_is_active, ":agent_id"),
  3103. (agent_is_alive, ":agent_id"), # only add previously equipped items if the agent is alive
  3104. (agent_get_position, pos1, ":agent_id"),
  3105. (assign, ":has_bow", 0),
  3106. (assign, ":has_crossbow", 0),
  3107. (assign, ":check_ammo", 0),
  3108. (assign, ":player_slot", slot_player_equip_item_0),
  3109. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  3110. (assign, ":store_item_id", 0),
  3111. (assign, ":store_item_ammo", 0),
  3112. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3113. (try_begin),
  3114. (ge, ":item_id", all_items_begin),
  3115. (item_get_type, ":item_type", ":item_id"),
  3116. (try_begin),
  3117. (neq, ":item_type", itp_type_arrows),
  3118. (neq, ":item_type", itp_type_bolts),
  3119. (neq, ":item_type", itp_type_thrown),
  3120. (assign, ":max_ammo", 0),
  3121. (assign, ":ammo", 0),
  3122. (else_try),
  3123. (item_get_slot, ":max_ammo", ":item_id", slot_item_max_ammo),
  3124. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  3125. (neq, ":item_type", itp_type_thrown),
  3126. (assign, ":check_ammo", 1),
  3127. (try_end),
  3128. (try_begin),
  3129. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  3130. (try_begin),
  3131. (eq, ":max_ammo", 0),
  3132. (assign, ":store_item_id", ":item_id"),
  3133. (else_try),
  3134. (gt, ":ammo", 0),
  3135. (assign, ":store_item_id", ":item_id"),
  3136. (assign, ":store_item_ammo", ":ammo"),
  3137. (try_end),
  3138. (try_begin),
  3139. (eq, ":item_type", itp_type_bow),
  3140. (assign, ":has_bow", 1),
  3141. (else_try),
  3142. (eq, ":item_type", itp_type_crossbow),
  3143. (assign, ":has_crossbow", 1),
  3144. (try_end),
  3145. (else_try),
  3146. (ge, ":ammo", ":max_ammo"),
  3147. (call_script, "script_set_random_spawn_position", 50),
  3148. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  3149. (call_script, "script_check_on_item_dropped", ":agent_id", ":item_id", reg0, 0),
  3150. (try_end),
  3151. (try_end),
  3152. (player_set_slot, ":player_id", ":player_slot", ":store_item_id"),
  3153. (store_add, ":ammo_slot", ":equip_slot", slot_player_equip_item_0_ammo),
  3154. (player_set_slot, ":player_id", ":ammo_slot", ":store_item_ammo"),
  3155. (val_add, ":player_slot", 1),
  3156. (try_end),
  3157. (try_begin),
  3158. (eq, ":check_ammo", 1),
  3159. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  3160. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3161. (ge, ":item_id", all_items_begin),
  3162. (assign, ":keep", 1),
  3163. (item_get_type, ":item_type", ":item_id"),
  3164. (try_begin),
  3165. (eq, ":item_type", itp_type_arrows),
  3166. (assign, ":keep", ":has_bow"),
  3167. (else_try),
  3168. (eq, ":item_type", itp_type_bolts),
  3169. (assign, ":keep", ":has_crossbow"),
  3170. (try_end),
  3171. (eq, ":keep", 0),
  3172. (store_add, ":player_slot", ":equip_slot", slot_player_equip_item_0),
  3173. (player_set_slot, ":player_id", ":player_slot", 0),
  3174. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  3175. (item_slot_eq, ":item_id", slot_item_max_ammo, ":ammo"),
  3176. (call_script, "script_set_random_spawn_position", 50),
  3177. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  3178. (call_script, "script_check_on_item_dropped", ":agent_id", ":item_id", reg0, 0),
  3179. (try_end),
  3180. (try_end),
  3181. (try_begin),
  3182. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  3183. (gt, ":horse_agent_id", -1),
  3184. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  3185. (store_agent_hit_points, ":hit_points", ":horse_agent_id", 1),
  3186. (init_position, pos2),
  3187. (position_move_x, pos2, 50),
  3188. (position_transform_position_to_parent, pos3, pos1, pos2),
  3189. (position_set_z_to_ground_level, pos3),
  3190. (set_spawn_position, pos3),
  3191. (spawn_horse, ":horse_item_id"),
  3192. (agent_set_hit_points, reg0, ":hit_points", 1),
  3193. (try_end),
  3194. (assign, ":player_slot", slot_player_equip_head),
  3195. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  3196. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3197. (try_begin),
  3198. (ge, ":item_id", all_items_begin),
  3199. (try_begin),
  3200. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  3201. (else_try),
  3202. (player_set_slot, ":player_id", ":player_slot", 0),
  3203. (try_end),
  3204. (try_end),
  3205. (val_add, ":player_slot", 1),
  3206. (try_end),
  3207. (try_end),
  3208. (call_script, "script_player_add_default_troop_items", ":player_id", ":troop_id"),
  3209. (call_script, "script_player_add_default_troop_armor", ":player_id", ":troop_id"),
  3210. ]),
  3211.  
  3212. ("player_add_spawn_items", # server: add the previously calculated and stored equipment to the engine's list of items to spawn with
  3213. [(store_script_param, ":player_id", 1), # must be valid
  3214. (store_script_param, ":add_weapons", 2), # 0 = armor and shields only, 1 = weapons also
  3215.  
  3216. (assign, ":player_slot", slot_player_equip_item_0),
  3217. (try_for_range, ":equip_slot", ek_item_0, ek_horse + 1),
  3218. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3219. (val_abs, ":item_id"),
  3220. (try_begin),
  3221. (ge, ":item_id", all_items_begin),
  3222. (item_get_type, ":item_type", ":item_id"),
  3223. (this_or_next|eq, ":add_weapons", 1),
  3224. (this_or_next|is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  3225. (eq, ":item_type", itp_type_shield),
  3226. (player_add_spawn_item, ":player_id", ":equip_slot", ":item_id"),
  3227. (try_end),
  3228. (val_add, ":player_slot", 1),
  3229. (try_end),
  3230. ]),
  3231.  
  3232. ("player_equip_stored_default_items", # server: after spawning, equip weapons saved in equipment slots
  3233. [(store_script_param, ":player_id", 1), # must be valid
  3234.  
  3235. (player_get_agent_id, ":agent_id", ":player_id"),
  3236. (try_for_range, ":player_slot", slot_player_equip_item_0, slot_player_equip_item_3 + 1),
  3237. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3238. (lt, ":item_id", 0),
  3239. (val_abs, ":item_id"),
  3240. (item_get_type, ":item_type", ":item_id"),
  3241. (neq, ":item_type", itp_type_shield),
  3242. (agent_equip_item, ":agent_id", ":item_id"),
  3243. (try_end),
  3244. ]),
  3245.  
  3246. ("player_set_stored_ammo_counts", # server: after spawning, try set counts for ammo items to the stored values
  3247. [(store_script_param, ":player_id", 1), # must be valid
  3248.  
  3249. (player_get_agent_id, ":agent_id", ":player_id"),
  3250. (try_for_range, ":player_slot", slot_player_equip_item_0, slot_player_equip_item_3 + 1),
  3251. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3252. (ge, ":item_id", all_items_begin),
  3253. (store_add, ":ammo_slot", ":player_slot", slot_player_equip_item_0_ammo - slot_player_equip_item_0),
  3254. (player_get_slot, ":item_ammo", ":player_id", ":ammo_slot"),
  3255. (gt, ":item_ammo", 0),
  3256. (assign, ":loop_end", slot_player_equip_item_3 + 1),
  3257. (try_for_range, ":other_player_slot", slot_player_equip_item_0, ":loop_end"),
  3258. (player_slot_eq, ":player_id", ":other_player_slot", ":item_id"),
  3259. (try_begin),
  3260. (lt, ":other_player_slot", ":player_slot"), # end the sub loop, because this item must have been handled by an earlier iteration of the main loop
  3261. (assign, ":loop_end", -1),
  3262. (else_try),
  3263. (gt, ":other_player_slot", ":player_slot"), # add the ammo value of all subsequent slots for the same item
  3264. (store_add, ":ammo_slot", ":other_player_slot", slot_player_equip_item_0_ammo - slot_player_equip_item_0),
  3265. (player_get_slot, ":slot_ammo", ":player_id", ":ammo_slot"),
  3266. (gt, ":slot_ammo", 0),
  3267. (val_add, ":item_ammo", ":slot_ammo"),
  3268. (try_end),
  3269. (try_end),
  3270. (neq, ":loop_end", -1),
  3271. (gt, ":item_ammo", 0),
  3272. (agent_set_ammo, ":agent_id", ":item_id", ":item_ammo"), # this operation sets total ammo for all equipped items of that type
  3273. (try_end),
  3274. ]),
  3275.  
  3276. ("player_get_spawn_point", # server: store in reg0 an appropriate spawn point for the player: the one requested if valid, otherwise pick randomly
  3277. [(store_script_param, ":player_id", 1), # must be valid
  3278.  
  3279. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  3280. (player_get_slot, ":spawn_point", ":player_id", slot_player_requested_spawn_point),
  3281. (player_set_slot, ":player_id", slot_player_requested_spawn_point, 0),
  3282. (try_begin),
  3283. (gt, ":spawn_point", 0),
  3284. (val_sub, ":spawn_point", 1), # the requested spawn point numbers are from 1 - 5, but the corresponding entry points are 0 - 4
  3285. (try_begin),
  3286. (is_between, ":faction_id", castle_factions_begin, factions_end),
  3287. (store_mod, ":castle_spawn_no", ":spawn_point", 10),
  3288. (is_between, ":castle_spawn_no", 0, 5),
  3289. (store_div, ":castle_no", ":spawn_point", 10),
  3290. (val_sub, ":castle_no", castle_factions_begin),
  3291. (call_script, "script_cf_castle_is_active", ":castle_no"),
  3292. (troop_slot_eq, "trp_mission_data", ":castle_no", ":faction_id"),
  3293. (else_try),
  3294. (is_between, ":faction_id", factions_begin, castle_factions_begin),
  3295. (is_between, ":spawn_point", 0, 5),
  3296. (store_mul, ":entry_point_begin", ":faction_id", 10),
  3297. (val_add, ":spawn_point", ":entry_point_begin"),
  3298. (else_try),
  3299. (assign, ":spawn_point", -1),
  3300. (try_end),
  3301. (gt, ":spawn_point", -1),
  3302. (else_try), # no spawn point requested, or it was invalid
  3303. (try_begin),
  3304. (is_between, ":faction_id", castle_factions_begin, factions_end),
  3305. (assign, ":owned_castles", 0),
  3306. (assign, ":temp_slot", 0), # add all castles owned by their faction to a temporary list
  3307. (try_for_range, ":castle_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  3308. (troop_get_slot, ":owner_faction", "trp_mission_data", ":castle_no"),
  3309. (eq, ":owner_faction", ":faction_id"),
  3310. (call_script, "script_cf_castle_is_active", ":castle_no"),
  3311. (troop_set_slot, "trp_temp_array", ":temp_slot", ":castle_no"),
  3312. (val_add, ":owned_castles", 1),
  3313. (val_add, ":temp_slot", 1),
  3314. (try_end),
  3315. (gt, ":owned_castles", 0),
  3316. (store_random_in_range, ":random_slot", 0, ":owned_castles"), # get a random owned castle
  3317. (troop_get_slot, ":entry_point_begin", "trp_temp_array", ":random_slot"),
  3318. (val_add, ":entry_point_begin", castle_factions_begin),
  3319. (val_mul, ":entry_point_begin", 10),
  3320. (else_try),
  3321. (is_between, ":faction_id", factions_begin, castle_factions_begin),
  3322. (store_mul, ":entry_point_begin", ":faction_id", 10),
  3323. (else_try),
  3324. (assign, ":entry_point_begin", 0),
  3325. (try_end),
  3326. (store_add, ":entry_point_end", ":entry_point_begin", 5), # get a random entry point in the calculated section
  3327. (store_random_in_range, ":spawn_point", ":entry_point_begin", ":entry_point_end"),
  3328. (try_end),
  3329. (assign, reg0, ":spawn_point"),
  3330. ]),
  3331.  
  3332. ("player_respawn_in_place", # server: save values for respawning a player at the same place; normally for changing troop
  3333. [(store_script_param, ":player_id", 1), # must be valid
  3334.  
  3335. (player_get_agent_id, ":agent_id", ":player_id"),
  3336. (store_agent_hit_points, ":health_percent", ":agent_id", 0),
  3337. (player_set_slot, ":player_id", slot_player_spawn_health_percent, ":health_percent"),
  3338. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  3339. (player_set_slot, ":player_id", slot_player_spawn_food_amount, ":food_amount"),
  3340. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":player_id", slot_player_spawn_food_amount, ":food_amount"),
  3341. (agent_get_position, pos1, ":agent_id"),
  3342. (try_begin), # if there are not enough spawn marker scene props, generate more
  3343. (ge, ":player_id", "$g_spawn_marker_count"),
  3344. (assign, ":start_count", "$g_spawn_marker_count"),
  3345. (server_get_max_num_players, "$g_spawn_marker_count"),
  3346. (val_add, "$g_spawn_marker_count", 1),
  3347. (try_begin),
  3348. (ge, ":player_id", "$g_spawn_marker_count"),
  3349. (store_add, "$g_spawn_marker_count", ":player_id", 1),
  3350. (try_end),
  3351. (set_spawn_position, pos1),
  3352. (try_for_range, ":unused", ":start_count", "$g_spawn_marker_count"),
  3353. (spawn_scene_prop, "spr_code_spawn_marker"),
  3354. (try_end),
  3355. (try_end),
  3356. (try_begin), # use the spawn marker prop of the number corresponding to the player id
  3357. (scene_prop_get_instance, ":instance_id", "spr_code_spawn_marker", ":player_id"),
  3358. (prop_instance_set_position, ":instance_id", pos1, 1),
  3359. (try_end),
  3360. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_at_marker),
  3361. (agent_fade_out, ":agent_id"),
  3362. (call_script, "script_player_get_spawn_point", ":player_id"),
  3363. (player_spawn_new_agent, ":player_id", reg0),
  3364. ]),
  3365.  
  3366. ("cf_player_check_spawn_agent", # server: check if the a new agent should be spawned for a player
  3367. [(store_script_param, ":player_id", 1), # must be valid
  3368.  
  3369. (assign, ":spawn", 0),
  3370. (player_get_slot, ":spawn_state", ":player_id", slot_player_spawn_state),
  3371. (try_begin),
  3372. (eq, ":spawn_state", player_spawn_state_dead),
  3373. (player_get_team_no, ":team_no", ":player_id"),
  3374. (try_begin),
  3375. (this_or_next|eq, ":team_no", team_spectators),
  3376. (player_slot_eq, ":player_id", slot_player_requested_spawn_point, -1), # has not selected to join the game yet after client connection
  3377. (else_try),
  3378. (player_get_agent_id, ":agent_id", ":player_id"),
  3379. (neg|agent_is_active, ":agent_id"),
  3380. (assign, ":spawn", 1),
  3381. (else_try),
  3382. (agent_is_alive, ":agent_id"),
  3383. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_alive),
  3384. (else_try),
  3385. (agent_get_time_elapsed_since_removed, ":elapsed_time", ":agent_id"), # only works while the previous dead agent is still valid - only for about 30 seconds
  3386. (gt, ":elapsed_time", "$g_respawn_period"),
  3387. (assign, ":spawn", 1),
  3388. (try_end),
  3389. (try_begin),
  3390. (eq, ":spawn", 1),
  3391. (player_get_troop_id, ":troop_id", ":player_id"),
  3392. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3393. (try_begin),
  3394. (call_script, "script_cf_player_can_use_troop", ":player_id", ":troop_id"),
  3395. (else_try),
  3396. (player_get_slot, ":troop_id", ":player_id", slot_player_non_lord_troop_id),
  3397. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3398. (call_script, "script_cf_player_can_use_troop", ":player_id", ":troop_id"),
  3399. (player_set_troop_id, ":player_id", ":troop_id"),
  3400. (else_try),
  3401. (assign, ":troop_id", playable_troops_begin),
  3402. (player_set_troop_id, ":player_id", ":troop_id"),
  3403. (try_end),
  3404. (call_script, "script_player_add_default_troop_items", ":player_id", ":troop_id"),
  3405. (call_script, "script_player_add_default_troop_armor", ":player_id", ":troop_id"),
  3406. (call_script, "script_player_add_spawn_items", ":player_id", 0),
  3407. (call_script, "script_player_get_spawn_point", ":player_id"),
  3408. (player_set_slot, ":player_id", slot_player_spawn_entry_point, reg0),
  3409. (player_spawn_new_agent, ":player_id", reg0),
  3410. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_invulnerable),
  3411. (store_mission_timer_a, ":spawn_time"),
  3412. (player_set_slot, ":player_id", slot_player_spawn_invulnerable_time, ":spawn_time"),
  3413. (try_end),
  3414. (else_try), # if the player is currently alive under spawn protection, check if the time is up
  3415. (eq, ":spawn_state", player_spawn_state_invulnerable),
  3416. (player_get_agent_id, ":agent_id", ":player_id"),
  3417. (agent_is_active, ":agent_id"),
  3418. (agent_is_alive, ":agent_id"),
  3419. (player_get_slot, ":spawn_invulnerable_time", ":player_id", slot_player_spawn_invulnerable_time),
  3420. (store_mission_timer_a, ":current_time"),
  3421. (val_sub, ":current_time", ":spawn_invulnerable_time"),
  3422. (try_begin),
  3423. (ge, ":current_time", spawn_invulnerable_time),
  3424. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_alive),
  3425. (player_set_slot, ":player_id", slot_player_spawn_invulnerable_time, 0),
  3426. (agent_set_team, ":agent_id", team_default),
  3427. (call_script, "script_player_equip_stored_default_items", ":player_id"),
  3428. (try_end),
  3429. (try_end),
  3430. (eq, ":spawn", 1),
  3431. ]),
  3432.  
  3433. ("on_agent_spawned", # server and clients: set agent slots and attributes after spawning
  3434. [(store_script_param, ":agent_id", 1), # must be valid
  3435.  
  3436. (agent_set_slot, ":agent_id", slot_agent_horse_last_rider, -1),
  3437. (agent_set_slot, ":agent_id", slot_agent_freeze_instance_id, -1),
  3438. (agent_set_slot, ":agent_id", slot_agent_poisoner_agent_id, -1),
  3439. (agent_set_slot, ":agent_id", slot_agent_poisoner_player_uid, -1),
  3440. (agent_set_slot, ":agent_id", slot_agent_fishing_last_school, -1),
  3441. (agent_set_slot, ":agent_id", slot_agent_last_horse_ridden, -1),
  3442. (agent_set_slot, ":agent_id", slot_agent_hunting_last_carcass, -1),
  3443. (agent_set_slot, ":agent_id", slot_agent_animal_herd_manager, -1),
  3444. (agent_set_slot, ":agent_id", slot_agent_animal_carcass_instance_id, -1),
  3445. (try_begin),
  3446. (eq, "$g_full_respawn_health", 0),
  3447. (agent_is_human, ":agent_id"),
  3448. (agent_set_max_hit_points, ":agent_id", max_hit_points_percent),
  3449. (try_end),
  3450. (agent_get_player_id, ":player_id", ":agent_id"),
  3451. (try_begin),
  3452. (player_is_active, ":player_id"),
  3453. (player_get_slot, ":food_amount", ":player_id", slot_player_spawn_food_amount),
  3454. (try_begin),
  3455. (gt, ":food_amount", 0),
  3456. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  3457. (player_set_slot, ":player_id", slot_player_spawn_food_amount, 0),
  3458. (try_end),
  3459. (try_begin),
  3460. (player_is_admin, ":player_id"),
  3461. (player_get_troop_id, ":troop_id", ":player_id"),
  3462. (eq, ":troop_id", "trp_godlike_hero"),
  3463. (agent_set_use_speed_modifier, ":agent_id", 1000),
  3464. (try_end),
  3465. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  3466. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3467. (ge, ":item_id", all_items_begin),
  3468. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 1, 1),
  3469. (try_end),
  3470. (multiplayer_is_server),
  3471. (player_get_slot, ":spawn_state", ":player_id", slot_player_spawn_state),
  3472. (try_begin),
  3473. (eq, ":spawn_state", player_spawn_state_invulnerable),
  3474. (agent_set_team, ":agent_id", team_spawn_invulnerable),
  3475. (try_begin),
  3476. (eq, "$g_full_respawn_health", 0),
  3477. (player_get_slot, ":spawn_health_percent", ":player_id", slot_player_next_spawn_health_percent),
  3478. (agent_set_hit_points, ":agent_id", ":spawn_health_percent", 0),
  3479. (try_end),
  3480. (else_try),
  3481. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_alive),
  3482. (eq, ":spawn_state", player_spawn_state_at_marker),
  3483. (scene_prop_get_instance, ":instance_id", "spr_code_spawn_marker", ":player_id"),
  3484. (prop_instance_get_position, pos1, ":instance_id"),
  3485. (agent_set_position, ":agent_id", pos1),
  3486. (player_get_slot, ":spawn_health_percent", ":player_id", slot_player_spawn_health_percent),
  3487. (try_begin),
  3488. (gt, ":spawn_health_percent", 0),
  3489. (agent_set_hit_points, ":agent_id", ":spawn_health_percent", 0),
  3490. (player_set_slot, ":player_id", slot_player_spawn_health_percent, 0),
  3491. (try_end),
  3492. (call_script, "script_player_set_stored_ammo_counts", ":player_id"),
  3493. (try_end),
  3494. (try_begin),
  3495. (neq, ":spawn_state", player_spawn_state_invulnerable),
  3496. (agent_set_team, ":agent_id", team_default),
  3497. (try_end),
  3498. (try_begin),
  3499. (eq, "$g_mute_global_chat", 1),
  3500. (player_set_is_muted, ":player_id", "$g_mute_global_chat"),
  3501. (try_end),
  3502. (try_end),
  3503. ]),
  3504.  
  3505. ("setup_agent_for_respawn", # server: when an agent dies, clean up slots and attached props; set up lootable items
  3506. [(store_script_param, ":agent_id", 1),
  3507.  
  3508. (try_begin),
  3509. (agent_is_active, ":agent_id"),
  3510. (agent_get_attached_scene_prop, ":instance_id", ":agent_id"),
  3511. (try_begin),
  3512. (prop_instance_is_valid, ":instance_id"),
  3513. (agent_set_attached_scene_prop, ":agent_id", -1),
  3514. (call_script, "script_cart_set_detached_position", ":instance_id"),
  3515. (try_end),
  3516. (agent_set_slot, ":agent_id", slot_agent_died_normally, 1),
  3517. (agent_set_slot, ":agent_id", slot_agent_cannot_attack, 0), # so the attack restrictons checking loop will skip this agent
  3518. (agent_get_player_id, ":player_id", ":agent_id"),
  3519. (player_is_active, ":player_id"),
  3520. (agent_get_position, pos1, ":agent_id"),
  3521. (set_spawn_position, pos1),
  3522. (store_random_in_range, ":imod", imod_plain, imod_cracked + 1),
  3523. (spawn_item, "itm_agent_corpse", ":imod", "$g_spawn_item_prune_time"),
  3524. (assign, ":corpse_instance_id", reg0),
  3525. (prop_instance_set_position, ":corpse_instance_id", pos1),
  3526. (store_mission_timer_a, ":prune_time"),
  3527. (val_add, ":prune_time", "$g_spawn_item_prune_time"),
  3528. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_prune_time, ":prune_time"),
  3529. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_count, corpse_inventory_slots),
  3530. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_max_length, corpse_inventory_max_length),
  3531. (val_add, "$g_last_inventory_unique_id", 1),
  3532. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, "$g_last_inventory_unique_id"),
  3533. (assign, ":inventory_slot", slot_scene_prop_inventory_begin),
  3534. (try_for_range, ":player_equip_slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  3535. (player_get_slot, ":item_id", ":player_id", ":player_equip_slot"),
  3536. (ge, ":item_id", all_items_begin),
  3537. (scene_prop_set_slot, ":corpse_instance_id", ":inventory_slot", ":item_id"),
  3538. (val_add, ":inventory_slot", 1),
  3539. (try_end),
  3540. (try_begin), # if the only items dropped were rubbish default items, remove the corpse now for performance reasons
  3541. (eq, ":inventory_slot", slot_scene_prop_inventory_begin),
  3542. (scene_prop_set_prune_time, ":corpse_instance_id", 1),
  3543. (try_end),
  3544. (try_for_range, ":player_equip_slot", slot_player_equip_item_0, slot_player_equip_end),
  3545. (player_set_slot, ":player_id", ":player_equip_slot", 0),
  3546. (try_end),
  3547. (agent_get_position, pos1, ":agent_id"),
  3548. (agent_get_wielded_item, ":weapon_item_id", ":agent_id", 0),
  3549. (agent_get_wielded_item, ":shield_item_id", ":agent_id", 1),
  3550. (set_fixed_point_multiplier, 100),
  3551. (position_get_z, ":height", pos1), # the engine only drops the wielded items, only if above water level: drop all equipped items
  3552. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  3553. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3554. (ge, ":item_id", all_items_begin),
  3555. (try_begin),
  3556. (this_or_next|eq, ":item_id", ":weapon_item_id"),
  3557. (eq, ":item_id", ":shield_item_id"),
  3558. (gt, ":height", -50),
  3559. (neq, ":item_id", "itm_money_bag"),
  3560. (else_try),
  3561. (store_add, ":unequip_slot", ":equip_slot", 1),
  3562. (agent_unequip_item, ":agent_id", ":item_id", ":unequip_slot"), # if spawning an item manually, remove it so the engine definitely won't drop a duplicate
  3563. (call_script, "script_set_random_spawn_position", 50),
  3564. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  3565. (call_script, "script_check_on_item_dropped", ":agent_id", ":item_id", reg0, 1),
  3566. (try_end),
  3567. (try_end),
  3568. (agent_get_slot, ":freeze_instance_id", ":agent_id", slot_agent_freeze_instance_id),
  3569. (try_begin),
  3570. (gt, ":freeze_instance_id", -1),
  3571. (call_script, "script_remove_scene_prop", ":freeze_instance_id"),
  3572. (agent_set_slot, ":agent_id", slot_agent_freeze_instance_id, -1),
  3573. (try_end),
  3574. (try_begin),
  3575. (neq, "$g_game_type", "mt_permanent_death"),
  3576. (agent_get_troop_id, ":troop_id", ":agent_id"),
  3577. (troop_get_slot, ":spawn_health_percent", ":troop_id", slot_troop_spawn_health_percent),
  3578. (player_set_slot, ":player_id", slot_player_next_spawn_health_percent, ":spawn_health_percent"),
  3579. (player_get_slot, ":inactive_index", ":player_id", slot_player_inactive_index),
  3580. (try_begin), # save values to the inactive players array
  3581. (gt, ":inactive_index", 0),
  3582. (player_get_unique_id, ":unique_id", ":player_id"),
  3583. (troop_slot_eq, "trp_inactive_players_array", ":inactive_index", ":unique_id"),
  3584. (call_script, "script_cf_player_store_inactive", ":player_id", ":inactive_index"),
  3585. (try_end),
  3586. (else_try),
  3587. (player_set_slot, ":player_id", slot_player_next_spawn_health_percent, 100),
  3588. (player_set_troop_id, ":player_id", playable_troops_begin),
  3589. (player_set_slot, ":player_id", slot_player_faction_id, factions_begin),
  3590. (try_end),
  3591. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_dead),
  3592. (try_end),
  3593. ]),
  3594.  
  3595. ("setup_player_joined", # server: when a player connects, update necessary data on clients, restore data from previous play sessions in this mission, and set up other attributes
  3596. [(store_script_param, ":player_id", 1), # must be valid
  3597.  
  3598. (call_script, "script_reset_illnesses", ":player_id"), #RAMARAUNT ADD
  3599. (player_set_team_no, ":player_id", team_default),
  3600. (player_set_slot, ":player_id", slot_player_requested_spawn_point, -1), # setting the initial team to spectator seems to occasionally stop that client loading properly, this is a work around
  3601. (player_set_slot, ":player_id", slot_player_next_chat_event_type, client_event_chat_message_begin),
  3602. (try_for_range, ":castle_owner_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  3603. (troop_get_slot, ":castle_owner", "trp_mission_data", ":castle_owner_slot"),
  3604. (faction_slot_eq, ":castle_owner", slot_faction_is_active, 1),
  3605. (multiplayer_send_3_int_to_player, ":player_id", server_event_troop_set_slot, "trp_mission_data", ":castle_owner_slot", ":castle_owner"),
  3606. (try_end),
  3607. (try_for_range, ":faction_id", factions_begin, factions_end),
  3608. (faction_slot_eq, ":faction_id", slot_faction_is_active, 1),
  3609. (ge, ":faction_id", castle_factions_begin),
  3610. (faction_get_slot, ":banner_mesh", ":faction_id", slot_faction_banner_mesh),
  3611. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", slot_faction_banner_mesh, ":banner_mesh"),
  3612. (try_begin),
  3613. (faction_slot_eq, ":faction_id", slot_faction_name_is_custom, 1),
  3614. (multiplayer_send_3_int_to_player, ":player_id", server_event_troop_set_slot, "trp_mission_data", slot_mission_data_faction_to_change_name_of, ":faction_id"),
  3615. (str_store_faction_name, s0, ":faction_id"),
  3616. (multiplayer_send_string_to_player, ":player_id", server_event_faction_set_name, s0),
  3617. (try_end),
  3618. (try_for_range, ":other_faction_id", castle_factions_begin, factions_end),
  3619. (faction_slot_eq, ":faction_id", slot_faction_is_active, 1),
  3620. (store_add, ":relation_slot", slot_faction_relations_begin, ":other_faction_id"),
  3621. (faction_get_slot, ":relation", ":faction_id", ":relation_slot"),
  3622. (neq, ":relation", 0),
  3623. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", ":relation_slot", ":relation"),
  3624. (try_end),
  3625. (try_begin),
  3626. (faction_slot_eq, ":faction_id", slot_faction_is_locked, 1),
  3627. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", slot_faction_is_locked, 1),
  3628. (try_end),
  3629. (try_end),
  3630. (scene_prop_get_num_instances, ":pole_num", "spr_pw_castle_capture_point"),
  3631. (try_for_range, ":pole_no", 0, ":pole_num"), # so secondary capture point banner item ids match up for the client side repositioning script, after joining
  3632. (scene_prop_get_instance, ":pole_instance_id", "spr_pw_castle_capture_point", ":pole_no"),
  3633. (scene_prop_get_slot, ":capture_faction_id", ":pole_instance_id", slot_scene_prop_capture_faction_id),
  3634. (gt, ":capture_faction_id", 0),
  3635. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":pole_instance_id", slot_scene_prop_capture_faction_id, ":capture_faction_id"),
  3636. (try_end),
  3637. (get_max_players, ":max_players"),
  3638. (player_get_unique_id, ":player_unique_id", ":player_id"),
  3639. (troop_get_slot, ":inactive_array_size", "trp_inactive_players_array", slot_player_array_size),
  3640. (try_begin), # try find player data in the inactive array, from a previous play session
  3641. (gt, ":inactive_array_size", 0),
  3642. (store_sub, ":inactive_last_entry_number", ":inactive_array_size", 1),
  3643. (store_mul, ":inactive_index", ":inactive_last_entry_number", player_array_entry_size),
  3644. (val_add, ":inactive_index", slot_player_array_begin),
  3645. (assign, ":loop_end", ":inactive_array_size"),
  3646. (try_for_range, ":unused", 0, ":loop_end"),
  3647. (troop_get_slot, ":inactive_unique_id", "trp_inactive_players_array", ":inactive_index"),
  3648. (neq, ":inactive_unique_id", ":player_unique_id"),
  3649. (val_sub, ":inactive_index", player_array_entry_size),
  3650. (else_try),
  3651. (troop_set_slot, "trp_inactive_players_array", ":inactive_index", 0),
  3652. (assign, ":loop_end", -1),
  3653. (try_end),
  3654. (eq, ":loop_end", -1),
  3655. (store_add, ":temp_index", ":inactive_index", player_array_troop_id),
  3656. (troop_get_slot, ":troop_id", "trp_inactive_players_array", ":temp_index"),
  3657. (store_add, ":temp_index", ":inactive_index", player_array_faction_id),
  3658. (troop_get_slot, ":faction_id", "trp_inactive_players_array", ":temp_index"),
  3659. (store_add, ":temp_index", ":inactive_index", player_array_gold_value),
  3660. (troop_get_slot, ":gold_value", "trp_inactive_players_array", ":temp_index"),
  3661. (store_add, ":temp_index", ":inactive_index", player_array_outlaw_rating),
  3662. (troop_get_slot, ":outlaw_rating", "trp_inactive_players_array", ":temp_index"),
  3663. (try_begin),
  3664. (gt, ":outlaw_rating", 0),
  3665. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":player_id", slot_player_outlaw_rating, ":outlaw_rating"),
  3666. (try_end),
  3667. (try_begin),
  3668. (neq, ":faction_id", 0),
  3669. (try_for_range, ":other_player_id", 1, ":max_players"),
  3670. (player_is_active, ":other_player_id"),
  3671. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  3672. (try_end),
  3673. (try_begin),
  3674. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":player_unique_id"),
  3675. (call_script, "script_player_set_lord", ":player_id", ":faction_id"),
  3676. (try_end),
  3677. (try_end),
  3678. (else_try), # otherwise, set default attributes
  3679. (assign, ":troop_id", playable_troops_begin),
  3680. (assign, ":faction_id", factions_begin),
  3681. (try_begin),
  3682. (neq, "$g_game_type", "mt_no_money"),
  3683. (neq, "$g_game_type", "mt_permanent_death"),
  3684. (store_random_in_range, ":gold_value", 30, 100),
  3685. (val_mul, ":gold_value", "$g_starting_gold_multiplier"),
  3686. (val_div, ":gold_value", 100),
  3687. (else_try),
  3688. (assign, ":gold_value", 0),
  3689. (try_end),
  3690. (assign, ":outlaw_rating", 0),
  3691. (try_end),
  3692. (player_set_troop_id, ":player_id", ":troop_id"),
  3693. (player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  3694. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 0),
  3695. (player_set_slot, ":player_id", slot_player_outlaw_rating, ":outlaw_rating"),
  3696. (troop_get_slot, ":spawn_health_percent", ":troop_id", slot_troop_spawn_health_percent),
  3697. (player_set_slot, ":player_id", slot_player_next_spawn_health_percent, ":spawn_health_percent"),
  3698. (try_begin),
  3699. (neq, ":faction_id", "fac_commoners"),
  3700. (str_store_player_username, s0, ":player_id"),
  3701. (str_store_faction_name, s1, ":faction_id"),
  3702. (server_add_message_to_log, "str_s0_joined_the_s1"),
  3703. (try_end),
  3704. (try_for_range, ":other_player_id", 1, ":max_players"),
  3705. (neq, ":other_player_id", ":player_id"),
  3706. (player_is_active, ":other_player_id"),
  3707. (player_get_slot, ":other_faction_id", ":other_player_id", slot_player_faction_id),
  3708. (try_begin),
  3709. (neq, ":other_faction_id", 0),
  3710. (multiplayer_send_4_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_faction_id, ":other_faction_id", change_faction_type_no_respawn),
  3711. (try_end),
  3712. (player_get_score, ":score", ":other_player_id"),
  3713. (player_get_kill_count, ":kills", ":other_player_id"),
  3714. (player_get_death_count, ":deaths", ":other_player_id"),
  3715. (multiplayer_send_4_int_to_player, ":player_id", server_event_set_player_score_kill_death, ":other_player_id", ":score", ":kills", ":deaths"),
  3716. (try_begin),
  3717. (player_slot_eq, ":other_player_id", slot_player_is_lord, 1),
  3718. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_is_lord, 1),
  3719. (try_end),
  3720. (try_end),
  3721. (try_for_agents, ":other_agent_id"),
  3722. (agent_get_attached_scene_prop, ":attached_instance_id", ":other_agent_id"),
  3723. (ge, ":attached_instance_id", 0),
  3724. (multiplayer_send_2_int_to_player, ":player_id", server_event_set_attached_scene_prop, ":other_agent_id", ":attached_instance_id"),
  3725. (try_end),
  3726. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_respawn_period, "$g_respawn_period"),
  3727. #(multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_num_bots_voteable, "$g_num_bots_voteable"),
  3728. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_maps_voteable, "$g_scenes_voteable"),
  3729. #(multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_factions_voteable, "$g_factions_voteable"),
  3730. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_kick_voteable, "$g_kick_voteable"),
  3731. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_ban_voteable, "$g_ban_voteable"),
  3732. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_force_default_armor, "$g_force_weather"),
  3733. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_disallow_ranged_weapons, "$g_full_respawn_health"),
  3734. (store_mission_timer_a, ":mission_timer"),
  3735. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_server_mission_timer, ":mission_timer"),
  3736. ]),
  3737.  
  3738. ("after_client_is_setup", # clients: called after the server has finished sending the initial module data updates
  3739. [
  3740. (assign, "$g_preset_message_display_enabled", 1),
  3741. (call_script, "script_redraw_castle_banners", redraw_client_banner_positions, -1),
  3742. ]),
  3743.  
  3744. ("cf_save_player_exit", # server: when a player disconnects, save attributes to the inactive players list
  3745. [(store_script_param, ":player_id", 1), # must be valid
  3746.  
  3747. (player_get_troop_id, ":troop_id", ":player_id"),
  3748. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3749. (player_get_unique_id, ":player_unique_id", ":player_id"),
  3750. (troop_get_slot, ":inactive_array_size", "trp_inactive_players_array", slot_player_array_size),
  3751. (assign, ":loop_end", ":inactive_array_size"),
  3752. (assign, ":inactive_index", slot_player_array_begin),
  3753. (try_for_range, ":unused", 0, ":loop_end"),
  3754. (this_or_next|troop_slot_eq, "trp_inactive_players_array", ":inactive_index", 0),
  3755. (troop_slot_eq, "trp_inactive_players_array", ":inactive_index", ":player_unique_id"),
  3756. (assign, ":loop_end", -1),
  3757. (else_try),
  3758. (val_add, ":inactive_index", player_array_entry_size),
  3759. (try_end),
  3760. (try_begin),
  3761. (call_script, "script_cf_player_store_inactive", ":player_id", ":inactive_index"),
  3762. (troop_set_slot, "trp_inactive_players_array", ":inactive_index", ":player_unique_id"),
  3763. (player_set_slot, ":player_id", slot_player_inactive_index, ":inactive_index"),
  3764. (neq, ":loop_end", -1),
  3765. (val_add, ":inactive_array_size", 1),
  3766. (troop_set_slot, "trp_inactive_players_array", slot_player_array_size, ":inactive_array_size"),
  3767. (try_end),
  3768. (assign, ":loop_end", factions_end),
  3769. (try_for_range, ":faction_id", castle_factions_begin, ":loop_end"),
  3770. (faction_get_slot, ":lord_player_uid", ":faction_id", slot_faction_lord_player_uid),
  3771. (eq, ":lord_player_uid", ":player_unique_id"),
  3772. (assign, ":loop_end", -1),
  3773. (store_mission_timer_a, ":current_time"),
  3774. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, ":current_time"),
  3775. (try_end),
  3776. ]),
  3777.  
  3778. ("cf_player_store_inactive", # server: store player attributes starting at a specified index in a list
  3779. [(store_script_param, ":player_id", 1), # must be valid
  3780. (store_script_param, ":inactive_index", 2),
  3781.  
  3782. (player_get_troop_id, ":troop_id", ":player_id"),
  3783. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3784. (try_begin),
  3785. (neq, "$g_game_type", "mt_permanent_death"),
  3786. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  3787. (player_get_gold, ":gold_value", ":player_id"),
  3788. (else_try),
  3789. (assign, ":troop_id", playable_troops_begin),
  3790. (assign, ":faction_id", factions_begin),
  3791. (assign, ":gold_value", 0),
  3792. (try_end),
  3793. (store_add, ":temp_index", ":inactive_index", player_array_troop_id),
  3794. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":troop_id"),
  3795. (store_add, ":temp_index", ":inactive_index", player_array_faction_id),
  3796. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":faction_id"),
  3797. (store_add, ":temp_index", ":inactive_index", player_array_gold_value),
  3798. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":gold_value"),
  3799. (player_get_slot, ":outlaw_rating", ":player_id", slot_player_outlaw_rating),
  3800. (store_add, ":temp_index", ":inactive_index", player_array_outlaw_rating),
  3801. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":outlaw_rating"),
  3802. ]),
  3803.  
  3804. ("apply_consequences_for_agent_death", # server and clients: when an agent dies, adjust scores, display messages, drop a loot money bag, check outlaw rating
  3805. [(store_script_param, ":dead_agent_id", 1),
  3806. (store_script_param, ":killer_agent_id", 2),
  3807.  
  3808. (try_begin),
  3809. (gt, ":dead_agent_id", -1),
  3810. (agent_get_player_id, ":dead_player_id", ":dead_agent_id"),
  3811. (player_is_active, ":dead_player_id"),
  3812. (try_begin),
  3813. (gt, ":killer_agent_id", -1),
  3814. (neq, ":killer_agent_id", ":dead_agent_id"),
  3815. (agent_get_player_id, ":killer_player_id", ":killer_agent_id"),
  3816. (player_is_active, ":killer_player_id"),
  3817. (player_get_slot, ":dead_faction_id", ":dead_player_id", slot_player_faction_id),
  3818. (player_get_slot, ":killer_faction_id", ":killer_player_id", slot_player_faction_id),
  3819. (try_begin),
  3820. (lt, ":dead_faction_id", castle_factions_begin),
  3821. (lt, ":killer_faction_id", castle_factions_begin),
  3822. (assign, ":dead_player_add_score", -1),
  3823. (assign, ":killer_player_add_score", 1),
  3824. (else_try),
  3825. (call_script, "script_cf_factions_are_hostile", ":dead_faction_id", ":killer_faction_id"),
  3826. (assign, ":dead_player_add_score", -1),
  3827. (assign, ":killer_player_add_score", 1),
  3828. (else_try),
  3829. (assign, ":dead_player_add_score", 0),
  3830. (assign, ":killer_player_add_score", -1),
  3831. (try_begin),
  3832. (str_store_player_username, s0, ":killer_player_id"),
  3833. (try_begin),
  3834. (eq, ":dead_faction_id", ":killer_faction_id"),
  3835. (assign, ":string_id", "str_s0_killed_faction_member"),
  3836. (else_try),
  3837. (assign, ":string_id", "str_s0_killed_friendly_faction_member"),
  3838. (try_end),
  3839. (try_begin),
  3840. (neg|multiplayer_is_server),
  3841. (display_message, ":string_id", 0xFFAA0000),
  3842. (else_try),
  3843. (server_add_message_to_log, ":string_id"),
  3844. (try_end),
  3845. (try_end),
  3846. (try_end),
  3847. (else_try),
  3848. (assign, ":dead_player_add_score", -1),
  3849. (assign, ":killer_player_add_score", 0),
  3850. (try_end),
  3851. (else_try),
  3852. (assign, ":dead_player_add_score", 0),
  3853. (assign, ":killer_player_add_score", 0),
  3854. (try_end),
  3855. (try_begin),
  3856. (le, ":dead_player_add_score", -1),
  3857. (player_get_score, ":dead_player_score", ":dead_player_id"),
  3858. (val_add, ":dead_player_score", ":dead_player_add_score"),
  3859. (player_set_score, ":dead_player_id", ":dead_player_score"),
  3860. (player_get_death_count, ":dead_player_deaths", ":dead_player_id"),
  3861. (val_add, ":dead_player_deaths", 1),
  3862. (player_set_death_count, ":dead_player_id", ":dead_player_deaths"),
  3863. (try_begin),
  3864. (multiplayer_is_server),
  3865. (neq, "$g_game_type", "mt_no_money"),
  3866. (call_script, "script_player_drop_loot", ":dead_player_id"),
  3867. (try_end),
  3868. (try_end),
  3869. (try_begin),
  3870. (neq, ":killer_player_add_score", 0),
  3871. (player_get_score, ":killer_player_score", ":killer_player_id"),
  3872. (val_add, ":killer_player_score", ":killer_player_add_score"),
  3873. (player_set_score, ":killer_player_id", ":killer_player_score"),
  3874. (ge, ":killer_player_add_score", 1),
  3875. (player_get_kill_count, ":killer_player_kills", ":killer_player_id"),
  3876. (val_add, ":killer_player_kills", 1),
  3877. (player_set_kill_count, ":killer_player_id", ":killer_player_kills"),
  3878. (try_end),
  3879. (try_begin),
  3880. (multiplayer_is_server),
  3881. (try_begin),
  3882. (le, ":killer_player_add_score", -1),
  3883. (call_script, "script_player_change_check_outlaw_rating", ":killer_player_id", outlaw_rating_for_team_kill, 0),
  3884. (else_try),
  3885. (player_is_active, ":killer_player_id"),
  3886. (player_slot_eq, ":killer_player_id", slot_player_faction_id, "fac_outlaws"),
  3887. (call_script, "script_player_change_check_outlaw_rating", ":killer_player_id", outlaw_rating_for_kill, 0),
  3888. (try_end),
  3889. (else_try),
  3890. (agent_is_active, ":killer_agent_id"),
  3891. (agent_is_active, ":dead_agent_id"),
  3892. (agent_is_human, ":dead_agent_id"),
  3893. (mission_cam_get_position, pos1),
  3894. (agent_get_position, pos2, ":dead_agent_id"),
  3895. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  3896. (try_begin),
  3897. (lt, ":sq_distance", sq(max_distance_local_chat)),
  3898. (val_add, "$g_recent_nearby_deaths_factor", 50),
  3899. (ge, "$g_recent_nearby_deaths_factor", 100),
  3900. (music_set_situation, mtf_sit_fight),
  3901. (try_end),
  3902. (multiplayer_get_my_player, ":my_player_id"),
  3903. (try_begin),
  3904. (player_is_active, ":my_player_id"),
  3905. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  3906. (eq, ":dead_agent_id", ":my_agent_id"),
  3907. (music_set_situation, mtf_sit_killed),
  3908. (try_end),
  3909. (try_end),
  3910. ]),
  3911.  
  3912. ("player_change_check_outlaw_rating", # server: update a player's outlaw rating and change faction if necessary
  3913. [(store_script_param, ":player_id", 1), # must be valid
  3914. (store_script_param, ":add_rating", 2),
  3915. (store_script_param, ":force_outlawed", 3), # change to outlaws even if the rating is not past the threshold
  3916.  
  3917. (player_get_slot, ":outlaw_rating", ":player_id", slot_player_outlaw_rating),
  3918. (store_add, ":new_outlaw_rating", ":outlaw_rating", ":add_rating"),
  3919. (val_min, ":new_outlaw_rating", outlaw_rating_maximum),
  3920. (try_begin),
  3921. (neq, ":new_outlaw_rating", ":outlaw_rating"),
  3922. (player_set_slot, ":player_id", slot_player_outlaw_rating, ":new_outlaw_rating"),
  3923. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":player_id", slot_player_outlaw_rating, ":new_outlaw_rating"),
  3924. (try_end),
  3925. (try_begin),
  3926. (neg|player_slot_eq, ":player_id", slot_player_faction_id, "fac_outlaws"),
  3927. (this_or_next|eq, ":force_outlawed", 1),
  3928. (ge, ":new_outlaw_rating", outlaw_rating_outlawed),
  3929. (call_script, "script_player_set_worse_respawn_troop", ":player_id", "trp_ruffian"),
  3930. (call_script, "script_change_faction", ":player_id", "fac_outlaws", change_faction_type_outlawed),
  3931. (try_end),
  3932. ]),
  3933.  
  3934. ("player_drop_loot", # server: drop a loot money bag based on amount carried and server settings
  3935. [(store_script_param, ":player_id", 1), # must be valid
  3936.  
  3937. (try_begin),
  3938. (neq, "$g_game_type", "mt_no_money"),
  3939. (player_get_gold, ":gold", ":player_id"),
  3940. (gt, ":gold", 0),
  3941. (try_begin),
  3942. (neq, "$g_game_type", "mt_permanent_death"),
  3943. (store_random_in_range, ":loot_multiplier", 10, 21),
  3944. (store_mul, ":gold_loot", ":loot_multiplier", "$g_combat_gold_multiplier"),
  3945. (val_min, ":gold_loot", 10000),
  3946. (val_mul, ":gold_loot", ":gold"),
  3947. (val_div, ":gold_loot", 10000),
  3948. (val_sub, ":gold", ":gold_loot"),
  3949. (else_try),
  3950. (assign, ":gold_loot", ":gold"),
  3951. (assign, ":gold", 0),
  3952. (try_end),
  3953. (gt, ":gold_loot", 0),
  3954. (call_script, "script_player_adjust_gold", ":player_id", ":gold", 0),
  3955. (player_get_agent_id, ":agent_id", ":player_id"),
  3956. (agent_get_position, pos1, ":agent_id"),
  3957. (call_script, "script_set_random_spawn_position", 50),
  3958. (spawn_item, "itm_money_bag", 0, "$g_spawn_item_prune_time"),
  3959. (scene_prop_set_slot, reg0, slot_scene_prop_gold_value, ":gold_loot"),
  3960. (try_end),
  3961. ]),
  3962.  
  3963. ("check_name_server", # server: send a test message to the name server to check whether it should be enabled
  3964. [
  3965. (try_begin),
  3966. (eq, "$g_name_server_enabled", 0),
  3967. (str_store_string, s1, "str_name_server"),
  3968. (neg|str_is_empty, s1),
  3969. (str_store_string, s2, "str_name_server_password"),
  3970. (neg|str_is_empty, s2),
  3971. (assign, reg1, 0),
  3972. (assign, reg2, 0),
  3973. (str_clear, s3),
  3974. (send_message_to_url, "str_http_s1_password_s2_id_reg1_uid_reg2_name_s3"),
  3975. (try_end),
  3976. ]),
  3977.  
  3978. ("player_check_name", # server: check the player name and unique id with the name server, if enabled
  3979. [(store_script_param, ":player_id", 1), # must be valid
  3980.  
  3981. (try_begin),
  3982. (eq, "$g_name_server_enabled", 1), # this is set upon reply to a test message sent at server start
  3983. (str_store_string, s1, "str_name_server"),
  3984. (str_store_string, s2, "str_name_server_password"),
  3985. (assign, reg1, ":player_id"),
  3986. (player_get_unique_id, reg2, ":player_id"),
  3987. (str_store_player_username, s3, ":player_id"),
  3988. (str_encode_url, s3),
  3989. (str_store_string, s0, "str_http_s1_password_s2_id_reg1_uid_reg2_name_s3"),
  3990. (try_begin),
  3991. (player_is_admin, ":player_id"),
  3992. (str_store_string, s0, "str_http_s0_admin"),
  3993. (try_end),
  3994. (send_message_to_url, s0),
  3995. (try_end),
  3996. ]),
  3997.  
  3998. ("player_set_admin_permissions", # unpack an admin permissions bitset and apply it to player slots
  3999. [(store_script_param, ":player_id", 1), # must be valid
  4000. (store_script_param, ":permissions", 2),
  4001.  
  4002. (try_for_range, ":slot", slot_player_admin_no_panel, slot_player_admin_end),
  4003. (assign, ":value", ":permissions"),
  4004. (val_and, ":value", 0x1),
  4005. (val_rshift, ":permissions", 1),
  4006. (eq, ":value", 0),
  4007. (player_set_slot, ":player_id", ":slot", 1),
  4008. (try_end),
  4009. ]),
  4010.  
  4011. ])
  4012.  
  4013. def generate_load_profile_options(): # generate operations to load settings stored in the current profile's banner id
  4014. script_body = [(assign, ":option_bits", "$g_current_profile_banner_id"),
  4015. (val_rshift, ":option_bits", profile_banner_id_option_bits_begin)]
  4016. for option in profile_options:
  4017. script_body.extend([(assign, option, ":option_bits"),
  4018. (val_and, option, 0x1),
  4019. (val_rshift, ":option_bits", 1)])
  4020. script_body.pop()
  4021. return [lazy.block(script_body)]
  4022.  
  4023. def generate_store_profile_options(): # generate operations to store on/off settings in the current profile's banner id
  4024. script_body = [(assign, ":option_bits", 0)]
  4025. for i, option in enumerate(profile_options):
  4026. script_body.extend([(assign, ":option_bit", option),
  4027. (val_clamp, ":option_bit", 0, 2),
  4028. (val_lshift, ":option_bit", i),
  4029. (val_or, ":option_bits", ":option_bit")])
  4030. script_body.extend([(val_lshift, ":option_bits", profile_banner_id_option_bits_begin),
  4031. (assign, ":profile_banner_id", "$g_current_profile_banner_id"),
  4032. (val_and, ":profile_banner_id", profile_banner_id_mask),
  4033. (val_or, ":option_bits", ":profile_banner_id"),
  4034. (assign, "$g_current_profile_banner_id", ":option_bits"),
  4035. (profile_set_banner_id, ":option_bits")])
  4036. return [lazy.block(script_body)]
  4037.  
  4038. scripts.extend([
  4039.  
  4040. ("load_profile_options", generate_load_profile_options()),
  4041.  
  4042. ("store_profile_options", generate_store_profile_options()),
  4043.  
  4044. ("client_check_show_respawn_time_counter",
  4045. [(store_script_param, ":agent_id", 1),
  4046.  
  4047. (try_begin),
  4048. (neg|multiplayer_is_dedicated_server),
  4049. (multiplayer_get_my_player, ":my_player_id"),
  4050. (is_between, ":my_player_id", 0, max_num_players),
  4051. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  4052. (eq, ":my_agent_id", ":agent_id"),
  4053. (store_mission_timer_a, "$g_respawn_start_time"),
  4054. (start_presentation, "prsnt_respawn_time_counter"),
  4055. (try_end),
  4056. ]),
  4057.  
  4058. ("scene_prop_play_sound", # server: send messages to clients to play a sound at the location of a scene prop, if their agent is nearby
  4059. [(store_script_param, ":instance_id", 1),
  4060. (store_script_param, ":sound_id", 2), # must be valid
  4061.  
  4062. (try_begin),
  4063. (gt, ":instance_id", -1),
  4064. (prop_instance_is_valid, ":instance_id"),
  4065. (prop_instance_get_position, pos60, ":instance_id"),
  4066. (val_lshift, ":sound_id", net_sound_shift), # pack instance id and sound id into one number
  4067. (le, ":instance_id", net_sound_mask),
  4068. (val_or, ":instance_id", ":sound_id"),
  4069. (is_between, ":instance_id", 0, net_value_upper_bound),
  4070. (try_for_agents, ":agent_id"),
  4071. (agent_is_active, ":agent_id"),
  4072. (agent_get_player_id, ":player_id", ":agent_id"),
  4073. (player_is_active, ":player_id"),
  4074. (agent_get_position, pos61, ":agent_id"),
  4075. (get_sq_distance_between_positions, ":sq_distance", pos60, pos61),
  4076. (le, ":sq_distance", sq(max_distance_to_play_sound)),
  4077. (multiplayer_send_int_to_player, ":player_id", server_event_scene_prop_play_sound, ":instance_id"),
  4078. (try_end),
  4079. (try_end),
  4080. ]),
  4081.  
  4082. ("hit_scene_prop_play_sound", # server: play a sound at a scene prop if hit with a ranged weapon, but play at the agent if hit in melee
  4083. [(store_script_param, ":agent_id", 1), # must be valid
  4084. (store_script_param, ":instance_id", 2),
  4085. (store_script_param, ":sound_id", 3), # must be valid
  4086.  
  4087. (agent_get_wielded_item, ":item_id", ":agent_id"),
  4088. (try_begin),
  4089. (gt, ":item_id", all_items_begin),
  4090. (item_get_type, ":item_type", ":item_id"),
  4091. (is_between, ":item_type", itp_type_bow, itp_type_thrown + 1),
  4092. (call_script, "script_scene_prop_play_sound", ":instance_id", ":sound_id"),
  4093. (else_try),
  4094. (agent_play_sound, ":agent_id", ":sound_id"),
  4095. (try_end),
  4096. ]),
  4097.  
  4098. ("play_sound_at_position", # server: send messages to clients to play a sound at the position stored in pos0, if their agent is nearby
  4099. [(store_script_param, ":sound_id", 1), # must be valid
  4100.  
  4101. (set_fixed_point_multiplier, 1),
  4102. (position_get_x, ":pos_x", pos0),
  4103. (position_get_y, ":pos_y", pos0),
  4104. (position_get_z, ":pos_z", pos0),
  4105. (set_fixed_point_multiplier, 100),
  4106. (val_add, ":pos_z", net_pack_3_value_upper_bound / 2),
  4107. (val_clamp, ":pos_x", 0, net_pack_3_value_upper_bound),
  4108. (val_clamp, ":pos_y", 0, net_pack_3_value_upper_bound),
  4109. (val_clamp, ":pos_z", 0, net_pack_3_value_upper_bound),
  4110. (assign, ":packed_position", ":pos_x"), # pack position x,y,z into one number
  4111. (val_lshift, ":pos_y", net_pack_3_shift_2),
  4112. (val_or, ":packed_position", ":pos_y"),
  4113. (val_lshift, ":pos_z", net_pack_3_shift_3),
  4114. (val_or, ":packed_position", ":pos_z"),
  4115. (try_for_agents, ":agent_id"),
  4116. (agent_is_active, ":agent_id"),
  4117. (agent_get_player_id, ":player_id", ":agent_id"),
  4118. (player_is_active, ":player_id"),
  4119. (agent_get_position, pos60, ":agent_id"),
  4120. (get_sq_distance_between_positions, ":sq_distance", pos0, pos60),
  4121. (le, ":sq_distance", sq(max_distance_to_play_sound)),
  4122. (multiplayer_send_2_int_to_player, ":player_id", server_event_play_sound_at_position, ":sound_id", ":packed_position"),
  4123. (try_end),
  4124. ]),
  4125.  
  4126. ("cf_check_enough_gold", # check if a player has enough gold before trying to perform whatever action was paid for, sending an error message if not
  4127. [(store_script_param, ":player_id", 1), # must be valid
  4128. (store_script_param, ":gold_cost", 2),
  4129.  
  4130. (player_get_gold, ":player_gold", ":player_id"),
  4131. (try_begin), # defensive check in case a large gold value has been corrupted by the server
  4132. (neg|multiplayer_is_server),
  4133. (gt, "$g_overflow_gold_value", max_correctly_displayed_gold),
  4134. (neq, ":player_gold", "$g_overflow_gold_value"),
  4135. (player_set_gold, ":player_gold", "$g_overflow_gold_value"),
  4136. (assign, ":player_gold", "$g_overflow_gold_value"),
  4137. (try_end),
  4138. (try_begin),
  4139. (lt, ":player_gold", ":gold_cost"),
  4140. (neq, "$g_game_type", "mt_no_money"),
  4141. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_dont_have_enough_money", preset_message_error),
  4142. (try_end),
  4143. (this_or_next|ge, ":player_gold", ":gold_cost"),
  4144. (eq, "$g_game_type", "mt_no_money"),
  4145. ]),
  4146.  
  4147. ("player_adjust_gold", # server: adjust player gold, sending large values manually that would overflow in the engine code, and playing an appropriate sound
  4148. [(store_script_param, ":player_id", 1), # must be valid
  4149. (store_script_param, ":gold_value", 2), # ignored if not positive
  4150. (store_script_param, ":add_abs_sub", 3), # -1 = subtract, 0 = set, 1 = add
  4151.  
  4152. (try_begin),
  4153. (neq, "$g_game_type", "mt_no_money"),
  4154. (ge, ":gold_value", 0),
  4155. (this_or_next|eq, ":add_abs_sub", 0),
  4156. (gt, ":gold_value", 0),
  4157. (player_get_gold, ":original_player_gold", ":player_id"),
  4158. (try_begin),
  4159. (gt, ":add_abs_sub", 0),
  4160. (store_add, ":player_gold", ":original_player_gold", ":gold_value"),
  4161. (assign, ":sound", "snd_money_received"),
  4162. (else_try),
  4163. (lt, ":add_abs_sub", 0),
  4164. (store_sub, ":player_gold", ":original_player_gold", ":gold_value"),
  4165. (assign, ":sound", "snd_money_paid"),
  4166. (else_try),
  4167. (assign, ":player_gold", ":gold_value"),
  4168. (assign, ":sound", -1),
  4169. (try_end),
  4170. (val_clamp, ":player_gold", 0, max_possible_gold),
  4171. (player_set_gold, ":player_id", ":player_gold"), # set gold before manually updating clients, so corrupted network messages don't overwrite the update
  4172. (try_begin),
  4173. (gt, ":player_gold", max_correctly_displayed_gold),
  4174. (multiplayer_send_int_to_player, ":player_id", server_event_set_overflow_gold, ":player_gold"),
  4175. (else_try),
  4176. (gt, ":original_player_gold", max_correctly_displayed_gold),
  4177. (multiplayer_send_message_to_player, ":player_id", server_event_set_overflow_gold),
  4178. (try_end),
  4179. (try_begin),
  4180. (gt, ":sound", -1),
  4181. (player_get_agent_id, ":agent_id", ":player_id"),
  4182. (gt, ":agent_id", -1),
  4183. (agent_is_alive, ":agent_id"),
  4184. (agent_play_sound, ":agent_id", ":sound"),
  4185. (try_end),
  4186. (try_end),
  4187. ]),
  4188.  
  4189. ("scene_prop_get_multiplier", # calculate the price multiplier from value 1 of a scene prop, returning in reg2
  4190. [(store_script_param, ":instance_id", 1), # must be valid
  4191.  
  4192. (prop_instance_get_variation_id, ":multiplier_no", ":instance_id"),
  4193. (val_div, ":multiplier_no", 10),
  4194. (try_begin),
  4195. (eq, ":multiplier_no", 0),
  4196. (assign, reg2, 100),
  4197. (else_try),
  4198. (try_begin),
  4199. (is_between, ":multiplier_no", 1, 5),
  4200. (store_mul, reg2, ":multiplier_no", 20),
  4201. (else_try),
  4202. (is_between, ":multiplier_no", 5, 10),
  4203. (store_add, reg2, ":multiplier_no", 1),
  4204. (val_mul, reg2, 20),
  4205. (else_try),
  4206. (eq, ":multiplier_no", 10),
  4207. (assign, reg2, 350),
  4208. (else_try),
  4209. (eq, ":multiplier_no", 11),
  4210. (assign, reg2, 500),
  4211. (else_try),
  4212. (eq, ":multiplier_no", 12),
  4213. (assign, reg2, 1000),
  4214. (try_end),
  4215. (try_end),
  4216. ]),
  4217.  
  4218. ("scene_prop_get_gold_value", # calculate the gold value and multiplier associated with a scene prop, caching for faster use later, storing in reg0 and reg1
  4219. [(store_script_param, ":instance_id", 1), # must be valid
  4220. (store_script_param, ":item_id", 2), # if invalid, set the base value below
  4221. (store_script_param, ":base_value_multiplier", 3), # the base value if the item id is not valid, otherwise an extra multiplier applied from module system code
  4222.  
  4223. (try_begin),
  4224. (eq, "$g_game_type", "mt_no_money"),
  4225. (assign, ":value", 0),
  4226. (assign, ":multiplier", 0),
  4227. (else_try),
  4228. (eq, "$g_game_type", "mt_feudalism"),
  4229. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_resource_stockpile, 1),
  4230. (assign, ":value", 0),
  4231. (assign, ":multiplier", 0),
  4232. (else_try),
  4233. (scene_prop_get_slot, ":value", ":instance_id", slot_scene_prop_gold_value),
  4234. (eq, ":value", 0), # not already cached: calculate the value by applying the multipliers
  4235. (try_begin),
  4236. (gt, ":item_id", -1),
  4237. (store_item_value, ":base_value", ":item_id"),
  4238. (try_begin),
  4239. (gt, ":base_value_multiplier", 0),
  4240. (val_mul, ":base_value", ":base_value_multiplier"),
  4241. (val_div, ":base_value", 100),
  4242. (try_end),
  4243. (else_try),
  4244. (assign, ":base_value", ":base_value_multiplier"),
  4245. (try_end),
  4246. (gt, ":base_value", 0),
  4247. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4248. (assign, ":multiplier", reg2),
  4249. (try_begin),
  4250. (eq, ":multiplier", 100),
  4251. (assign, ":value", ":base_value"),
  4252. (else_try),
  4253. (store_mul, ":value", ":base_value", ":multiplier"),
  4254. (val_div, ":value", 100),
  4255. (val_max, ":value", 1),
  4256. (try_end),
  4257. (scene_prop_get_slot, ":scene_prop_multiplier", ":instance_id", slot_scene_prop_gold_multiplier),
  4258. (try_begin),
  4259. (gt, ":scene_prop_multiplier", 0),
  4260. (val_mul, ":multiplier", ":scene_prop_multiplier"),
  4261. (val_div, ":multiplier", 100),
  4262. (val_mul, ":value", ":scene_prop_multiplier"),
  4263. (val_div, ":value", 100),
  4264. (val_max, ":value", 1),
  4265. (try_end),
  4266. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_value, ":value"),
  4267. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_multiplier, ":multiplier"),
  4268. (else_try), # otherwise used cached values
  4269. (scene_prop_get_slot, ":multiplier", ":instance_id", slot_scene_prop_gold_multiplier),
  4270. (try_end),
  4271. (assign, reg0, ":value"),
  4272. (assign, reg1, ":multiplier"),
  4273. ]),
  4274.  
  4275. ("calculate_local_resource_price_multiplier", # only called by scene_prop_calculate_resource_refund_cost to calculate the effect of price areas at pos40, returning multiplier in reg2
  4276. [(store_script_param, ":price_area_scene_prop_id", 1), # must be a scene prop id (kind)
  4277. (store_script_param, ":price_area_count", 2), # must be the result of calling scene_prop_get_num_instances for the above scene prop id
  4278.  
  4279. (try_begin), # if there is only only one price area of this type, use it for the entire scene
  4280. (eq, ":price_area_count", 1),
  4281. (scene_prop_get_instance, ":instance_id", ":price_area_scene_prop_id", 0),
  4282. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4283. (else_try), # if there are multiple price areas, try find the closest enclosing area, or interpolate
  4284. (gt, ":price_area_count", 1),
  4285. (assign, ":price_multiplier", 0),
  4286. (set_fixed_point_multiplier, 100),
  4287. (assign, ":closest_distance_inside", 1000000),
  4288. (assign, ":inside_area_multiplier", -1),
  4289. (assign, ":proportional_factor_sum", 0),
  4290. (try_for_range, ":instance_no", 0, ":price_area_count"),
  4291. (scene_prop_get_instance, ":instance_id", ":price_area_scene_prop_id", ":instance_no"),
  4292. (prop_instance_get_position, pos41, ":instance_id"),
  4293. (position_set_z, pos41, 0),
  4294. (get_distance_between_positions, ":current_distance", pos40, pos41),
  4295. (prop_instance_get_scale, pos42, ":instance_id"),
  4296. (position_get_scale_x, ":current_area_radius", pos42),
  4297. (val_mul, ":current_area_radius", 100),
  4298. (try_begin), # try find the closest area that the position is inside
  4299. (lt, ":current_distance", ":closest_distance_inside"),
  4300. (lt, ":current_distance", ":current_area_radius"),
  4301. (assign, ":closest_distance_inside", ":current_distance"),
  4302. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4303. (assign, ":inside_area_multiplier", reg2),
  4304. (else_try), # otherwise store the distances to the edge of each price area in the scene, for later calculation
  4305. (eq, ":inside_area_multiplier", -1), # skip if inside at least one area
  4306. (store_sub, ":distance_from_area_edge", ":current_distance", ":current_area_radius"),
  4307. (val_div, ":distance_from_area_edge", 1000),
  4308. (val_max, ":distance_from_area_edge", 1),
  4309. (store_div, ":proportional_factor", 1000, ":distance_from_area_edge"),
  4310. (troop_set_slot, "trp_temp_array", ":instance_no", ":instance_id"),
  4311. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_multiplier, ":proportional_factor"),
  4312. (val_add, ":proportional_factor_sum", ":proportional_factor"),
  4313. (try_end),
  4314. (try_end),
  4315. (try_begin), # if inside an area, use that price multiplier
  4316. (neq, ":inside_area_multiplier", -1),
  4317. (assign, ":price_multiplier", ":inside_area_multiplier"),
  4318. (else_try), # otherwise finish interpolating the price multiplier between all areas, after distance proportions can be calculated
  4319. (try_for_range, ":instance_no", 0, ":price_area_count"), # finish interpolating the price multiplier, after proportions of the total can be calculated
  4320. (troop_get_slot, ":instance_id", "trp_temp_array", ":instance_no"),
  4321. (scene_prop_get_slot, ":normalized_proportional_factor", ":instance_id", slot_scene_prop_gold_multiplier),
  4322. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_multiplier, 0), # reset the slot after using it as temporary storage
  4323. (val_mul, ":normalized_proportional_factor", 1000),
  4324. (val_div, ":normalized_proportional_factor", ":proportional_factor_sum"),
  4325. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4326. (store_mul, ":proportional_multiplier", reg2, ":normalized_proportional_factor"),
  4327. (val_add, ":price_multiplier", ":proportional_multiplier"),
  4328. (try_end),
  4329. (val_div, ":price_multiplier", 1000),
  4330. (try_end),
  4331. (assign, reg2, ":price_multiplier"),
  4332. (try_end),
  4333. ]),
  4334.  
  4335. ("scene_prop_calculate_resource_refund_cost", # calculate the cost of crafting resources associated with a scene prop, caching for faster use later, returning cost in reg1
  4336. [(store_script_param, ":instance_id", 1), # must be valid
  4337.  
  4338. (scene_prop_get_num_instances, ":local_wood_price_areas", "spr_pw_local_wood_price_area"),
  4339. (scene_prop_get_num_instances, ":local_iron_price_areas", "spr_pw_local_iron_price_area"),
  4340. (scene_prop_get_num_instances, ":local_cloth_price_areas", "spr_pw_local_cloth_price_area"),
  4341. (scene_prop_get_num_instances, ":local_leather_price_areas", "spr_pw_local_leather_price_area"),
  4342. (scene_prop_get_num_instances, ":local_precious_price_areas", "spr_pw_local_precious_price_area"),
  4343. (try_begin), # if there are no areas in the scene, use the precalculated default cost
  4344. (eq, ":local_wood_price_areas", 0),
  4345. (eq, ":local_iron_price_areas", 0),
  4346. (eq, ":local_cloth_price_areas", 0),
  4347. (eq, ":local_leather_price_areas", 0),
  4348. (eq, ":local_precious_price_areas", 0),
  4349. (scene_prop_get_slot, ":resource_refund_cost", ":instance_id", slot_scene_prop_resources_default_cost),
  4350. (else_try), # otherwise calculate the local prices of the required resource types, resulting in a cost to refund the resources for crafting the item at this stockpile position
  4351. (assign, ":resource_refund_cost", 0),
  4352. (assign, ":local_wood_price_multiplier", -1),
  4353. (assign, ":local_iron_price_multiplier", -1),
  4354. (assign, ":local_cloth_price_multiplier", -1),
  4355. (assign, ":local_leather_price_multiplier", -1),
  4356. (assign, ":local_precious_price_multiplier", -1),
  4357. (set_fixed_point_multiplier, 100),
  4358. (prop_instance_get_position, pos40, ":instance_id"),
  4359. (position_set_z, pos40, 0),
  4360. (try_for_range, ":resource_slot", slot_scene_prop_crafting_resource_1, slot_scene_prop_crafting_resource_4 + 1),
  4361. (scene_prop_get_slot, ":resource_item_id", ":instance_id", ":resource_slot"),
  4362. (ge, ":resource_item_id", all_items_begin),
  4363. (assign, reg2, 0),
  4364. (item_get_slot, ":item_class", ":resource_item_id", slot_item_class),
  4365. (try_begin),
  4366. lazy.block([
  4367. lazy.block([
  4368. (eq, ":item_class", item_class),
  4369. (try_begin),
  4370. (eq, local_price_multiplier_var, -1),
  4371. (call_script, "script_calculate_local_resource_price_multiplier", spr_local_price_area, local_price_count_var),
  4372. (assign, local_price_multiplier_var, reg2),
  4373. (else_try),
  4374. (assign, reg2, local_price_multiplier_var),
  4375. (try_end),
  4376. (else_try)]) for item_class, local_price_multiplier_var, spr_local_price_area, local_price_count_var in
  4377. [(item_class_wood, ":local_wood_price_multiplier", "spr_pw_local_wood_price_area", ":local_wood_price_areas"),
  4378. (item_class_iron, ":local_iron_price_multiplier", "spr_pw_local_iron_price_area", ":local_iron_price_areas"),
  4379. (item_class_cloth,":local_cloth_price_multiplier", "spr_pw_local_cloth_price_area", ":local_cloth_price_areas"),
  4380. (item_class_leather,":local_leather_price_multiplier", "spr_pw_local_leather_price_area", ":local_leather_price_areas"),
  4381. (item_class_precious,":local_precious_price_multiplier", "spr_pw_local_precious_price_area", ":local_precious_price_areas"),
  4382. ]
  4383. ]),
  4384. (try_end),
  4385. (store_item_value, ":item_cost", ":resource_item_id"),
  4386. (try_begin),
  4387. (gt, reg2, 0),
  4388. (val_mul, ":item_cost", reg2),
  4389. (val_div, ":item_cost", 100),
  4390. (try_end),
  4391. (val_add, ":resource_refund_cost", ":item_cost"),
  4392. (try_end),
  4393. (try_end),
  4394. (scene_prop_set_slot, ":instance_id", slot_scene_prop_resource_refund_cost, ":resource_refund_cost"),
  4395. (assign, reg1, ":resource_refund_cost"),
  4396. ]),
  4397.  
  4398. ("scene_setup_factions_castles", # server: at mission start, for each faction set whether active, and for each castle set owning faction, whether active, and whether it has training stations
  4399. [
  4400. (assign, ":current_faction", castle_factions_begin),
  4401. (try_for_range, ":current_castle_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4402. (troop_set_slot, "trp_mission_data", ":current_castle_slot", ":current_faction"),
  4403. (val_add, ":current_faction", 1),
  4404. (try_begin),
  4405. (eq, ":current_faction", factions_end),
  4406. (assign, ":current_faction", castle_factions_begin),
  4407. (try_end),
  4408. (try_end),
  4409. (faction_set_slot, "fac_commoners", slot_faction_is_active, 1),
  4410. (faction_set_slot, "fac_outlaws", slot_faction_is_active, 1),
  4411. (scene_prop_get_num_instances, ":pole_num", "spr_pw_castle_capture_point"),
  4412. (try_for_range, ":pole_no", 0, ":pole_num"),
  4413. (scene_prop_get_instance, ":instance_id", "spr_pw_castle_capture_point", ":pole_no"),
  4414. (prop_instance_get_variation_id_2, ":capture_type", ":instance_id"),
  4415. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4416. (try_begin),
  4417. (neq, ":capture_type", capture_point_type_primary),
  4418. (scene_prop_set_slot, ":instance_id", slot_scene_prop_capture_faction_id, reg0),
  4419. (else_try),
  4420. (faction_set_slot, reg0, slot_faction_is_active, 1),
  4421. (gt, reg1, -1),
  4422. (val_add, reg1, slot_mission_data_castle_is_active_begin),
  4423. (troop_set_slot, "trp_mission_data", reg1, 1),
  4424. (try_end),
  4425. (try_end),
  4426. (assign, "$g_scene_num_castle_factions", 0),
  4427. (try_for_range, ":faction_id", castle_factions_begin, factions_end),
  4428. (faction_slot_eq, ":faction_id", slot_faction_is_active, 1),
  4429. (val_add, "$g_scene_num_castle_factions", 1),
  4430. (try_end),
  4431. (try_for_range, ":slot", slot_mission_data_castle_allows_training_begin, slot_mission_data_castle_allows_training_end),
  4432. (troop_set_slot, "trp_mission_data", ":slot", 0),
  4433. (try_end),
  4434. (try_for_range, ":scene_prop_id", "spr_pw_change_troop_peasant", "spr_pw_change_troop_mercenary"),
  4435. (scene_prop_get_num_instances, ":num_instances", ":scene_prop_id"),
  4436. (try_for_range, ":instance_no", 0, ":num_instances"),
  4437. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  4438. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4439. (gt, reg1, -1),
  4440. (store_add, ":castle_is_active_slot", slot_mission_data_castle_is_active_begin, reg1),
  4441. (troop_slot_eq, "trp_mission_data", ":castle_is_active_slot", 1),
  4442. (val_add, reg1, slot_mission_data_castle_allows_training_begin),
  4443. (troop_set_slot, "trp_mission_data", reg1, 1),
  4444. (try_end),
  4445. (try_end),
  4446. (call_script, "script_setup_castle_names"),
  4447. ]),
  4448.  
  4449. ("cf_castle_is_active",
  4450. [(store_script_param, ":castle_no", 1),
  4451.  
  4452. (is_between, ":castle_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4453. (val_add, ":castle_no", slot_mission_data_castle_is_active_begin),
  4454. (troop_slot_eq, "trp_mission_data", ":castle_no", 1),
  4455. ]),
  4456.  
  4457. ("capture_castle", # server: perform capture of the castle by the faction, without checking anything
  4458. [(store_script_param, ":faction_id", 1),
  4459. (store_script_param, ":castle_no", 2),
  4460.  
  4461. (try_begin),
  4462. (is_between, ":faction_id", castle_factions_begin, factions_end),
  4463. (call_script, "script_cf_castle_is_active", ":castle_no"),
  4464. (troop_set_slot, "trp_mission_data", ":castle_no", ":faction_id"),
  4465. (get_max_players, ":num_players"),
  4466. (try_for_range, ":player_id", 1, ":num_players"),
  4467. (player_is_active, ":player_id"),
  4468. (multiplayer_send_3_int_to_player, ":player_id", server_event_troop_set_slot, "trp_mission_data", ":castle_no", ":faction_id"),
  4469. (try_end),
  4470. (call_script, "script_redraw_castle_banners", redraw_castle_banners, ":castle_no"),
  4471. (try_end),
  4472. ]),
  4473.  
  4474. ("cf_use_capture_point", # server: after an agent uses a capture point scene prop, capture the castle if checks succeed
  4475. [(store_script_param, ":agent_id", 1), # must be valid
  4476. (store_script_param, ":instance_id", 2), # must be valid
  4477. (store_script_param, ":completed", 3), # 1 if completed using the scene prop
  4478.  
  4479. (agent_get_player_id, ":player_id", ":agent_id"),
  4480. (player_is_active, ":player_id"),
  4481. (this_or_next|neq, ":completed", 1),
  4482. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_disabled, ":player_id"), # player started using when not hostile
  4483. (scene_prop_set_slot, ":instance_id", slot_scene_prop_disabled, 0),
  4484. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  4485. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4486. (assign, ":faction_id", reg0),
  4487. (assign, ":castle_no", reg1),
  4488. (gt, ":castle_no", -1),
  4489. (prop_instance_get_variation_id_2, ":capture_type", ":instance_id"),
  4490. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  4491. (try_begin), # capturing a hostile point with own faction's banner
  4492. (neq, ":faction_id", ":player_faction_id"),
  4493. (troop_get_slot, ":castle_owning_faction_id", "trp_mission_data", ":castle_no"),
  4494. (try_begin),
  4495. (eq, ":castle_owning_faction_id", ":player_faction_id"), # allow capturing back secondary points belonging to the castle even when at peace
  4496. (else_try),
  4497. (call_script, "script_cf_factions_are_hostile", ":faction_id", ":player_faction_id"),
  4498. (else_try),
  4499. (assign, ":castle_no", -1),
  4500. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_your_faction_not_hostile_to_s1", preset_message_faction|preset_message_fail_sound, ":faction_id"),
  4501. (try_begin),
  4502. (neq, ":completed", 1),
  4503. (scene_prop_set_slot, ":instance_id", slot_scene_prop_disabled, ":player_id"), # disable capturing if factions are not hostile at start of use
  4504. (try_end),
  4505. (try_end),
  4506. (gt, ":castle_no", -1),
  4507. (faction_get_slot, ":banner_item_id", ":player_faction_id", slot_faction_banner_mesh),
  4508. (val_sub, ":banner_item_id", banner_meshes_begin),
  4509. (val_add, ":banner_item_id", banner_items_begin),
  4510. (eq, ":wielded_item_id", ":banner_item_id"),
  4511. (item_get_slot, ":difficulty", ":wielded_item_id", slot_item_difficulty),
  4512. (agent_get_troop_id, ":troop_id", ":agent_id"),
  4513. (store_attribute_level, ":strength", ":troop_id", ca_strength),
  4514. (ge, ":strength", ":difficulty"),
  4515. (try_begin), # when capturing a primary point, check whether the required secondary points have been captured
  4516. (eq, ":capture_type", capture_point_type_primary),
  4517. (assign, ":type_secondary_all_check_result", -1),
  4518. (assign, ":type_secondary_one_check_result", -1),
  4519. (scene_prop_get_num_instances, ":pole_num", "spr_pw_castle_capture_point"),
  4520. (try_for_range, ":pole_no", 0, ":pole_num"),
  4521. (scene_prop_get_instance, ":other_instance_id", "spr_pw_castle_capture_point", ":pole_no"),
  4522. (prop_instance_get_variation_id_2, ":other_capture_type", ":other_instance_id"),
  4523. (neq, ":other_capture_type", capture_point_type_primary),
  4524. (call_script, "script_scene_prop_get_owning_faction", ":other_instance_id"),
  4525. (eq, reg1, ":castle_no"),
  4526. (try_begin),
  4527. (eq, ":other_capture_type", capture_point_type_secondary_all),
  4528. (try_begin),
  4529. (neq, reg0, ":player_faction_id"),
  4530. (assign, ":type_secondary_all_check_result", 0),
  4531. (assign, ":pole_num", 0),
  4532. (try_end),
  4533. (else_try),
  4534. (eq, ":other_capture_type", capture_point_type_secondary_one),
  4535. (try_begin),
  4536. (neq, reg0, ":player_faction_id"),
  4537. (val_max, ":type_secondary_one_check_result", 0),
  4538. (else_try),
  4539. (assign, ":type_secondary_one_check_result", 1),
  4540. (try_end),
  4541. (try_end),
  4542. (try_end),
  4543. (try_begin),
  4544. (neq, ":type_secondary_all_check_result", 0),
  4545. (neq, ":type_secondary_one_check_result", 0),
  4546. (try_begin),
  4547. (eq, ":completed", 1),
  4548. (call_script, "script_cf_agent_consume_item", ":agent_id", ":banner_item_id", 1),
  4549. (call_script, "script_capture_castle", ":player_faction_id", ":castle_no"),
  4550. (try_end),
  4551. (else_try),
  4552. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_your_faction_not_captured_required_points", preset_message_faction|preset_message_fail_sound, ":player_faction_id"),
  4553. (try_end),
  4554. (else_try), # capturing a single secondary point
  4555. (eq, ":completed", 1),
  4556. (is_between, ":capture_type", capture_point_type_secondary_all, capture_point_type_secondary_one + 1),
  4557. (call_script, "script_cf_agent_consume_item", ":agent_id", ":banner_item_id", 1),
  4558. (scene_prop_set_slot, ":instance_id", slot_scene_prop_capture_faction_id, ":player_faction_id"),
  4559. (call_script, "script_redraw_castle_banners", redraw_single_capture_point_banner, ":instance_id"),
  4560. (try_end),
  4561. (else_try), # as lord, giving away an owned castle using the other faction's banner
  4562. (eq, ":completed", 1),
  4563. (eq, ":faction_id", ":player_faction_id"),
  4564. (eq, ":capture_type", capture_point_type_primary),
  4565. (call_script, "script_cf_player_is_lord", ":player_id"),
  4566. (assign, ":loop_end", factions_end),
  4567. (try_for_range, ":other_faction_id", castle_factions_begin, ":loop_end"),
  4568. (neq, ":other_faction_id", ":player_faction_id"),
  4569. (faction_get_slot, ":banner_item_id", ":other_faction_id", slot_faction_banner_mesh),
  4570. (val_sub, ":banner_item_id", banner_meshes_begin),
  4571. (val_add, ":banner_item_id", banner_items_begin),
  4572. (eq, ":wielded_item_id", ":banner_item_id"),
  4573. (assign, ":loop_end", -1),
  4574. (try_end),
  4575. (eq, ":loop_end", -1),
  4576. (call_script, "script_cf_agent_consume_item", ":agent_id", ":banner_item_id", 1),
  4577. (call_script, "script_capture_castle", ":other_faction_id", ":castle_no"),
  4578. (else_try),
  4579. (assign, ":castle_no", -1),
  4580. (try_end),
  4581. (gt, ":castle_no", -1),
  4582. ]),
  4583.  
  4584. ("cf_victory_condition_met", # server: check if a victory condition for the mission has been met; if so, reg0 = victorious faction id
  4585. [
  4586. (ge, "$g_victory_condition", 1),
  4587. (assign, ":last_owner_faction", -1),
  4588. (assign, ":loop_end", slot_mission_data_castle_owner_faction_end),
  4589. (try_for_range, ":castle_no", slot_mission_data_castle_owner_faction_begin, ":loop_end"),
  4590. (store_add, ":castle_active_slot", ":castle_no", slot_mission_data_castle_is_active_begin),
  4591. (troop_slot_eq, "trp_mission_data", ":castle_active_slot", 1),
  4592. (troop_get_slot, ":owner_faction", "trp_mission_data", ":castle_no"),
  4593. (try_begin),
  4594. (neq, ":last_owner_faction", -1),
  4595. (neq, ":owner_faction", ":last_owner_faction"),
  4596. (assign, ":loop_end", -1),
  4597. (try_end),
  4598. (assign, ":last_owner_faction", ":owner_faction"),
  4599. (try_end),
  4600. (neq, ":loop_end", -1),
  4601. (assign, reg0, ":owner_faction"),
  4602. ]),
  4603.  
  4604. ("redraw_castle_banners", # redraw heraldic banner tableaus using various tricks
  4605. [(store_script_param, ":redraw_type", 1), # constants starting with redraw_
  4606. (store_script_param, ":value", 2), # castle number, faction id, or instance id, depending on redraw_type
  4607.  
  4608. (try_begin),
  4609. (this_or_next|eq, ":redraw_type", redraw_all_banners),
  4610. (eq, ":redraw_type", redraw_client_banner_positions),
  4611. (else_try),
  4612. (eq, ":redraw_type", redraw_castle_banners),
  4613. (is_between, ":value", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4614. (else_try),
  4615. (eq, ":redraw_type", redraw_faction_banners),
  4616. (is_between, ":value", castle_factions_begin, factions_end),
  4617. (else_try),
  4618. (eq, ":redraw_type", redraw_single_capture_point_banner),
  4619. (prop_instance_is_valid, ":value"),
  4620. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":value"),
  4621. (eq, ":scene_prop_id", "spr_pw_castle_capture_point"),
  4622. (scene_prop_get_slot, ":faction_id", ":value", slot_scene_prop_capture_faction_id),
  4623. (call_script, "script_redraw_castle_banner_instance", ":redraw_type", ":value", ":scene_prop_id", ":faction_id", "itm_pw_banner_castle_fac_1a"),
  4624. (assign, ":redraw_type", -1),
  4625. (else_try),
  4626. (assign, ":redraw_type", -1),
  4627. (try_end),
  4628. (try_begin),
  4629. (gt, ":redraw_type", -1),
  4630. (try_begin),
  4631. (eq, ":redraw_type", redraw_faction_banners),
  4632. (faction_get_slot, ":banner_variant", ":value", slot_faction_castle_banner_variant),
  4633. (val_add, ":banner_variant", 1), # change to the other banner variant to force the engine to redraw the tableaus with the new texture
  4634. (val_mod, ":banner_variant", 2),
  4635. (faction_set_slot, ":value", slot_faction_castle_banner_variant, ":banner_variant"),
  4636. (try_end),
  4637. (call_script, "script_redraw_castle_banner_kind", ":redraw_type", ":value", "spr_pw_castle_capture_point", "itm_pw_banner_castle_fac_1a"),
  4638. (call_script, "script_redraw_castle_banner_kind", ":redraw_type", ":value", "spr_pw_castle_wall_banner", "itm_pw_banner_wall_fac_1a"),
  4639. (try_end),
  4640. ]),
  4641.  
  4642. ("redraw_castle_banner_kind", # redraw heraldic banners of a certain scene prop kind
  4643. [(store_script_param, ":redraw_type", 1), # constants starting with redraw_
  4644. (store_script_param, ":value", 2), # castle number or faction id, depending on redraw_type
  4645. (store_script_param, ":pole_scene_prop_id", 3), # scene prop kind of the banner's pole
  4646. (store_script_param, ":begin_item_id", 4), # beginning item in the range to use for the banners
  4647.  
  4648. (set_fixed_point_multiplier, 100),
  4649. (scene_prop_get_num_instances, ":pole_count", ":pole_scene_prop_id"),
  4650. (try_for_range, ":pole_no", 0, ":pole_count"),
  4651. (scene_prop_get_instance, ":pole_instance_id", ":pole_scene_prop_id", ":pole_no"),
  4652. (call_script, "script_scene_prop_get_owning_faction", ":pole_instance_id"),
  4653. (try_begin),
  4654. (this_or_next|eq, ":redraw_type", redraw_all_banners),
  4655. (eq, ":redraw_type", redraw_client_banner_positions),
  4656. (else_try),
  4657. (eq, ":redraw_type", redraw_castle_banners),
  4658. (prop_instance_get_variation_id_2, ":capture_type", ":pole_instance_id"),
  4659. (eq, ":capture_type", capture_point_type_primary),
  4660. (eq, reg1, ":value"),
  4661. (else_try),
  4662. (eq, ":redraw_type", redraw_faction_banners),
  4663. (eq, reg0, ":value"),
  4664. (else_try),
  4665. (assign, reg1, -1),
  4666. (try_end),
  4667. (gt, reg1, -1),
  4668. (call_script, "script_redraw_castle_banner_instance", ":redraw_type", ":pole_instance_id", ":pole_scene_prop_id", reg0, ":begin_item_id"),
  4669. (try_end),
  4670. ]),
  4671.  
  4672. ("redraw_castle_banner_instance", # redraw heraldic banners of a certain scene prop kind
  4673. [(store_script_param, ":redraw_type", 1), # constants starting with redraw_
  4674. (store_script_param, ":pole_instance_id", 2), # must be valid
  4675. (store_script_param, ":pole_scene_prop_id", 3), # scene prop kind of the banner's pole
  4676. (store_script_param, ":faction_id", 4), # must be valid
  4677. (store_script_param, ":begin_item_id", 5), # beginning item in the range to use for the banners
  4678.  
  4679. (faction_get_slot, ":banner_item_id", ":faction_id", slot_faction_castle_banner_variant),
  4680. (val_mul, ":banner_item_id", max_castle_count),
  4681. (val_add, ":banner_item_id", ":faction_id"),
  4682. (val_sub, ":banner_item_id", castle_factions_begin),
  4683. (val_add, ":banner_item_id", ":begin_item_id"),
  4684. (prop_instance_get_position, pos2, ":pole_instance_id"),
  4685. (try_begin),
  4686. (neq, ":redraw_type", redraw_client_banner_positions),
  4687. (scene_prop_get_slot, ":old_banner_instance_id", ":pole_instance_id", slot_scene_prop_linked_scene_prop),
  4688. (gt, ":old_banner_instance_id", 0), # remove the old banner item, if any
  4689. (prop_instance_is_valid, ":old_banner_instance_id"),
  4690. (prop_instance_get_scene_prop_kind, ":scene_prop_item_id", ":old_banner_instance_id"),
  4691. (store_add, ":end_item_id", ":begin_item_id", max_castle_count * 2),
  4692. (is_between, ":scene_prop_item_id", ":begin_item_id", ":end_item_id"),
  4693. (scene_prop_set_prune_time, ":old_banner_instance_id", 0),
  4694. (else_try),
  4695. (eq, ":redraw_type", redraw_client_banner_positions),
  4696. (position_get_z, ":pole_z", pos2),
  4697. (assign, ":continue", 2), # check over all banner items to see if any are at the same location with a different height, a glitch caused by the engine after connecting
  4698. (try_for_range, ":unused", 0, ":continue"),
  4699. (scene_spawned_item_get_num_instances, ":banner_count", ":banner_item_id"),
  4700. (try_for_range, ":banner_no", 0, ":banner_count"),
  4701. (scene_spawned_item_get_instance, ":banner_instance_id", ":banner_item_id", ":banner_no"),
  4702. (prop_instance_get_position, pos4, ":banner_instance_id"),
  4703. (position_set_z, pos4, ":pole_z"),
  4704. (get_sq_distance_between_positions, ":sq_distance", pos2, pos4),
  4705. (lt, ":sq_distance", 5),
  4706. (assign, ":banner_count", -1),
  4707. (assign, ":continue", -1),
  4708. (try_end),
  4709. (val_add, ":banner_item_id", max_castle_count),
  4710. (try_end),
  4711. (try_end),
  4712. (try_begin), # move capture point banners to the top of the pole
  4713. (eq, ":pole_scene_prop_id", "spr_pw_castle_capture_point"),
  4714. (prop_instance_get_scale, pos3, ":pole_instance_id"),
  4715. (position_get_scale_z, ":banner_height", pos3),
  4716. (val_mul, ":banner_height", 10),
  4717. (position_move_z, pos2, ":banner_height"),
  4718. (position_move_y, pos2, 11),
  4719. (try_end),
  4720. (try_begin),
  4721. (neq, ":redraw_type", redraw_client_banner_positions),
  4722. (set_spawn_position, pos2),
  4723. (spawn_item, ":banner_item_id", 0, 60 * 60 * 24 * 7 + 1), # spawn the new banner item for up to a week
  4724. (scene_prop_set_slot, ":pole_instance_id", slot_scene_prop_linked_scene_prop, reg0),
  4725. (prop_instance_set_position, reg0, pos2),
  4726. (else_try),
  4727. (eq, ":redraw_type", redraw_client_banner_positions),
  4728. (eq, ":banner_count", -1),
  4729. (prop_instance_set_position, ":banner_instance_id", pos2),
  4730. (try_end),
  4731. ]),
  4732.  
  4733. ("setup_castle_names", # check for linked sign posts to name a castle by, caching the string ids
  4734. [
  4735. (try_for_range, ":name_slot", slot_mission_data_castle_name_string_begin, slot_mission_data_castle_name_string_end),
  4736. (troop_set_slot, "trp_mission_data", ":name_slot", 0),
  4737. (try_end),
  4738. (scene_prop_get_num_instances, ":sign_num", "spr_pw_castle_sign"),
  4739. (try_for_range, ":sign_no", 0, ":sign_num"),
  4740. (scene_prop_get_instance, ":instance_id", "spr_pw_castle_sign", ":sign_no"),
  4741. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4742. (is_between, reg1, slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4743. (store_add, ":name_slot", reg1, slot_mission_data_castle_name_string_begin),
  4744. (troop_slot_eq, "trp_mission_data", ":name_slot", 0),
  4745. (prop_instance_get_variation_id_2, ":name_string_id", ":instance_id"),
  4746. (val_add, ":name_string_id", castle_names_begin),
  4747. (try_begin),
  4748. (is_between, ":name_string_id", castle_names_begin, castle_names_end),
  4749. (assign, ":loop_end", slot_mission_data_castle_name_string_end),
  4750. (try_for_range, ":other_name_slot", slot_mission_data_castle_name_string_begin, ":loop_end"),
  4751. (neq, ":other_name_slot", ":name_slot"),
  4752. (troop_slot_eq, "trp_mission_data", ":other_name_slot", ":name_string_id"),
  4753. (assign, ":loop_end", -1),
  4754. (try_end),
  4755. (neq, ":loop_end", -1),
  4756. (else_try),
  4757. (assign, ":name_string_id", castle_names_end),
  4758. (try_end),
  4759. (troop_set_slot, "trp_mission_data", ":name_slot", ":name_string_id"),
  4760. (try_end),
  4761. ]),
  4762.  
  4763. ("str_store_castle_name", # store a castle's name in the passed string register
  4764. [(store_script_param, ":output_castle_name", 1), # the string register to store in
  4765. (store_script_param, ":castle_no", 2),
  4766.  
  4767. (try_begin),
  4768. (is_between, ":castle_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4769. (val_add, ":castle_no", slot_mission_data_castle_name_string_begin),
  4770. (troop_get_slot, ":name_string_id", "trp_mission_data", ":castle_no"),
  4771. (is_between, ":name_string_id", castle_names_begin, castle_names_end),
  4772. (str_store_string, ":output_castle_name", ":name_string_id"),
  4773. (else_try),
  4774. (str_store_string, ":output_castle_name", castle_names_end),
  4775. (try_end),
  4776. ]),
  4777.  
  4778. ("setup_castle_money_chests", # check for linked money chests for each castle, caching the instance ids
  4779. [
  4780. (try_for_range, ":chest_slot", slot_mission_data_castle_money_chest_begin, slot_mission_data_castle_money_chest_end),
  4781. (troop_set_slot, "trp_mission_data", ":chest_slot", 0),
  4782. (try_end),
  4783. (try_for_range, ":interest_slot", slot_mission_data_interest_box_begin,slot_mission_data_interest_box_end), #RAMARAUNT ADD TRY LOOP
  4784. (troop_set_slot, "trp_mission_data", ":interest_slot", 0),
  4785. (try_end),
  4786. (try_begin),
  4787. (neq, "$g_game_type", "mt_no_money"),
  4788. (scene_prop_get_num_instances, ":chest_num", "spr_pw_castle_money_chest"),
  4789. (scene_prop_get_num_instances, ":ledger_num", "spr_pws_castle_faction_interest_ledger"),
  4790. (try_for_range, ":chest_no", 0, ":chest_num"),
  4791. (scene_prop_get_instance, ":instance_id", "spr_pw_castle_money_chest", ":chest_no"),
  4792. (scene_prop_set_slot, ":instance_id", slot_money_chest_interest_timer, 0),
  4793. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4794. (assign, ":chest_fac", reg1),
  4795. (is_between, ":chest_fac", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4796. (store_add, ":chest_slot", ":chest_fac", slot_mission_data_castle_money_chest_begin),
  4797. #(troop_slot_eq, "trp_mission_data", ":chest_slot", 0),
  4798. (troop_set_slot, "trp_mission_data", ":chest_slot", ":instance_id"),
  4799. (try_for_range, ":ledger_no", 0, ":ledger_num"), #RAMARAUNT LEDGERS ADD
  4800. (scene_prop_get_instance, ":ledger_id", "spr_pws_castle_faction_interest_ledger", ":ledger_no"),
  4801. (call_script, "script_scene_prop_get_owning_faction", ":ledger_id"),
  4802. (eq, ":chest_fac", reg1),
  4803. (store_add, ":ledger_slot", reg1, slot_mission_data_interest_box_begin),
  4804. #(troop_slot_eq, "trp_mission_data", ":ledger_slot", 0),
  4805. (troop_set_slot, "trp_mission_data", ":ledger_slot", ":ledger_id"),
  4806. (try_end),
  4807. (try_end),
  4808. (try_end),
  4809. ]),
  4810.  
  4811. ("castle_receive_gold", # server: send money directly into the castle's linked chest
  4812. [(store_script_param, ":castle_slot", 1),
  4813. (store_script_param, ":gold_value", 2),
  4814. (store_script_param, ":percentage", 3), # if greater than -1, applied as a percentage to the value
  4815.  
  4816. (try_begin),
  4817. (neq, "$g_game_type", "mt_no_money"),
  4818. (is_between, ":castle_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4819. (assign, ":fac_no", ":castle_slot"),
  4820. (val_add, ":castle_slot", slot_mission_data_castle_money_chest_begin),
  4821. (troop_get_slot, ":instance_id", "trp_mission_data", ":castle_slot"),
  4822. (gt, ":instance_id", 0),
  4823. (store_add, ":ledger_slot", ":fac_no", slot_mission_data_interest_box_begin),
  4824. (troop_get_slot, ":ledger_id", "trp_mission_data", ":ledger_slot"),
  4825. (neq, ":ledger_id", 0),
  4826. (scene_prop_get_slot, ":chest_gold", ":instance_id", slot_scene_prop_stock_count),
  4827. (call_script, "script_scene_prop_ledger_get_money", ":ledger_id"),
  4828. (ge, ":chest_gold", reg0),
  4829. (try_begin),
  4830. (gt, ":percentage", -1),
  4831. (val_mul, ":gold_value", ":percentage"),
  4832. (val_div, ":gold_value", 100),
  4833. (try_end),
  4834. (val_add, ":chest_gold", ":gold_value"),
  4835. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":chest_gold"),
  4836. (try_end),
  4837. ]),
  4838.  
  4839. ("faction_set_color_from_banner", # gets the background color for a banner and lightens it to set as the faction color
  4840. [(store_script_param, ":faction_id", 1),
  4841. (store_script_param, ":banner_mesh", 2),
  4842.  
  4843. (troop_get_slot, ":color", "trp_banner_background_color_array", ":banner_mesh"),
  4844. (store_div, ":red", ":color", 0x10000),
  4845. (val_and, ":red", 0xFF),
  4846. (val_mul, ":red", 2),
  4847. (val_min, ":red", 0xFF),
  4848. (val_mul, ":red", 0x10000),
  4849. (store_div, ":green", ":color", 0x100),
  4850. (val_and, ":green", 0xFF),
  4851. (val_mul, ":green", 2),
  4852. (val_min, ":green", 0xFF),
  4853. (val_mul, ":green", 0x100),
  4854. (assign, ":blue", ":color"),
  4855. (val_and, ":blue", 0xFF),
  4856. (val_mul, ":blue", 2),
  4857. (val_min, ":blue", 0xFF),
  4858. (store_add, ":color", ":red", ":green"),
  4859. (val_add, ":color", ":blue"),
  4860. (faction_set_color, ":faction_id", ":color"),
  4861. ]),
  4862.  
  4863. ("faction_redraw_heraldic_items", # client: redraw heraldic armor worn by all players in a faction
  4864. [(store_script_param, ":faction_id", 1),
  4865.  
  4866. (get_max_players, ":max_players"),
  4867. (try_for_range, ":player_id", 1, ":max_players"),
  4868. (player_is_active, ":player_id"),
  4869. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  4870. (call_script, "script_player_redraw_heraldic_items", ":player_id"),
  4871. (try_end),
  4872. ]),
  4873.  
  4874. ("player_redraw_heraldic_items", # client: redraw heraldic armor worn by a player
  4875. [(store_script_param, ":player_id", 1), # must be valid
  4876.  
  4877. (player_get_agent_id, ":agent_id", ":player_id"),
  4878. (try_begin),
  4879. (agent_is_active, ":agent_id"),
  4880. (agent_is_alive, ":agent_id"),
  4881. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  4882. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  4883. (ge, ":item_id", all_items_begin),
  4884. (item_slot_eq, ":item_id", slot_item_class, item_class_heraldic),
  4885. (store_sub, ":no_item_id", ":equip_slot", ek_head),
  4886. (val_add, ":no_item_id", "itm_invisible_head"),
  4887. (agent_equip_item, ":agent_id", ":no_item_id"),
  4888. (agent_equip_item, ":agent_id", ":item_id"),
  4889. (try_end),
  4890. (try_end),
  4891. ]),
  4892.  
  4893. ("cf_factions_are_hostile",
  4894. [(store_script_param, ":faction_1_id", 1),
  4895. (store_script_param, ":faction_2_id", 2),
  4896.  
  4897. (neq, ":faction_1_id", ":faction_2_id"),
  4898. (store_add, ":faction_1_slot", ":faction_1_id", slot_faction_relations_begin),
  4899. (store_add, ":faction_2_slot", ":faction_2_id", slot_faction_relations_begin),
  4900. (this_or_next|neg|faction_slot_ge, ":faction_1_id", ":faction_2_slot", 1),
  4901. (neg|faction_slot_ge, ":faction_2_id", ":faction_1_slot", 1),
  4902. ]),
  4903.  
  4904. ("display_faction_relation_change", # server and clients: calculate and display changed faction relations
  4905. [(store_script_param, ":faction_id", 1),
  4906. (store_script_param, ":other_faction_id", 2),
  4907. (store_script_param, ":previous_relation", 3),
  4908. (store_script_param, ":new_relation", 4),
  4909.  
  4910. (assign, ":string_id", -1),
  4911. (try_begin),
  4912. (eq, ":new_relation", ":previous_relation"),
  4913. (else_try),
  4914. (lt, ":new_relation", 1),
  4915. (ge, ":previous_relation", 1),
  4916. (assign, ":string_id", "str_s1_now_hostile_towards_s10"),
  4917. (else_try),
  4918. (lt, ":previous_relation", 1),
  4919. (ge, ":new_relation", 1),
  4920. (assign, ":string_id", "str_s1_and_s10_made_peace"),
  4921. (try_end),
  4922. (try_begin),
  4923. (gt, ":string_id", -1),
  4924. (store_add, ":other_relation_slot", slot_faction_relations_begin, ":faction_id"),
  4925. (try_begin),
  4926. (faction_slot_ge, ":other_faction_id", ":other_relation_slot", 1),
  4927. (str_store_faction_name, s10, ":other_faction_id"),
  4928. (try_begin),
  4929. (multiplayer_is_server),
  4930. (str_store_faction_name, s1, ":faction_id"),
  4931. (server_add_message_to_log, ":string_id"),
  4932. (else_try),
  4933. (call_script, "script_preset_message", ":string_id", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  4934. (try_end),
  4935. (else_try),
  4936. (neg|multiplayer_is_server),
  4937. (multiplayer_get_my_player, ":my_player_id"),
  4938. (player_slot_eq, ":my_player_id", slot_player_is_lord, 1),
  4939. (player_slot_eq, ":my_player_id", slot_player_faction_id, ":other_faction_id"),
  4940. (faction_get_color, ":faction_color", ":faction_id"),
  4941. (try_begin),
  4942. (eq, ":string_id", "str_s1_now_hostile_towards_s10"),
  4943. (assign, ":string_id", "str_lord_of_s1_withdraws_offer_of_peace"),
  4944. (else_try),
  4945. (eq, ":string_id", "str_s1_and_s10_made_peace"),
  4946. (assign, ":string_id", "str_lord_of_s1_offers_peace"),
  4947. (try_end),
  4948. (str_store_faction_name, s1, ":faction_id"),
  4949. (display_message, ":string_id", ":faction_color"),
  4950. (try_end),
  4951. (try_end),
  4952. ]),
  4953.  
  4954. ("scene_prop_get_owning_faction", # get the current owning faction and castle number associated with a scene prop, storing in reg0 and reg1
  4955. [(store_script_param, ":instance_id", 1), # must be valid
  4956.  
  4957. (prop_instance_get_variation_id, ":scene_prop_owner_slot", ":instance_id"),
  4958. (val_mod, ":scene_prop_owner_slot", 10), # stored in the first digit of scene prop value 1, set with the scene editor
  4959. (try_begin),
  4960. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_mercenary, 1),
  4961. (ge, ":scene_prop_owner_slot", castle_factions_begin),
  4962. (val_sub, ":scene_prop_owner_slot", castle_factions_begin),
  4963. (val_clamp, ":scene_prop_owner_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4964. (scene_prop_get_slot, reg0, ":instance_id", slot_scene_prop_capture_faction_id),
  4965. (try_begin),
  4966. (le, reg0, 0),
  4967. (troop_get_slot, reg0, "trp_mission_data", ":scene_prop_owner_slot"),
  4968. (try_end),
  4969. (assign, reg1, ":scene_prop_owner_slot"),
  4970. (else_try),
  4971. (assign, reg0, ":scene_prop_owner_slot"),
  4972. (assign, reg1, -1),
  4973. (try_end),
  4974. (val_clamp, reg0, factions_begin, factions_end),
  4975. ]),
  4976.  
  4977. ("cf_can_change_faction", # check that a player can change to the selected faction, storing the error message in reg1 if not
  4978. [(store_script_param, ":player_id", 1), # must be valid
  4979. (store_script_param, ":faction_id", 2),
  4980.  
  4981. (try_begin),
  4982. (faction_slot_eq, ":faction_id", slot_faction_is_active, 0),
  4983. (assign, reg1, "str_scene_error_this_faction_is_not_active"),
  4984. (else_try),
  4985. (assign, reg1, 0),
  4986. (try_end),
  4987. (eq, reg1, 0),
  4988. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  4989. (assign, reg0, ":player_faction_id"),
  4990. (try_begin),
  4991. (neq, ":player_faction_id", ":faction_id"),
  4992. (neq, ":player_faction_id", "fac_commoners"),
  4993. (neq, ":faction_id", "fac_commoners"),
  4994. (assign, reg1, "str_must_leave_s1_first"),
  4995. (try_end),
  4996. (eq, reg1, 0),
  4997. (try_begin),
  4998. (neq, ":faction_id", "fac_outlaws"),
  4999. (eq, ":player_faction_id", "fac_outlaws"),
  5000. (player_slot_ge, ":player_id", slot_player_outlaw_rating, 1),
  5001. (assign, reg1, "str_you_have_been_outlawed"),
  5002. (try_end),
  5003. (eq, reg1, 0),
  5004. ]),
  5005.  
  5006. ("cf_faction_set_lord", # server: try set a faction's lord, failing if the player id and unique id don't match
  5007. [(store_script_param, ":player_id", 1), # if valid, checked against unique_id
  5008. (store_script_param, ":unique_id", 2), # if player_id is not valid, store in a faction slot so they are set lord when reconnected
  5009. (store_script_param, ":faction_id", 3),
  5010.  
  5011. (assign, ":fail", 0),
  5012. (try_begin),
  5013. (neg|player_is_active, ":player_id"),
  5014. (store_mission_timer_a, ":last_seen_time"),
  5015. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, ":last_seen_time"),
  5016. (else_try),
  5017. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  5018. (player_get_unique_id, ":player_unique_id", ":player_id"),
  5019. (eq, ":player_unique_id", ":unique_id"),
  5020. (call_script, "script_player_set_lord", ":player_id", ":faction_id"),
  5021. (else_try),
  5022. (assign, ":fail", 1),
  5023. (try_end),
  5024. (eq, ":fail", 0),
  5025. (faction_set_slot, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  5026. ]),
  5027.  
  5028. ("player_set_lord", # server: set a player as lord of a faction, changing all the appropriate slots
  5029. [(store_script_param, ":player_id", 1), # must be valid
  5030. (store_script_param, ":faction_id", 2),
  5031.  
  5032. (get_max_players, ":max_players"),
  5033. (try_for_range, ":other_player_id", 1, ":max_players"),
  5034. (player_is_active, ":other_player_id"),
  5035. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_player_set_slot, ":player_id", slot_player_is_lord, 1),
  5036. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":faction_id"),
  5037. (neq, ":other_player_id", ":player_id"),
  5038. (player_get_slot, ":was_lord", ":other_player_id", slot_player_is_lord),
  5039. (player_set_slot, ":other_player_id", slot_player_is_lord, 0),
  5040. (player_set_slot, ":other_player_id", slot_player_last_faction_kicked_from, 0),
  5041. (player_get_slot, ":has_door_key", ":other_player_id", slot_player_has_faction_door_key),
  5042. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_has_faction_door_key, ":has_door_key"),
  5043. (player_get_slot, ":has_money_key", ":other_player_id", slot_player_has_faction_money_key),
  5044. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_has_faction_money_key, ":has_money_key"),
  5045. (player_get_slot, ":has_item_key", ":other_player_id", slot_player_has_faction_item_key),
  5046. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_has_faction_item_key, ":has_item_key"),
  5047. (try_begin), # for the previous lord, remove the announcement permission, but leave all other settings unchanged
  5048. (eq, ":was_lord", 1),
  5049. (assign, ":can_announce", 0),
  5050. (player_set_slot, ":other_player_id", slot_player_can_faction_announce, ":can_announce"),
  5051. (else_try),
  5052. (player_get_slot, ":can_announce", ":other_player_id", slot_player_can_faction_announce),
  5053. (try_end),
  5054. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_can_faction_announce, ":can_announce"),
  5055. (player_get_slot, ":is_muted", ":other_player_id", slot_player_faction_chat_muted),
  5056. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_faction_chat_muted, ":is_muted"),
  5057. (try_end),
  5058. (player_set_slot, ":player_id", slot_player_is_lord, 1),
  5059. (player_set_slot, ":player_id", slot_player_has_faction_door_key, 1),
  5060. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 1),
  5061. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 1),
  5062. (player_set_slot, ":player_id", slot_player_can_faction_announce, 1),
  5063. (player_set_slot, ":player_id", slot_player_faction_chat_muted, 0),
  5064. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, 0),
  5065. (str_store_faction_name, s1, ":faction_id"),
  5066. (str_store_player_username, s10, ":player_id"),
  5067. (server_add_message_to_log, "str_s10_now_lord_of_s1"),
  5068. ]),
  5069.  
  5070. ("cf_player_is_lord",
  5071. [(store_script_param, ":player_id", 1), # must be valid
  5072.  
  5073. (assign, ":fail", 0),
  5074. (try_begin),
  5075. (multiplayer_is_server),
  5076. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  5077. (is_between, ":faction_id", factions_begin, factions_end),
  5078. (player_get_unique_id, ":unique_id", ":player_id"),
  5079. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  5080. (else_try),
  5081. (neg|multiplayer_is_server),
  5082. (player_slot_eq, ":player_id", slot_player_is_lord, 1),
  5083. (else_try),
  5084. (assign, ":fail", 1),
  5085. (try_end),
  5086. (eq, ":fail", 0),
  5087. ]),
  5088.  
  5089. ("cf_player_can_use_troop", # check if the player meets restrictions for certain troops
  5090. [(store_script_param, ":player_id", 1), # must be valid
  5091. (store_script_param, ":troop_id", 2),
  5092.  
  5093. (assign, ":fail", 0),
  5094. (try_begin),
  5095. (eq, ":troop_id", "trp_godlike_hero"),
  5096. (try_begin),
  5097. (player_is_admin, ":player_id"),
  5098. (player_slot_eq, ":player_id", slot_player_admin_no_godlike_troop, 0),
  5099. (else_try),
  5100. (assign, ":fail", 1),
  5101. (try_end),
  5102. (else_try),
  5103. (store_skill_level, ":leadership", "skl_leadership", ":troop_id"),
  5104. (eq, ":leadership", 0),
  5105. (else_try),
  5106. (call_script, "script_cf_player_is_lord", ":player_id"),
  5107. (else_try),
  5108. (assign, ":fail", 1),
  5109. (try_end),
  5110. (eq, ":fail", 0),
  5111. ]),
  5112.  
  5113. ("change_faction", # server: change a player's faction
  5114. [(store_script_param, ":player_id", 1), # must be valid
  5115. (store_script_param, ":faction_id", 2),
  5116. (store_script_param, ":change_faction_type", 3), # constants starting with change_faction_type_
  5117.  
  5118. (try_begin),
  5119. (neg|player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  5120. (player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  5121. (get_max_players, ":num_players"),
  5122. (try_for_range, ":other_player_id", 1, ":num_players"),
  5123. (player_is_active, ":other_player_id"),
  5124. (try_begin),
  5125. (eq, ":change_faction_type", 0),
  5126. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  5127. (else_try),
  5128. (multiplayer_send_4_int_to_player, ":other_player_id", server_event_player_set_slot, ":player_id", slot_player_faction_id, ":faction_id", ":change_faction_type"),
  5129. (try_end),
  5130. (try_end),
  5131. (player_set_slot, ":player_id", slot_player_is_lord, 0), # reset all faction permissions
  5132. (player_get_unique_id, ":unique_id", ":player_id"),
  5133. (try_begin),
  5134. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  5135. (faction_set_slot, ":faction_id", slot_faction_lord_player_uid, 0),
  5136. (try_end),
  5137. (player_set_slot, ":player_id", slot_player_has_faction_door_key, 0),
  5138. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 0),
  5139. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 0),
  5140. (player_set_slot, ":player_id", slot_player_can_faction_announce, 0),
  5141. (str_store_player_username, s0, ":player_id"),
  5142. (try_begin),
  5143. (eq, ":change_faction_type", change_faction_type_outlawed),
  5144. (server_add_message_to_log, "str_s0_has_been_outlawed"),
  5145. (else_try),
  5146. (str_store_faction_name, s1, ":faction_id"),
  5147. (server_add_message_to_log, "str_s0_joined_the_s1"),
  5148. (try_end),
  5149. (try_end),
  5150. ]),
  5151.  
  5152. ("cf_change_faction", # server: check if a player can join the faction associated with a scene prop, joining if so
  5153. [(store_script_param, ":agent_id", 1), # must be valid
  5154. (store_script_param, ":instance_id", 2), # must be valid
  5155. (store_script_param, ":change_faction_type", 3), # constants starting with change_faction_type_
  5156.  
  5157. (agent_get_player_id, ":player_id", ":agent_id"),
  5158. (player_is_active, ":player_id"),
  5159. (agent_is_alive, ":agent_id"),
  5160. (assign, ":fail", 0),
  5161. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5162. (assign, ":faction_id", reg0),
  5163. (try_begin), # either a non castle faction or linked to a castle - not a 'mercenary' station to allow resurrecting a faction
  5164. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_mercenary, 1),
  5165. (else_try), # otherwise, check to ensure the faction owns no castles (where the player should train at instead)
  5166. (assign, ":loop_end", slot_mission_data_castle_owner_faction_end),
  5167. (try_for_range, ":castle_no", slot_mission_data_castle_owner_faction_begin, ":loop_end"),
  5168. (troop_slot_eq, "trp_mission_data", ":castle_no", ":faction_id"),
  5169. (store_add, ":castle_allows_training_slot", slot_mission_data_castle_allows_training_begin, ":castle_no"),
  5170. (troop_slot_eq, "trp_mission_data", ":castle_allows_training_slot", 1),
  5171. (assign, ":loop_end", -1),
  5172. (try_end),
  5173. (neq, ":loop_end", -1),
  5174. (else_try),
  5175. (assign, ":fail", 1),
  5176. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_s1_doesnt_need_merc", preset_message_faction|preset_message_fail_sound, ":faction_id"),
  5177. (try_end),
  5178. (eq, ":fail", 0),
  5179. (try_begin),
  5180. (call_script, "script_cf_can_change_faction", ":player_id", ":faction_id"),
  5181. (call_script, "script_change_faction", ":player_id", ":faction_id", ":change_faction_type"),
  5182. (else_try),
  5183. (assign, ":fail", 1),
  5184. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, reg1, preset_message_faction|preset_message_fail_sound, reg0),
  5185. (try_end),
  5186. (eq, ":fail", 0),
  5187. ]),
  5188.  
  5189. ("player_set_worse_respawn_troop", # server: crude check to try pick whether the players current troop or the target has worse stats
  5190. [(store_script_param, ":player_id", 1), # must be valid
  5191. (store_script_param, ":troop_id", 2),
  5192.  
  5193. (try_begin),
  5194. (player_get_agent_id, ":agent_id", ":player_id"),
  5195. (agent_is_active, ":agent_id"),
  5196. (agent_get_troop_id, ":current_troop_id", ":agent_id"),
  5197. (else_try),
  5198. (player_get_troop_id, ":current_troop_id", ":player_id"),
  5199. (try_end),
  5200. (store_attribute_level, ":strength", ":current_troop_id", ca_strength),
  5201. (try_begin),
  5202. (ge, ":strength", 9),
  5203. (player_set_troop_id, ":player_id", ":troop_id"),
  5204. (try_end),
  5205. ]),
  5206.  
  5207. ("cf_change_faction_worse_respawn_troop", # server: try prevent players getting a 'better' troop after dying when clicking use at certain training stations to join instantly for free
  5208. [(store_script_param, ":agent_id", 1), # must be valid
  5209. (store_script_param, ":instance_id", 2), # must be valid
  5210.  
  5211. (call_script, "script_cf_change_faction", ":agent_id", ":instance_id", change_faction_type_no_respawn),
  5212. (agent_get_player_id, ":player_id", ":agent_id"),
  5213. (scene_prop_get_slot, ":troop_id", ":instance_id", slot_scene_prop_troop_id),
  5214. (call_script, "script_player_set_worse_respawn_troop", ":player_id", ":troop_id"),
  5215. ]),
  5216.  
  5217. ("cf_change_troop", # server: try change a player's troop and / or faction
  5218. [(store_script_param, ":agent_id", 1), # must be valid
  5219. (store_script_param, ":instance_id", 2), # must be valid
  5220. (store_script_param, ":cancel", 3), # 0 = fully train as the troop, 1 = quickly start and cancel the training to just change faction, if already the same troop
  5221.  
  5222. (agent_get_player_id, ":player_id", ":agent_id"),
  5223. (player_is_active, ":player_id"),
  5224. (agent_is_alive, ":agent_id"),
  5225. (scene_prop_get_slot, ":troop_id", ":instance_id", slot_scene_prop_troop_id),
  5226. (assign, ":fail", 0),
  5227. (try_begin),
  5228. (call_script, "script_cf_player_can_use_troop", ":player_id", ":troop_id"),
  5229. (else_try),
  5230. (assign, ":fail", 1),
  5231. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  5232. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_you_are_not_lord_of_s1", preset_message_faction, ":faction_id"),
  5233. (try_end),
  5234. (eq, ":fail", 0),
  5235. (agent_get_troop_id, ":current_troop_id", ":agent_id"),
  5236. (try_begin),
  5237. (neq, ":current_troop_id", ":troop_id"),
  5238. (eq, ":cancel", 0),
  5239. (scene_prop_get_slot, ":gold_cost", ":instance_id", slot_scene_prop_gold_value),
  5240. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_cost"),
  5241. (call_script, "script_cf_change_faction", ":agent_id", ":instance_id", change_faction_type_respawn),
  5242. (call_script, "script_player_adjust_gold", ":player_id", ":gold_cost", -1),
  5243. (player_set_troop_id, ":player_id", ":troop_id"),
  5244. (try_begin),
  5245. (store_skill_level, ":new_leadership", "skl_leadership", ":troop_id"),
  5246. (gt, ":new_leadership", 0),
  5247. (store_skill_level, ":old_leadership", "skl_leadership", ":current_troop_id"),
  5248. (eq, ":old_leadership", 0),
  5249. (player_set_slot, ":player_id", slot_player_non_lord_troop_id, ":current_troop_id"),
  5250. (try_end),
  5251. (call_script, "script_player_add_equipped_items", ":player_id", ":troop_id"),
  5252. (call_script, "script_player_add_spawn_items", ":player_id", 1),
  5253. (call_script, "script_player_respawn_in_place", ":player_id"),
  5254. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5255. (call_script, "script_castle_receive_gold", reg1, ":gold_cost", castle_training_gold_percentage),
  5256. (else_try),
  5257. (eq, ":current_troop_id", ":troop_id"),
  5258. (call_script, "script_cf_change_faction", ":agent_id", ":instance_id", change_faction_type_no_respawn),
  5259. (player_set_troop_id, ":player_id", ":troop_id"),
  5260. (else_try),
  5261. (assign, ":fail", 1),
  5262. (try_end),
  5263. (eq, ":fail", 0),
  5264. ]),
  5265.  
  5266. ("cf_check_troop_can_equip_item", # check the item has no hard requirements that prevent the troop or player from equipping it
  5267. [(store_script_param, ":troop_id", 1),
  5268. (store_script_param, ":item_id", 2),
  5269. (store_script_param, ":player_id", 3),
  5270.  
  5271. (assign, ":fail", 0),
  5272. (try_begin),
  5273. (player_is_active, ":player_id"),
  5274. (player_get_gender, ":player_gender", ":player_id"),
  5275. (item_get_slot, ":item_gender", ":item_id", slot_item_gender),
  5276. (neq, ":item_gender", 0), # male gendered items can be equipped by anyone
  5277. (neq, ":player_gender", ":item_gender"),
  5278. (assign, ":fail", 1),
  5279. (else_try),
  5280. (item_get_slot, ":difficulty", ":item_id", slot_item_difficulty),
  5281. (ge, ":difficulty", 30),
  5282. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  5283. (lt, ":troop_level", ":difficulty"),
  5284. (assign, ":fail", 1),
  5285. (try_end),
  5286. (eq, ":fail", 0),
  5287. ]),
  5288.  
  5289. ("cf_change_armor", # server: check whether the player can equip the armor item, changing if so
  5290. [(store_script_param, ":agent_id", 1),
  5291. (store_script_param, ":item_id", 2),
  5292.  
  5293. (agent_is_active, ":agent_id"),
  5294. (assign, ":fail", 0),
  5295. (agent_get_player_id, ":player_id", ":agent_id"),
  5296. (try_begin),
  5297. (player_is_active, ":player_id"),
  5298. (agent_get_troop_id, ":troop_id", ":agent_id"),
  5299. (try_begin),
  5300. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  5301. (else_try),
  5302. (assign, ":fail", 1),
  5303. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_cant_equip_item", preset_message_error),
  5304. (try_end),
  5305. (eq, ":fail", 0),
  5306. (item_get_type, ":item_type", ":item_id"),
  5307. (store_add, ":player_slot", ":item_type", slot_player_equip_head - itp_type_head_armor),
  5308. (player_set_slot, ":player_id", ":player_slot", ":item_id"),
  5309. (else_try),
  5310. (agent_is_non_player, ":agent_id"),
  5311. (agent_is_alive, ":agent_id"),
  5312. (else_try),
  5313. (assign, ":fail", 1),
  5314. (try_end),
  5315. (eq, ":fail", 0),
  5316. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  5317. ]),
  5318.  
  5319. ("change_armor", # server: equip an armor item on an agent, sending messages to all clients to update the mesh
  5320. [(store_script_param, ":agent_id", 1),
  5321. (store_script_param, ":item_id", 2),
  5322.  
  5323. (call_script, "script_agent_equip_armor", ":agent_id", ":item_id"),
  5324. (get_max_players, ":num_players"),
  5325. (try_for_range, ":player_id", 1, ":num_players"),
  5326. (player_is_active, ":player_id"),
  5327. (multiplayer_send_2_int_to_player, ":player_id", server_event_agent_equip_armor, ":agent_id", ":item_id"),
  5328. (try_end),
  5329. ]),
  5330.  
  5331. ("agent_equip_armor", # clients and server: equip or unequip an armor item on an agent, the server for combat calculations and the clients for the visual appearance
  5332. [(store_script_param, ":agent_id", 1), # must be valid
  5333. (store_script_param, ":item_id", 2),
  5334.  
  5335. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 1, 1),
  5336. (try_begin),
  5337. (is_between, ":item_id", all_items_begin, all_items_end),
  5338. (agent_equip_item, ":agent_id", ":item_id"),
  5339. (else_try),
  5340. (is_between, ":item_id", "itm_no_head", "itm_no_horse"),
  5341. (store_sub, ":equip_slot", ":item_id", "itm_no_head"),
  5342. (val_add, ":equip_slot", ek_head),
  5343. (agent_get_item_slot, ":equipped_item_id", ":agent_id", ":equip_slot"),
  5344. (gt, ":equipped_item_id", -1),
  5345. (agent_unequip_item, ":agent_id", ":equipped_item_id"),
  5346. (try_end),
  5347. (try_begin),
  5348. (neg|multiplayer_is_server),
  5349. (try_begin), # for admin armor disable agent visibility as well, to remove shadows
  5350. (is_between, ":item_id", "itm_invisible_head", "itm_invisible_sword"),
  5351. (agent_has_item_equipped, ":agent_id", "itm_invisible_head"),
  5352. (agent_has_item_equipped, ":agent_id", "itm_invisible_body"),
  5353. (agent_has_item_equipped, ":agent_id", "itm_invisible_foot"),
  5354. (agent_has_item_equipped, ":agent_id", "itm_invisible_hand"),
  5355. (agent_set_visibility, ":agent_id", 0),
  5356. (else_try),
  5357. (agent_set_visibility, ":agent_id", 1),
  5358. (try_end),
  5359. (try_end),
  5360. ]),
  5361.  
  5362. ("agent_remove_empty_ammo_stacks", # server: remove empty ammo stacks to free up slots for buying items and inventory transfers
  5363. [(store_script_param, ":agent_id", 1), # must be valid
  5364.  
  5365. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  5366. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  5367. (ge, ":item_id", all_items_begin),
  5368. (item_get_type, ":item_type", ":item_id"),
  5369. (this_or_next|eq, ":item_type", itp_type_arrows),
  5370. (this_or_next|eq, ":item_type", itp_type_bolts),
  5371. (eq, ":item_type", itp_type_thrown),
  5372. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  5373. (le, ":ammo", 0),
  5374. (val_add, ":equip_slot", 1),
  5375. (agent_unequip_item, ":agent_id", ":item_id", ":equip_slot"),
  5376. (try_end),
  5377. ]),
  5378.  
  5379. ("cf_buy_item", # server: handle players trying to buy an item from a stockpile
  5380. [(store_script_param, ":agent_id", 1), # must be valid
  5381. (store_script_param, ":instance_id", 2), # must be valid
  5382.  
  5383. (agent_get_player_id, ":player_id", ":agent_id"),
  5384. (player_is_active, ":player_id"),
  5385. (call_script, "script_agent_remove_empty_ammo_stacks", ":agent_id"),
  5386. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5387. (is_between, ":item_id", all_items_begin, all_items_end),
  5388. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5389. (assign, ":gold_value", reg0),
  5390. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  5391. (assign, ":fail", 0),
  5392. (item_get_type, ":item_type", ":item_id"),
  5393. (try_begin),
  5394. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  5395. (try_begin),
  5396. (call_script, "script_cf_change_armor", ":agent_id", ":item_id"),
  5397. (else_try),
  5398. (assign, ":fail", 1),
  5399. (try_end),
  5400. (else_try),
  5401. (set_spawn_position, pos1),
  5402. (eq, ":item_type", itp_type_horse),
  5403. (store_mission_timer_a, ":time"),
  5404. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  5405. (store_sub, ":interval", ":time", ":last_action_time"),
  5406. (try_begin), # prevent players from quickly and repeatedly buying horses to try overload the server
  5407. (ge, ":interval", repeat_action_min_interval),
  5408. (try_begin),
  5409. (neg|item_slot_eq, ":item_id", slot_item_animal_adult_item_id, 0),
  5410. (try_begin),
  5411. (call_script, "script_cf_can_spawn_herd_animal", ":agent_id"),
  5412. (call_script, "script_cf_spawn_herd_animal", ":item_id", -1),
  5413. (else_try),
  5414. (assign, ":fail", 1),
  5415. (try_end),
  5416. (else_try),
  5417. (spawn_horse, ":item_id"),
  5418. (try_end),
  5419. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  5420. (else_try),
  5421. (assign, ":fail", 1),
  5422. (try_end),
  5423. (else_try),
  5424. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  5425. (prop_instance_set_position, reg0, pos1),
  5426. (try_end),
  5427. (eq, ":fail", 0),
  5428. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", -1),
  5429. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5430. (call_script, "script_castle_receive_gold", reg1, ":gold_value", castle_tax_gold_percentage),
  5431. ]),
  5432.  
  5433. ("cf_sell_item", # server: handle players trying to sell an item to a stockpile
  5434. [(store_script_param, ":agent_id", 1), # must be valid
  5435. (store_script_param, ":instance_id", 2), # must be valid
  5436.  
  5437. (agent_get_player_id, ":player_id", ":agent_id"),
  5438. (player_is_active, ":player_id"),
  5439. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5440. (is_between, ":item_id", all_items_begin, all_items_end),
  5441. (assign, ":fail", 1),
  5442. (item_get_type, ":item_type", ":item_id"),
  5443. (try_begin),
  5444. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  5445. (try_begin), # use a dummy "no_" item id when removing armor
  5446. (agent_has_item_equipped, ":agent_id", ":item_id"),
  5447. (store_sub, ":no_item_id", ":item_type", itp_type_head_armor),
  5448. (val_add, ":no_item_id", "itm_no_head"),
  5449. (store_sub, ":player_slot", ":item_type", itp_type_head_armor),
  5450. (val_add, ":player_slot", slot_player_equip_head),
  5451. (player_set_slot, ":player_id", ":player_slot", ":no_item_id"),
  5452. (call_script, "script_change_armor", ":agent_id", ":no_item_id"),
  5453. (assign, ":fail", 0),
  5454. (try_end),
  5455. (else_try),
  5456. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  5457. (assign, ":fail", 0),
  5458. (try_end),
  5459. (eq, ":fail", 0),
  5460. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5461. (call_script, "script_calculate_stockpile_taxed_price", ":instance_id", reg0),
  5462. (call_script, "script_player_adjust_gold", ":player_id", reg0, 1),
  5463. ]),
  5464.  
  5465. ("cf_sell_horse", # server: handle players trying to sell a horse to a stockpile; if failed, reg0 = 1 if an error message was displayed, 0 otherwise
  5466. [(store_script_param, ":agent_id", 1), # must be valid
  5467. (store_script_param, ":instance_id", 2), # must be valid
  5468.  
  5469. (assign, reg0, 0),
  5470. (agent_get_player_id, ":player_id", ":agent_id"),
  5471. (player_is_active, ":player_id"),
  5472. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5473. (is_between, ":item_id", all_items_begin, all_items_end),
  5474. (item_get_type, ":item_type", ":item_id"),
  5475. (eq, ":item_type", itp_type_horse),
  5476. (assign, ":error_string_id", -1),
  5477. (agent_get_slot, ":horse_agent_id", ":agent_id", slot_agent_last_horse_ridden),
  5478. (agent_is_active, ":horse_agent_id"),
  5479. (agent_is_alive, ":horse_agent_id"),
  5480. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  5481. (eq, ":horse_item_id", ":item_id"),
  5482. (assign, reg0, 1),
  5483. (agent_slot_eq, ":horse_agent_id", slot_agent_horse_last_rider, ":agent_id"),
  5484. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  5485. (assign, ":error_string_id", "str_dismount_to_sell"),
  5486. (try_begin), # only allow selling horses that were last ridden by the player, are not badly wounded, and are close enough to the stockpile
  5487. (neq, ":rider_agent_id", ":agent_id"),
  5488. (assign, ":error_string_id", -1),
  5489. (eq, ":rider_agent_id", -1),
  5490. (assign, ":error_string_id", "str_horse_too_wounded_to_sell"),
  5491. (store_agent_hit_points, ":horse_hit_points", ":horse_agent_id", 0),
  5492. (gt, ":horse_hit_points", 50),
  5493. (assign, ":error_string_id", -1),
  5494. (store_mission_timer_a, ":time"),
  5495. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  5496. (store_sub, ":interval", ":time", ":last_action_time"),
  5497. (ge, ":interval", repeat_action_min_interval),
  5498. (assign, reg0, 0),
  5499. (agent_get_position, pos20, ":agent_id"),
  5500. (agent_get_position, pos21, ":horse_agent_id"),
  5501. (get_sq_distance_between_positions, ":sq_distance", pos20, pos21),
  5502. (le, ":sq_distance", sq(max_distance_to_use)),
  5503. (assign, ":error_string_id", 0),
  5504. (assign, reg0, 1),
  5505. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  5506. (else_try),
  5507. (gt, ":error_string_id", 0),
  5508. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":error_string_id", preset_message_error),
  5509. (try_end),
  5510. (eq, ":error_string_id", 0),
  5511. (agent_fade_out, ":horse_agent_id"),
  5512. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5513. (call_script, "script_calculate_stockpile_taxed_price", ":instance_id", reg0),
  5514. (store_mul, ":gold_value", reg0, ":horse_hit_points"),
  5515. (val_div, ":gold_value", 100),
  5516. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5517. ]),
  5518.  
  5519. ("cf_export_item", # server: handle players exporting an item out of the game world
  5520. [(store_script_param, ":agent_id", 1), # must be valid
  5521. (store_script_param, ":instance_id", 2), # must be valid
  5522.  
  5523. (agent_get_player_id, ":player_id", ":agent_id"),
  5524. (player_is_active, ":player_id"),
  5525. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5526. (is_between, ":item_id", all_items_begin, all_items_end),
  5527. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  5528. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", base_export_percentage),
  5529. (assign, ":gold_value", reg0),
  5530. (prop_instance_get_variation_id_2, ":tax_multiplier", ":instance_id"),
  5531. (try_begin),
  5532. (neq, "$g_game_type", "mt_feudalism"),
  5533. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5534. (else_try),
  5535. (val_add, ":tax_multiplier", 100),
  5536. (try_end),
  5537. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5538. (call_script, "script_castle_receive_gold", reg1, ":gold_value", ":tax_multiplier"),
  5539. ]),
  5540.  
  5541. ("cf_gain_gold", # server: give a player gold based on a scene prop's preset value
  5542. [(store_script_param, ":agent_id", 1), # must be valid
  5543. (store_script_param, ":instance_id", 2), # must be valid
  5544.  
  5545. (agent_get_player_id, ":player_id", ":agent_id"),
  5546. (player_is_active, ":player_id"),
  5547. (scene_prop_get_slot, ":gold_value", ":instance_id", slot_scene_prop_gold_value),
  5548. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5549. ]),
  5550.  
  5551. ("cf_read_book", # cause a book to show in a presentation window
  5552. [(store_script_param, ":book_string_id", 1),
  5553. (store_script_param, ":agent_id", 2), # if valid, show on this player's client
  5554.  
  5555. (try_begin),
  5556. (multiplayer_is_server),
  5557. (agent_get_player_id, ":player_id", ":agent_id"),
  5558. (player_is_active, ":player_id"),
  5559. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":book_string_id", preset_message_read_object),
  5560. (else_try),
  5561. (call_script, "script_preset_message", ":book_string_id", preset_message_read_object, 0, 0),
  5562. (try_end),
  5563. ]),
  5564.  
  5565. ("cf_buy_banner", # server: handle players trying to buy a faction banner
  5566. [(store_script_param, ":agent_id", 1), # must be valid
  5567. (store_script_param, ":instance_id", 2), # must be valid
  5568.  
  5569. (agent_get_player_id, ":player_id", ":agent_id"),
  5570. (player_is_active, ":player_id"),
  5571. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  5572. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5573. (assign, ":faction_id", reg0),
  5574. (try_begin),
  5575. (eq, ":faction_id", ":player_faction_id"),
  5576. (assign, ":fail", 0),
  5577. (else_try),
  5578. (assign, ":fail", 1),
  5579. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_not_a_member_of_s1", preset_message_faction, ":faction_id"),
  5580. (try_end),
  5581. (eq, ":fail", 0),
  5582. (faction_get_slot, ":banner_no", ":faction_id", slot_faction_banner_mesh),
  5583. (val_sub, ":banner_no", banner_meshes_begin),
  5584. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5585. (val_add, ":item_id", ":banner_no"),
  5586. (is_between, ":item_id", banner_items_begin, banner_items_end),
  5587. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5588. (assign, ":gold_value", reg0),
  5589. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  5590. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", -1),
  5591. (prop_instance_get_position, pos1, ":instance_id"),
  5592. (position_move_y, pos1, -5),
  5593. (set_spawn_position, pos1),
  5594. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  5595. ]),
  5596.  
  5597. ("cf_use_destroy_heap", # server: allow players to permanently destroy wielded items or the contents of an attached cart
  5598. [(store_script_param, ":agent_id", 1), # must be valid
  5599.  
  5600. (assign, ":fail", 1),
  5601. (agent_get_horse, ":attach_agent_id", ":agent_id"),
  5602. (try_begin),
  5603. (le, ":attach_agent_id", -1),
  5604. (assign, ":attach_agent_id", ":agent_id"),
  5605. (try_end),
  5606. (agent_get_attached_scene_prop, ":attached_instance_id", ":attach_agent_id"),
  5607. (try_begin),
  5608. (prop_instance_is_valid, ":attached_instance_id"),
  5609. (try_begin),
  5610. (scene_prop_get_slot, ":inventory_slot_end", ":attached_instance_id", slot_scene_prop_inventory_count),
  5611. (gt, ":inventory_slot_end", 0),
  5612. (val_add, ":inventory_slot_end", slot_scene_prop_inventory_begin),
  5613. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_slot_end"),
  5614. (scene_prop_set_slot, ":attached_instance_id", ":inventory_slot", 0),
  5615. (try_end),
  5616. (assign, ":fail", 0),
  5617. (get_max_players, ":max_players"),
  5618. (try_for_range, ":other_player_id", 1, ":max_players"),
  5619. (player_is_active, ":other_player_id"),
  5620. (player_slot_eq, ":other_player_id", slot_player_accessing_instance_id, ":attached_instance_id"),
  5621. (player_set_slot, ":other_player_id", slot_player_accessing_instance_id, 0),
  5622. (multiplayer_send_int_to_player, ":other_player_id", server_event_show_inventory, -1),
  5623. (try_end),
  5624. (try_end),
  5625. (else_try),
  5626. (agent_get_wielded_item, ":item_id", ":agent_id", 0),
  5627. (try_begin),
  5628. (is_between, ":item_id", all_items_begin, all_items_end),
  5629. (else_try),
  5630. (agent_get_wielded_item, ":item_id", ":agent_id", 1),
  5631. (is_between, ":item_id", all_items_begin, all_items_end),
  5632. (else_try),
  5633. (assign, ":item_id", -1),
  5634. (try_end),
  5635. (neq, ":item_id", -1),
  5636. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  5637. (try_begin),
  5638. (eq, ":item_id", "itm_money_bag"),
  5639. (call_script, "script_cf_pop_agent_money_bag_value", ":agent_id"),
  5640. (try_end),
  5641. (assign, ":fail", 0),
  5642. (try_end),
  5643. (eq, ":fail", 0),
  5644. ]),
  5645.  
  5646. ("remove_scene_prop", # server: move an unused scene prop to where it is unlikely to be visible
  5647. [(store_script_param, ":instance_id", 1),
  5648.  
  5649. (set_fixed_point_multiplier, 100),
  5650. (position_set_x, pos0, -5000),
  5651. (position_set_y, pos0, -5000),
  5652. (position_set_z, pos0, -5000),
  5653. (prop_instance_set_position, ":instance_id", pos0),
  5654. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  5655. (prop_instance_enable_physics, ":instance_id", 0),
  5656. ]),
  5657.  
  5658. ("reuse_or_spawn_scene_prop", # server: search for unused scene props to reuse, otherwise spawn a new instance; reg0 = the instance id; the position should be set afterwards
  5659. [(store_script_param, ":scene_prop_id", 1), # the desired scene prop kind
  5660.  
  5661. (scene_prop_get_num_instances, ":instance_num", ":scene_prop_id"),
  5662. (try_for_range, ":instance_no", 0, ":instance_num"),
  5663. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  5664. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  5665. (assign, ":instance_num", -1),
  5666. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  5667. (prop_instance_enable_physics, ":instance_id", 1),
  5668. (assign, reg0, ":instance_id"),
  5669. (try_end),
  5670. (try_begin),
  5671. (neq, ":instance_num", -1),
  5672. (set_spawn_position, pos0),
  5673. (spawn_scene_prop, ":scene_prop_id"),
  5674. (try_end),
  5675. ]),
  5676.  
  5677. ("cf_can_use_scene_prop", # check whether a prop instance id is the correct scene prop kind and is in range of the agent
  5678. [(store_script_param, ":player_id", 1),
  5679. (store_script_param, ":instance_id", 2),
  5680. (store_script_param, ":required_scene_prop_id", 3),
  5681.  
  5682. (prop_instance_is_valid, ":instance_id"),
  5683. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":instance_id"),
  5684. (eq, ":scene_prop_id", ":required_scene_prop_id"),
  5685. (player_is_active, ":player_id"),
  5686. (player_get_agent_id, ":agent_id", ":player_id"),
  5687. (agent_is_alive, ":agent_id"),
  5688. (agent_get_position, pos1, ":agent_id"),
  5689. (prop_instance_get_position, pos2, ":instance_id"),
  5690. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  5691. (le, ":sq_distance", sq(max_distance_to_use)),
  5692. ]),
  5693.  
  5694. ("cf_find_closest_scene_prop", # try to find the closest scene prop to pos1 of a specific kind; overwrites pos0; and if found, reg0 = instance id
  5695. [(store_script_param, ":scene_prop_id", 1), # the desired scene prop kind
  5696. (store_script_param, ":maximum_sq_distance", 2), # this is the maximum distance to check squared, so use the sq() function for passing preset values
  5697.  
  5698. (scene_prop_get_num_instances, ":count", ":scene_prop_id"),
  5699. (gt, ":count", 0),
  5700. (assign, ":closest_sq_distance", ":maximum_sq_distance"),
  5701. (try_for_range, ":instance_no", 0, ":count"),
  5702. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  5703. (prop_instance_get_position, pos0, ":instance_id"),
  5704. (get_sq_distance_between_positions, ":sq_distance", pos0, pos1),
  5705. (lt, ":sq_distance", ":closest_sq_distance"),
  5706. (assign, ":closest_sq_distance", ":sq_distance"),
  5707. (assign, reg0, ":instance_id"),
  5708. (try_end),
  5709. (lt, ":closest_sq_distance", ":maximum_sq_distance"),
  5710. ]),
  5711.  
  5712. ("cf_use_castle_money_chest", # server and clients: handle depositing to and withdrawing from a money chest. the client version just does the checks, the server version also applies changes
  5713. [(store_script_param, ":player_id", 1), # must be valid
  5714. (store_script_param, ":instance_id", 2),
  5715. (store_script_param, ":gold_value", 3), # positive values to deposit, negative to withdraw
  5716.  
  5717. (assign, ":fail_message", -1),
  5718. (try_begin),
  5719. (neq, "$g_game_type", "mt_no_money"),
  5720. (neq, ":gold_value", 0),
  5721. (assign, ":fail_message", "str_no_money_chest_nearby"),
  5722. (call_script, "script_cf_can_use_scene_prop", ":player_id", ":instance_id", "spr_pw_castle_money_chest"),
  5723. (scene_prop_get_slot, ":chest_gold", ":instance_id", slot_scene_prop_stock_count),
  5724. (try_begin),
  5725. (lt, ":gold_value", 0),
  5726. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5727. (try_begin),
  5728. (eq, reg1, -1),
  5729. (else_try),
  5730. (neg|multiplayer_is_server),
  5731. (else_try),
  5732. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  5733. (else_try),
  5734. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  5735. (player_slot_eq, ":player_id", slot_player_has_faction_money_key, 1),
  5736. (else_try),
  5737. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  5738. (call_script, "script_cf_player_is_lord", ":player_id"),
  5739. (else_try),
  5740. (assign, ":fail_message", "str_cant_open_money_chest"),
  5741. (try_end),
  5742. (neq, ":fail_message", "str_cant_open_money_chest"),
  5743. (assign, ":fail_message", "str_not_enough_money_in_chest"),
  5744. (store_mul, ":gold_requested", ":gold_value", -1),
  5745. (ge, ":chest_gold", ":gold_requested"),
  5746. (try_begin),
  5747. (multiplayer_is_server),
  5748. (val_sub, ":chest_gold", ":gold_requested"),
  5749. (call_script, "script_player_adjust_gold", ":player_id", ":gold_requested", 1),
  5750. (try_end),
  5751. (assign, ":fail_message", 0),
  5752. (else_try),
  5753. (gt, ":gold_value", 0),
  5754. (assign, ":fail_message", "str_dont_have_enough_money"),
  5755. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  5756. (try_begin),
  5757. (multiplayer_is_server),
  5758. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", -1),
  5759. (val_add, ":chest_gold", ":gold_value"),
  5760. (val_clamp, ":chest_gold", 0, max_possible_gold),
  5761. (try_end),
  5762. (assign, ":fail_message", 0),
  5763. (try_end),
  5764. (try_end),
  5765. (try_begin),
  5766. (eq, ":fail_message", 0),
  5767. (try_begin),
  5768. (multiplayer_is_server),
  5769. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":chest_gold"),
  5770. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":chest_gold"),
  5771. (else_try),
  5772. (multiplayer_send_3_int_to_server, client_event_transfer_gold, ":instance_id", ":gold_value"),
  5773. (try_end),
  5774. (else_try),
  5775. (multiplayer_is_server),
  5776. (gt, ":fail_message", 0),
  5777. (neq, ":fail_message", "str_dont_have_enough_money"),
  5778. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":fail_message", preset_message_error),
  5779. (try_end),
  5780. (assign, reg0, ":fail_message"),
  5781. (eq, ":fail_message", 0),
  5782.  
  5783. #RAMARAUNT ADD LEDGER KEEPING TRACK OF LAST USER
  5784. (call_script, "script_store_money_chest_last_user", ":player_id", ":instance_id"),
  5785. ]),
  5786.  
  5787. ("store_money_chest_last_user", #RAMARAUNT SCRIPT
  5788.  
  5789.  
  5790. [(store_script_param, ":player_id", 1),
  5791. (store_script_param, ":instance_id", 2),
  5792.  
  5793.  
  5794. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5795.  
  5796. (try_begin),
  5797. (eq, reg0, 0),
  5798. (str_store_player_username, s50, ":player_id"),
  5799.  
  5800. (else_try),
  5801. (eq, reg0, 1),
  5802. (str_store_player_username, s51, ":player_id"),
  5803. (else_try),
  5804. (eq, reg0, 2),
  5805. (str_store_player_username, s52, ":player_id"),
  5806. (else_try),
  5807. (eq, reg0, 3),
  5808. (str_store_player_username, s53, ":player_id"),
  5809. (else_try),
  5810. (eq, reg0, 4),
  5811. (str_store_player_username, s54, ":player_id"),
  5812. (else_try),
  5813. (eq, reg0, 5),
  5814. (str_store_player_username, s55, ":player_id"),
  5815. (else_try),
  5816. (eq, reg0, 6),
  5817. (str_store_player_username, s56, ":player_id"),
  5818. (else_try),
  5819. (eq, reg0, 7),
  5820. (str_store_player_username, s57, ":player_id"),
  5821. (else_try),
  5822. (eq, reg0, 8),
  5823. (str_store_player_username, s58, ":player_id"),
  5824. (try_end),
  5825.  
  5826.  
  5827. ]),
  5828.  
  5829. ("return_money_chest_last_user_string", #RAMARAUNT SCRIPT
  5830. [(store_script_param_1, ":fac_no"),
  5831.  
  5832. (try_begin),
  5833. (eq, ":fac_no", 0),
  5834. (str_store_string, s49, s50),
  5835. (else_try),
  5836. (eq, ":fac_no", 1),
  5837. (str_store_string, s49, s51),
  5838. (else_try),
  5839. (eq, ":fac_no", 2),
  5840. (str_store_string, s49, s52),
  5841. (else_try),
  5842. (eq, ":fac_no", 3),
  5843. (str_store_string, s49, s53),
  5844. (else_try),
  5845. (eq, ":fac_no", 4),
  5846. (str_store_string, s49, s54),
  5847. (else_try),
  5848. (eq, ":fac_no", 5),
  5849. (str_store_string, s49, s55),
  5850. (else_try),
  5851. (eq, ":fac_no", 6),
  5852. (str_store_string, s49, s56),
  5853. (else_try),
  5854. (eq, ":fac_no", 7),
  5855. (str_store_string, s49, s57),
  5856. (else_try),
  5857. (eq, ":fac_no", 8),
  5858. (str_store_string, s49, s58),
  5859. (try_end),
  5860.  
  5861. ]),
  5862.  
  5863. ("scene_prop_ledger_get_money", # get the amount of gold from the ledger and store it in reg0 and reg1 RAMARAUNT ADD
  5864. [(store_script_param, ":instance_id", 1), # must be valid
  5865.  
  5866. (prop_instance_get_variation_id_2, ":scene_prop_ledger_amount", ":instance_id"),
  5867. (val_mul, ":scene_prop_ledger_amount", 10000),
  5868. (assign, reg0, ":scene_prop_ledger_amount"),
  5869. (val_div, ":scene_prop_ledger_amount", 100),
  5870. (val_mul, ":scene_prop_ledger_amount", 5),
  5871. (assign, reg1, ":scene_prop_ledger_amount"),
  5872.  
  5873. (store_add, reg2, reg0, 100000),
  5874. ]),
  5875.  
  5876. ("castle_recieve_taxes", #Ramaraunt script: this script is called for each chest every 30 seconds.
  5877. [(try_for_range, ":fac_no", 0, 9),
  5878. (store_add, ":chest_slot", slot_mission_data_castle_money_chest_begin, ":fac_no"),
  5879. (store_add, ":ledger_slot", slot_mission_data_interest_box_begin, ":fac_no"),
  5880. (troop_get_slot, ":chest_id", "trp_mission_data", ":chest_slot"),
  5881. (troop_get_slot, ":ledger_id", "trp_mission_data", ":ledger_slot"),
  5882. (scene_prop_get_slot, ":chest_gold", ":chest_id", slot_scene_prop_stock_count),
  5883. (call_script, "script_scene_prop_ledger_get_money", ":ledger_id"),
  5884. (try_begin),
  5885. (ge, ":chest_gold", reg0),
  5886. (le, ":chest_gold", reg2),
  5887. (scene_prop_get_slot, ":timer", ":chest_id", slot_money_chest_interest_timer),
  5888. (try_begin),
  5889. (ge, ":timer", 20),
  5890. (scene_prop_set_slot, ":chest_id", slot_money_chest_interest_timer, 0),
  5891. (neq, ":ledger_id", 0),
  5892. (val_add, ":chest_gold", reg1),
  5893. (scene_prop_set_slot, ":chest_id", slot_scene_prop_stock_count, ":chest_gold"),
  5894. (else_try),
  5895. (val_add, ":timer", 1),
  5896. (scene_prop_set_slot, ":chest_id", slot_money_chest_interest_timer, ":timer"),
  5897. (try_end),
  5898. (else_try),
  5899. (scene_prop_set_slot, ":chest_id", slot_money_chest_interest_timer, 0),
  5900. (try_end),
  5901.  
  5902. (try_end),
  5903.  
  5904. ]),
  5905.  
  5906. ("cf_drop_money_bag_item", # server: handle players dropping money bags
  5907. [(store_script_param, ":player_id", 1), # must be valid
  5908. (store_script_param, ":gold_amount", 2),
  5909.  
  5910. (player_get_agent_id, ":agent_id", ":player_id"),
  5911. (agent_is_alive, ":agent_id"),
  5912. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_amount"),
  5913. (store_mission_timer_a, ":time"),
  5914. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  5915. (store_sub, ":interval", ":time", ":last_action_time"),
  5916. (this_or_next|ge, ":interval", repeat_action_min_interval),
  5917. (player_is_admin, ":player_id"),
  5918. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  5919. (call_script, "script_player_adjust_gold", ":player_id", ":gold_amount", -1),
  5920. (agent_get_position, pos1, ":agent_id"),
  5921. (position_move_y, pos1, 50),
  5922. (set_spawn_position, pos1),
  5923. (spawn_item, "itm_money_bag", 0, "$g_spawn_item_prune_time"),
  5924. (scene_prop_set_slot, reg0, slot_scene_prop_gold_value, ":gold_amount"),
  5925. ]),
  5926.  
  5927. ("cf_pop_agent_money_bag_value", # remove the last added money bag amount from the agent's slots
  5928. [(store_script_param, ":agent_id", 1), # must be valid
  5929.  
  5930. (assign, ":last_value", 0),
  5931. (try_for_range_backwards, ":value_slot", slot_agent_money_bag_1_value, slot_agent_money_bag_4_value + 1),
  5932. (agent_get_slot, ":value", ":agent_id", ":value_slot"),
  5933. (agent_set_slot, ":agent_id", ":value_slot", ":last_value"),
  5934. (assign, ":last_value", ":value"),
  5935. (try_end),
  5936. (assign, reg0, ":last_value"),
  5937. (gt, ":last_value", 0),
  5938. ]),
  5939.  
  5940. ("cf_use_money_bag_item", # server: handle players retrieving the contents of equipped money bags
  5941. [(store_script_param, ":agent_id", 1), # must be valid
  5942.  
  5943. (neq, "$g_game_type", "mt_no_money"),
  5944. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_money_bag", 1),
  5945. (call_script, "script_cf_pop_agent_money_bag_value", ":agent_id"),
  5946. (assign, ":gold_value", reg0),
  5947. (agent_get_player_id, ":player_id", ":agent_id"),
  5948. (player_is_active, ":player_id"),
  5949. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5950. ]),
  5951.  
  5952. ("check_on_item_picked_up", # server: extra checks when an agent picks up an item
  5953. [(store_script_param, ":agent_id", 1), # must be valid
  5954. (store_script_param, ":item_id", 2),
  5955. (store_script_param, ":instance_id", 3), # must be the item instance's id
  5956.  
  5957. (try_begin),
  5958. (eq, ":item_id", "itm_money_bag"), # since the item instance will be removed immediately aftewards, transfer the contents to an agent slot
  5959. (neq, "$g_game_type", "mt_no_money"),
  5960. (scene_prop_get_slot, ":value", ":instance_id", slot_scene_prop_gold_value),
  5961. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_value, 0),
  5962. (try_for_range, ":value_slot", slot_agent_money_bag_1_value, slot_agent_money_bag_4_value + 1),
  5963. (agent_get_slot, ":next_value", ":agent_id", ":value_slot"),
  5964. (agent_set_slot, ":agent_id", ":value_slot", ":value"),
  5965. (assign, ":value", ":next_value"),
  5966. (try_end),
  5967. (else_try),
  5968. (this_or_next|eq, ":item_id", "itm_invisible_sword"),
  5969. (eq, ":item_id", "itm_admin_scalpel"),
  5970. (agent_get_player_id, ":player_id", ":agent_id"),
  5971. (player_is_active, ":player_id"),
  5972. (neg|player_is_admin, ":player_id"),
  5973. (agent_unequip_item, ":agent_id", ":item_id"),
  5974. (try_end),
  5975. ]),
  5976.  
  5977. ("check_on_item_dropped", # server: extra checks when an agent drops an item
  5978. [(store_script_param, ":agent_id", 1), # must be valid
  5979. (store_script_param, ":item_id", 2),
  5980. (store_script_param, ":instance_id", 3), # must be the dropped item instance's id
  5981. (store_script_param, ":agent_died", 4), # set to 1 for dropping when the agent dies
  5982.  
  5983. (set_fixed_point_multiplier, 100),
  5984. (try_begin), # only check for items over a certain id, near the end of the list
  5985. (le, ":item_id", "itm_lock_pick"),
  5986. (else_try),
  5987. (eq, ":item_id", "itm_money_bag"),
  5988. (try_begin),
  5989. (neq, "$g_game_type", "mt_no_money"),
  5990. (call_script, "script_cf_pop_agent_money_bag_value", ":agent_id"), # transfer from the agent slot into the new dropped item instance
  5991. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_value, reg0),
  5992. (try_end),
  5993. (else_try),
  5994. (is_between, ":item_id", "itm_pw_banner_pole_a01", "itm_pw_banner_castle_fac_1a"),
  5995. (neq, ":agent_died", 1), # if not dropped because the agent died, plant the flag pole upright
  5996. (prop_instance_get_position, pos1, ":instance_id"),
  5997. (position_rotate_x, pos1, 90),
  5998. (prop_instance_set_position, ":instance_id", pos1),
  5999. (assign, ":flag_prune_time", "$g_spawn_item_prune_time"),
  6000. (val_max, ":flag_prune_time", 3600), # prevent it disappearing for at least an hour
  6001. (scene_prop_set_prune_time, ":instance_id", ":flag_prune_time"),
  6002. (else_try),
  6003. (eq, ":item_id", "itm_fishing_net"),
  6004. (prop_instance_get_position, pos1, ":instance_id"),
  6005. (position_get_z, ":height", pos1),
  6006. (try_begin),
  6007. (lt, ":height", -100),
  6008. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6009. (store_skill_level, ":placement_skill", "skl_labouring", ":troop_id"),
  6010. (else_try),
  6011. (assign, ":placement_skill", 0),
  6012. (try_end),
  6013. (scene_prop_set_slot, ":instance_id", slot_scene_prop_position, ":placement_skill"),
  6014. (else_try),
  6015. (eq, ":item_id", "itm_scythe"),
  6016. (prop_instance_get_position, pos1, ":instance_id"),
  6017. (position_rotate_x, pos1, 11),
  6018. (prop_instance_set_position, ":instance_id", pos1),
  6019. (else_try),
  6020. (this_or_next|eq, ":item_id", "itm_beer_jug"),
  6021. (eq, ":item_id", "itm_wheat_sheaf"),
  6022. (prop_instance_get_position, pos1, ":instance_id"),
  6023. (position_rotate_x, pos1, 90),
  6024. (position_move_z, pos1, 21, 1),
  6025. (prop_instance_set_position, ":instance_id", pos1),
  6026. (else_try),
  6027. (this_or_next|eq, ":item_id", "itm_flour_sack"),
  6028. (this_or_next|eq, ":item_id", "itm_beer_cask"),
  6029. (this_or_next|eq, ":item_id", "itm_must_barrel"),
  6030. (eq, ":item_id", "itm_wine_barrel"),
  6031. (prop_instance_get_position, pos1, ":instance_id"),
  6032. (position_move_z, pos1, 16, 1),
  6033. (prop_instance_set_position, ":instance_id", pos1),
  6034. (else_try),
  6035. (eq, ":item_id", "itm_die"),
  6036. (prop_instance_get_position, pos1, ":instance_id"),
  6037. (position_move_y, pos1, 50),
  6038. (store_random_in_range, ":throw_result", 0, 6),
  6039. (try_begin),
  6040. (eq, ":throw_result", 0),
  6041. (else_try),
  6042. (eq, ":throw_result", 1),
  6043. (position_rotate_x, pos1, 90),
  6044. (else_try),
  6045. (eq, ":throw_result", 2),
  6046. (position_rotate_y, pos1, 90),
  6047. (else_try),
  6048. (eq, ":throw_result", 3),
  6049. (position_rotate_y, pos1, -90),
  6050. (else_try),
  6051. (eq, ":throw_result", 4),
  6052. (position_rotate_x, pos1, -90),
  6053. (else_try),
  6054. (position_rotate_x, pos1, 180),
  6055. (try_end),
  6056. (prop_instance_set_position, ":instance_id", pos1),
  6057. (else_try), # remove admin items dropped on the ground
  6058. (this_or_next|eq, ":item_id", "itm_invisible_sword"),
  6059. (this_or_next|eq, ":item_id", "itm_admin_lock_pick"),
  6060. (eq, ":item_id", "itm_admin_scalpel"),
  6061. (init_position, pos1),
  6062. (position_set_z, pos1, z_position_to_hide_object),
  6063. (prop_instance_set_position, ":instance_id", pos1),
  6064. (scene_prop_set_prune_time, ":instance_id", 1),
  6065. (try_end),
  6066. ]),
  6067.  
  6068. ("agent_calculate_stat_modifiers_for_item", # clients: return the modifiers in reg10 - reg14; server: apply the modifiers if that parameter is set
  6069. [(store_script_param, ":agent_id", 1), # must be valid
  6070. (store_script_param, ":item_id", 2),
  6071. (store_script_param, ":equipped", 3), # 1 = the item was equipped and wielded so add modifiers, 0 = the item was unwielded, so remove modifiers
  6072. (store_script_param, ":apply", 4), # server only: 1 = apply the modifiers to the agent rather than returning them
  6073.  
  6074. (try_begin),
  6075. (multiplayer_is_server),
  6076. (eq, ":equipped", 1),
  6077. (eq, ":apply", 1), # if the item is the same as the last calcuated for this agent, skip the redundant calculations
  6078. (agent_slot_eq, ":agent_id", slot_agent_last_apply_factors_item_id, ":item_id"),
  6079. (else_try),
  6080. (assign, ":handled", 1),
  6081. (assign, ":cannot_attack", 0),
  6082. (item_get_slot, ":difficulty", ":item_id", slot_item_difficulty),
  6083. (item_get_type, ":item_type", ":item_id"),
  6084. (try_begin),
  6085. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  6086. (try_begin), # if the armor has restrictions, calculate the modifier factors
  6087. (gt, ":difficulty", 0),
  6088. (eq, ":equipped", 1),
  6089. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6090. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  6091. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  6092. (val_max, ":difficulty_level", 0),
  6093. (store_mul, ":damage_factor", ":difficulty_level", armor_damage_reduction_factor),
  6094. (try_begin),
  6095. (eq, ":item_type", itp_type_head_armor),
  6096. (store_mul, ":speed_factor", ":difficulty_level", head_armor_speed_reduction_factor),
  6097. (store_mul, ":accuracy_factor", ":difficulty_level", head_armor_accuracy_reduction_factor),
  6098. (store_mul, ":reload_factor", ":difficulty_level", head_armor_reload_reduction_factor),
  6099. (else_try),
  6100. (eq, ":item_type", itp_type_body_armor),
  6101. (store_mul, ":speed_factor", ":difficulty_level", body_armor_speed_reduction_factor),
  6102. (store_mul, ":accuracy_factor", ":difficulty_level", body_armor_accuracy_reduction_factor),
  6103. (store_mul, ":reload_factor", ":difficulty_level", body_armor_reload_reduction_factor),
  6104. (else_try),
  6105. (eq, ":item_type", itp_type_foot_armor),
  6106. (store_mul, ":speed_factor", ":difficulty_level", foot_armor_speed_reduction_factor),
  6107. (store_mul, ":accuracy_factor", ":difficulty_level", foot_armor_accuracy_reduction_factor),
  6108. (store_mul, ":reload_factor", ":difficulty_level", foot_armor_reload_reduction_factor),
  6109. (else_try),
  6110. (eq, ":item_type", itp_type_hand_armor),
  6111. (store_mul, ":speed_factor", ":difficulty_level", hand_armor_speed_reduction_factor),
  6112. (store_mul, ":accuracy_factor", ":difficulty_level", hand_armor_accuracy_reduction_factor),
  6113. (store_mul, ":reload_factor", ":difficulty_level", hand_armor_reload_reduction_factor),
  6114. (try_end),
  6115. (else_try),
  6116. (assign, ":damage_factor", 0),
  6117. (assign, ":speed_factor", 0),
  6118. (assign, ":accuracy_factor", 0),
  6119. (assign, ":reload_factor", 0),
  6120. (try_end),
  6121. (assign, ":item_damage_factor", ":damage_factor"),
  6122. (assign, ":item_speed_factor", ":speed_factor"),
  6123. (assign, ":item_accuracy_factor", ":accuracy_factor"),
  6124. (assign, ":item_reload_factor", ":reload_factor"),
  6125. (assign, ":slot", slot_agent_head_damage_factor),
  6126. (try_for_range, ":current_type", itp_type_head_armor, itp_type_hand_armor + 1),
  6127. (neq, ":current_type", ":item_type"), # add cached factors for armor equipped in other slots
  6128. (agent_get_slot, ":existing_damage_factor", ":agent_id", ":slot"),
  6129. (val_add, ":damage_factor", ":existing_damage_factor"),
  6130. (val_add, ":slot", 1),
  6131. (agent_get_slot, ":existing_speed_factor", ":agent_id", ":slot"),
  6132. (val_add, ":speed_factor", ":existing_speed_factor"),
  6133. (val_add, ":slot", 1),
  6134. (agent_get_slot, ":existing_accuracy_factor", ":agent_id", ":slot"),
  6135. (val_add, ":accuracy_factor", ":existing_accuracy_factor"),
  6136. (val_add, ":slot", 1),
  6137. (agent_get_slot, ":existing_reload_factor", ":agent_id", ":slot"),
  6138. (val_add, ":reload_factor", ":existing_reload_factor"),
  6139. (val_add, ":slot", 1),
  6140. (else_try), # if applying, cache the factors for the current armor item's slot
  6141. (eq, ":apply", 1),
  6142. (agent_set_slot, ":agent_id", ":slot", ":item_damage_factor"),
  6143. (val_add, ":slot", 1),
  6144. (agent_set_slot, ":agent_id", ":slot", ":item_speed_factor"),
  6145. (val_add, ":slot", 1),
  6146. (agent_set_slot, ":agent_id", ":slot", ":item_accuracy_factor"),
  6147. (val_add, ":slot", 1),
  6148. (agent_set_slot, ":agent_id", ":slot", ":item_reload_factor"),
  6149. (val_add, ":slot", 1),
  6150. (else_try), # otherwise skip the slots for the current armor item
  6151. (val_add, ":slot", 4),
  6152. (try_end),
  6153. (try_begin),
  6154. (eq, ":apply", 1), # if applying, cache the total armor factors
  6155. (agent_set_slot, ":agent_id", slot_agent_armor_damage_factor, ":damage_factor"),
  6156. (agent_set_slot, ":agent_id", slot_agent_armor_speed_factor, ":speed_factor"),
  6157. (agent_set_slot, ":agent_id", slot_agent_armor_accuracy_factor, ":accuracy_factor"),
  6158. (agent_set_slot, ":agent_id", slot_agent_armor_reload_factor, ":reload_factor"),
  6159. (assign, ":damage_through", ":speed_factor"),
  6160. (val_min, ":damage_through", 100),
  6161. (agent_set_slot, ":agent_id", slot_agent_armor_damage_through, ":damage_through"),
  6162. (try_end), # add existing weapon factors
  6163. (agent_get_slot, ":weapon_damage_factor", ":agent_id", slot_agent_weapon_damage_factor),
  6164. (val_add, ":damage_factor", ":weapon_damage_factor"),
  6165. (agent_get_slot, ":weapon_speed_factor", ":agent_id", slot_agent_weapon_speed_factor),
  6166. (val_add, ":speed_factor", ":weapon_speed_factor"),
  6167. (agent_get_slot, ":weapon_accuracy_factor", ":agent_id", slot_agent_weapon_accuracy_factor),
  6168. (val_add, ":accuracy_factor", ":weapon_accuracy_factor"),
  6169. (agent_get_slot, ":weapon_reload_factor", ":agent_id", slot_agent_weapon_reload_factor),
  6170. (val_add, ":reload_factor", ":weapon_reload_factor"),
  6171. (else_try),
  6172. (try_begin),
  6173. (assign, ":damage_factor", 0),
  6174. (assign, ":speed_factor", 0),
  6175. (try_begin), # for crossbows, apply extra accuracy and reload factors based on proficiency
  6176. (eq, ":item_type", itp_type_crossbow),
  6177. (eq, ":equipped", 1),
  6178. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6179. (store_proficiency_level, ":crossbow", ":troop_id", wpt_crossbow),
  6180. (lt, ":crossbow", 100),
  6181. (store_sub, ":accuracy_factor", 100, ":crossbow"),
  6182. (val_div, ":accuracy_factor", 2),
  6183. (assign, ":reload_factor", ":accuracy_factor"),
  6184. (else_try),
  6185. (assign, ":accuracy_factor", 0),
  6186. (assign, ":reload_factor", 0),
  6187. (try_end),
  6188. (gt, ":difficulty", 0),
  6189. (eq, ":equipped", 1),
  6190. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6191. (try_begin),
  6192. (is_between, ":item_type", itp_type_one_handed_wpn, itp_type_polearm + 1),
  6193. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  6194. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  6195. (val_max, ":difficulty_level", 0),
  6196. (store_mul, ":damage_factor", ":difficulty_level", melee_damage_reduction_factor),
  6197. (store_mul, ":speed_factor", ":difficulty_level", melee_speed_reduction_factor),
  6198. (try_begin),
  6199. (gt, ":difficulty_level", melee_max_level_difference),
  6200. (assign, ":cannot_attack", 1),
  6201. (try_end),
  6202. (else_try),
  6203. (eq, ":item_type", itp_type_crossbow),
  6204. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  6205. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  6206. (val_max, ":difficulty_level", 0),
  6207. (store_mul, ":damage_factor", ":difficulty_level", crossbow_damage_reduction_factor),
  6208. (store_mul, ":speed_factor", ":difficulty_level", crossbow_speed_reduction_factor),
  6209. (store_mul, ":accuracy_factor_2", ":difficulty_level", crossbow_accuracy_reduction_factor),
  6210. (val_add, ":accuracy_factor", ":accuracy_factor_2"),
  6211. (store_mul, ":reload_factor_2", ":difficulty_level", crossbow_reload_reduction_factor),
  6212. (val_add, ":reload_factor", ":reload_factor_2"),
  6213. (try_begin),
  6214. (gt, ":difficulty_level", crossbow_max_level_difference),
  6215. (assign, ":cannot_attack", 1),
  6216. (try_end),
  6217. (else_try),
  6218. (this_or_next|eq, ":item_type", itp_type_bow),
  6219. (eq, ":item_type", itp_type_thrown),
  6220. (try_begin),
  6221. (eq, ":item_type", itp_type_bow),
  6222. (store_skill_level, ":troop_level", "skl_power_draw", ":troop_id"),
  6223. (else_try),
  6224. (eq, ":item_type", itp_type_thrown),
  6225. (store_skill_level, ":troop_level", "skl_power_throw", ":troop_id"),
  6226. (try_end),
  6227. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  6228. (val_max, ":difficulty_level", 0),
  6229. (store_mul, ":damage_factor", ":difficulty_level", bow_thrown_damage_reduction_factor),
  6230. (store_mul, ":speed_factor", ":difficulty_level", bow_thrown_speed_reduction_factor),
  6231. (store_mul, ":accuracy_factor", ":difficulty_level", bow_thrown_accuracy_reduction_factor),
  6232. (try_begin),
  6233. (gt, ":troop_level", 0),
  6234. (le, ":difficulty_level", bow_ranged_max_level_difference),
  6235. (else_try),
  6236. (assign, ":cannot_attack", 1),
  6237. (try_end),
  6238. (else_try),
  6239. (assign, ":handled", 0), # an unhandled item type
  6240. (try_end),
  6241. (else_try),
  6242. (neg|is_between, ":item_type", itp_type_one_handed_wpn, itp_type_polearm + 1),
  6243. (neg|is_between, ":item_type", itp_type_bow, itp_type_thrown + 1),
  6244. (assign, ":handled", 0), # an unhandled item type
  6245. (try_end),
  6246. (eq, ":handled", 1),
  6247. (try_begin),
  6248. (eq, ":apply", 1), # if applying, cache the weapon factors
  6249. (agent_set_slot, ":agent_id", slot_agent_weapon_damage_factor, ":damage_factor"),
  6250. (agent_set_slot, ":agent_id", slot_agent_weapon_speed_factor, ":speed_factor"),
  6251. (agent_set_slot, ":agent_id", slot_agent_weapon_accuracy_factor, ":accuracy_factor"),
  6252. (agent_set_slot, ":agent_id", slot_agent_weapon_reload_factor, ":reload_factor"),
  6253. (try_end), # add existing armor factors
  6254. (agent_get_slot, ":armor_damage_factor", ":agent_id", slot_agent_armor_damage_factor),
  6255. (val_add, ":damage_factor", ":armor_damage_factor"),
  6256. (agent_get_slot, ":armor_speed_factor", ":agent_id", slot_agent_armor_speed_factor),
  6257. (val_add, ":speed_factor", ":armor_speed_factor"),
  6258. (agent_get_slot, ":armor_accuracy_factor", ":agent_id", slot_agent_armor_accuracy_factor),
  6259. (val_add, ":accuracy_factor", ":armor_accuracy_factor"),
  6260. (agent_get_slot, ":armor_reload_factor", ":agent_id", slot_agent_armor_reload_factor),
  6261. (val_add, ":reload_factor", ":armor_reload_factor"),
  6262. (try_end),
  6263. (assign, ":damage_modifier", 100),
  6264. (assign, ":speed_modifier", 100),
  6265. (assign, ":accuracy_modifier", 100),
  6266. (assign, ":reload_modifier", 100),
  6267. (try_begin), # convert the total factors (additive) into modifiers (subtracting from 100)
  6268. (eq, ":handled", 1),
  6269. (try_begin),
  6270. (gt, ":damage_factor", 0),
  6271. (store_sub, ":damage_modifier", reduction_factor_base, ":damage_factor"),
  6272. (val_max, ":damage_modifier", 0),
  6273. (try_end),
  6274. (try_begin),
  6275. (gt, ":speed_factor", 0),
  6276. (store_sub, ":speed_modifier", reduction_factor_base, ":speed_factor"),
  6277. (val_max, ":speed_modifier", 0),
  6278. (try_end),
  6279. (try_begin),
  6280. (gt, ":accuracy_factor", 0),
  6281. (store_sub, ":accuracy_modifier", reduction_factor_base, ":accuracy_factor"),
  6282. (val_max, ":accuracy_modifier", 0),
  6283. (try_end),
  6284. (try_begin),
  6285. (gt, ":reload_factor", 0),
  6286. (store_sub, ":reload_modifier", reduction_factor_base, ":reload_factor"),
  6287. (val_max, ":reload_modifier", 0),
  6288. (try_end),
  6289. (try_begin), # get the agent's wielded item type if the one being checked is not a weapon
  6290. (neg|is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  6291. (assign, ":wielded_item_type", ":item_type"),
  6292. (else_try),
  6293. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  6294. (gt, ":wielded_item_id", -1),
  6295. (item_get_type, ":wielded_item_type", ":wielded_item_id"),
  6296. (else_try),
  6297. (assign, ":wielded_item_type", -1),
  6298. (try_end),
  6299. (try_begin), # prevent attacking if relevant modifiers are zero
  6300. (neq, ":cannot_attack", 1),
  6301. (neq, ":speed_modifier", 0),
  6302. (neq, ":damage_modifier", 0),
  6303. (this_or_next|neq, ":accuracy_modifier", 0),
  6304. (neg|is_between, ":wielded_item_type", itp_type_bow, itp_type_thrown + 1),
  6305. (this_or_next|neq, ":reload_modifier", 0),
  6306. (neq, ":wielded_item_type", itp_type_crossbow),
  6307. (assign, ":cannot_attack", 0),
  6308. (else_try),
  6309. (assign, ":cannot_attack", 1),
  6310. (try_end),
  6311. (eq, ":apply", 1),
  6312. (agent_set_slot, ":agent_id", slot_agent_cannot_attack, ":cannot_attack"),
  6313. (try_begin), # only apply modifiers on the server: it seems to cause memory leaks on clients
  6314. (multiplayer_is_server),
  6315. (agent_set_damage_modifier, ":agent_id", ":damage_modifier"),
  6316. (agent_set_ranged_damage_modifier, ":agent_id", ":damage_modifier"),
  6317. (agent_set_speed_modifier, ":agent_id", ":speed_modifier"),
  6318. (agent_set_accuracy_modifier, ":agent_id", ":accuracy_modifier"),
  6319. (agent_set_reload_speed_modifier, ":agent_id", ":reload_modifier"),
  6320. (try_begin), # remember the item id to avoid duplicate calculation if the script is called twice, by hard coded triggers or whatever
  6321. (eq, ":equipped", 1),
  6322. (agent_set_slot, ":agent_id", slot_agent_last_apply_factors_item_id, ":item_id"),
  6323. (else_try),
  6324. (agent_set_slot, ":agent_id", slot_agent_last_apply_factors_item_id, -1),
  6325. (try_end),
  6326. (try_end),
  6327. (else_try),
  6328. (neq, ":apply", 1),
  6329. (assign, reg10, ":cannot_attack"),
  6330. (assign, reg11, ":damage_modifier"),
  6331. (assign, reg12, ":speed_modifier"),
  6332. (assign, reg13, ":accuracy_modifier"),
  6333. (assign, reg14, ":reload_modifier"),
  6334. (try_end),
  6335. (try_end),
  6336. ]),
  6337.  
  6338. ("scene_prop_adjust_hit", # server: adjust hit damage by an agent on a resource scene prop for tools, skill, and more; reg0 = agent id
  6339. [(store_script_param, ":instance_id", 1), # must be valid
  6340. (store_script_param, ":hit_damage", 2),
  6341. (store_script_param, ":hardness", 3), # divides the damage dealt by this number
  6342. (store_script_param, ":tool_class", 4), # constants starting with item_class_
  6343. (store_script_param, ":skill_id", 5),
  6344. (store_script_param, ":attack_direction_range", 6), # second digit = direction from agent_get_action_dir, first digit = subsequent directions to include
  6345. (set_fixed_point_multiplier, 1),
  6346. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  6347. (set_fixed_point_multiplier, 100),
  6348.  
  6349. (try_begin),
  6350. (gt, ":skill_id", -1),
  6351. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6352. (store_skill_level, ":skill", ":skill_id", ":troop_id"),
  6353. (try_begin),
  6354. (le, ":skill", 0),
  6355. (val_mul, ":hit_damage", 10),
  6356. (else_try),
  6357. (val_mul, ":hit_damage", 50),
  6358. (val_mul, ":hit_damage", ":skill"),
  6359. (try_end),
  6360. (else_try),
  6361. (val_mul, ":hit_damage", 100),
  6362. (try_end),
  6363. (try_begin),
  6364. (ge, ":hit_damage", 100), # will be divided by 100 later, so checking if the damage can be greater than 0
  6365. (try_begin),
  6366. (gt, ":attack_direction_range", -1),
  6367. (store_div, ":attack_direction_end", ":attack_direction_range", 10),
  6368. (val_mod, ":attack_direction_range", 10),
  6369. (val_add, ":attack_direction_end", ":attack_direction_range"),
  6370. (val_add, ":attack_direction_end", 1),
  6371. (agent_get_action_dir, ":attack_direction", ":agent_id"),
  6372. (neg|is_between, ":attack_direction", ":attack_direction_range", ":attack_direction_end"),
  6373. (val_div, ":hit_damage", 3),
  6374. (try_end),
  6375. (ge, ":hit_damage", 100),
  6376. (try_begin),
  6377. (gt, ":tool_class", -1),
  6378. (agent_get_wielded_item, ":wielded_item", ":agent_id", 0),
  6379. (try_begin),
  6380. (gt, ":wielded_item", -1),
  6381. (item_get_slot, ":wielded_item_class", ":wielded_item", slot_item_class),
  6382. (eq, ":wielded_item_class", ":tool_class"),
  6383. (else_try),
  6384. (val_div, ":hit_damage", 5),
  6385. (try_end),
  6386. (try_end),
  6387. (val_max, ":hardness", 1),
  6388. (val_div, ":hit_damage", ":hardness"),
  6389. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  6390. (store_sub, ":hunger_factor", max_food_amount, ":food_amount"),
  6391. (val_mul, ":hunger_factor", ":hardness"),
  6392. (val_mul, ":hunger_factor", ":hit_damage"),
  6393. (val_div, ":hunger_factor", max_food_amount * 7),
  6394. (val_sub, ":hit_damage", ":hunger_factor"),
  6395. (val_max, ":hit_damage", 0),
  6396. (try_begin), # decrease food amount based on a probability to simulate an average of less than one point per hit
  6397. (gt, ":food_amount", 0),
  6398. (store_random_in_range, ":random", ":hardness", 16),
  6399. (gt, ":random", 12),
  6400. (val_sub, ":food_amount", 1),
  6401. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  6402. (store_mod, ":remainder", ":food_amount", 5),
  6403. (eq, ":remainder", 0), # only send food bar updates to the player's client about every 5% used
  6404. (agent_get_player_id, ":player_id", ":agent_id"),
  6405. (player_is_active, ":player_id"),
  6406. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  6407. (try_end),
  6408. (try_end),
  6409. (val_div, ":hit_damage", 100),
  6410. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  6411. (assign, reg0, ":agent_id"),
  6412. ]),
  6413.  
  6414. ("scene_prop_damage_no_destroy", # server: adjust damage to a scene prop so it is never destroyed; reg1 = adjusted damage, reg2 = adjusted hit points
  6415. [(store_script_param, ":instance_id", 1), # must be valid
  6416. (store_script_param, ":hit_damage", 2),
  6417.  
  6418. (scene_prop_get_hit_points, ":hit_points", ":instance_id"),
  6419. (val_sub, ":hit_points", ":hit_damage"),
  6420. (try_begin),
  6421. (lt, ":hit_points", min_scene_prop_hit_points),
  6422. (val_add, ":hit_damage", ":hit_points"),
  6423. (val_sub, ":hit_damage", min_scene_prop_hit_points),
  6424. (assign, ":hit_points", min_scene_prop_hit_points),
  6425. (try_end),
  6426. (set_trigger_result, ":hit_damage"),
  6427. (assign, reg1, ":hit_damage"),
  6428. (assign, reg2, ":hit_points"),
  6429. ]),
  6430.  
  6431. ("cf_check_drop_resource", # server: check if scene prop hit points have decreased enough to drop resources; storing the number to drop in reg0
  6432. [(store_script_param, ":instance_id", 1), # must be valid
  6433. (store_script_param, ":hit_points", 2), # current hit points
  6434. (store_script_param, ":hit_points_for_resource", 3), # hit damage required per resource dropped
  6435. (store_script_param, ":random_adjustment", 4), # maximum random adjustment to the above value
  6436.  
  6437. (scene_prop_get_slot, ":next_resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  6438. (assign, reg0, 0),
  6439. (assign, ":loop_condition", 10), # only check for a maximum of 10 iterations, to prevent long or infinite loops
  6440. (try_for_range, ":unused", 0, ":loop_condition"),
  6441. (ge, ":next_resource_hp", ":hit_points"),
  6442. (val_sub, ":next_resource_hp", ":hit_points_for_resource"),
  6443. (try_begin),
  6444. (gt, ":random_adjustment", 0),
  6445. (store_random_in_range, ":random_hp", 0, ":random_adjustment"),
  6446. (val_sub, ":next_resource_hp", ":random_hp"),
  6447. (try_end),
  6448. (val_add, reg0, 1),
  6449. (else_try),
  6450. (assign, ":loop_condition", -1),
  6451. (try_end),
  6452. (neq, reg0, 0),
  6453. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":next_resource_hp"),
  6454. ]),
  6455.  
  6456. ("cf_hit_tree", # server: handle agents damaging a tree, should be called from ti_on_scene_prop_hit; reg0 = agent id, reg1 = hit damage, reg2 = hit points
  6457. [(multiplayer_is_server),
  6458. (store_script_param, ":instance_id", 1), # must be valid
  6459. (store_script_param, ":hit_damage", 2),
  6460. (store_script_param, ":fell_tree_hit_points", 3), # hit points when the tree should be rotated to lie along the ground and produce blocks rather than branches
  6461. (store_script_param, ":hit_points_for_resource", 4),
  6462. (store_script_param, ":hardness", 5),
  6463. (store_script_param, ":resource_imod", 6), # item mesh variation to match the visual appearance
  6464. (store_script_param, ":regrow_interval", 7),
  6465.  
  6466. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6467. (assign, ":break_effect", 0),
  6468. (try_begin),
  6469. (this_or_next|eq, ":state", scene_prop_state_active),
  6470. (eq, ":state", scene_prop_state_destroyed),
  6471. (call_script, "script_scene_prop_adjust_hit", ":instance_id", ":hit_damage", ":hardness", item_class_wood_cutting, "skl_labouring", 11),
  6472. (assign, ":agent_id", reg0),
  6473. (assign, ":hit_damage", reg1),
  6474. (assign, ":hit_points", reg2),
  6475. (try_begin),
  6476. (lt, ":hit_points", ":fell_tree_hit_points"),
  6477. (try_begin),
  6478. (eq, ":state", scene_prop_state_destroyed),
  6479. (le, ":hit_points", min_scene_prop_hit_points),
  6480. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6481. (prop_instance_get_position, pos2, ":instance_id"),
  6482. (position_move_z, pos2, -5000, 1),
  6483. (prop_instance_animate_to_position, ":instance_id", pos2, 2000),
  6484. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6485. (else_try),
  6486. (eq, ":state", scene_prop_state_active),
  6487. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  6488. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6489. (copy_position, pos3, pos2), # calculate the best angle to match the terrain by measuring at multiple distances along the felled length
  6490. (assign, ":trunk_angle", 90),
  6491. (try_for_range, ":count", 1, 4),
  6492. (position_move_x, pos3, 500),
  6493. (position_get_distance_to_ground_level, ":ground_distance", pos3),
  6494. (store_sub, ":slope_ratio", ":ground_distance", 30),
  6495. (val_abs, ":slope_ratio"),
  6496. (convert_to_fixed_point, ":slope_ratio"),
  6497. (store_mul, ":trunk_distance", ":count", 500),
  6498. (val_div, ":slope_ratio", ":trunk_distance"),
  6499. (store_atan, ":test_angle", ":slope_ratio"),
  6500. (convert_from_fixed_point, ":test_angle"),
  6501. (try_begin),
  6502. (lt, ":ground_distance", 0),
  6503. (val_mul, ":test_angle", -1),
  6504. (try_end),
  6505. (val_min, ":trunk_angle", ":test_angle"),
  6506. (try_end),
  6507. (val_add, ":trunk_angle", 90),
  6508. (position_rotate_y, pos2, ":trunk_angle"),
  6509. (prop_instance_animate_to_position, ":instance_id", pos2, 300),
  6510. (assign, ":break_effect", 1),
  6511. (scene_prop_get_slot, ":attached_item_count", ":instance_id", slot_scene_prop_inventory_count), # drop attached items on the ground
  6512. (val_add, ":attached_item_count", slot_scene_prop_inventory_begin),
  6513. (try_for_range, ":slot", slot_scene_prop_inventory_begin, ":attached_item_count"),
  6514. (scene_prop_get_slot, ":attached_instance_id", ":instance_id", ":slot"),
  6515. (prop_instance_is_valid, ":attached_instance_id"),
  6516. (scene_prop_slot_eq, ":attached_instance_id", slot_scene_prop_linked_scene_prop, ":instance_id"),
  6517. (prop_instance_get_position, pos4, ":attached_instance_id"),
  6518. (position_move_z, pos4, -50),
  6519. (position_set_z_to_ground_level, pos4),
  6520. (prop_instance_set_position, ":attached_instance_id", pos4),
  6521. (try_end),
  6522. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_count, 0),
  6523. (try_end),
  6524. (assign, ":resource_item_id", "itm_wood_block"),
  6525. (else_try),
  6526. (assign, ":resource_item_id", "itm_branch"),
  6527. (try_end),
  6528. (try_begin),
  6529. (call_script, "script_cf_check_drop_resource", ":instance_id", ":hit_points", ":hit_points_for_resource", 0),
  6530. (assign, ":resource_count", reg0),
  6531. (try_for_range, ":unused", 0, ":resource_count"),
  6532. (call_script, "script_set_random_spawn_position", 200),
  6533. (spawn_item, ":resource_item_id", ":resource_imod", "$g_spawn_item_prune_time"),
  6534. (try_end),
  6535. (assign, ":break_effect", 1),
  6536. (try_end),
  6537. (else_try), # don't allow damaging destroyed and hidden trees, for whatever reason
  6538. (assign, ":hit_damage", 0),
  6539. (set_trigger_result, 0),
  6540. (set_fixed_point_multiplier, 1),
  6541. (position_get_x, ":agent_id", pos2),
  6542. (set_fixed_point_multiplier, 100),
  6543. (try_end),
  6544. (try_begin),
  6545. (eq, ":break_effect", 1),
  6546. (particle_system_burst, "psys_dummy_straw", pos1, 40),
  6547. (particle_system_burst, "psys_gourd_piece_2", pos1, 5),
  6548. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  6549. (else_try),
  6550. (ge, ":hit_damage", 5),
  6551. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  6552. (particle_system_burst, "psys_gourd_piece_2", pos1, 2),
  6553. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  6554. (else_try),
  6555. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  6556. (try_end),
  6557. ]),
  6558.  
  6559. ("add_resource_to_regrow_list", # server: add a scene prop instance id to a list for calling a specified script after the regrowing time interval
  6560. [(store_script_param, ":instance_id", 1), # must be valid
  6561. (store_script_param, ":regrow_interval", 2),
  6562.  
  6563. (prop_instance_get_variation_id_2, ":regrow_interval_multiplier", ":instance_id"),
  6564. (val_max, ":regrow_interval_multiplier", 1),
  6565. (val_mul, ":regrow_interval", ":regrow_interval_multiplier"),
  6566. (store_mission_timer_a, ":time"),
  6567. (val_add, ":time", ":regrow_interval"),
  6568. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state_time, ":time"),
  6569. (troop_get_slot, ":resources_count", "trp_removed_scene_props", slot_array_count),
  6570. (store_add, ":loop_end", ":resources_count", slot_array_begin),
  6571. (try_for_range, ":resource_slot", slot_array_begin, ":loop_end"),
  6572. (neg|troop_slot_ge, "trp_removed_scene_props", ":resource_slot", 1),
  6573. (troop_set_slot, "trp_removed_scene_props", ":resource_slot", ":instance_id"),
  6574. (assign, ":loop_end", -1),
  6575. (try_end),
  6576. (try_begin),
  6577. (neq, ":loop_end", -1),
  6578. (troop_set_slot, "trp_removed_scene_props", ":loop_end", ":instance_id"),
  6579. (val_add, ":resources_count", 1),
  6580. (troop_set_slot, "trp_removed_scene_props", slot_array_count, ":resources_count"),
  6581. (try_end),
  6582. ]),
  6583.  
  6584. ("regrow_resource", # server: generic regrowing script called if a custom one is not set
  6585. [(store_script_param, ":instance_id", 1), # must be valid
  6586.  
  6587. (set_fixed_point_multiplier, 100),
  6588. (prop_instance_get_starting_position, pos1, ":instance_id"),
  6589. (copy_position, pos2, pos1),
  6590. (position_move_z, pos2, -5000, 1),
  6591. (prop_instance_set_position, ":instance_id", pos2),
  6592. (prop_instance_animate_to_position, ":instance_id", pos1, 6000),
  6593. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_regenerating),
  6594. (prop_instance_enable_physics, ":instance_id", 1),
  6595. ]),
  6596.  
  6597. ("regrow_fruit_tree", # server: either regrow the tree or produce fruit
  6598. [(store_script_param, ":instance_id", 1), # must be valid
  6599.  
  6600. (assign, ":regrow_again", 1),
  6601. (try_begin), # tree is already active, so regrow fruit
  6602. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6603. (scene_prop_get_slot, ":attached_item_count", ":instance_id", slot_scene_prop_inventory_count), # check for fruit still unpicked
  6604. (val_add, ":attached_item_count", slot_scene_prop_inventory_begin),
  6605. (assign, ":first_invalid_slot", -1),
  6606. (assign, ":existing_fruit_count", 0),
  6607. (try_for_range, ":slot", slot_scene_prop_inventory_begin, ":attached_item_count"),
  6608. (scene_prop_get_slot, ":attached_instance_id", ":instance_id", ":slot"),
  6609. (prop_instance_is_valid, ":attached_instance_id"),
  6610. (scene_prop_slot_eq, ":attached_instance_id", slot_scene_prop_linked_scene_prop, ":instance_id"),
  6611. (val_add, ":existing_fruit_count", 1),
  6612. (try_begin), # compress the attached fruit array to be continuous and valid
  6613. (gt, ":first_invalid_slot", -1),
  6614. (scene_prop_set_slot, ":instance_id", ":first_invalid_slot", ":attached_instance_id"),
  6615. (val_add, ":first_invalid_slot", 1),
  6616. (try_end),
  6617. (else_try),
  6618. (eq, ":first_invalid_slot", -1),
  6619. (assign, ":first_invalid_slot", ":slot"),
  6620. (try_end),
  6621. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_count, ":existing_fruit_count"),
  6622. (scene_prop_get_slot, ":fruit_count", ":instance_id", slot_scene_prop_fruit_count),
  6623. (store_mul, ":maximum_fruit_count", ":fruit_count", 2),
  6624. (try_begin),
  6625. (lt, ":existing_fruit_count", ":maximum_fruit_count"), # only grow new fruit if not loaded with old
  6626. (scene_prop_get_slot, ":fruit_item_id", ":instance_id", slot_scene_prop_resource_item_id),
  6627. (scene_prop_get_slot, ":fruit_height", ":instance_id", slot_scene_prop_height),
  6628. (scene_prop_get_slot, ":fruit_width", ":instance_id", slot_scene_prop_width),
  6629. (store_random_in_range, ":random_factor", 50, 101),
  6630. (store_mul, ":new_fruit_count", ":fruit_count", ":random_factor"),
  6631. (val_div, ":new_fruit_count", 100),
  6632. (prop_instance_get_position, pos1, ":instance_id"),
  6633. (init_position, pos3),
  6634. (position_move_z, pos1, ":fruit_height"),
  6635. (store_add, ":fruit_item_index", ":existing_fruit_count", slot_scene_prop_inventory_begin),
  6636. (try_for_range, ":unused", 0, ":new_fruit_count"),
  6637. (copy_position, pos2, pos1), # produce fruit items within a sphere of radius fruit_width, centered at fruit_height above the tree origin
  6638. (store_random_in_range, ":random_angle", -180, 180),
  6639. (position_rotate_z, pos2, ":random_angle"),
  6640. (store_random_in_range, ":random_angle", -80, 81),
  6641. (position_rotate_x, pos2, ":random_angle"),
  6642. (store_random_in_range, ":random_distance", 30, ":fruit_width"),
  6643. (position_move_y, pos2, ":random_distance"),
  6644. (position_copy_rotation, pos2, pos3),
  6645. (store_random_in_range, ":random_angle", -180, 180),
  6646. (position_rotate_z, pos2, ":random_angle"),
  6647. (set_spawn_position, pos2),
  6648. (spawn_item, ":fruit_item_id", 0, "$g_spawn_item_prune_time"),
  6649. (scene_prop_set_slot, ":instance_id", ":fruit_item_index", reg0), # store the spawned item instance ids to drop on ground if tree is cut down
  6650. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":instance_id"),
  6651. (val_add, ":fruit_item_index", 1),
  6652. (try_end),
  6653. (val_add, ":new_fruit_count", ":existing_fruit_count"),
  6654. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_count, ":new_fruit_count"),
  6655. (try_end),
  6656. (else_try), # call the normal regrowing script if cut down
  6657. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6658. (call_script, "script_regrow_resource", ":instance_id"),
  6659. (else_try),
  6660. (assign, ":regrow_again", 0),
  6661. (try_end),
  6662. (try_begin), # set up the callback for the next fruiting cycle
  6663. (eq, ":regrow_again", 1),
  6664. (scene_prop_get_slot, ":regrow_interval", ":instance_id", slot_scene_prop_fruiting_interval),
  6665. (store_random_in_range, ":random_factor", 80, 121),
  6666. (val_mul, ":regrow_interval", ":random_factor"),
  6667. (val_div, ":regrow_interval", 100),
  6668. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6669. (try_end),
  6670. ]),
  6671.  
  6672. ("cf_resource_animation_finished", # server: called when an animation for a regrowing resource scene prop is finished, to change the state
  6673. [(multiplayer_is_server),
  6674. (store_script_param, ":instance_id", 1), # must be valid
  6675. (store_script_param, ":hit_points_for_resource", 2),
  6676.  
  6677. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6678. (try_begin),
  6679. (eq, ":state", scene_prop_state_regenerating),
  6680. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6681. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  6682. (scene_prop_set_hit_points, ":instance_id", ":full_hit_points"),
  6683. (val_sub, ":full_hit_points", ":hit_points_for_resource"),
  6684. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":full_hit_points"),
  6685. (else_try),
  6686. (eq, ":state", scene_prop_state_hidden),
  6687. (prop_instance_enable_physics, ":instance_id", 0),
  6688. (try_end),
  6689. ]),
  6690.  
  6691. ("initialize_resource_hit_points", # adjust the hit points for certain resource scene props using scene editor values
  6692. [(store_script_param, ":instance_id", 1), # must be valid
  6693. (store_script_param, ":hit_points_for_resource", 2),
  6694.  
  6695. (prop_instance_get_variation_id, ":start_hit_points", ":instance_id"),
  6696. (val_mul, ":start_hit_points", 120),
  6697. (val_clamp, ":start_hit_points", 120, max_correctly_displayed_hp + 1),
  6698. (scene_prop_set_hit_points, ":instance_id", ":start_hit_points"),
  6699. (scene_prop_set_slot, ":instance_id", slot_scene_prop_full_hit_points, ":start_hit_points"),
  6700. (try_begin),
  6701. (multiplayer_is_server),
  6702. (gt, ":hit_points_for_resource", -1),
  6703. (val_sub, ":start_hit_points", ":hit_points_for_resource"),
  6704. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":start_hit_points"),
  6705. (else_try),
  6706. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, 1),
  6707. (try_end),
  6708. ]),
  6709.  
  6710. ("cf_hit_regrowing_resource", # server: generic script for hitting a resource scene prop, should be called from ti_on_scene_prop_hit; reg0 = agent id, reg1 = hit damage, reg2 = hit points
  6711. [(multiplayer_is_server),
  6712. (store_script_param, ":instance_id", 1), # must be valid
  6713. (store_script_param, ":hit_damage", 2),
  6714. (store_script_param, ":hit_points_for_resource", 3),
  6715. (store_script_param, ":resource_item_id", 4),
  6716. (store_script_param, ":hardness", 5),
  6717. (store_script_param, ":tool_class", 6), # constants starting with item_class_
  6718. (store_script_param, ":skill_id", 7),
  6719. (store_script_param, ":attack_direction_range", 8), # second digit = direction from agent_get_action_dir, first digit = subsequent directions to include
  6720. (store_script_param, ":spawn_on_ground", 9), # 0 = spawn resources at the hit position, 1 = spawn at a random nearby position on the ground
  6721. (store_script_param, ":regrow_interval", 10),
  6722. (store_script_param, ":effect_script_id", 11), # if greater than -1, called as a script to play visual or sound effects
  6723. (store_script_param, ":random_hit_points_adjustment", 12), # maximum random adjustment to hit_points_for_resource
  6724.  
  6725. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6726. (try_begin),
  6727. (eq, ":state", scene_prop_state_active),
  6728. (call_script, "script_scene_prop_adjust_hit", ":instance_id", ":hit_damage", ":hardness", ":tool_class", ":skill_id", ":attack_direction_range"),
  6729. (assign, ":agent_id", reg0),
  6730. (assign, ":hit_damage", reg1),
  6731. (assign, ":hit_points", reg2),
  6732. (assign, ":resource_count", 0),
  6733. (try_begin),
  6734. (le, ":hit_points", min_scene_prop_hit_points),
  6735. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6736. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6737. (position_move_z, pos2, -1000, 1),
  6738. (prop_instance_animate_to_position, ":instance_id", pos2, 500),
  6739. (particle_system_burst, "psys_dummy_smoke", pos2, 10),
  6740. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6741. (assign, ":resource_count", -1),
  6742. (else_try),
  6743. (call_script, "script_cf_check_drop_resource", ":instance_id", ":hit_points", ":hit_points_for_resource", ":random_hit_points_adjustment"),
  6744. (assign, ":resource_count", reg0),
  6745. (try_for_range, ":unused", 0, ":resource_count"),
  6746. (try_begin),
  6747. (eq, ":spawn_on_ground", 1),
  6748. (call_script, "script_set_random_spawn_position", 50),
  6749. (else_try),
  6750. (set_spawn_position, pos1),
  6751. (try_end),
  6752. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  6753. (try_end),
  6754. (try_end),
  6755. (try_begin),
  6756. (gt, ":effect_script_id", -1),
  6757. (agent_is_active, ":agent_id"),
  6758. (call_script, ":effect_script_id", ":agent_id", ":instance_id", ":hit_damage", ":resource_count"),
  6759. (try_end),
  6760. (else_try),
  6761. (set_trigger_result, 0),
  6762. (try_end),
  6763. ]),
  6764.  
  6765. ("hit_iron_mine_effect",
  6766. [(store_script_param, ":agent_id", 1),
  6767. (store_script_param, ":instance_id", 2),
  6768. (store_script_param, ":hit_damage", 3),
  6769. (store_script_param, ":resource_count", 4),
  6770.  
  6771. (try_begin),
  6772. (eq, ":resource_count", -1),
  6773. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_body_fall_big"),
  6774. (particle_system_burst, "psys_dummy_smoke", pos1, 15),
  6775. (else_try),
  6776. (gt, ":resource_count", 0),
  6777. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_body_fall_small"),
  6778. (particle_system_burst, "psys_dummy_smoke", pos1, 5),
  6779. (else_try),
  6780. (ge, ":hit_damage", 5),
  6781. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_mining_hit"),
  6782. (else_try),
  6783. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_mining_scratch"),
  6784. (try_end),
  6785. ]),
  6786.  
  6787. ("hit_bush_effect",
  6788. [(store_script_param, ":agent_id", 1),
  6789. (store_script_param, ":instance_id", 2),
  6790. (store_script_param, ":unused", 3),
  6791. (store_script_param, ":resource_count", 4),
  6792.  
  6793. (try_begin),
  6794. (gt, ":resource_count", 0),
  6795. (particle_system_burst, "psys_dummy_straw", pos1, 3),
  6796. (try_end),
  6797. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  6798. ]),
  6799.  
  6800. ("cf_hit_damage_resource", # server: handle damage to a resource that is not supposed to be hit
  6801. [(multiplayer_is_server),
  6802. (store_script_param, ":instance_id", 1),
  6803. (store_script_param, ":hit_damage", 2),
  6804. (store_script_param, ":regrow_interval", 3),
  6805.  
  6806. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6807. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  6808. (try_begin),
  6809. (le, reg2, min_scene_prop_hit_points),
  6810. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6811. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6812. (position_move_z, pos2, -1000, 1),
  6813. (prop_instance_animate_to_position, ":instance_id", pos2, 500),
  6814. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6815. (try_end),
  6816. ]),
  6817.  
  6818. ("cf_use_resource", # server: handle resource scene props that are gathered by using
  6819. [(store_script_param, ":agent_id", 1), # must be valid
  6820. (store_script_param, ":instance_id", 2), # must be valid
  6821. (store_script_param, ":resource_item_id", 3),
  6822. (store_script_param, ":resource_hit_points", 4),
  6823. (store_script_param, ":regrow_interval", 5),
  6824. (store_script_param, ":sound_id", 6), # sound to play when a resource item is spawned
  6825.  
  6826. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6827. (store_skill_level, ":labouring", "skl_labouring", ":troop_id"),
  6828. (gt, ":labouring", 0),
  6829. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  6830. (eq, ":weapon", -1),
  6831. (agent_get_wielded_item, ":shield", ":agent_id", 1),
  6832. (eq, ":shield", -1),
  6833. (store_mul, ":less_damage", ":resource_hit_points", ":labouring"),
  6834. (val_div, ":less_damage", 19),
  6835. (val_sub, ":resource_hit_points", ":less_damage"),
  6836. (scene_prop_get_hit_points, ":hit_points", ":instance_id"),
  6837. (store_sub, ":resulting_hit_points", ":hit_points", ":resource_hit_points"),
  6838. (try_begin),
  6839. (ge, ":resulting_hit_points", min_scene_prop_hit_points),
  6840. (agent_get_position, pos1, ":agent_id"),
  6841. (call_script, "script_set_random_spawn_position", 50),
  6842. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  6843. (particle_system_burst, "psys_dummy_smoke", pos10, 5),
  6844. (try_begin),
  6845. (is_between, ":sound_id", 0, "snd_sounds_end"),
  6846. (agent_play_sound, ":agent_id", ":sound_id"),
  6847. (try_end),
  6848. (else_try),
  6849. (assign, ":resulting_hit_points", min_scene_prop_hit_points),
  6850. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6851. (set_fixed_point_multiplier, 100),
  6852. (prop_instance_get_starting_position, pos1, ":instance_id"),
  6853. (position_move_z, pos1, -1000, 1),
  6854. (prop_instance_animate_to_position, ":instance_id", pos1, 300),
  6855. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6856. (try_end),
  6857. (scene_prop_set_hit_points, ":instance_id", ":resulting_hit_points"),
  6858. ]),
  6859.  
  6860. ("cf_setup_field", # server: set up linked plants scene prop for a field grown resource
  6861. [(multiplayer_is_server),
  6862. (neq, "$g_edit_scene", 1),
  6863. (store_script_param, ":instance_id", 1), # must be valid
  6864. (store_script_param, ":plant_scene_prop_id", 2),
  6865.  
  6866. (set_fixed_point_multiplier, 100),
  6867. (prop_instance_get_starting_position, pos1, ":instance_id"),
  6868. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  6869. (val_mul, ":height", -2),
  6870. (position_move_z, pos1, ":height"),
  6871. (set_spawn_position, pos1),
  6872. (spawn_scene_prop, ":plant_scene_prop_id"),
  6873. (scene_prop_set_slot, ":instance_id", slot_scene_prop_linked_scene_prop, reg0),
  6874. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":instance_id"),
  6875. (prop_instance_set_position, reg0, pos1),
  6876. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6877. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, min_scene_prop_hit_points),
  6878. (scene_prop_set_hit_points, ":instance_id", min_scene_prop_hit_points),
  6879. ]),
  6880.  
  6881. ("cf_hit_field", # server: handle planting, watering, harvesting, and spoiling a field resource; should be called from ti_on_scene_prop_hit
  6882. [(multiplayer_is_server),
  6883. (store_script_param, ":instance_id", 1), # must be valid
  6884. (store_script_param, ":hit_damage", 2),
  6885. (store_script_param, ":hit_points_for_resource", 3),
  6886. (store_script_param, ":resource_item_id", 4),
  6887. (store_script_param, ":plant_item_id", 5),
  6888. (store_script_param, ":tool_class", 6), # constants starting with item_class_
  6889. (store_script_param, ":regrow_interval", 7),
  6890. (set_fixed_point_multiplier, 1),
  6891. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  6892. (set_fixed_point_multiplier, 100),
  6893.  
  6894. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6895. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6896. (store_skill_level, ":skill", "skl_labouring", ":troop_id"),
  6897. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  6898. (try_begin), # planting seeds
  6899. (eq, ":wielded_item_id", ":plant_item_id"),
  6900. (set_trigger_result, 0),
  6901. (gt, ":skill", 0),
  6902. (store_mission_timer_a, ":time"),
  6903. (try_begin),
  6904. (eq, ":state", scene_prop_state_hidden),
  6905. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_regenerating),
  6906. (store_div, ":hidden_time", ":regrow_interval", 2),
  6907. (val_add, ":hidden_time", ":time"),
  6908. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state_time, ":hidden_time"),
  6909. (scene_prop_set_slot, ":instance_id", slot_scene_prop_seeds, 1),
  6910. (scene_prop_get_slot, ":full_hp", ":instance_id", slot_scene_prop_full_hit_points),
  6911. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":full_hp"),
  6912. (scene_prop_get_slot, ":plant_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  6913. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6914. (store_mul, ":animate_time", ":regrow_interval", 100),
  6915. (prop_instance_animate_to_position, ":plant_instance_id", pos2, ":animate_time"),
  6916. (else_try),
  6917. (eq, ":state", scene_prop_state_regenerating),
  6918. (scene_prop_slot_ge, ":instance_id", slot_scene_prop_state_time, ":time"),
  6919. (scene_prop_get_slot, ":seeds", ":instance_id", slot_scene_prop_seeds),
  6920. (val_add, ":seeds", 1),
  6921. (scene_prop_set_slot, ":instance_id", slot_scene_prop_seeds, ":seeds"),
  6922. (try_end),
  6923. (else_try), # watering
  6924. (eq, ":wielded_item_id", "itm_water_bucket"),
  6925. (set_trigger_result, 0),
  6926. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_water_bucket", 1),
  6927. (agent_equip_item, ":agent_id", "itm_bucket"),
  6928. (agent_set_wielded_item, ":agent_id", "itm_bucket"),
  6929. (scene_prop_get_slot, ":water", ":instance_id", slot_scene_prop_water),
  6930. (val_add, ":water", 1),
  6931. (scene_prop_set_slot, ":instance_id", slot_scene_prop_water, ":water"),
  6932. (else_try), # prevent damaging an inactive field
  6933. (neq, ":state", scene_prop_state_active),
  6934. (neq, ":state", scene_prop_state_regenerating),
  6935. (set_trigger_result, 0),
  6936. (else_try), # harvest or spoil, depending on tool and skill
  6937. (assign, ":original_damage", ":hit_damage"),
  6938. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  6939. (assign, ":hit_damage", reg1),
  6940. (assign, ":hit_points", reg2),
  6941. (assign, ":destroyed", 0),
  6942. (try_begin),
  6943. (eq, ":state", scene_prop_state_active),
  6944. (try_begin),
  6945. (le, ":hit_points", min_scene_prop_hit_points),
  6946. (assign, ":destroyed", 1),
  6947. (try_end),
  6948. (gt, ":skill", 0),
  6949. (gt, ":wielded_item_id", -1),
  6950. (item_slot_eq, ":wielded_item_id", slot_item_class, ":tool_class"),
  6951. (try_begin),
  6952. (call_script, "script_cf_check_drop_resource", ":instance_id", ":hit_points", ":hit_points_for_resource", 10),
  6953. (assign, ":resource_count", reg0),
  6954. (try_for_range, ":unused", 0, ":resource_count"),
  6955. (call_script, "script_set_random_spawn_position", 50),
  6956. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  6957. (position_rotate_x, pos10, 90),
  6958. (position_move_z, pos10, 30, 1),
  6959. (prop_instance_set_position, reg0, pos10),
  6960. (particle_system_burst, "psys_dummy_smoke", pos10, 5),
  6961. (try_end),
  6962. (try_end),
  6963. (else_try),
  6964. (scene_prop_get_slot, ":resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  6965. (val_sub, ":resource_hp", ":original_damage"),
  6966. (try_begin),
  6967. (le, ":resource_hp", min_scene_prop_hit_points),
  6968. (assign, ":resource_hp", min_scene_prop_hit_points),
  6969. (assign, ":destroyed", 1),
  6970. (try_end),
  6971. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":resource_hp"),
  6972. (try_end),
  6973. (try_begin), # if destroyed, make the plants disappear
  6974. (eq, ":destroyed", 1),
  6975. (scene_prop_set_slot, ":instance_id", slot_scene_prop_seeds, 0),
  6976. (scene_prop_set_slot, ":instance_id", slot_scene_prop_water, 0),
  6977. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6978. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  6979. (store_mul, ":animate_time", ":height", 2),
  6980. (val_mul, ":height", -2),
  6981. (position_move_z, pos2, ":height"),
  6982. (scene_prop_get_slot, ":plant_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  6983. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6984. (prop_instance_stop_animating, ":plant_instance_id"),
  6985. (prop_instance_animate_to_position, ":plant_instance_id", pos2, ":animate_time"),
  6986. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6987. (try_end),
  6988. (try_end),
  6989. ]),
  6990.  
  6991. ("cf_field_animation_finished", # server: set up the field for harvesting after the growing animation is finished
  6992. [(store_script_param, ":plant_instance_id", 1), # must be valid
  6993. (store_script_param, ":optimum_seeds", 2),
  6994. (store_script_param, ":optimum_water", 3),
  6995.  
  6996. (scene_prop_get_slot, ":instance_id", ":plant_instance_id", slot_scene_prop_linked_scene_prop),
  6997. (gt, ":instance_id", 0),
  6998. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6999. (try_begin),
  7000. (eq, ":state", scene_prop_state_regenerating),
  7001. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  7002. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  7003. (scene_prop_get_slot, ":resource_hit_points", ":instance_id", slot_scene_prop_next_resource_hp),
  7004. (store_sub, ":damage", ":full_hit_points", ":resource_hit_points"),
  7005. (scene_prop_get_slot, ":seeds", ":instance_id", slot_scene_prop_seeds),
  7006. (store_sub, ":seed_damage", ":optimum_seeds", ":seeds"),
  7007. (try_begin),
  7008. (gt, ":seed_damage", 0),
  7009. (val_mul, ":seed_damage", ":full_hit_points"),
  7010. (val_div, ":seed_damage", ":optimum_seeds"),
  7011. (val_add, ":damage", ":seed_damage"),
  7012. (try_end),
  7013. (scene_prop_get_slot, ":water", ":instance_id", slot_scene_prop_water),
  7014. (store_sub, ":water_damage", ":optimum_water", ":water"),
  7015. (try_begin),
  7016. (gt, ":water_damage", 0),
  7017. (val_mul, ":water_damage", ":full_hit_points"),
  7018. (val_div, ":water_damage", ":optimum_water"),
  7019. (val_div, ":water_damage", 4),
  7020. (val_add, ":damage", ":water_damage"),
  7021. (try_end),
  7022. (store_sub, ":hit_points", ":full_hit_points", ":damage"),
  7023. (val_max, ":hit_points", min_scene_prop_hit_points),
  7024. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  7025. (val_sub, ":hit_points", 50),
  7026. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":hit_points"),
  7027. (else_try),
  7028. (eq, ":state", scene_prop_state_destroyed),
  7029. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  7030. (try_end),
  7031. ]),
  7032.  
  7033. ("cf_hit_vine", # server: handle hitting a vine grown resource; should be called from ti_on_scene_prop_hit
  7034. [(multiplayer_is_server),
  7035. (store_script_param, ":instance_id", 1), # must be valid
  7036. (store_script_param, ":hit_damage", 2),
  7037. (store_script_param, ":tool_class", 3), # constants starting with item_class_
  7038. (store_script_param, ":regrow_interval", 4),
  7039.  
  7040. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  7041. (try_begin),
  7042. (eq, ":state", scene_prop_state_active),
  7043. (call_script, "script_scene_prop_adjust_hit", ":instance_id", ":hit_damage", 1, ":tool_class", "skl_labouring", 21),
  7044. (assign, ":agent_id", reg0),
  7045. (assign, ":hit_damage", reg1),
  7046. (assign, ":hit_points", reg2),
  7047. (agent_get_wielded_item, ":wielded_item", ":agent_id", 0),
  7048. (try_begin),
  7049. (gt, ":wielded_item", -1),
  7050. (neg|item_slot_eq, ":wielded_item", slot_item_class, ":tool_class"),
  7051. (scene_prop_get_slot, ":damaged_hit_points", ":instance_id", slot_scene_prop_next_resource_hp),
  7052. (val_sub, ":damaged_hit_points", ":hit_damage"),
  7053. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":damaged_hit_points"),
  7054. (try_end),
  7055. (try_begin),
  7056. (le, ":hit_points", min_scene_prop_hit_points),
  7057. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  7058. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  7059. (try_end),
  7060. (else_try),
  7061. (set_fixed_point_multiplier, 1),
  7062. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  7063. (set_fixed_point_multiplier, 100),
  7064. (set_trigger_result, 0),
  7065. (assign, ":hit_damage", 0),
  7066. (try_end),
  7067. (try_begin),
  7068. (ge, ":hit_damage", 5),
  7069. (particle_system_burst, "psys_dummy_straw", pos1, 3),
  7070. (particle_system_burst, "psys_grape_leaf", pos1, 1),
  7071. (else_try),
  7072. (particle_system_burst, "psys_dummy_straw", pos1, 1),
  7073. (try_end),
  7074. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  7075. ]),
  7076.  
  7077. ("regrow_vine", # server: resource regrowing script to spawn vine fruit items
  7078. [(store_script_param, ":instance_id", 1), # must be valid
  7079.  
  7080. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  7081. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  7082. (scene_prop_set_hit_points, ":instance_id", ":full_hit_points"),
  7083. (scene_prop_get_slot, ":damaged_hit_points", ":instance_id", slot_scene_prop_next_resource_hp),
  7084. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":full_hit_points"),
  7085. (scene_prop_get_slot, ":resource_item_id", ":instance_id", slot_scene_prop_resource_item_id),
  7086. (scene_prop_get_slot, ":max_resources", ":instance_id", slot_scene_prop_seeds),
  7087. (scene_prop_get_slot, ":length", ":instance_id", slot_scene_prop_length),
  7088. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  7089. (store_add, ":max_height", ":height", 50),
  7090. (prop_instance_get_position, pos1, ":instance_id"),
  7091. (val_max, ":damaged_hit_points", 0),
  7092. (store_mul, ":resources", ":damaged_hit_points", ":max_resources"),
  7093. (val_div, ":resources", ":full_hit_points"),
  7094. (store_div, ":resource_count", ":resources", 2),
  7095. (store_random_in_range, ":resource_count", ":resource_count", ":resources"),
  7096. (set_fixed_point_multiplier, 100),
  7097. (try_for_range, ":unused", 0, ":resource_count"),
  7098. (copy_position, pos2, pos1),
  7099. (store_random_in_range, ":x_offset", 50, ":length"),
  7100. (position_move_x, pos2, ":x_offset"),
  7101. (store_random_in_range, ":y_offset", -50, 51),
  7102. (position_move_y, pos2, ":y_offset"),
  7103. (store_random_in_range, ":z_offset", ":height", ":max_height"),
  7104. (position_move_z, pos2, ":z_offset"),
  7105. (position_rotate_x, pos2, 90),
  7106. (set_spawn_position, pos2),
  7107. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  7108. (prop_instance_set_position, reg0, pos2),
  7109. (try_end),
  7110. ]),
  7111.  
  7112. ("setup_linked_scene_props", # server, edit mode: called at mission start to find necessary links for certain scene prop kinds
  7113. [(store_script_param, ":scene_prop_id", 1),
  7114.  
  7115. (scene_prop_get_num_instances, ":num_instances", ":scene_prop_id"),
  7116. (try_for_range, ":begin_scene_prop_no", 0, ":num_instances"), # iterate over all scene props of the specified kind
  7117. (scene_prop_get_instance, ":begin_instance_id", ":scene_prop_id", ":begin_scene_prop_no"),
  7118. (scene_prop_slot_eq, ":begin_instance_id", slot_scene_prop_linked_scene_prop, 0),
  7119. (prop_instance_get_variation_id_2, ":begin_var_2", ":begin_instance_id"),
  7120. (prop_instance_get_position, pos1, ":begin_instance_id"),
  7121. (try_for_range, ":linked_scene_prop_no", 0, linked_scene_prop_slot_count), # iterate over all scene prop kinds required to link
  7122. (store_add, ":linked_scene_prop_param_no", ":linked_scene_prop_no", 2),
  7123. (store_script_param, ":linked_scene_prop_id", ":linked_scene_prop_param_no"),
  7124. (gt, ":linked_scene_prop_id", -1),
  7125. (store_add, ":linked_scene_prop_slot", slot_scene_prop_linked_scene_prop, ":linked_scene_prop_no"),
  7126. (assign, ":nearest_instance_id", -1),
  7127. (assign, ":nearest_distance", -1),
  7128. (scene_prop_get_num_instances, ":num_check_instances", ":linked_scene_prop_id"),
  7129. (try_for_range, ":check_scene_prop_no", 0, ":num_check_instances"), # iterate over all of the required scene prop kind, finding the nearest not already linked
  7130. (scene_prop_get_instance, ":check_instance_id", ":linked_scene_prop_id", ":check_scene_prop_no"),
  7131. (neq, ":check_instance_id", ":begin_instance_id"),
  7132. (prop_instance_get_variation_id_2, ":check_var_2", ":check_instance_id"),
  7133. (eq, ":check_var_2", ":begin_var_2"), # match scene editor value 2 to narrow down the search
  7134. (scene_prop_slot_eq, ":check_instance_id", slot_scene_prop_linked_scene_prop, 0),
  7135. (prop_instance_get_position, pos2, ":check_instance_id"),
  7136. (get_sq_distance_between_positions, ":check_distance", pos1, pos2),
  7137. (this_or_next|eq, ":nearest_distance", -1),
  7138. (lt, ":check_distance", ":nearest_distance"),
  7139. (assign, ":nearest_distance", ":check_distance"),
  7140. (assign, ":nearest_instance_id", ":check_instance_id"),
  7141. (try_end),
  7142. (scene_prop_set_slot, ":begin_instance_id", ":linked_scene_prop_slot", ":nearest_instance_id"),
  7143. (try_begin), # success
  7144. (gt, ":nearest_instance_id", -1),
  7145. (scene_prop_set_slot, ":nearest_instance_id", slot_scene_prop_linked_scene_prop, ":begin_instance_id"),
  7146. (else_try), # failure to find a necessary linked prop
  7147. (multiplayer_is_server),
  7148. (assign, reg10, ":begin_instance_id"),
  7149. (prop_instance_get_scene_prop_kind, reg11, ":begin_instance_id"),
  7150. (assign, reg12, ":linked_scene_prop_id"),
  7151. (assign, reg13, ":begin_var_2"),
  7152. (display_message, "str_error_unable_to_find_link_scene_prop"),
  7153. (try_begin),
  7154. (eq, "$g_edit_scene", 1),
  7155. (troop_get_slot, ":count", "trp_removed_scene_props", slot_array_count),
  7156. (val_add, ":count", 1),
  7157. (troop_set_slot, "trp_removed_scene_props", slot_array_count, ":count"),
  7158. (troop_set_slot, "trp_removed_scene_props", ":count", ":begin_instance_id"),
  7159. (try_end),
  7160. (try_end),
  7161. (try_end),
  7162. (try_end),
  7163. ]),
  7164.  
  7165. ("setup_all_linked_scene_props", []), # generated to run the above script for each scene prop type that needs linking to other types
  7166. ("setup_scene_props_after_mission_start", []), # generated to call setup scripts for scene props after the mission has finished loading (after ti_on_scene_prop_init)
  7167.  
  7168. ("cf_agent_pick_lock", # server: calculate whether an agent picks a lock successfully, based on skill, tool, and random chance
  7169. [(store_script_param, ":agent_id", 1), # must be valid
  7170. (store_script_param, ":probablity_multiplier", 2), # 100 means a 1% chance at looting level 1, up to 10000 for 100% success rate
  7171.  
  7172. (assign, reg0, 0),
  7173. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  7174. (gt, ":wielded_item_id", -1),
  7175. (item_slot_eq, ":wielded_item_id", slot_item_class, item_class_lock_pick),
  7176. (agent_get_troop_id, ":troop_id", ":agent_id"),
  7177. (store_skill_level, ":looting", "skl_looting", ":troop_id"),
  7178. (gt, ":looting", 0),
  7179. (assign, reg0, ":looting"),
  7180. (try_begin),
  7181. (eq, ":wielded_item_id", "itm_admin_lock_pick"),
  7182. (agent_get_troop_id, ":troop_id", ":agent_id"),
  7183. (eq, ":troop_id", "trp_godlike_hero"),
  7184. (assign, ":random", 0),
  7185. (else_try),
  7186. (val_max, ":probablity_multiplier", 1),
  7187. (val_mul, ":looting", ":probablity_multiplier"),
  7188. (store_random_in_range, ":random", 0, 10000),
  7189. (try_end),
  7190. (try_begin),
  7191. (ge, ":random", ":looting"),
  7192. #(agent_play_sound, ":agent_id", "snd_pick_lock_fail"),
  7193. (agent_get_player_id, ":player_id", ":agent_id"),
  7194. (multiplayer_send_int_to_player, ":player_id", server_event_lockpick, 0),
  7195. (try_end),
  7196. (lt, ":random", ":looting"),
  7197. (agent_get_player_id, ":player_id", ":agent_id"),
  7198. (multiplayer_send_int_to_player, ":player_id", server_event_lockpick, 1),
  7199. ]),
  7200.  
  7201. ("cf_use_teleport_door", # server: handle agents using a door which teleports to another linked door
  7202. [(store_script_param, ":agent_id", 1), # must be valid
  7203. (store_script_param, ":instance_id", 2), # must be valid
  7204. (store_script_param, ":x_offset", 3),
  7205. (store_script_param, ":y_offset", 4), # position offset relative to the linked door that the agent is moved to
  7206. (store_script_param, ":z_offset", 5),
  7207. (store_script_param, ":is_pickable", 6),
  7208.  
  7209. (scene_prop_get_slot, ":linked_door_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  7210. (gt, ":linked_door_instance_id", 0),
  7211. (agent_get_player_id, ":player_id", ":agent_id"),
  7212. (player_is_active, ":player_id"),
  7213. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  7214. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  7215. (assign, ":faction_id", reg0),
  7216. (assign, ":fail", 0),
  7217. (try_begin),
  7218. (eq, ":faction_id", "fac_commoners"),
  7219. (else_try),
  7220. (eq, ":faction_id", ":player_faction_id"),
  7221. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  7222. (try_begin),
  7223. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  7224. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  7225. (scene_prop_set_slot, ":linked_door_instance_id", slot_scene_prop_unlocked, 0),
  7226. (agent_play_sound, ":agent_id", "snd_lock"),
  7227. (try_end),
  7228. (else_try),
  7229. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  7230. (else_try),
  7231. (assign, reg0, 0),
  7232. (eq, ":is_pickable", 1),
  7233. (call_script, "script_cf_agent_pick_lock", ":agent_id", 100),
  7234. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  7235. (scene_prop_set_slot, ":linked_door_instance_id", slot_scene_prop_unlocked, 1),
  7236. (else_try),
  7237. (assign, ":fail", 1),
  7238. (gt, reg0, 0),
  7239. (else_try),
  7240. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_door_locked_by_s1", preset_message_faction|preset_message_fail_sound, ":faction_id"),
  7241. (try_end),
  7242. (eq, ":fail", 0),
  7243. (prop_instance_get_position, pos1, ":linked_door_instance_id"),
  7244. (position_move_x, pos1, ":x_offset"),
  7245. (position_move_y, pos1, ":y_offset"),
  7246. (position_move_z, pos1, ":z_offset"),
  7247. (agent_set_position, ":agent_id", pos1),
  7248. ]),
  7249.  
  7250. ("cf_lock_teleport_door", # server: lock a teleport door that has been picked if the player is in the owning faction and has the key permission
  7251. [(store_script_param, ":agent_id", 1), # must be valid
  7252. (store_script_param, ":instance_id", 2), # must be valid
  7253.  
  7254. (agent_get_player_id, ":player_id", ":agent_id"),
  7255. (player_is_active, ":player_id"),
  7256. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  7257. (neq, reg0, "fac_commoners"),
  7258. (assign, ":faction_id", reg0),
  7259. (assign, ":fail", 1),
  7260. (try_begin),
  7261. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 0),
  7262. (agent_play_sound, ":agent_id", "snd_pick_lock_fail"),
  7263. (else_try),
  7264. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  7265. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  7266. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  7267. (scene_prop_get_slot, ":linked_door_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  7268. (try_begin),
  7269. (gt, ":linked_door_instance_id", 0),
  7270. (scene_prop_set_slot, ":linked_door_instance_id", slot_scene_prop_unlocked, 0),
  7271. (try_end),
  7272. (agent_play_sound, ":agent_id", "snd_lock"),
  7273. (assign, ":fail", 0),
  7274. (try_end),
  7275. (eq, ":fail", 0),
  7276. ]),
  7277.  
  7278. ("cf_agent_consume_items", # server: handle checking for and removing 4 items carried by the agent, only making changes if successful; reg1 - reg4 = the items removed, in slot order
  7279. [(store_script_param, ":agent_id", 1), # must be valid
  7280. (store_script_param, ":item_1_id", 2),
  7281. (store_script_param, ":item_2_id", 3), # pass -1 to any of these to check for less items
  7282. (store_script_param, ":item_3_id", 4),
  7283. (store_script_param, ":item_4_id", 5),
  7284.  
  7285. (assign, ":item_1_slot", -1),
  7286. (assign, ":item_2_slot", -1),
  7287. (assign, ":item_3_slot", -1),
  7288. (assign, ":item_4_slot", -1),
  7289. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  7290. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  7291. (ge, ":item_id", all_items_begin),
  7292. (store_add, ":offset_slot", ":equip_slot", 1),
  7293. (try_begin),
  7294. (eq, ":item_id", ":item_1_id"),
  7295. (eq, ":item_1_slot", -1),
  7296. (assign, ":item_1_slot", ":offset_slot"),
  7297. (else_try),
  7298. (eq, ":item_id", ":item_2_id"),
  7299. (eq, ":item_2_slot", -1),
  7300. (assign, ":item_2_slot", ":offset_slot"),
  7301. (else_try),
  7302. (eq, ":item_id", ":item_3_id"),
  7303. (eq, ":item_3_slot", -1),
  7304. (assign, ":item_3_slot", ":offset_slot"),
  7305. (else_try),
  7306. (eq, ":item_id", ":item_4_id"),
  7307. (eq, ":item_4_slot", -1),
  7308. (assign, ":item_4_slot", ":offset_slot"),
  7309. (try_end),
  7310. (try_end),
  7311. (this_or_next|lt, ":item_1_id", all_items_begin),
  7312. (gt, ":item_1_slot", -1),
  7313. (this_or_next|lt, ":item_2_id", all_items_begin),
  7314. (gt, ":item_2_slot", -1),
  7315. (this_or_next|lt, ":item_3_id", all_items_begin),
  7316. (gt, ":item_3_slot", -1),
  7317. (this_or_next|lt, ":item_4_id", all_items_begin),
  7318. (gt, ":item_4_slot", -1),
  7319. (try_begin),
  7320. (gt, ":item_1_slot", -1),
  7321. (agent_unequip_item, ":agent_id", ":item_1_id", ":item_1_slot"),
  7322. (try_end),
  7323. (try_begin),
  7324. (gt, ":item_2_slot", -1),
  7325. (agent_unequip_item, ":agent_id", ":item_2_id", ":item_2_slot"),
  7326. (try_end),
  7327. (try_begin),
  7328. (gt, ":item_3_slot", -1),
  7329. (agent_unequip_item, ":agent_id", ":item_3_id", ":item_3_slot"),
  7330. (try_end),
  7331. (try_begin),
  7332. (gt, ":item_4_slot", -1),
  7333. (agent_unequip_item, ":agent_id", ":item_4_id", ":item_4_slot"),
  7334. (try_end),
  7335. (assign, reg1, ":item_1_slot"),
  7336. (assign, reg2, ":item_2_slot"),
  7337. (assign, reg3, ":item_3_slot"),
  7338. (assign, reg4, ":item_4_slot"),
  7339. ]),
  7340.  
  7341. ("cf_agent_consume_resource", # server: handle consuming any items carried by the agent of a specified item class, up to a maximum resource amount required; reg0 = amount found
  7342. [(store_script_param, ":agent_id", 1), # must be valid
  7343. (store_script_param, ":resource_class", 2), # constants starting with item_class_
  7344. (store_script_param, ":maximum_required", 3), # don't consume more resource items if this amount is reached
  7345.  
  7346. (assign, ":amount_found", 0),
  7347. (assign, ":loop_end", ek_item_3 + 1),
  7348. (try_for_range, ":equip_slot", ek_item_0, ":loop_end"),
  7349. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  7350. (ge, ":item_id", all_items_begin),
  7351. (item_slot_eq, ":item_id", slot_item_class, ":resource_class"),
  7352. (item_get_slot, ":item_amount", ":item_id", slot_item_resource_amount),
  7353. (gt, ":item_amount", 0),
  7354. (val_add, ":amount_found", ":item_amount"),
  7355. (store_add, ":offset_slot", ":equip_slot", 1),
  7356. (agent_unequip_item, ":agent_id", ":item_id", ":offset_slot"),
  7357. (ge, ":amount_found", ":maximum_required"),
  7358. (assign, ":loop_end", -1),
  7359. (try_end),
  7360. (assign, reg0, ":amount_found"),
  7361. (gt, ":amount_found", 0),
  7362. ]),
  7363.  
  7364. ("cf_agent_consume_item", # server: handle consuming any number of a specific item carried by the agent; reg0 = last equip slot consumed from, numbered 1 - 4 rather than 0 - 3
  7365. [(store_script_param, ":agent_id", 1), # must be valid
  7366. (store_script_param, ":item_id", 2),
  7367. (store_script_param, ":count", 3), # 1 - 4 items to try consume
  7368.  
  7369. (agent_has_item_equipped, ":agent_id", ":item_id"),
  7370. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  7371. (item_get_type, ":item_type", ":item_id"),
  7372. (try_begin),
  7373. (neq, ":item_type", itp_type_arrows),
  7374. (neq, ":item_type", itp_type_bolts),
  7375. (neq, ":item_type", itp_type_thrown),
  7376. (assign, ":check_max_ammo", 0),
  7377. (else_try),
  7378. (item_get_slot, ":check_max_ammo", ":item_id", slot_item_max_ammo),
  7379. (try_end),
  7380. (assign, ":found", 0),
  7381. (assign, ":loop_end", ek_item_3 + 1),
  7382. (try_for_range, ":equip_slot", ek_item_0, ":loop_end"),
  7383. (agent_get_item_slot, ":equip_item_id", ":agent_id", ":equip_slot"),
  7384. (eq, ":equip_item_id", ":item_id"),
  7385. (try_begin), # for ammo items, require full stacks for consuming
  7386. (gt, ":check_max_ammo", 0),
  7387. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  7388. (lt, ":ammo", ":check_max_ammo"),
  7389. (else_try),
  7390. (store_add, ":offset_slot", ":equip_slot", 1), # agent_get_item_slot numbered 0 - 3 = agent_unequip_item numbered 1 - 4
  7391. (troop_set_slot, "trp_temp_array", ":found", ":offset_slot"), # add items to a list for removing if enough found
  7392. (val_add, ":found", 1),
  7393. (ge, ":found", ":count"),
  7394. (assign, ":loop_end", -1),
  7395. (try_end),
  7396. (try_end),
  7397. (ge, ":found", ":count"),
  7398. (try_for_range, ":index", 0, ":count"),
  7399. (troop_get_slot, ":offset_slot", "trp_temp_array", ":index"),
  7400. (agent_unequip_item, ":agent_id", ":item_id", ":offset_slot"),
  7401. (try_end),
  7402. (try_begin),
  7403. (eq, ":wielded_item_id", ":item_id"),
  7404. (agent_set_wielded_item, ":agent_id", -1),
  7405. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 0, 1),
  7406. (try_end),
  7407. (assign, reg0, ":offset_slot"),
  7408. ]),
  7409.  
  7410. ("spawn_processed_resources", # server: spawn a row of items on the ground in front of the agent; overwrites pos1
  7411. [(store_script_param, ":agent_id", 1), # must be valid
  7412. (store_script_param, ":processed_item_id", 2),
  7413. (store_script_param, ":processed_item_count", 3),
  7414.  
  7415. (agent_get_position, pos1, ":agent_id"),
  7416. (position_set_z_to_ground_level, pos1),
  7417. (position_move_y, pos1, 10),
  7418. (try_begin),
  7419. (gt, ":processed_item_count", 2),
  7420. (position_move_x, pos1, -20),
  7421. (try_end),
  7422. (assign, ":column", 0),
  7423. (try_for_range, ":unused", 0, ":processed_item_count"),
  7424. (set_spawn_position, pos1),
  7425. (spawn_item, ":processed_item_id", 0, "$g_spawn_item_prune_time"),
  7426. (try_begin),
  7427. (lt, ":column", 3),
  7428. (position_move_x, pos1, 10),
  7429. (val_add, ":column", 1),
  7430. (else_try),
  7431. (assign, ":column", 0),
  7432. (position_move_y, pos1, 10),
  7433. (position_move_x, pos1, -30),
  7434. (try_end),
  7435. (try_end),
  7436. ]),
  7437.  
  7438. ])
  7439.  
  7440. # Generate common parts of resource processing server scripts. 'resource_class' is constants starting with item_class_.
  7441. # 'start_effect' allows the script to proceed even if the 'finished' parameter is not 1, to allow playing effects at the start.
  7442. # 'get_relative_pos' calculates the relative position of the agent to the scene prop, to allow different actions.
  7443. def generate_process_init(skill=None, level=1, resource_class=None, start_effect=True, get_relative_pos=False):
  7444. operations = [(store_script_param, ":agent_id", 1)]
  7445. if start_effect or get_relative_pos:
  7446. operations.append((store_script_param, ":instance_id", 2))
  7447. operations.append((store_script_param, ":finished", 3))
  7448. if not start_effect:
  7449. operations.append((eq, ":finished", 1))
  7450. if skill is not None and level > 0:
  7451. operations.extend([(agent_get_troop_id, ":troop_id", ":agent_id"),
  7452. (store_skill_level, ":skill_level", skill, ":troop_id"),
  7453. (ge, ":skill_level", level)])
  7454. operations.extend([(agent_get_wielded_item, ":resource_item_id", ":agent_id", 0),
  7455. (ge, ":resource_item_id", all_items_begin)])
  7456. if resource_class is not None:
  7457. if isinstance(resource_class, list):
  7458. operations.extend([(this_or_next|item_slot_eq, ":resource_item_id", slot_item_class, rc) for rc in resource_class[:-1]])
  7459. resource_class = resource_class[-1]
  7460. operations.append((item_slot_eq, ":resource_item_id", slot_item_class, resource_class))
  7461. if get_relative_pos:
  7462. operations.extend([(set_fixed_point_multiplier, 100),
  7463. (prop_instance_get_position, pos1, ":instance_id"),
  7464. (agent_get_position, pos2, ":agent_id"),
  7465. (position_transform_position_to_local, pos3, pos1, pos2),
  7466. (position_get_y, ":relative_y_position", pos3)])
  7467. return lazy.block(operations)
  7468.  
  7469. scripts.extend([
  7470.  
  7471. ("cf_process_wood",
  7472. [generate_process_init(skill="skl_engineer", level=1, resource_class=item_class_wood),
  7473.  
  7474. (assign, ":processed_item_id", -1),
  7475. (assign, ":processed_item_count", 1),
  7476. (try_begin),
  7477. (eq, ":resource_item_id", "itm_branch"),
  7478. (assign, ":processed_item_id", "itm_wood_pole"),
  7479. (else_try),
  7480. (eq, ":resource_item_id", "itm_wood_pole"),
  7481. (assign, ":processed_item_id", "itm_wood_pole_short"),
  7482. (assign, ":processed_item_count", 2),
  7483. (else_try),
  7484. (eq, ":resource_item_id", "itm_wood_pole_short"),
  7485. (assign, ":processed_item_id", "itm_stick"),
  7486. (assign, ":processed_item_count", 2),
  7487. (else_try),
  7488. (eq, ":resource_item_id", "itm_wood_block"),
  7489. (assign, ":processed_item_id", "itm_board"),
  7490. (assign, ":processed_item_count", 4),
  7491. (try_end),
  7492. (neq, ":processed_item_id", -1),
  7493. (try_begin),
  7494. (eq, ":finished", 1),
  7495. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7496. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7497. (else_try),
  7498. (eq, ":finished", 0),
  7499. (agent_play_sound, ":agent_id", "snd_saw_wood"),
  7500. (prop_instance_get_position, pos1, ":instance_id"),
  7501. (position_move_z, pos1, 50),
  7502. (particle_system_burst, "psys_cut_wood", pos1, 100),
  7503. (try_end),
  7504. ]),
  7505.  
  7506. ("cf_process_iron",
  7507. [generate_process_init(skill="skl_engineer", level=2, resource_class=[item_class_iron, item_class_precious], get_relative_pos=True),
  7508.  
  7509. (assign, ":processed_item_id", -1),
  7510. (assign, ":processed_item_count", 1),
  7511. (assign, ":resource_item_count", 1),
  7512. (try_begin),
  7513. (eq, ":resource_item_id", "itm_iron_ore"),
  7514. (assign, ":processed_item_count", 2),
  7515. (assign, ":processed_item_id", "itm_iron_bar"),
  7516. (else_try),
  7517. (eq, ":resource_item_id", "itm_iron_ore_small"),
  7518. (assign, ":processed_item_count", 2),
  7519. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7520. (else_try),#RAMARAUNT ADD
  7521. (eq, ":resource_item_id", "itm_copper_ore"),
  7522. (assign, ":processed_item_count", 2),
  7523. (assign, ":processed_item_id", "itm_copper_bar"),
  7524. (else_try),
  7525. (eq, ":resource_item_id", "itm_gold_nugget"),
  7526. (assign, ":processed_item_count", 1),
  7527. (assign, ":resource_item_count", 4),
  7528. (assign, ":processed_item_id", "itm_gold_bar"),
  7529. (else_try),
  7530. (eq, ":resource_item_id", "itm_silver_nugget"),
  7531. (assign, ":processed_item_count", 1),
  7532. (assign, ":resource_item_count", 4),
  7533. (assign, ":processed_item_id", "itm_silver_bar"),
  7534. (else_try),#RAMARAUNT ADD
  7535. (eq, ":resource_item_id", "itm_zinc_ore"),
  7536. (assign, ":processed_item_count", 1),
  7537. (assign, ":resource_item_count", 1),
  7538. (assign, ":processed_item_id", "itm_brass_bar"),
  7539. (else_try),
  7540. (ge, ":relative_y_position", 0),
  7541. (assign, ":processed_item_count", 2),
  7542. (try_begin),
  7543. (eq, ":resource_item_id", "itm_iron_bar_short"),
  7544. (assign, ":processed_item_id", "itm_iron_piece"),
  7545. (else_try),
  7546. (eq, ":resource_item_id", "itm_iron_bar"),
  7547. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7548. (else_try),
  7549. (eq, ":resource_item_id", "itm_iron_bar_long"),
  7550. (assign, ":processed_item_id", "itm_iron_bar"),
  7551. (else_try),#RAMARAUNT ADD
  7552. (eq, ":resource_item_id", "itm_brass_bar"),
  7553. (assign, ":processed_item_id", "itm_brass_bar_short"),
  7554. (else_try),#RAMARAUNT ADD
  7555. (eq, ":resource_item_id", "itm_copper_bar"),
  7556. (assign, ":processed_item_id", "itm_copper_bar_short"),
  7557. (try_end),
  7558. (else_try),
  7559. (assign, ":resource_item_count", 2),
  7560. (eq, ":resource_item_id", "itm_iron_piece"),
  7561. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7562. (else_try),
  7563. (eq, ":resource_item_id", "itm_iron_bar_short"),
  7564. (assign, ":processed_item_id", "itm_iron_bar"),
  7565. (else_try),
  7566. (eq, ":resource_item_id", "itm_iron_bar"),
  7567. (assign, ":processed_item_id", "itm_iron_bar_long"),
  7568. (else_try),#RAMARAUNT ADD
  7569. (eq, ":resource_item_id", "itm_brass_bar_short"),
  7570. (assign, ":processed_item_id", "itm_brass_bar"),
  7571. (else_try),#RAMARAUNT ADD
  7572. (eq, ":resource_item_id", "itm_copper_bar_short"),
  7573. (assign, ":processed_item_id", "itm_copper_bar"),
  7574. (try_end),
  7575. (ge, ":processed_item_id", all_items_begin),
  7576. (try_begin),
  7577. (eq, ":finished", 1),
  7578. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7579. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7580. (try_begin),
  7581. (eq, ":processed_item_id", "itm_brass_bar"),
  7582. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_copper_bar", ":resource_item_count"),
  7583. (try_end),
  7584. (else_try),
  7585. (eq, ":finished", 0),
  7586. (agent_play_sound, ":agent_id", "snd_blacksmith"),
  7587. (prop_instance_get_position, pos1, ":instance_id"),
  7588. (position_move_z, pos1, 100),
  7589. (particle_system_burst, "psys_fireplace_fire_big", pos1, 100),
  7590. (try_end),
  7591. ]),
  7592.  
  7593. ("cf_process_iron_divide_only",
  7594. [generate_process_init(skill="skl_engineer", level=2, resource_class=item_class_iron),
  7595.  
  7596. (assign, ":processed_item_id", -1),
  7597. (try_begin),
  7598. (eq, ":resource_item_id", "itm_iron_bar_short"),
  7599. (assign, ":processed_item_id", "itm_iron_piece"),
  7600. (else_try),
  7601. (eq, ":resource_item_id", "itm_iron_bar"),
  7602. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7603. (else_try),
  7604. (eq, ":resource_item_id", "itm_iron_bar_long"),
  7605. (assign, ":processed_item_id", "itm_iron_bar"),
  7606. (else_try),#RAMARAUNT ADD
  7607. (eq, ":resource_item_id", "itm_brass_bar"),
  7608. (assign, ":processed_item_id", "itm_brass_bar_short"),
  7609. (else_try),#RAMARAUNT ADD
  7610. (eq, ":resource_item_id", "itm_copper_bar"),
  7611. (assign, ":processed_item_id", "itm_copper_bar_short"),
  7612. (try_end),
  7613. (ge, ":processed_item_id", all_items_begin),
  7614. (try_begin),
  7615. (eq, ":finished", 1),
  7616. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7617. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 2),
  7618. (else_try),
  7619. (eq, ":finished", 0),
  7620. (agent_play_sound, ":agent_id", "snd_blacksmith"),
  7621. (neq, ":instance_id", 0),
  7622. (try_end),
  7623. ]),
  7624.  
  7625. ("cf_process_grind",
  7626. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7627.  
  7628. (assign, ":processed_item_id", -1),
  7629. (assign, ":processed_item_count", 1),
  7630. (assign, ":resource_item_count", 1),
  7631. (try_begin),
  7632. (eq, ":resource_item_id", "itm_wheat_sheaf"),
  7633. (assign, ":processed_item_id", "itm_flour_sack"),
  7634. (try_begin),
  7635. (ge, ":skill_level", 5),
  7636. (assign, ":resource_item_count", 3),
  7637. (else_try),
  7638. (assign, ":resource_item_count", 4),
  7639. (try_end),
  7640. (try_end),
  7641. (neq, ":processed_item_id", -1),
  7642. (try_begin),
  7643. (eq, ":finished", 1),
  7644. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7645. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7646. (else_try),
  7647. (eq, ":finished", 0),
  7648. (prop_instance_get_position, pos1, ":instance_id"),
  7649. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  7650. (particle_system_burst, "psys_dummy_smoke", pos1, 10),
  7651. (try_end),
  7652. ]),
  7653.  
  7654. ("cf_process_cook", #ALTERED BY RAMARAUNT
  7655. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7656.  
  7657. (assign, ":resource_2_item_id", -1),
  7658. (assign, ":resource_3_item_id", -1),
  7659. (assign, ":resource_4_item_id", -1),
  7660. (assign, ":processed_item_id", -1),
  7661. (assign, ":processed_item_count", 1),
  7662. (try_begin),
  7663. (eq, ":resource_item_id", "itm_flour_sack"),
  7664. (try_begin),
  7665. (agent_has_item_equipped, ":agent_id", "itm_water_bucket"),
  7666. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7667. (assign, ":processed_item_id", "itm_bread"),
  7668. (else_try),
  7669. (agent_has_item_equipped, ":agent_id", "itm_raw_meat"),
  7670. (assign, ":resource_2_item_id", "itm_raw_meat"),
  7671. (assign, ":processed_item_id", "itm_meat_pie"),
  7672. (else_try),
  7673. (agent_has_item_equipped, ":agent_id", "itm_salted_meat"),
  7674. (assign, ":resource_2_item_id", "itm_salted_meat"),
  7675. (assign, ":processed_item_id", "itm_meat_pie"),
  7676. (else_try),
  7677. (agent_has_item_equipped, ":agent_id", "itm_red_apple"),
  7678. (assign, ":resource_2_item_id", "itm_red_apple"),
  7679. (assign, ":resource_3_item_id", "itm_red_apple"),
  7680. (assign, ":resource_4_item_id", "itm_red_apple"),
  7681. (assign, ":processed_item_id", "itm_apple_pie"),
  7682. (try_end),
  7683. (try_begin),
  7684. (ge, ":skill_level", 5),
  7685. (assign, ":processed_item_count", 5),
  7686. (else_try),
  7687. (assign, ":processed_item_count", 4),
  7688. (try_end),
  7689. (else_try),
  7690. (this_or_next|eq, ":resource_item_id", "itm_fish"),
  7691. (eq, ":resource_item_id", "itm_salted_fish"),
  7692. (assign, ":processed_item_id", "itm_cooked_fish"),
  7693. (else_try),
  7694. (this_or_next|eq, ":resource_item_id", "itm_raw_meat"),
  7695. (eq, ":resource_item_id", "itm_salted_meat"),
  7696. (assign, ":processed_item_id", "itm_cooked_meat"),
  7697. (else_try), #mushroom soup
  7698. (eq, ":resource_item_id", "itm_shitocky_mushroom"),
  7699. (assign, ":processed_item_id", "itm_shitocky_soup"),
  7700. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7701. (else_try), #bad mushroom soup
  7702. (eq, ":resource_item_id", "itm_bad_trip_mushroom"),
  7703. (assign, ":processed_item_id", "itm_shit_soup"),
  7704. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7705. (else_try), #vegetable soup
  7706. (this_or_next|eq, ":resource_item_id", "itm_cut_carrots"),
  7707. (this_or_next|eq, ":resource_item_id", "itm_cut_potato"),
  7708. (eq, ":resource_item_id", "itm_cabbage_leaf"),
  7709. (assign, ":processed_item_id", "itm_vegetable_soup_pot"),
  7710. (assign, ":resource_4_item_id", "itm_cabbage_leaf"),
  7711. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7712. (assign, ":resource_item_id", "itm_cut_potato"),
  7713. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7714. (else_try), #stew
  7715. (eq, ":resource_item_id", "itm_cut_meat"),
  7716. (assign, ":processed_item_id", "itm_stew_pot"),
  7717. (assign, ":resource_item_id", "itm_cut_meat"),
  7718. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7719. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7720. (assign, ":resource_4_item_id", "itm_cut_potato"),
  7721. (else_try), #baked potato
  7722. (eq, ":resource_item_id", "itm_potato"),
  7723. (assign, ":processed_item_id", "itm_baked_potato"),
  7724. (else_try), #mushroom stew poisinous
  7725. (eq, ":resource_item_id", "itm_cut_mushrooms_poison"),
  7726. (assign, ":processed_item_id", "itm_mushroom_stew_pot_poison"),
  7727. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7728. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7729. (assign, ":resource_4_item_id", "itm_cut_potato"),
  7730. (else_try), # mushroom stew
  7731. (eq, ":resource_item_id", "itm_cut_mushrooms"),
  7732. (assign, ":processed_item_id", "itm_mushroom_stew_pot"),
  7733. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7734. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7735. (assign, ":resource_4_item_id", "itm_cut_potato"),
  7736. (try_end),
  7737. (neq, ":processed_item_id", -1),
  7738. (try_begin),
  7739. (eq, ":finished", 1),
  7740. (call_script, "script_cf_agent_consume_items", ":agent_id", ":resource_item_id", ":resource_2_item_id", ":resource_3_item_id", ":resource_4_item_id"),
  7741. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7742. (try_begin),
  7743. (eq, ":resource_2_item_id", "itm_water_bucket"),
  7744. (agent_equip_item, ":agent_id", "itm_bucket", reg2),
  7745. (try_end),
  7746. (else_try),
  7747. (eq, ":finished", 0),
  7748. (call_script, "script_scene_prop_play_sound", ":instance_id", "snd_fire"),
  7749. (prop_instance_get_position, pos1, ":instance_id"),
  7750. (copy_position, pos2, pos1),
  7751. (position_move_z, pos1, 100),
  7752. (position_move_y, pos1, -50),
  7753. (particle_system_burst, "psys_cooking_smoke", pos1, 100),
  7754. (particle_system_burst, "psys_fireplace_fire_small", pos2, 100),
  7755. (try_end),
  7756. ]),
  7757.  
  7758. ("cf_process_press",
  7759. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7760.  
  7761. (assign, ":processed_item_id", -1),
  7762. (assign, ":processed_item_count", 1),
  7763. (assign, ":resource_item_count", 1),
  7764. (try_begin),
  7765. (eq, ":resource_item_id", "itm_grapes"),
  7766. (assign, ":processed_item_id", "itm_must_barrel"),
  7767. (assign, ":resource_item_count", 3),
  7768. (else_try),
  7769. (eq, ":resource_item_id", "itm_must_barrel"),
  7770. (assign, ":processed_item_id", "itm_wine_barrel"),
  7771. (try_begin),
  7772. (ge, ":skill_level", 5),
  7773. (assign, ":resource_item_count", 2),
  7774. (else_try),
  7775. (assign, ":resource_item_count", 3),
  7776. (try_end),
  7777. (try_end),
  7778. (neq, ":processed_item_id", -1),
  7779. (try_begin),
  7780. (eq, ":finished", 1),
  7781. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7782. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7783. (else_try),
  7784. (eq, ":finished", 0),
  7785. (prop_instance_get_position, pos1, ":instance_id"),
  7786. (particle_system_burst, "psys_wine_press_fill", pos1, 1),
  7787. (try_end),
  7788. ]),
  7789.  
  7790. ("cf_process_brew",
  7791. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7792.  
  7793. (assign, ":processed_item_id", -1),
  7794. (assign, ":processed_item_count", 1),
  7795. (try_begin),
  7796. (eq, ":resource_item_id", "itm_wheat_sheaf"),
  7797. (agent_has_item_equipped, ":agent_id", "itm_water_bucket"),
  7798. (assign, ":processed_item_id", "itm_beer_cask"),
  7799. (try_begin),
  7800. (ge, ":skill_level", 5),
  7801. (assign, ":resource_item_count", 2),
  7802. (else_try),
  7803. (assign, ":resource_item_count", 3),
  7804. (try_end),
  7805. (try_begin),
  7806. (eq, ":finished", 1),
  7807. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_water_bucket", 1),
  7808. (agent_equip_item, ":agent_id", "itm_bucket", reg0),
  7809. (try_end),
  7810. (try_end),
  7811. (neq, ":processed_item_id", -1),
  7812. (try_begin),
  7813. (eq, ":finished", 1),
  7814. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7815. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7816. (else_try),
  7817. (eq, ":finished", 0),
  7818. (prop_instance_get_position, pos1, ":instance_id"),
  7819. (position_move_x, pos1, -75),
  7820. (position_move_y, pos1, -25),
  7821. (position_move_z, pos1, 320),
  7822. (particle_system_burst, "psys_brewing_steam", pos1, 100),
  7823. (try_end),
  7824. ]),
  7825.  
  7826. ("cf_process_tavern", #ALTERED BY RAMARAUNT FOR RICE WINE
  7827. [generate_process_init(resource_class=item_class_food, start_effect=False),
  7828.  
  7829. (assign, ":processed_item_id", -1),
  7830. (assign, ":resource_item_count", 1),
  7831. (assign, ":processed_item_count", 1),
  7832. (store_script_param, ":instance_id", 2),
  7833. (prop_instance_get_position, pos1, ":instance_id"),
  7834. (try_begin),
  7835. (eq, ":resource_item_id", "itm_wine_barrel"),
  7836. (assign, ":processed_item_count", 4),
  7837. (assign, ":processed_item_id", "itm_wine_jar"),
  7838. (position_move_z, pos1, 105),
  7839. (position_rotate_x, pos1, 90),
  7840. (else_try),
  7841. (eq, ":resource_item_id", "itm_wine_jar"),
  7842. (assign, ":resource_item_count", 4),
  7843. (assign, ":processed_item_id", "itm_wine_barrel"),
  7844. (position_move_z, pos1, 114),
  7845. (else_try),
  7846. (eq, ":resource_item_id", "itm_beer_cask"),
  7847. (assign, ":processed_item_count", 4),
  7848. (assign, ":processed_item_id", "itm_beer_jug"),
  7849. (position_move_z, pos1, 120),
  7850. (position_rotate_x, pos1, 90),
  7851. (else_try),
  7852. (eq, ":resource_item_id", "itm_beer_jug"),
  7853. (assign, ":resource_item_count", 4),
  7854. (assign, ":processed_item_id", "itm_beer_cask"),
  7855. (position_move_z, pos1, 116),
  7856. (else_try), #vege soup add
  7857. (eq, ":resource_item_id", "itm_vegetable_soup_pot"),
  7858. (assign, ":processed_item_count", 4),
  7859. (assign, ":processed_item_id", "itm_vegetable_soup_bowl"),
  7860. (position_move_z, pos1, 105),
  7861. (else_try),
  7862. (eq, ":resource_item_id", "itm_vegetable_soup_bowl"),
  7863. (assign, ":resource_item_count", 4),
  7864. (assign, ":processed_item_id", "itm_vegetable_soup_pot"),
  7865. (position_move_z, pos1, 116),
  7866. (else_try), #stew add
  7867. (eq, ":resource_item_id", "itm_stew_pot"),
  7868. (assign, ":processed_item_count", 4),
  7869. (assign, ":processed_item_id", "itm_stew_bowl"),
  7870. (position_move_z, pos1, 116),
  7871. (else_try),
  7872. (eq, ":resource_item_id", "itm_stew_bowl"),
  7873. (assign, ":resource_item_count", 4),
  7874. (assign, ":processed_item_id", "itm_stew_pot"),
  7875. (position_move_z, pos1, 116),
  7876. (else_try), #Milk add
  7877. (eq, ":resource_item_id", "itm_milk_bucket"),
  7878. (assign, ":processed_item_count", 4),
  7879. (assign, ":processed_item_id", "itm_milk_jug"),
  7880. (position_move_z, pos1, 120),
  7881. (position_rotate_x, pos1, 90),
  7882. (agent_equip_item, ":agent_id", "itm_bucket", 1),
  7883. (else_try), #mushroom stew add
  7884. (eq, ":resource_item_id", "itm_mushroom_stew_pot"),
  7885. (assign, ":processed_item_count", 4),
  7886. (assign, ":processed_item_id", "itm_mushroom_stew_bowl"),
  7887. (position_move_z, pos1, 116),
  7888. (else_try),
  7889. (eq, ":resource_item_id", "itm_mushroom_stew_bowl"),
  7890. (assign, ":resource_item_count", 4),
  7891. (assign, ":processed_item_id", "itm_mushroom_stew_pot"),
  7892. (position_move_z, pos1, 116),
  7893. (else_try), #mushroom stew poison add
  7894. (eq, ":resource_item_id", "itm_mushroom_stew_pot_poison"),
  7895. (assign, ":processed_item_count", 4),
  7896. (assign, ":processed_item_id", "itm_mushroom_stew_bowl_poison"),
  7897. (position_move_z, pos1, 116),
  7898. (else_try),
  7899. (eq, ":resource_item_id", "itm_mushroom_stew_bowl_poison"),
  7900. (assign, ":resource_item_count", 4),
  7901. (assign, ":processed_item_id", "itm_mushroom_stew_pot_poison"),
  7902. (position_move_z, pos1, 116),
  7903. (try_end),
  7904.  
  7905. (neq, ":processed_item_id", -1),
  7906. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7907. (store_div, ":move_x", ":processed_item_count", 2),
  7908. (val_mul, ":move_x", -50),
  7909. (position_move_x, pos1, ":move_x"),
  7910. (try_for_range, ":unused", 0, ":processed_item_count"),
  7911. (set_spawn_position, pos1),
  7912. (spawn_item, ":processed_item_id", 0, "$g_spawn_item_prune_time"),
  7913. (prop_instance_set_position, reg0, pos1),
  7914. (position_move_x, pos1, 50),
  7915. (try_end),
  7916. ]),
  7917.  
  7918.  
  7919. ("cf_process_preserve",
  7920. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food, start_effect=False),
  7921.  
  7922. (assign, ":processed_item_id", -1),
  7923. (try_begin),
  7924. (eq, ":resource_item_id", "itm_fish"),
  7925. (assign, ":processed_item_id", "itm_salted_fish"),
  7926. (else_try),
  7927. (eq, ":resource_item_id", "itm_raw_meat"),
  7928. (assign, ":processed_item_id", "itm_salted_meat"),
  7929. (else_try),
  7930. (eq, ":resource_item_id", "itm_salt_sack"),
  7931. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_salt_sack", 1),
  7932. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_salt", 8),
  7933. (try_end),
  7934. (neq, ":processed_item_id", -1),
  7935. (call_script, "script_cf_agent_consume_items", ":agent_id", "itm_salt", ":resource_item_id", ":resource_item_id", ":resource_item_id"),
  7936. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 3),
  7937. ]),
  7938.  
  7939. ("cf_process_prepare", #Ramaraunt Script
  7940. [generate_process_init(skill="skl_labouring", level=1, resource_class=[item_class_food,item_class_precious], start_effect=False),
  7941.  
  7942. (assign, ":processed_item_id", -1),
  7943. (try_begin),
  7944. (eq, ":resource_item_id", "itm_carrot"),
  7945. (assign, ":processed_item_id", "itm_cut_carrots"),
  7946. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7947. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cut_carrots", 1),
  7948. (else_try),
  7949. (eq, ":resource_item_id", "itm_cabbage"),
  7950. (assign, ":processed_item_id", "itm_cabbage_leaf"),
  7951. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7952. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cabbage_leaf", 1),
  7953. (else_try),
  7954. (eq,":resource_item_id", "itm_potato"),
  7955. (assign, ":processed_item_id", "itm_cut_potato"),
  7956. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7957. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cut_potato", 1),
  7958. (else_try),
  7959. (this_or_next|eq, ":resource_item_id", "itm_salted_meat"),
  7960. (this_or_next|eq, ":resource_item_id", "itm_raw_meat"),
  7961. (eq, ":resource_item_id", "itm_cooked_meat"),
  7962. (assign, ":processed_item_id", "itm_cut_meat"),
  7963. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7964. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cut_meat", 1),
  7965. (else_try),
  7966. (eq, ":resource_item_id", "itm_baked_potato"),
  7967. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_butter_small", 1),
  7968. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7969. (assign, ":processed_item_id", "itm_buttered_baked_potato"),
  7970. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_buttered_baked_potato", 1),
  7971. (else_try),
  7972. (eq,":resource_item_id", "itm_bread"),
  7973. (assign, ":processed_item_id", "itm_bread_cut"),
  7974. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7975. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 3),
  7976. (else_try),
  7977. (eq,":resource_item_id", "itm_onion"),
  7978. (assign, ":processed_item_id", "itm_cut_onions"),
  7979. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7980. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7981. (else_try),
  7982. (eq,":resource_item_id", "itm_bread_cut"),
  7983. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_butter_small", 1),
  7984. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7985. (assign, ":processed_item_id", "itm_buttered_bread_cut"),
  7986. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7987. (else_try),
  7988. (eq,":resource_item_id", "itm_bread_cut"),
  7989. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_olive_oil", 1),
  7990. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7991. (assign, ":processed_item_id", "itm_olived_bread_cut"),
  7992. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7993. (else_try),
  7994. (eq,":resource_item_id", "itm_olived_bread_cut"),
  7995. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_butter_small", 1),
  7996. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7997. (assign, ":processed_item_id", "itm_olived_buttered_bread_cut"),
  7998. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7999. (else_try),
  8000. (eq,":resource_item_id", "itm_buttered_bread_cut"),
  8001. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_olive_oil", 1),
  8002. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8003. (assign, ":processed_item_id", "itm_olived_buttered_bread_cut"),
  8004. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  8005. (else_try),
  8006. (eq, ":resource_item_id", "itm_olives"),
  8007. (assign, ":processed_item_id", "itm_olive_oil"),
  8008. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8009. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  8010. (else_try),
  8011. (eq,":resource_item_id", "itm_shitocky_mushroom"),
  8012. (assign, ":processed_item_id", "itm_cut_mushrooms"),
  8013. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8014. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  8015. (else_try),
  8016. (eq,":resource_item_id", "itm_bad_trip_mushroom"),
  8017. (assign, ":processed_item_id", "itm_cut_mushrooms_poison"),
  8018. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8019. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  8020. (else_try),
  8021. (eq,":resource_item_id", "itm_healing_herb"),
  8022. (assign, ":processed_item_id", "itm_blue_dye"),
  8023. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8024. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  8025. (try_end),
  8026.  
  8027.  
  8028.  
  8029. (neq, ":processed_item_id", -1),
  8030.  
  8031. ]),
  8032. #Ramaraunt Script
  8033. ("cf_process_churn",
  8034. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food, start_effect=False),
  8035.  
  8036. (assign,":processed_item_id", -1),
  8037. (try_begin),
  8038. (eq, ":resource_item_id", "itm_milk_bucket"),
  8039. (assign, ":processed_item_id", "itm_butter_small"),
  8040. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8041. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 2),
  8042. (agent_equip_item, ":agent_id", "itm_bucket", 1),
  8043. (else_try),
  8044. (eq, ":resource_item_id", "itm_butter_small"),
  8045. (assign, ":processed_item_id", "itm_cheese"),
  8046. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8047. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  8048. (try_end),
  8049. (neq, ":processed_item_id", -1),
  8050. ]),
  8051.  
  8052.  
  8053. ("cf_process_spin",
  8054. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_cloth, start_effect=False),
  8055.  
  8056. (assign, ":processed_item_id", -1),
  8057. (assign, ":processed_item_count", 2),
  8058. (try_begin),
  8059. (eq, ":resource_item_id", "itm_flax_bundle"),
  8060. (assign, ":processed_item_id", "itm_linen_thread"),
  8061. (try_end),
  8062. (neq, ":processed_item_id", -1),
  8063. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  8064. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  8065. ]),
  8066.  
  8067. ("cf_process_weave",
  8068. [generate_process_init(skill="skl_tailoring", level=1, resource_class=item_class_cloth, start_effect=False),
  8069.  
  8070. (assign, ":processed_item_id", -1),
  8071. (assign, ":processed_item_count", 1),
  8072. (assign, ":resource_item_count", 1),
  8073. (try_begin),
  8074. (eq, ":resource_item_id", "itm_linen_thread"),
  8075. (assign, ":processed_item_count", 2),
  8076. (assign, ":processed_item_id", "itm_linen_cloth"),
  8077. (else_try),
  8078. (eq, ":resource_item_id", "itm_linen_cloth_small"),
  8079. (assign, ":resource_item_count", 4),
  8080. (assign, ":processed_item_id", "itm_linen_cloth"),
  8081. (try_end),
  8082. (neq, ":processed_item_id", -1),
  8083. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  8084. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  8085. ]),
  8086.  
  8087. ("cf_process_cut",
  8088. [generate_process_init(resource_class=[item_class_cloth, item_class_leather], start_effect=False),
  8089.  
  8090. (agent_get_troop_id, ":troop_id", ":agent_id"),
  8091. (store_skill_level, ":tailoring", "skl_tailoring", ":troop_id"),
  8092. (store_skill_level, ":engineer", "skl_engineer", ":troop_id"),
  8093. (this_or_next|ge, ":tailoring", 1),
  8094. (ge, ":engineer", 1),
  8095. (assign, ":processed_item_id", -1),
  8096. (assign, ":processed_item_count", 4),
  8097. (assign, ":resource_item_count", 1),
  8098. (try_begin),
  8099. (eq, ":resource_item_id", "itm_linen_cloth"),
  8100. (assign, ":processed_item_id", "itm_linen_cloth_small"),
  8101. (else_try),
  8102. (eq, ":resource_item_id", "itm_leather_roll"),
  8103. (assign, ":processed_item_id", "itm_leather_piece"),
  8104. (try_end),
  8105. (neq, ":processed_item_id", -1),
  8106. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  8107. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  8108. ]),
  8109.  
  8110. ("cf_process_leather",
  8111. [generate_process_init(skill="skl_labouring", level=1, start_effect=False),
  8112.  
  8113. (eq, ":resource_item_id", "itm_raw_hide"),
  8114. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_raw_hide", 1),
  8115. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_leather_roll", 2),
  8116. ]),
  8117.  
  8118. ("cf_use_resource_stockpile", # server: handle players using a stockpile for buying and selling resources, not crafting
  8119. [(store_script_param, ":agent_id", 1), # must be valid
  8120. (store_script_param, ":instance_id", 2), # mist be valid
  8121.  
  8122. (agent_get_player_id, ":player_id", ":agent_id"),
  8123. (player_is_active, ":player_id"),
  8124. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8125. (is_between, ":item_id", all_items_begin, all_items_end),
  8126. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8127. (agent_get_wielded_item, ":weapon_item_id", ":agent_id", 0),
  8128. (agent_get_wielded_item, ":shield_item_id", ":agent_id", 1),
  8129. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  8130. (assign, ":gold_value", reg0),
  8131. (assign, ":fail", 0),
  8132. (try_begin),
  8133. (this_or_next|eq, ":weapon_item_id", ":item_id"),
  8134. (eq, ":shield_item_id", ":item_id"),
  8135. (prop_instance_get_variation_id_2, ":stock_limit", ":instance_id"),
  8136. (val_div, ":stock_limit", 10),
  8137. (val_mul, ":stock_limit", 100),
  8138. (try_begin),
  8139. (this_or_next|eq, "$g_game_type", "mt_quick_battle"),
  8140. (this_or_next|eq, ":stock_limit", 0),
  8141. (lt, ":stock_count", ":stock_limit"),
  8142. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  8143. (assign, ":add_or_subtract", 1),
  8144. (val_add, ":stock_count", 1),
  8145. (else_try),
  8146. (assign, ":fail", 1),
  8147. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  8148. (try_end),
  8149. (else_try),
  8150. (this_or_next|gt, ":stock_count", 0),
  8151. (eq, "$g_game_type", "mt_quick_battle"),
  8152. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  8153. (call_script, "script_spawn_processed_resources", ":agent_id", ":item_id", 1),
  8154. (assign, ":add_or_subtract", -1),
  8155. (val_sub, ":stock_count", 1),
  8156. (else_try),
  8157. (assign, ":fail", 1),
  8158. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  8159. (try_end),
  8160. (eq, ":fail", 0),
  8161. (try_begin),
  8162. (neq, "$g_game_type", "mt_no_money"),
  8163. (neq, "$g_game_type", "mt_feudalism"),
  8164. (call_script, "script_calculate_stockpile_taxed_price", ":instance_id", ":gold_value"),
  8165. (try_begin),
  8166. (eq, ":add_or_subtract", 1),
  8167. (assign, ":gold_value", reg0),
  8168. (else_try),
  8169. (eq, ":add_or_subtract", -1),
  8170. (assign, ":tax_value", reg1),
  8171. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  8172. (call_script, "script_castle_receive_gold", reg1, ":tax_value", -1),
  8173. (try_end),
  8174. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", ":add_or_subtract"),
  8175. (try_end),
  8176. (try_begin),
  8177. (neq, "$g_game_type", "mt_quick_battle"),
  8178. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8179. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8180. (try_end),
  8181. ]),
  8182.  
  8183. ("calculate_stockpile_taxed_price", # for resource stockpiles, return the taxed price in reg0 and the tax amount in reg1, depending on stock targets and current count
  8184. [(store_script_param, ":instance_id", 1), # must be valid
  8185. (store_script_param, ":gold_value", 2),
  8186.  
  8187. (store_mul, ":tax_value", ":gold_value", castle_tax_gold_percentage),
  8188. (try_begin),
  8189. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_resource_stockpile, 1),
  8190. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8191. (prop_instance_get_variation_id_2, ":stock_target", ":instance_id"),
  8192. (val_mod, ":stock_target", 10),
  8193. (val_mul, ":stock_target", 10),
  8194. (is_between, ":stock_count", 0, ":stock_target"),
  8195. (val_mul, ":tax_value", ":stock_count"),
  8196. (val_div, ":tax_value", ":stock_target"),
  8197. (try_end),
  8198. (val_div, ":tax_value", 100),
  8199. (store_sub, reg0, ":gold_value", ":tax_value"),
  8200. (assign, reg1, ":tax_value"),
  8201. ]),
  8202.  
  8203. ("cf_buy_sell_item_stockpile", # server: handle players using an item or horse stockpile for buying and selling
  8204. [(store_script_param, ":agent_id", 1), # must be valid
  8205. (store_script_param, ":instance_id", 2), # must be valid
  8206.  
  8207. (agent_get_player_id, ":player_id", ":agent_id"),
  8208. (player_is_active, ":player_id"),
  8209. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8210. (is_between, ":item_id", all_items_begin, all_items_end),
  8211. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8212. (agent_get_wielded_item, ":weapon_item_id", ":agent_id", 0),
  8213. (agent_get_wielded_item, ":shield_item_id", ":agent_id", 1),
  8214. (item_get_type, ":item_type", ":item_id"),
  8215. (assign, ":fail", 0),
  8216. (try_begin), # if the item is wielded or worn, try selling it
  8217. (this_or_next|eq, ":weapon_item_id", ":item_id"),
  8218. (this_or_next|eq, ":shield_item_id", ":item_id"),
  8219. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  8220. (call_script, "script_cf_sell_item", ":agent_id", ":instance_id"),
  8221. (val_add, ":stock_count", 1),
  8222. (else_try), # else try selling a horse
  8223. (assign, reg0, 0),
  8224. (eq, ":item_type", itp_type_horse),
  8225. (call_script, "script_cf_sell_horse", ":agent_id", ":instance_id"),
  8226. (val_add, ":stock_count", 1),
  8227. (else_try), # if the horse selling didn't respond with a failure message and the weapon hand is empty, try buy
  8228. (eq, reg0, 0),
  8229. (this_or_next|gt, ":stock_count", 0),
  8230. (eq, "$g_game_type", "mt_quick_battle"),
  8231. (eq, ":weapon_item_id", -1),
  8232. (call_script, "script_cf_buy_item", ":agent_id", ":instance_id"),
  8233. (val_sub, ":stock_count", 1),
  8234. (else_try),
  8235. (eq, ":stock_count", 0),
  8236. (assign, ":fail", 1),
  8237. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  8238. (try_end),
  8239. (eq, ":fail", 0),
  8240. (try_begin),
  8241. (neq, "$g_game_type", "mt_quick_battle"),
  8242. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8243. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8244. (try_end),
  8245. ]),
  8246.  
  8247. ("cf_craft_item_stockpile", # server: handle players crafting items at a stockpile
  8248. [(store_script_param, ":agent_id", 1), # must be valid
  8249. (store_script_param, ":instance_id", 2), # must be valid
  8250. (store_script_param, ":skill_1_id", 3),
  8251. (store_script_param, ":required_level_1", 4),
  8252. (store_script_param, ":skill_2_id", 5), # an optional alternate skill and level to craft with
  8253. (store_script_param, ":required_level_2", 6),
  8254. (store_script_param, ":resource_1_item_id", 7),
  8255. (store_script_param, ":resource_2_item_id", 8),
  8256. (store_script_param, ":resource_3_item_id", 9),
  8257. (store_script_param, ":resource_4_item_id", 10),
  8258.  
  8259. (neq, "$g_game_type", "mt_quick_battle"),
  8260. (agent_get_player_id, ":player_id", ":agent_id"),
  8261. (player_is_active, ":player_id"),
  8262. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8263. (is_between, ":item_id", all_items_begin, all_items_end),
  8264. (is_between, ":resource_1_item_id", all_items_begin, all_items_end),
  8265. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8266. (assign, ":error_string_id", 0),
  8267. (try_begin),
  8268. (assign, ":average_level", ":required_level_1"),
  8269. (try_begin),
  8270. (le, ":skill_1_id", -1),
  8271. (else_try),
  8272. (agent_get_troop_id, ":troop_id", ":agent_id"),
  8273. (store_skill_level, ":skill_1_level", ":skill_1_id", ":troop_id"),
  8274. (ge, ":skill_1_level", ":required_level_1"),
  8275. (else_try),
  8276. (gt, ":skill_2_id", -1),
  8277. (store_skill_level, ":skill_2_level", ":skill_2_id", ":troop_id"),
  8278. (ge, ":skill_2_level", ":required_level_2"),
  8279. (store_add, ":average_level", ":required_level_1", ":required_level_2"),
  8280. (val_div, ":average_level", 2),
  8281. (else_try),
  8282. (assign, ":error_string_id", "str_craft_not_skilled"),
  8283. (try_end),
  8284. (eq, ":error_string_id", 0),
  8285. (assign, ":error_string_id", "str_craft_wrong_resources"),
  8286. (call_script, "script_cf_agent_consume_items", ":agent_id", ":resource_1_item_id", ":resource_2_item_id", ":resource_3_item_id", ":resource_4_item_id"),
  8287. (call_script, "script_scene_prop_get_item_crafting_refund_reward", ":instance_id"),
  8288. (call_script, "script_player_adjust_gold", ":player_id", reg0, 1),
  8289. (val_add, ":stock_count", 1),
  8290. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8291. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8292. (else_try),
  8293. (gt, ":error_string_id", 0),
  8294. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":error_string_id", preset_message_yellow|preset_message_fail_sound),
  8295. (try_end),
  8296. (eq, ":error_string_id", 0),
  8297. ]),
  8298.  
  8299. ("scene_prop_get_item_crafting_refund_reward", # reg0 = the total money given, reg1 = the local cost of all resources, reg2 = the variable extra reward
  8300. [(store_script_param, ":instance_id", 1), # must be valid
  8301.  
  8302. (prop_instance_get_variation_id_2, ":design_target_stock_count", ":instance_id"),
  8303. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8304. (store_sub, ":stock_count_factor", ":design_target_stock_count", ":stock_count"),
  8305. (try_begin),
  8306. (gt, ":stock_count_factor", 0),
  8307. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8308. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  8309. (store_mul, ":gold_reward", reg0, craft_price_gold_reward_percentage),
  8310. (val_div, ":gold_reward", 100),
  8311. (scene_prop_get_slot, ":skill_reward", ":instance_id", slot_scene_prop_average_craft_skill),
  8312. (val_mul, ":skill_reward", craft_skill_gold_reward_multiplier),
  8313. (val_add, ":gold_reward", ":skill_reward"),
  8314. (val_mul, ":gold_reward", ":stock_count_factor"),
  8315. (val_div, ":gold_reward", ":design_target_stock_count"),
  8316. (else_try),
  8317. (assign, ":gold_reward", 0),
  8318. (try_end),
  8319. (try_begin),
  8320. (neq, "$g_game_type", "mt_feudalism"),
  8321. (scene_prop_get_slot, reg1, ":instance_id", slot_scene_prop_resource_refund_cost),
  8322. (try_begin),
  8323. (lt, reg1, 0),
  8324. (call_script, "script_scene_prop_calculate_resource_refund_cost", ":instance_id"),
  8325. (try_end),
  8326. (else_try),
  8327. (assign, reg1, 0),
  8328. (try_end),
  8329. (assign, reg2, ":gold_reward"),
  8330. (store_add, reg0, reg1, ":gold_reward"),
  8331. ]),
  8332.  
  8333. ("cf_repair_scene_prop", # server: check if an attack on a destructible scene prop should repair it; reg0 = resulting hit points, reg1 = whether more resources are required
  8334. [(store_script_param, ":instance_id", 1), # must be valid
  8335. (store_script_param, ":agent_id", 2), # must be valid
  8336. (store_script_param, ":hit_damage", 3),
  8337. (store_script_param, ":full_hit_points", 4),
  8338. (store_script_param, ":resource_class", 5), # constants starting with item_class_
  8339.  
  8340. (agent_is_alive, ":agent_id"),
  8341. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  8342. (gt, ":wielded_item_id", -1),
  8343. (item_get_slot, ":wielded_item_class", ":wielded_item_id", slot_item_class),
  8344. (eq, ":wielded_item_class", item_class_repair),
  8345. (agent_get_troop_id, ":troop_id", ":agent_id"),
  8346. (store_skill_level, ":engineer", "skl_engineer", ":troop_id"),
  8347. (gt, ":engineer", 0),
  8348. (set_trigger_result, 0),
  8349. (scene_prop_get_hit_points, ":hit_points", ":instance_id"),
  8350. (lt, ":hit_points", ":full_hit_points"),
  8351. (scene_prop_get_slot, ":next_resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  8352. (try_begin),
  8353. (gt, ":hit_points", ":next_resource_hp"),
  8354. (store_sub, ":maximum_required", ":full_hit_points", ":hit_points"),
  8355. (call_script, "script_cf_agent_consume_resource", ":agent_id", ":resource_class", ":maximum_required"),
  8356. (val_add, ":next_resource_hp", reg0),
  8357. (val_min, ":next_resource_hp", ":full_hit_points"),
  8358. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":next_resource_hp"),
  8359. (try_end),
  8360. (try_begin),
  8361. (le, ":hit_points", ":next_resource_hp"),
  8362. (val_add, ":hit_points", ":hit_damage"),
  8363. (val_mul, ":engineer", 20),
  8364. (val_add, ":hit_points", ":engineer"),
  8365. (val_min, ":hit_points", ":full_hit_points"),
  8366. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  8367. (assign, reg1, 0),
  8368. (else_try),
  8369. (assign, reg1, 1),
  8370. (try_end),
  8371. (assign, reg0, ":hit_points"),
  8372. ]),
  8373.  
  8374. ("cf_hit_repairable_scene_prop", # server: handle attacking a destructible and repairable scene prop; reg0 = constant starting with repairable_, reg1 = resulting hit points
  8375. [(store_script_param, ":instance_id", 1), # must be valid
  8376. (store_script_param, ":hit_damage", 2),
  8377. (store_script_param, ":full_hit_points", 3),
  8378. (store_script_param, ":resource_class", 4), # constants starting with item_class
  8379. (store_script_param, ":agent_id", 5), # must be valid
  8380. (store_script_param, ":repair_active", 6), # whether to allow repairing active, not fully destroyed scene props
  8381. (store_script_param, ":script_damage", 7), # 0 = damage applied by an agent from ti_on_scene_prop_hit, 1 = damage applied by a script
  8382.  
  8383. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  8384. (try_begin),
  8385. (agent_is_active, ":agent_id"),
  8386. (this_or_next|neq, ":state", scene_prop_state_active),
  8387. (eq, ":repair_active", 1),
  8388. (call_script, "script_cf_repair_scene_prop", ":instance_id", ":agent_id", ":hit_damage", ":full_hit_points", ":resource_class"),
  8389. (assign, ":hit_points", reg0),
  8390. (assign, ":resource_required", reg1),
  8391. (try_begin),
  8392. (ge, ":hit_points", ":full_hit_points"),
  8393. (neq, ":state", scene_prop_state_active),
  8394. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  8395. (get_max_players, ":max_players"),
  8396. (try_for_range, ":player_id", 1, ":max_players"),
  8397. (player_is_active, ":player_id"),
  8398. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":instance_id", -1),
  8399. (try_end),
  8400. (assign, ":result", repairable_repaired),
  8401. (else_try),
  8402. (eq, ":resource_required", 1),
  8403. (assign, ":result", repairable_resource_required),
  8404. (agent_get_player_id, ":player_id", ":agent_id"),
  8405. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_resource_required", preset_message_yellow|preset_message_fail_sound),
  8406. (else_try),
  8407. (assign, ":result", repairable_repairing),
  8408. (try_end),
  8409. (else_try),
  8410. (try_begin),
  8411. (eq, ":resource_class", item_class_wood),
  8412. (agent_is_active, ":agent_id"),
  8413. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  8414. (gt, ":wielded_item_id", -1),
  8415. (item_slot_eq, ":wielded_item_id", slot_item_bonus_against_wood, 1),
  8416. (val_mul, ":hit_damage", 2),
  8417. (try_end),
  8418. (scene_prop_get_slot, ":next_resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  8419. (val_sub, ":next_resource_hp", ":hit_damage"),
  8420. (val_max, ":next_resource_hp", min_scene_prop_hit_points),
  8421. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":next_resource_hp"),
  8422. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  8423. (assign, ":hit_damage", reg1),
  8424. (assign, ":hit_points", reg2),
  8425. (try_begin), # for damage by a script rather than an agent, reduce the hit points manually
  8426. (eq, ":script_damage", 1),
  8427. (gt, ":hit_damage", 0),
  8428. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  8429. (try_end),
  8430. (try_begin),
  8431. (eq, ":state", scene_prop_state_active),
  8432. (try_begin),
  8433. (le, ":hit_points", min_scene_prop_hit_points),
  8434. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8435. (assign, ":result", repairable_destroyed),
  8436. (else_try),
  8437. (assign, ":result", repairable_hit),
  8438. (try_end),
  8439. (else_try),
  8440. (assign, ":result", repairable_hit_destroyed),
  8441. (try_end),
  8442. (try_end),
  8443. (assign, reg0, ":result"),
  8444. (assign, reg1, ":hit_points"),
  8445. ]),
  8446.  
  8447. ("cf_hit_door", # server: handle hitting a rotating destructible door; should be called from ti_on_scene_prop_hit
  8448. [(multiplayer_is_server),
  8449. (store_script_param, ":instance_id", 1), # must be valid
  8450. (store_script_param, ":hit_damage", 2),
  8451. (store_script_param, ":resource_class", 3),
  8452. (set_fixed_point_multiplier, 1),
  8453. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8454. (set_fixed_point_multiplier, 100),
  8455.  
  8456. (try_begin), # only allow repairing standing doors if they are open
  8457. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_rotation, 1),
  8458. (assign, ":repair_active", 1),
  8459. (else_try),
  8460. (assign, ":repair_active", 0),
  8461. (try_end),
  8462. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8463. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", ":resource_class", ":agent_id", ":repair_active", 0),
  8464. (assign, ":result", reg0),
  8465. (try_begin),
  8466. (eq, ":result", repairable_hit),
  8467. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  8468. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_shield_hit_wood_metal"),
  8469. (else_try),
  8470. (eq, ":result", repairable_destroyed),
  8471. (call_script, "script_destroy_door", ":agent_id", ":instance_id"),
  8472. (particle_system_burst, "psys_dummy_smoke", pos1, 20),
  8473. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8474. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  8475. (else_try),
  8476. (eq, ":result", repairable_hit_destroyed),
  8477. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8478. (else_try),
  8479. (eq, ":result", repairable_repairing),
  8480. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8481. (else_try),
  8482. (eq, ":result", repairable_repaired),
  8483. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8484. (prop_instance_animate_to_position, ":instance_id", pos2, 400),
  8485. (agent_play_sound, ":agent_id", "snd_man_grunt"),
  8486. (try_end),
  8487. ]),
  8488.  
  8489. ("destroy_door", # server: rotate destructible doors flat on the ground after destroyed
  8490. [(store_script_param, ":agent_id", 1), # if invalid, manually sets the hit points and state to destroyed
  8491. (store_script_param, ":instance_id", 2), # must be valid
  8492.  
  8493. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8494. (init_position, pos3),
  8495. (try_begin),
  8496. (agent_is_active, ":agent_id"),
  8497. (agent_get_position, pos5, ":agent_id"),
  8498. (else_try),
  8499. (scene_prop_set_hit_points, ":instance_id", min_scene_prop_hit_points),
  8500. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, min_scene_prop_hit_points),
  8501. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8502. (try_end),
  8503. (try_begin), # align the door along the ground away from the agent
  8504. (agent_is_active, ":agent_id"),
  8505. (prop_instance_get_position, pos6, ":instance_id"),
  8506. (position_is_behind_position, pos5, pos6),
  8507. (assign, ":direction", -1),
  8508. (position_move_y, pos3, 150),
  8509. (assign, ":ground_offset", 20),
  8510. (else_try),
  8511. (assign, ":direction", 1),
  8512. (position_move_y, pos3, -150),
  8513. (assign, ":ground_offset", 0),
  8514. (try_end),
  8515. (position_move_x, pos3, -50),
  8516. (position_transform_position_to_parent, pos4, pos2, pos3),
  8517. (position_move_z, pos4, 150, 1),
  8518. (position_get_distance_to_ground_level, ":ground_distance", pos4),
  8519. (val_sub, ":ground_distance", 150),
  8520. (store_atan2, ":ground_angle", ":ground_distance", 150),
  8521. (convert_from_fixed_point, ":ground_angle"),
  8522. (store_add, ":rotate_angle", 90, ":ground_angle"),
  8523. (val_mul, ":rotate_angle", ":direction"),
  8524. (position_rotate_x, pos2, ":rotate_angle"),
  8525. (position_move_z, pos2, ":ground_offset", 1),
  8526. (prop_instance_animate_to_position, ":instance_id", pos2, 100),
  8527. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, 0),
  8528. ]),
  8529.  
  8530. ("cf_use_rotate_door", # server: handle opening and closing a rotating door
  8531. [(store_script_param, ":agent_id", 1), # must be valid
  8532. (store_script_param, ":instance_id", 2), # must be valid
  8533. (store_script_param, ":left", 3), # 1 makes the door rotate the other way, for matching left and right doors
  8534.  
  8535. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  8536. (agent_get_player_id, ":player_id", ":agent_id"),
  8537. (player_is_active, ":player_id"),
  8538. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  8539. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  8540. (assign, ":faction_id", reg0),
  8541. (prop_instance_get_variation_id_2, ":is_bolted", ":instance_id"),
  8542. (val_and, ":is_bolted", 0x2),
  8543. (assign, ":fail_string_id", 0),
  8544. (try_begin),
  8545. (eq, ":is_bolted", 0x2),
  8546. (try_begin),
  8547. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_rotation, 1),
  8548. (else_try),
  8549. (neq, ":faction_id", "fac_commoners"),
  8550. (eq, ":faction_id", ":player_faction_id"),
  8551. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  8552. (else_try),
  8553. (prop_instance_get_position, pos1, ":instance_id"),
  8554. (agent_get_position, pos2, ":agent_id"),
  8555. (neg|position_is_behind_position, pos2, pos1),
  8556. (else_try),
  8557. (assign, ":fail_string_id", "str_door_bolted"),
  8558. (try_end),
  8559. (else_try),
  8560. (eq, ":faction_id", "fac_commoners"),
  8561. (else_try),
  8562. (eq, ":faction_id", ":player_faction_id"),
  8563. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  8564. (else_try),
  8565. (assign, ":fail_string_id", "str_door_locked_by_s1"),
  8566. (try_end),
  8567. (try_begin),
  8568. (gt, ":fail_string_id", 0),
  8569. (prop_instance_get_variation_id_2, ":not_pickable", ":instance_id"),
  8570. (val_and, ":not_pickable", 0x4),
  8571. (neq, ":not_pickable", 0x4),
  8572. (try_begin),
  8573. (call_script, "script_cf_agent_pick_lock", ":agent_id", 100),
  8574. (assign, ":fail_string_id", 0),
  8575. (try_end),
  8576. (gt, reg0, 0),
  8577. (else_try),
  8578. (eq, ":fail_string_id", "str_door_bolted"),
  8579. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":fail_string_id", preset_message_error),
  8580. (else_try),
  8581. (eq, ":fail_string_id", "str_door_locked_by_s1"),
  8582. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, ":fail_string_id", preset_message_faction|preset_message_fail_sound, ":faction_id"),
  8583. (try_end),
  8584. (eq, ":fail_string_id", 0),
  8585. (call_script, "script_cf_rotate_door", ":instance_id", ":left"),
  8586. ]),
  8587.  
  8588. ("cf_rotate_door", # server: helper script to rotate doors
  8589. [(store_script_param, ":instance_id", 1), # must be valid
  8590. (store_script_param, ":left", 2),
  8591.  
  8592. (prop_instance_get_starting_position, pos1, ":instance_id"),
  8593. (try_begin),
  8594. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_rotation, 0),
  8595. (try_begin),
  8596. (eq, ":left", 1),
  8597. (position_rotate_z, pos1, -95),
  8598. (else_try),
  8599. (position_rotate_z, pos1, 95),
  8600. (try_end),
  8601. (assign, ":door_open", 1),
  8602. (else_try),
  8603. (assign, ":door_open", 0),
  8604. (try_end),
  8605. (scene_prop_set_slot, ":instance_id", slot_scene_prop_rotation, ":door_open"),
  8606. (scene_prop_enable_after_time, ":instance_id", 100),
  8607. (prop_instance_animate_to_position, ":instance_id", pos1, 100),
  8608. ]),
  8609.  
  8610. ("cf_init_rotate_door", # server: set the inital position of a rotating door
  8611. [(store_script_param, ":instance_id", 1), # must be valid
  8612. (store_script_param, ":left", 2),
  8613.  
  8614. (prop_instance_get_variation_id_2, ":bit_field", ":instance_id"),
  8615. (store_and, ":start_destroyed", ":bit_field", 0x10),
  8616. (try_begin),
  8617. (eq, ":start_destroyed", 0x10),
  8618. (call_script, "script_destroy_door", -1, ":instance_id"),
  8619. (else_try),
  8620. (store_and, ":initial_position", ":bit_field", 0x1),
  8621. (eq, ":initial_position", 0x1),
  8622. (call_script, "script_cf_rotate_door", ":instance_id", ":left"),
  8623. (try_end),
  8624. ]),
  8625.  
  8626. ("cf_hit_chest", # server: handle damaging and repairing a storage chest; should be called from ti_on_scene_prop_hit
  8627. [(multiplayer_is_server),
  8628. (store_script_param, ":instance_id", 1), # must be valid
  8629. (store_script_param, ":hit_damage", 2),
  8630. (store_script_param, ":full_hit_points", 3),
  8631. (set_fixed_point_multiplier, 1),
  8632. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8633. (set_fixed_point_multiplier, 100),
  8634.  
  8635. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, 0),
  8636. (assign, ":result", reg0),
  8637. (try_begin),
  8638. (eq, ":result", repairable_hit),
  8639. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_shield_hit_wood_metal"),
  8640. (else_try),
  8641. (eq, ":result", repairable_destroyed),
  8642. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  8643. (particle_system_burst, "psys_dummy_smoke", pos1, 10),
  8644. (particle_system_burst, "psys_dummy_straw", pos1, 30),
  8645. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_shield_broken"),
  8646. (else_try),
  8647. (eq, ":result", repairable_hit_destroyed),
  8648. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  8649. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8650. (else_try),
  8651. (eq, ":result", repairable_repairing),
  8652. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8653. (else_try),
  8654. (eq, ":result", repairable_repaired),
  8655. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  8656. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8657. (try_end),
  8658. ]),
  8659.  
  8660. ("cf_pick_chest_lock", # server: handle players trying to pick the lock of a storage chest
  8661. [(store_script_param, ":agent_id", 1), # must be valid
  8662. (store_script_param, ":instance_id", 2), # must be valid
  8663. (store_script_param, ":probability_multiplier", 3), # see script_cf_agent_pick_lock
  8664.  
  8665. (agent_get_player_id, ":player_id", ":agent_id"),
  8666. (player_is_active, ":player_id"),
  8667. (assign, ":fail", 0),
  8668. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  8669. (assign, ":faction_id", reg0),
  8670. (try_begin),
  8671. (eq, reg1, -1),
  8672. (else_try),
  8673. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  8674. (try_begin),
  8675. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  8676. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  8677. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  8678. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  8679. (agent_play_sound, ":agent_id", "snd_lock"),
  8680. (try_end),
  8681. (else_try),
  8682. (assign, ":fail", 1),
  8683. (le, ":probability_multiplier", 0),
  8684. #(agent_play_sound, ":agent_id", "snd_pick_lock_fail"), #RAMARAUNT CHANGE
  8685. (multiplayer_send_int_to_player, ":player_id", server_event_lockpick, 0),
  8686. (else_try),
  8687. (call_script, "script_cf_agent_pick_lock", ":agent_id", ":probability_multiplier"),
  8688. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  8689. (assign, ":fail", 0),
  8690. (else_try),
  8691. (le, reg0, 0),
  8692. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_chest_locked_by_s1", preset_message_faction|preset_message_fail_sound, ":faction_id"),
  8693. (try_end),
  8694. (eq, ":fail", 0),
  8695. ]),
  8696.  
  8697. ("cf_hit_bridge", # server: handle damaging and repairing bridges; should be called from ti_on_scene_prop_hit
  8698. [(multiplayer_is_server),
  8699. (store_script_param, ":instance_id", 1), # must be valid
  8700. (store_script_param, ":hit_damage", 2),
  8701. (store_script_param, ":script_damage", 3), # set to 1 when the agent hit a linked scene prop, to apply damage manually
  8702. (set_fixed_point_multiplier, 1),
  8703. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8704. (set_fixed_point_multiplier, 100),
  8705.  
  8706. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8707. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, ":script_damage"),
  8708. (assign, ":result", reg0),
  8709. (try_begin),
  8710. (eq, ":result", repairable_hit),
  8711. (particle_system_burst, "psys_dummy_straw", pos1, 30),
  8712. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  8713. (else_try),
  8714. (eq, ":result", repairable_destroyed),
  8715. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8716. (position_get_distance_to_terrain, ":distance", pos2),
  8717. (try_begin), # drop to terrain if above
  8718. (gt, ":distance", 0),
  8719. (val_mul, ":distance", -1),
  8720. (position_move_z, pos2, ":distance"),
  8721. (else_try), # otherwise if starting below terrain, drop to the lowest position
  8722. (position_get_z, ":distance", pos2),
  8723. (store_sub, ":distance", z_position_to_hide_object, ":distance"),
  8724. (position_set_z, pos2, z_position_to_hide_object),
  8725. (try_end),
  8726. (store_div, ":animation_time", ":distance", 2),
  8727. (val_abs, ":animation_time"),
  8728. (agent_get_position, pos3, ":agent_id"), # rotate bridge to fall faster on the side of the last attacker
  8729. (position_transform_position_to_local, pos4, pos2, pos3),
  8730. (position_get_x, ":distance_from_center", pos4),
  8731. (store_div, ":rotate_angle", ":distance_from_center", 30),
  8732. (assign, ":absolute_distance", ":distance"),
  8733. (val_abs, ":absolute_distance"),
  8734. (try_begin),
  8735. (le, ":absolute_distance", 1000),
  8736. (val_mul, ":rotate_angle", ":absolute_distance"),
  8737. (val_div, ":rotate_angle", 1000),
  8738. (try_end),
  8739. (val_clamp, ":rotate_angle", -40, 41),
  8740. (position_rotate_y, pos2, ":rotate_angle"),
  8741. (prop_instance_animate_to_position, ":instance_id", pos2, ":animation_time"),
  8742. (particle_system_burst, "psys_dummy_smoke", pos1, 20),
  8743. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8744. (particle_system_burst, "psys_game_water_splash_2", pos1, 100),
  8745. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  8746. (else_try),
  8747. (eq, ":result", repairable_hit_destroyed),
  8748. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8749. (else_try),
  8750. (eq, ":result", repairable_repairing),
  8751. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8752. (else_try),
  8753. (eq, ":result", repairable_repaired),
  8754. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8755. (prop_instance_stop_animating, ":instance_id"),
  8756. (prop_instance_set_position, ":instance_id", pos2),
  8757. (particle_system_burst, "psys_dummy_smoke", pos1, 50),
  8758. (agent_play_sound, ":agent_id", "snd_man_grunt"),
  8759. (try_end),
  8760. (assign, reg2, ":agent_id"),
  8761. ]),
  8762.  
  8763. ("cf_hit_bridge_footing", # server: handle damaging and repairing bridges indirectly through linked props; should be called from ti_on_scene_prop_hit
  8764. [(multiplayer_is_server),
  8765. (store_script_param, ":instance_id", 1), # must be valid
  8766. (store_script_param, ":hit_damage", 2),
  8767.  
  8768. (scene_prop_get_slot, ":bridge_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8769. (gt, ":bridge_instance_id", 0),
  8770. (call_script, "script_cf_hit_bridge", ":bridge_instance_id", ":hit_damage", 1),
  8771. (agent_get_player_id, ":player_id", reg2),
  8772. (try_begin),
  8773. (player_is_active, ":player_id"),
  8774. (scene_prop_get_hit_points, ":hit_points", ":bridge_instance_id"),
  8775. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":bridge_instance_id", ":hit_points"),
  8776. (try_end),
  8777. (set_trigger_result, 0),
  8778. ]),
  8779.  
  8780. ("cf_init_wall", # server: set up destructible wall positions and slots at mission start
  8781. [(store_script_param, ":instance_id", 1), # must be valid
  8782.  
  8783. (set_fixed_point_multiplier, 100),
  8784. (prop_instance_get_starting_position, pos1, ":instance_id"),
  8785. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  8786. (prop_instance_get_scale, pos3, ":instance_id"),
  8787. (position_get_scale_z, ":scale", pos3),
  8788. (val_mul, ":height", ":scale"),
  8789. (convert_from_fixed_point, ":height"),
  8790. (val_add, ":height", 100),
  8791. (val_mul, ":height", -1),
  8792. (position_move_z, pos1, ":height"),
  8793. (prop_instance_set_position, ":instance_id", pos1),
  8794. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8795. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, min_scene_prop_hit_points),
  8796. (scene_prop_set_hit_points, ":instance_id", min_scene_prop_hit_points),
  8797. ]),
  8798.  
  8799. ("cf_hit_wall", # server: handle damaging and repairing walls and ladders; should be called from ti_on_scene_prop_hit
  8800. [(multiplayer_is_server),
  8801. (store_script_param, ":instance_id", 1), # must be valid
  8802. (store_script_param, ":hit_damage", 2),
  8803. (store_script_param, ":script_damage", 3), # set to 1 when the agent hit a linked scene prop, to apply damage manually
  8804. (set_fixed_point_multiplier, 1),
  8805. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8806. (set_fixed_point_multiplier, 100),
  8807.  
  8808. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8809. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, ":script_damage"),
  8810. (assign, ":result", reg0),
  8811. (try_begin),
  8812. (eq, ":result", repairable_hit),
  8813. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8814. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  8815. (else_try),
  8816. (eq, ":result", repairable_destroyed),
  8817. (try_begin),
  8818. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_no_move_physics, 1),
  8819. (prop_instance_enable_physics, ":instance_id", 0),
  8820. (try_end),
  8821. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8822. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  8823. (prop_instance_get_scale, pos3, ":instance_id"),
  8824. (position_get_scale_z, ":scale", pos3),
  8825. (val_mul, ":height", ":scale"),
  8826. (convert_from_fixed_point, ":height"),
  8827. (val_add, ":height", 100),
  8828. (val_mul, ":height", -1),
  8829. (position_move_z, pos2, ":height"),
  8830. (prop_instance_animate_to_position, ":instance_id", pos2, 1000),
  8831. (particle_system_burst, "psys_dummy_smoke", pos1, 100),
  8832. (particle_system_burst, "psys_dummy_straw", pos1, 100),
  8833. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  8834. (else_try),
  8835. (eq, ":result", repairable_hit_destroyed),
  8836. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8837. (else_try),
  8838. (eq, ":result", repairable_repairing),
  8839. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8840. (else_try),
  8841. (eq, ":result", repairable_repaired),
  8842. (try_begin),
  8843. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_no_move_physics, 1),
  8844. (prop_instance_enable_physics, ":instance_id", 0),
  8845. (try_end),
  8846. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8847. (prop_instance_animate_to_position, ":instance_id", pos2, 1000),
  8848. (agent_play_sound, ":agent_id", "snd_man_grunt"),
  8849. (try_end),
  8850. (assign, reg2, ":agent_id"),
  8851. ]),
  8852.  
  8853. ("cf_hit_build_wall", # server: handle hitting the building station for walls and ladders; should be called from ti_on_scene_prop_hit
  8854. [(multiplayer_is_server),
  8855. (store_script_param, ":instance_id", 1), # must be valid
  8856. (store_script_param, ":hit_damage", 2),
  8857.  
  8858. (scene_prop_get_slot, ":wall_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8859. (gt, ":wall_instance_id", 0),
  8860. (call_script, "script_cf_hit_wall", ":wall_instance_id", ":hit_damage", 1),
  8861. (agent_get_player_id, ":player_id", reg2),
  8862. (try_begin),
  8863. (player_is_active, ":player_id"),
  8864. (scene_prop_get_hit_points, ":hit_points", ":wall_instance_id"),
  8865. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":wall_instance_id", ":hit_points"),
  8866. (try_end),
  8867. (set_trigger_result, 0),
  8868. ]),
  8869.  
  8870. ("cf_hit_build_ship", # server: handle hitting the building station for ships; should be called from ti_on_scene_prop_hit #RAMARAUNT SCRIPT
  8871. [(multiplayer_is_server),
  8872. (store_script_param, ":instance_id", 1), # must be valid
  8873. (store_script_param, ":agent_id", 2), #must be player, and hitting prop with itm_repair_hammer
  8874.  
  8875. (agent_has_item_equipped,":agent_id","itm_board"),
  8876. (agent_is_alive, ":agent_id"),
  8877. (neg|agent_is_non_player, ":agent_id"),
  8878. (agent_get_player_id, ":player_id", ":agent_id"),
  8879. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  8880. (gt, ":wielded_item_id", -1),
  8881. (item_get_slot, ":wielded_item_class", ":wielded_item_id", slot_item_class),
  8882. (eq, ":wielded_item_class", item_class_repair),
  8883. (agent_get_troop_id, ":troop_id", ":agent_id"),
  8884. (store_skill_level, ":engineer", "skl_engineer", ":troop_id"),
  8885. (gt, ":engineer", 0),
  8886. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_board", 1),
  8887.  
  8888. (scene_prop_get_hit_points, ":cur_points", ":instance_id"),
  8889. (store_add, ":test", ":cur_points", 500),
  8890. (try_begin),
  8891. (ge, ":test", 10000),
  8892. #TIME TO BUILD BOAT!
  8893. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":instance_id", 500),
  8894. (scene_prop_set_cur_hit_points, ":instance_id", 500),
  8895. (scene_prop_get_slot, ":hull_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8896. #RESET ONLY IF DESTROYED
  8897. (scene_prop_slot_eq, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8898. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_active),
  8899. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_position, 0),
  8900. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_position, 0),
  8901. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_rotation, 0),
  8902. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_rotation, 0),
  8903. (scene_prop_get_slot, ":hit_points", ":hull_instance_id", slot_scene_prop_full_hit_points),
  8904. (scene_prop_set_hit_points, ":hull_instance_id", ":hit_points"),
  8905. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_next_resource_hp, ":hit_points"),
  8906. (prop_instance_get_starting_position, pos1, ":hull_instance_id"),
  8907. (prop_instance_stop_animating, ":hull_instance_id"),
  8908. (prop_instance_set_position, ":hull_instance_id", pos1),
  8909. (scene_prop_get_slot, ":sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail),
  8910. (try_begin),
  8911. (gt, ":sail_instance_id", -1),
  8912. (prop_instance_stop_animating, ":sail_instance_id"),
  8913. (set_fixed_point_multiplier, 100),
  8914. (init_position, pos2),
  8915. (position_set_z, pos2, z_position_to_hide_object),
  8916. (prop_instance_set_position, ":sail_instance_id", pos2),
  8917. (try_end),
  8918. (scene_prop_get_slot, ":sail_off_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail_off),
  8919. (try_begin),
  8920. (gt, ":sail_off_instance_id", -1),
  8921. (prop_instance_stop_animating, ":sail_off_instance_id"),
  8922. (prop_instance_set_position, ":sail_off_instance_id", pos1),
  8923. (try_end),
  8924. (scene_prop_get_slot, ":ramp_instance_id", ":hull_instance_id", slot_scene_prop_linked_ramp),
  8925. (try_begin),
  8926. (gt, ":ramp_instance_id", -1),
  8927. (prop_instance_stop_animating, ":ramp_instance_id"),
  8928. (prop_instance_get_variation_id, ":ramp_start_position", ":hull_instance_id"),
  8929. (try_begin),
  8930. (gt, ":ramp_start_position", 1),
  8931. (assign, ":ramp_start_position", -1),
  8932. (try_end),
  8933. (call_script, "script_ship_get_ramp_relative_position", ":ramp_start_position", 1),
  8934. (position_transform_position_to_parent, pos2, pos1, pos30),
  8935. (prop_instance_set_position, ":ramp_instance_id", pos2),
  8936. (try_end),
  8937. (try_begin),
  8938. (scene_prop_get_slot, ":hold_instance_id", ":hull_instance_id", slot_scene_prop_linked_hold),
  8939. (gt, ":hold_instance_id", -1),
  8940. (prop_instance_stop_animating, ":hold_instance_id"),
  8941. (prop_instance_set_position, ":hold_instance_id", pos1),
  8942. (scene_prop_get_slot, ":inventory_slot_end", ":hold_instance_id", slot_scene_prop_inventory_count),
  8943. (gt, ":inventory_slot_end", 0),
  8944. (val_add, ":inventory_slot_end", slot_scene_prop_inventory_begin),
  8945. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_slot_end"),
  8946. (scene_prop_set_slot, ":hold_instance_id", ":inventory_slot", 0),
  8947. (try_end),
  8948. (try_end),
  8949. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  8950. (else_try),
  8951. (scene_prop_set_cur_hit_points, ":instance_id", ":test"),
  8952. #add to the boat!
  8953. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":instance_id", ":test"),
  8954. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8955. (try_end),
  8956.  
  8957.  
  8958. (set_trigger_result, 0),
  8959. ]),
  8960.  
  8961. ("cf_hit_construction_box", # server: handle building and damaging construction boxes; should be called from ti_on_scene_prop_hit
  8962. [(multiplayer_is_server),
  8963. (store_script_param, ":instance_id", 1), # must be valid
  8964. (store_script_param, ":hit_damage", 2),
  8965. (store_script_param, ":resource_class", 3), # constants starting with item_class_
  8966. (set_fixed_point_multiplier, 1),
  8967. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8968. (set_fixed_point_multiplier, 100),
  8969.  
  8970. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8971. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", ":resource_class", ":agent_id", 1, 0),
  8972. (assign, ":result", reg0),
  8973. (try_begin),
  8974. (this_or_next|eq, ":result", repairable_hit),
  8975. (eq, ":result", repairable_destroyed),
  8976. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8977. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  8978. (else_try),
  8979. (eq, ":result", repairable_hit_destroyed),
  8980. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8981. (else_try),
  8982. (eq, ":result", repairable_repairing),
  8983. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8984. (else_try),
  8985. (eq, ":result", repairable_repaired),
  8986. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8987. (prop_instance_get_starting_position, pos1, ":instance_id"),
  8988. (particle_system_burst, "psys_dummy_smoke_big", pos1, 20),
  8989. (init_position, pos1),
  8990. (position_set_z, pos1, z_position_to_hide_object),
  8991. (prop_instance_set_position, ":instance_id", pos1),
  8992. (prop_instance_enable_physics, ":instance_id", 0),
  8993. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  8994. (try_end),
  8995. ]),
  8996.  
  8997. ("cf_init_fire_place", # server: set up the linked visible flames for a fire place prop at mission start
  8998. [(multiplayer_is_server),
  8999. (store_script_param, ":instance_id", 1), # must be valid
  9000.  
  9001. (set_fixed_point_multiplier, 100),
  9002. (init_position, pos1),
  9003. (position_set_z, pos1, z_position_to_hide_object),
  9004. (set_spawn_position, pos1),
  9005. (spawn_scene_prop, "spr_wood_heap_fire"),
  9006. (scene_prop_set_slot, ":instance_id", slot_scene_prop_linked_scene_prop, reg0),
  9007. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  9008. (prop_instance_get_variation_id_2, ":initial_wood_amount", ":instance_id"),
  9009. (val_mul, ":initial_wood_amount", 1000),
  9010. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":initial_wood_amount"),
  9011. ]),
  9012.  
  9013. ("cf_hit_fire_place", # server: handle adding wood to, lighting, and extinguishing a fire place; should be called from ti_on_scene_prop_hit
  9014. [(multiplayer_is_server),
  9015. (store_script_param, ":instance_id", 1), # must be valid
  9016. (set_fixed_point_multiplier, 1),
  9017. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  9018. (set_fixed_point_multiplier, 100),
  9019.  
  9020. (set_trigger_result, 0),
  9021. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  9022. (gt, ":wielded_item_id", -1),
  9023. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  9024. (try_begin),
  9025. (eq, ":wielded_item_id", "itm_torch"),
  9026. (eq, ":state", scene_prop_state_destroyed),
  9027. (scene_prop_slot_ge, ":instance_id", slot_scene_prop_stock_count, 1),
  9028. (scene_prop_get_slot, ":fire_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  9029. (prop_instance_is_valid, ":fire_instance_id"),
  9030. (prop_instance_get_position, pos1, ":instance_id"),
  9031. (prop_instance_set_position, ":fire_instance_id", pos1),
  9032. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  9033. (else_try),
  9034. (eq, ":wielded_item_id", "itm_water_bucket"),
  9035. (eq, ":state", scene_prop_state_active),
  9036. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_water_bucket", 1),
  9037. (agent_equip_item, ":agent_id", "itm_bucket", reg0),
  9038. (agent_set_wielded_item, ":agent_id", "itm_bucket"),
  9039. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  9040. (scene_prop_get_slot, ":fire_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  9041. (prop_instance_is_valid, ":fire_instance_id"),
  9042. (init_position, pos1),
  9043. (position_set_z, pos1, z_position_to_hide_object),
  9044. (prop_instance_set_position, ":fire_instance_id", pos1),
  9045. (else_try),
  9046. (item_slot_eq, ":wielded_item_id", slot_item_class, item_class_wood),
  9047. (item_get_slot, ":resource_amount", ":wielded_item_id", slot_item_resource_amount),
  9048. (gt, ":resource_amount", 0),
  9049. (call_script, "script_cf_agent_consume_item", ":agent_id", ":wielded_item_id", 1),
  9050. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  9051. (val_add, ":stock_count", ":resource_amount"),
  9052. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  9053. (try_end),
  9054. ]),
  9055.  
  9056. ("fire_place_burn", # server: consume wood while a fire is burning, remove the flames if no fuel left
  9057. [(store_script_param, ":instance_id", 1), # must be valid
  9058.  
  9059. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  9060. (try_begin),
  9061. (eq, ":state", scene_prop_state_active),
  9062. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  9063. (val_sub, ":stock_count", 200),
  9064. (val_max, ":stock_count", 0),
  9065. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  9066. (le, ":stock_count", 0),
  9067. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  9068. (scene_prop_get_slot, ":fire_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  9069. (prop_instance_is_valid, ":fire_instance_id"),
  9070. (set_fixed_point_multiplier, 100),
  9071. (init_position, pos1),
  9072. (position_set_z, pos1, z_position_to_hide_object),
  9073. (prop_instance_set_position, ":fire_instance_id", pos1),
  9074. (try_end),
  9075. ]),
  9076.  
  9077. ("winch_get_direction", # return the direction an agent will rotate a winch in reg0, based on relative position
  9078. [(store_script_param, ":agent_id", 1), # must be valid
  9079. (store_script_param, ":instance_id", 2), # must be valid
  9080.  
  9081. (prop_instance_get_starting_position, pos1, ":instance_id"),
  9082. (agent_get_position, pos2, ":agent_id"),
  9083. (position_transform_position_to_local, pos3, pos1, pos2),
  9084. (position_get_y, ":relative_y_position", pos3),
  9085. (try_begin),
  9086. (ge, ":relative_y_position", 0),
  9087. (assign, reg0, 1),
  9088. (else_try),
  9089. (assign, reg0, -1),
  9090. (try_end),
  9091. ]),
  9092.  
  9093. ("cf_use_winch", # server: handle players using a winch to move another linked object
  9094. [(store_script_param, ":agent_id", 1), # must be valid
  9095. (store_script_param, ":winch_instance_id", 2), # must be valid
  9096. (store_script_param, ":move_steps_plus_one", 3),
  9097. (store_script_param, ":step_size", 4),
  9098. (store_script_param, ":animation_time", 5),
  9099. (store_script_param, ":winch_type", 6), # constants starting with winch_type_
  9100.  
  9101. (agent_get_player_id, ":player_id", ":agent_id"),
  9102. (player_is_active, ":player_id"),
  9103. (agent_is_alive, ":agent_id"),
  9104. (call_script, "script_winch_get_direction", ":agent_id", ":winch_instance_id"),
  9105. (assign, ":direction", reg0),
  9106. (scene_prop_get_slot, ":moveable_instance_id", ":winch_instance_id", slot_scene_prop_linked_scene_prop),
  9107. (gt, ":moveable_instance_id", 0),
  9108. (scene_prop_get_slot, ":current_target", ":moveable_instance_id", slot_scene_prop_target_position),
  9109. (try_begin),
  9110. (eq, ":winch_type", winch_type_platform),
  9111. (scene_prop_get_slot, ":maximum_height", ":moveable_instance_id", slot_scene_prop_height),
  9112. (scene_prop_get_slot, ":maximum_depth", ":moveable_instance_id", slot_scene_prop_width),
  9113. (store_sub, ":move_steps_plus_one", ":maximum_height", ":maximum_depth"),
  9114. (val_div, ":move_steps_plus_one", ":step_size"),
  9115. (val_add, ":move_steps_plus_one", 1),
  9116. (try_end),
  9117. (try_begin),
  9118. (le, ":direction", -1),
  9119. (val_mul, ":direction", 2), # drop down twice as fast as raising up
  9120. (eq, ":winch_type", winch_type_portcullis),
  9121. (assign, ":new_target", 0), # portcullis drops all the way in one step
  9122. (neq, ":new_target", ":current_target"),
  9123. (assign, ":animation_time", 20),
  9124. (call_script, "script_scene_prop_play_sound", ":moveable_instance_id", "snd_body_fall_big"),
  9125. (else_try),
  9126. (store_add, ":new_target", ":current_target", ":direction"),
  9127. (val_clamp, ":new_target", 0, ":move_steps_plus_one"),
  9128. (try_end),
  9129. (neq, ":new_target", ":current_target"),
  9130. (scene_prop_set_slot, ":moveable_instance_id", slot_scene_prop_target_position, ":new_target"),
  9131. (prop_instance_get_starting_position, pos1, ":moveable_instance_id"),
  9132. (store_mul, ":target_movement", ":new_target", ":step_size"),
  9133. (try_begin),
  9134. (eq, ":winch_type", winch_type_platform),
  9135. (store_add, ":target_height", ":maximum_depth", ":target_movement"),
  9136. (val_clamp, ":target_height", ":maximum_depth", ":maximum_height"),
  9137. (position_set_z, pos1, ":target_height"),
  9138. (else_try),
  9139. (eq, ":winch_type", winch_type_portcullis),
  9140. (position_move_z, pos1, ":target_movement"),
  9141. (else_try),
  9142. (eq, ":winch_type", winch_type_sliding_door),
  9143. (position_move_x, pos1, ":target_movement"),
  9144. (else_try),
  9145. (position_rotate_x, pos1, ":target_movement"),
  9146. (try_end),
  9147. (prop_instance_animate_to_position, ":moveable_instance_id", pos1, ":animation_time"),
  9148. (try_begin),
  9149. (gt, ":direction", 0),
  9150. (assign, ":winch_rotation", -36000),
  9151. (else_try),
  9152. (eq, ":winch_type", winch_type_sliding_door),
  9153. (assign, ":winch_rotation", 36000),
  9154. (else_try),
  9155. (assign, ":winch_rotation", 72000),
  9156. (try_end),
  9157. (prop_instance_get_position, pos1, ":winch_instance_id"),
  9158. (prop_instance_rotate_to_position, ":winch_instance_id", pos1, ":animation_time", ":winch_rotation"),
  9159. ]),
  9160.  
  9161. ("cf_init_winch", # server: set initial positions for objects linked to winches
  9162. [(multiplayer_is_server),
  9163. (store_script_param, ":winch_instance_id", 1), # must be valid
  9164. (store_script_param, ":start_step", 2),
  9165. (store_script_param, ":step_size", 3),
  9166. (store_script_param, ":winch_type", 4), # constants starting with winch_type_
  9167.  
  9168. (scene_prop_get_slot, ":moveable_instance_id", ":winch_instance_id", slot_scene_prop_linked_scene_prop),
  9169. (ge, ":moveable_instance_id", 0),
  9170. (prop_instance_get_variation_id, ":initial_position", ":winch_instance_id"),
  9171. (val_and, ":initial_position", 0x1),
  9172. (try_begin),
  9173. (eq, ":winch_type", winch_type_drawbridge),
  9174. (eq, ":initial_position", 0x1),
  9175. (else_try),
  9176. (this_or_next|eq, ":winch_type", winch_type_portcullis),
  9177. (eq, ":winch_type", winch_type_sliding_door),
  9178. (neq, ":initial_position", 0x1),
  9179. (else_try),
  9180. (assign, ":initial_position", -1),
  9181. (try_end),
  9182. (try_begin),
  9183. (neq, ":initial_position", -1),
  9184. (scene_prop_set_slot, ":moveable_instance_id", slot_scene_prop_target_position, ":start_step"),
  9185. (prop_instance_get_starting_position, pos1, ":moveable_instance_id"),
  9186. (store_mul, ":target_movement", ":start_step", ":step_size"),
  9187. (try_begin),
  9188. (eq, ":winch_type", winch_type_portcullis),
  9189. (position_move_z, pos1, ":target_movement"),
  9190. (else_try),
  9191. (eq, ":winch_type", winch_type_sliding_door),
  9192. (position_move_x, pos1, ":target_movement"),
  9193. (else_try),
  9194. (position_rotate_x, pos1, ":target_movement"),
  9195. (try_end),
  9196. (prop_instance_set_position, ":moveable_instance_id", pos1),
  9197. (try_end),
  9198. ]),
  9199.  
  9200. ("cf_init_lift_platform", # server: calculate range of motion for a lift platform at mission start
  9201. [(multiplayer_is_server),
  9202. (store_script_param, ":platform_instance_id", 1), # must be valid
  9203.  
  9204. (scene_prop_get_slot, ":winch_1_instance_id", ":platform_instance_id", slot_scene_prop_linked_scene_prop_1),
  9205. (gt, ":winch_1_instance_id", 0),
  9206. (scene_prop_get_slot, ":winch_2_instance_id", ":platform_instance_id", slot_scene_prop_linked_scene_prop_2),
  9207. (gt, ":winch_2_instance_id", 0),
  9208. (set_fixed_point_multiplier, 100),
  9209. (prop_instance_get_starting_position, pos1, ":winch_1_instance_id"),
  9210. (prop_instance_get_starting_position, pos2, ":winch_2_instance_id"),
  9211. (position_get_z, ":height", pos1),
  9212. (position_get_z, ":depth", pos2),
  9213. (val_sub, ":height", 100),
  9214. (val_sub, ":depth", 100),
  9215. (try_begin), # swap the top and bottom values if needed
  9216. (gt, ":depth", ":height"),
  9217. (assign, ":temp", ":depth"),
  9218. (assign, ":depth", ":height"),
  9219. (assign, ":height", ":temp"),
  9220. (try_end),
  9221. (scene_prop_set_slot, ":platform_instance_id", slot_scene_prop_height, ":height"),
  9222. (scene_prop_set_slot, ":platform_instance_id", slot_scene_prop_width, ":depth"),
  9223. (prop_instance_get_starting_position, pos1, ":platform_instance_id"),
  9224. (position_set_z, pos1, ":depth"),
  9225. (prop_instance_set_position, ":platform_instance_id", pos1),
  9226. ]),
  9227.  
  9228. ("cf_use_inventory", # server: reply with inventory contents of a scene prop when requested by a player
  9229. [(store_script_param, ":agent_id", 1), # must be valid
  9230. (store_script_param, ":instance_id", 2), # must be valid
  9231. (store_script_param, ":probability_multiplier", 3), # used for lock picking if the scene prop is destructible and locked
  9232.  
  9233. (agent_get_player_id, ":player_id", ":agent_id"),
  9234. (player_is_active, ":player_id"),
  9235. (agent_is_alive, ":agent_id"),
  9236. (call_script, "script_agent_remove_empty_ammo_stacks", ":agent_id"),
  9237. (assign, ":fail", 0),
  9238. (try_begin),
  9239. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_full_hit_points, 0),
  9240. (else_try),
  9241. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  9242. (else_try),
  9243. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  9244. (eq, reg1, -1),
  9245. (else_try),
  9246. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  9247. (player_slot_eq, ":player_id", slot_player_has_faction_item_key, 1),
  9248. (else_try),
  9249. (call_script, "script_cf_pick_chest_lock", ":agent_id", ":instance_id", ":probability_multiplier"),
  9250. (else_try),
  9251. (assign, ":fail", 1),
  9252. (try_end),
  9253. (eq, ":fail", 0),
  9254. (agent_set_animation, ":agent_id", "anim_access_inventory"),
  9255. (scene_prop_get_slot, ":inventory_slot_end", ":instance_id", slot_scene_prop_inventory_count),
  9256. (gt, ":inventory_slot_end", 0),
  9257. (val_add, ":inventory_slot_end", slot_scene_prop_inventory_begin),
  9258. (assign, ":slot_range_begin", -1),
  9259. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_inventory_begin),
  9260. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_slot_end"),
  9261. (store_add, ":next_inventory_slot", ":inventory_slot", 1),
  9262. (try_begin),
  9263. (lt, ":next_inventory_slot", ":inventory_slot_end"),
  9264. (scene_prop_get_slot, ":next_item_id", ":instance_id", ":next_inventory_slot"),
  9265. (else_try),
  9266. (assign, ":next_item_id", -9999),
  9267. (try_end),
  9268. (try_begin), # if the next items are identical, wait to send one message for the full slot range
  9269. (eq, ":item_id", ":next_item_id"),
  9270. (try_begin),
  9271. (le, ":slot_range_begin", -1),
  9272. (assign, ":slot_range_begin", ":inventory_slot"),
  9273. (try_end),
  9274. (else_try),
  9275. (try_begin), # sending a group of identical items
  9276. (gt, ":slot_range_begin", -1),
  9277. (multiplayer_send_4_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", ":slot_range_begin", ":item_id", ":next_inventory_slot"),
  9278. (assign, ":slot_range_begin", -1),
  9279. (else_try), # else just send the single slot
  9280. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", ":inventory_slot", ":item_id"),
  9281. (try_end),
  9282. (try_end),
  9283. (assign, ":item_id", ":next_item_id"),
  9284. (try_end),
  9285. (multiplayer_send_int_to_player, ":player_id", server_event_show_inventory, ":instance_id"),
  9286. (player_set_slot, ":player_id", slot_player_accessing_instance_id, ":instance_id"),
  9287. (scene_prop_get_slot, ":inventory_unique_id", ":instance_id", slot_scene_prop_inventory_unique_id),
  9288. (player_set_slot, ":player_id", slot_player_accessing_unique_id, ":inventory_unique_id"),
  9289. ]),
  9290.  
  9291. ("transfer_inventory", # server: handle inventory transfers within and between scene props and their agent
  9292. [(store_script_param, ":player_id", 1), # must be valid
  9293. (store_script_param, ":instance_id", 2),
  9294. (store_script_param, ":from_slot", 3),
  9295. (store_script_param, ":to_slot", 4),
  9296. (store_script_param, ":item_id", 5),
  9297.  
  9298. (try_begin), # failures in this section will force disconnection from the scene prop, to stop receiving updates
  9299. (gt, ":instance_id", 0),
  9300. (player_get_agent_id, ":agent_id", ":player_id"),
  9301. (agent_is_active, ":agent_id"),
  9302. (agent_is_alive, ":agent_id"),
  9303. (prop_instance_is_valid, ":instance_id"),
  9304. (scene_prop_get_slot, ":inventory_unique_id", ":instance_id", slot_scene_prop_inventory_unique_id),
  9305. (player_slot_eq, ":player_id", slot_player_accessing_unique_id, ":inventory_unique_id"),
  9306. (scene_prop_get_slot, ":inventory_count", ":instance_id", slot_scene_prop_inventory_count),
  9307. (gt, ":inventory_count", 0),
  9308. (try_begin),
  9309. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_full_hit_points, 0),
  9310. (else_try),
  9311. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  9312. (else_try),
  9313. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  9314. (eq, reg1, -1),
  9315. (else_try),
  9316. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  9317. (player_slot_eq, ":player_id", slot_player_has_faction_item_key, 1),
  9318. (else_try),
  9319. (assign, ":inventory_count", 0),
  9320. (try_end),
  9321. (gt, ":inventory_count", 0),
  9322. (scene_prop_get_slot, ":linked_scene_prop", ":instance_id", slot_scene_prop_linked_scene_prop),
  9323. (try_begin), # for horse carts, use the specialized distance check
  9324. (eq, ":linked_scene_prop", 0),
  9325. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_required_horse, 0),
  9326. (call_script, "script_cart_choose_action", ":agent_id", ":instance_id"),
  9327. (neq, reg0, 0),
  9328. (else_try), # for normal storage props
  9329. (agent_get_position, pos1, ":agent_id"),
  9330. (prop_instance_get_position, pos2, ":instance_id"),
  9331. (eq, ":linked_scene_prop", 0),
  9332. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9333. (le, ":sq_distance", sq(max_distance_to_use)),
  9334. (else_try), # for ships, check agent is on board
  9335. (gt, ":linked_scene_prop", 0),
  9336. (prop_instance_is_valid, ":linked_scene_prop"),
  9337. (neg|scene_prop_slot_eq, ":linked_scene_prop", slot_scene_prop_collision_kind, 0),
  9338. (set_fixed_point_multiplier, 100),
  9339. (position_transform_position_to_local, pos3, pos2, pos1),
  9340. (position_get_y, ":relative_y", pos3),
  9341. (is_between, ":relative_y", -500, 500),
  9342. (position_get_z, ":relative_z", pos3),
  9343. (is_between, ":relative_z", 0, 500),
  9344. (position_get_x, ":relative_x", pos3),
  9345. (scene_prop_get_slot, ":max_x", ":linked_scene_prop", slot_scene_prop_length),
  9346. (store_mul, ":min_x", ":max_x", -1),
  9347. (is_between, ":relative_x", ":min_x", ":max_x"),
  9348. (else_try),
  9349. (assign, ":inventory_count", 0),
  9350. (try_end),
  9351. (gt, ":inventory_count", 0),
  9352. (player_set_slot, ":player_id", slot_player_accessing_instance_id, ":instance_id"),
  9353. (try_begin), # for failures after this point, stay connected with the scene prop, to receive updates
  9354. (store_add, ":inventory_end", slot_scene_prop_inventory_begin, ":inventory_count"),
  9355. (this_or_next|is_between, ":from_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9356. (is_between, ":from_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_item_0 + ek_gloves + 1),
  9357. (this_or_next|is_between, ":to_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9358. (is_between, ":to_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_item_0 + ek_gloves + 1),
  9359. (scene_prop_slot_eq, ":instance_id", ":to_slot", 0),
  9360. (ge, ":item_id", all_items_begin),
  9361. (item_get_type, ":item_type", ":item_id"),
  9362. (try_begin), # checks for equipping items on the agent
  9363. (is_between, ":to_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_end),
  9364. (try_begin),
  9365. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9366. (store_add, ":correct_armor_slot", ":item_type", slot_scene_prop_inventory_item_0 + ek_head - itp_type_head_armor),
  9367. (eq, ":to_slot", ":correct_armor_slot"),
  9368. (else_try),
  9369. (neg|is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9370. (lt, ":to_slot", slot_scene_prop_inventory_item_0 + ek_item_3 + 1),
  9371. (else_try),
  9372. (assign, ":item_id", -1),
  9373. (try_end),
  9374. (try_begin),
  9375. (ge, ":item_id", all_items_begin),
  9376. (agent_get_troop_id, ":troop_id", ":agent_id"),
  9377. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  9378. (else_try),
  9379. (assign, ":item_id", -1),
  9380. (try_end),
  9381. (else_try), # check that the item fits inside when storing in the inventory
  9382. (item_get_slot, ":length", ":item_id", slot_item_length),
  9383. (neg|scene_prop_slot_ge, ":instance_id", slot_scene_prop_inventory_max_length, ":length"),
  9384. (assign, ":item_id", -1),
  9385. (try_end),
  9386. (ge, ":item_id", all_items_begin),
  9387. (try_begin),
  9388. (this_or_next|eq, ":item_type", itp_type_arrows),
  9389. (this_or_next|eq, ":item_type", itp_type_bolts),
  9390. (this_or_next|eq, ":item_type", itp_type_thrown),
  9391. (eq, ":item_type", itp_type_crossbow),
  9392. (assign, ":item_ammo", 0),
  9393. (else_try),
  9394. (assign, ":item_ammo", -1),
  9395. (try_end),
  9396. (assign, ":neg_from_mod_slot", 0),
  9397. (try_begin), # remove items taken from the agent's equipment
  9398. (ge, ":from_slot", slot_scene_prop_inventory_item_0),
  9399. (store_add, ":from_equip_slot", ":from_slot", ek_item_0 - slot_scene_prop_inventory_item_0),
  9400. (agent_get_item_slot, ":equip_item_id", ":agent_id", ":from_equip_slot"),
  9401. (eq, ":equip_item_id", ":item_id"),
  9402. (try_begin),
  9403. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9404. (store_sub, ":no_item_id", ":item_type", itp_type_head_armor),
  9405. (val_add, ":no_item_id", "itm_no_head"),
  9406. (call_script, "script_change_armor", ":agent_id", ":no_item_id"),
  9407. (store_add, ":player_slot", ":from_slot", slot_player_equip_item_0 - slot_scene_prop_inventory_item_0),
  9408. (player_set_slot, ":player_id", ":player_slot", 0),
  9409. (else_try),
  9410. (try_begin),
  9411. (gt, ":item_ammo", -1),
  9412. (agent_get_ammo_for_slot, ":item_ammo", ":agent_id", ":from_equip_slot"),
  9413. (try_end),
  9414. (val_add, ":from_equip_slot", 1),
  9415. (agent_unequip_item, ":agent_id", ":item_id", ":from_equip_slot"),
  9416. (try_end),
  9417. (else_try), # removing items from the scene prop
  9418. (lt, ":from_slot", slot_scene_prop_inventory_item_0),
  9419. (scene_prop_slot_eq, ":instance_id", ":from_slot", ":item_id"),
  9420. (scene_prop_set_slot, ":instance_id", ":from_slot", 0),
  9421. (store_add, ":neg_from_mod_slot", ":from_slot", slot_scene_prop_inventory_mod_begin - slot_scene_prop_inventory_begin),
  9422. (val_mul, ":neg_from_mod_slot", -1), # negative numbers in the _mod slots means the item was removed
  9423. (try_begin),
  9424. (gt, ":item_ammo", -1),
  9425. (store_add, ":from_ammo_slot", ":from_slot", slot_scene_prop_inventory_ammo_begin - slot_scene_prop_inventory_begin),
  9426. (scene_prop_get_slot, ":item_ammo", ":instance_id", ":from_ammo_slot"),
  9427. (scene_prop_set_slot, ":instance_id", ":from_ammo_slot", 0),
  9428. (try_end),
  9429. (else_try),
  9430. (assign, ":item_id", -1),
  9431. (try_end),
  9432. (ge, ":item_id", all_items_begin),
  9433. (try_begin), # ignore empty ammo items (but not unloaded crossbows)
  9434. (eq, ":item_ammo", 0),
  9435. (neq, ":item_type", itp_type_crossbow),
  9436. (else_try),
  9437. (ge, ":to_slot", slot_scene_prop_inventory_item_0),
  9438. (try_begin),
  9439. (gt, ":item_ammo", -1), # add up current ammo before equipping the item
  9440. (try_for_range, ":check_equip_slot", ek_item_0, ek_item_3 + 1),
  9441. (agent_get_item_slot, ":check_item_id", ":agent_id", ":check_equip_slot"),
  9442. (eq, ":check_item_id", ":item_id"),
  9443. (agent_get_ammo_for_slot, ":check_ammo", ":agent_id", ":check_equip_slot"),
  9444. (val_add, ":item_ammo", ":check_ammo"),
  9445. (try_end),
  9446. (try_end),
  9447. (try_begin),
  9448. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9449. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  9450. (store_add, ":player_slot", ":to_slot", slot_player_equip_item_0 - slot_scene_prop_inventory_item_0),
  9451. (player_set_slot, ":player_id", ":player_slot", ":item_id"),
  9452. (else_try),
  9453. (store_add, ":to_equip_slot", ":to_slot", ek_item_0 - slot_scene_prop_inventory_item_0 + 1),
  9454. (agent_equip_item, ":agent_id", ":item_id", ":to_equip_slot"),
  9455. (gt, ":item_ammo", -1),
  9456. (agent_set_ammo, ":agent_id", ":item_id", ":item_ammo"),
  9457. (try_end),
  9458. (else_try),
  9459. (scene_prop_set_slot, ":instance_id", ":to_slot", ":item_id"),
  9460. (try_begin),
  9461. (gt, ":item_ammo", -1),
  9462. (store_add, ":to_ammo_slot", ":to_slot", slot_scene_prop_inventory_ammo_begin - slot_scene_prop_inventory_begin),
  9463. (scene_prop_set_slot, ":instance_id", ":to_ammo_slot", ":item_ammo",),
  9464. (try_end),
  9465. (try_end),
  9466. (try_begin), # ignore empty ammo items
  9467. (eq, ":item_ammo", 0),
  9468. (neq, ":item_type", itp_type_crossbow),
  9469. (assign, ":to_mod_slot", -1),
  9470. (else_try),
  9471. (store_add, ":to_mod_slot", ":to_slot", slot_scene_prop_inventory_mod_begin - slot_scene_prop_inventory_begin),
  9472. (try_end),
  9473. (try_begin),
  9474. (ge, ":neg_from_mod_slot", 0), # items from the agent equipment
  9475. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", ":to_mod_slot", ":item_id"),
  9476. (else_try), # items moved within the inventory
  9477. (multiplayer_send_4_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", ":to_mod_slot", ":item_id", ":neg_from_mod_slot"),
  9478. (try_end),
  9479. (this_or_next|lt, ":from_slot", slot_scene_prop_inventory_item_0), # don't send updates to other players when just shuffling agent equipment
  9480. (lt, ":to_slot", slot_scene_prop_inventory_item_0),
  9481. (try_begin), # when equipped on this agent, remove from inventory view of other players
  9482. (ge, ":to_slot", slot_scene_prop_inventory_item_0),
  9483. (assign, ":to_mod_slot", -1),
  9484. (try_end),
  9485. (get_max_players, ":max_players"),
  9486. (try_for_range, ":other_player_id", 1, ":max_players"), # loop over all players currently looking at the same inventory
  9487. (player_is_active, ":other_player_id"),
  9488. (neq, ":other_player_id", ":player_id"),
  9489. (player_slot_eq, ":other_player_id", slot_player_accessing_instance_id, ":instance_id"),
  9490. (try_begin),
  9491. (ge, ":neg_from_mod_slot", 0),
  9492. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_scene_prop_set_slot, ":instance_id", ":to_mod_slot", ":item_id"),
  9493. (else_try),
  9494. (multiplayer_send_4_int_to_player, ":other_player_id", server_event_scene_prop_set_slot, ":instance_id", ":to_mod_slot", ":item_id", ":neg_from_mod_slot"),
  9495. (try_end),
  9496. (try_end),
  9497. (scene_prop_get_slot, ":prune_time", ":instance_id", slot_scene_prop_prune_time),
  9498. (try_begin), # if the inventory is stored in a spawned item, remove it if all items are taken out
  9499. (gt, ":prune_time", 0),
  9500. (is_between, ":from_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9501. (is_between, ":to_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_item_0 + ek_gloves + 1),
  9502. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9503. (scene_prop_get_slot, ":item_id", ":instance_id", ":inventory_slot"),
  9504. (ge, ":item_id", all_items_begin),
  9505. (assign, ":inventory_end", -1),
  9506. (try_end),
  9507. (neq, ":inventory_end", -1),
  9508. (scene_prop_set_prune_time, ":instance_id", 1),
  9509. (else_try), # otherwise extend the time it will be removed if that is soon
  9510. (store_mission_timer_a, ":time"),
  9511. (val_add, ":time", 60),
  9512. (gt, ":time", ":prune_time"),
  9513. (scene_prop_set_prune_time, ":instance_id", 60),
  9514. (scene_prop_set_slot, ":instance_id", slot_scene_prop_prune_time, ":time"),
  9515. (try_end),
  9516. (try_end),
  9517. (else_try),
  9518. (player_set_slot, ":player_id", slot_player_accessing_instance_id, 0),
  9519. (try_end),
  9520. ]),
  9521.  
  9522. ("cart_choose_action", # get the relative position of the agent to the cart to decide the action; returns reg0 as 0 = out of range, -1 = attach, 1 = access
  9523. [(store_script_param, ":agent_id", 1), # must be valid
  9524. (store_script_param, ":instance_id", 2), # must be valid
  9525.  
  9526. (assign, reg0, 0),
  9527. (set_fixed_point_multiplier, 100),
  9528. (prop_instance_get_position, pos1, ":instance_id"),
  9529. (agent_get_position, pos2, ":agent_id"),
  9530. (position_get_z, ":height", pos2),
  9531. (position_set_z, pos1, ":height"),
  9532. (scene_prop_get_slot, ":access_offset", ":instance_id", slot_scene_prop_width),
  9533. (assign, ":access_distance", ":access_offset"),
  9534. (val_abs, ":access_distance"), # use the positive value for a radius
  9535. (val_mul, ":access_distance", ":access_distance"), # squared
  9536. (val_div, ":access_distance", 50), # distance * 2 / 100
  9537. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9538. (try_begin), # if within range of the attach position (mesh origin)
  9539. (le, ":sq_distance", ":access_distance"),
  9540. (assign, reg0, 1),
  9541. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  9542. (eq, ":weapon", -1),
  9543. (agent_get_wielded_item, ":shield", ":agent_id", 1),
  9544. (eq, ":shield", -1),
  9545. (assign, reg0, -1),
  9546. (else_try), # if within range of the access position (the offset from the mesh origin)
  9547. (lt, reg0, 1),
  9548. (position_move_y, pos1, ":access_offset"),
  9549. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9550. (le, ":sq_distance", ":access_distance"),
  9551. (assign, reg0, 1),
  9552. (try_end),
  9553. ]),
  9554.  
  9555. ("cf_use_cart", # server: handle players trying to attach or access carts
  9556. [(store_script_param, ":agent_id", 1), # must be valid
  9557. (store_script_param, ":instance_id", 2), # must be valid
  9558. (store_script_param, ":action", 3), # from cart_choose_action: -1 = attach, 1 = access
  9559.  
  9560. (agent_get_player_id, ":player_id", ":agent_id"),
  9561. (player_is_active, ":player_id"),
  9562. (agent_is_alive, ":agent_id"),
  9563. (assign, ":fail", 0),
  9564. (try_begin),
  9565. (eq, ":action", 1),
  9566. (call_script, "script_cf_use_inventory", ":agent_id", ":instance_id", 0),
  9567. (else_try),
  9568. (eq, ":action", -1),
  9569. (scene_prop_get_slot, ":required_horse", ":instance_id", slot_scene_prop_required_horse),
  9570. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  9571. (try_begin), # if a horse is required, check
  9572. (ge, ":required_horse", 1),
  9573. (assign, ":attach_agent_id", ":horse_agent_id"),
  9574. (try_begin),
  9575. (gt, ":horse_agent_id", -1),
  9576. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  9577. (this_or_next|eq, ":required_horse", 1),
  9578. (eq, ":horse_item_id", ":required_horse"),
  9579. (else_try),
  9580. (assign, ":fail", 1),
  9581. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_not_riding_necessary_horse", preset_message_error),
  9582. (try_end),
  9583. (else_try), # if mounted but horse not required, disallow attaching hand carts
  9584. (gt, ":horse_agent_id", -1),
  9585. (assign, ":fail", 1),
  9586. (else_try), # hand carts
  9587. (assign, ":attach_agent_id", ":agent_id"),
  9588. (agent_get_troop_id, ":troop_id", ":agent_id"),
  9589. (store_skill_level, ":labouring", "skl_labouring", ":troop_id"),
  9590. (try_begin),
  9591. (lt, ":labouring", 1),
  9592. (assign, ":fail", 1),
  9593. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_craft_not_skilled", preset_message_error),
  9594. (try_end),
  9595. (try_end),
  9596. (eq, ":fail", 0),
  9597. (try_begin),
  9598. (call_script, "script_cf_attach_cart", ":attach_agent_id", ":instance_id", ":agent_id"),
  9599. (else_try),
  9600. (assign, ":fail", 1),
  9601. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_already_attached_cart", preset_message_error),
  9602. (try_end),
  9603. (else_try),
  9604. (assign, ":fail", 1),
  9605. (try_end),
  9606. (eq, ":fail", 0),
  9607. ]),
  9608.  
  9609. ("cf_attach_cart", # server: try attach or detach agent and cart
  9610. [(store_script_param, ":attach_agent_id", 1), # the human or horse agent being attached to, must be valid
  9611. (store_script_param, ":instance_id", 2), # must be valid
  9612. (store_script_param, ":agent_id", 3), # the player agent, must be valid
  9613.  
  9614. (agent_get_attached_scene_prop, ":attached_scene_prop", ":attach_agent_id"),
  9615. (assign, ":fail", 0),
  9616. (try_begin),
  9617. (eq, ":attached_scene_prop", -1),
  9618. (ge, ":instance_id", 0),
  9619. (scene_prop_get_slot, ":attached_to_agent", ":instance_id", slot_scene_prop_attached_to_agent),
  9620. (try_begin),
  9621. (agent_is_active, ":attached_to_agent"),
  9622. (agent_is_alive, ":attached_to_agent"),
  9623. (agent_get_attached_scene_prop, ":other_instance_id", ":attached_to_agent"),
  9624. (eq, ":other_instance_id", ":instance_id"),
  9625. (assign, ":fail", 1),
  9626. (else_try),
  9627. (scene_prop_set_slot, ":instance_id", slot_scene_prop_attached_to_agent, ":attach_agent_id"),
  9628. (assign, ":new_attached_scene_prop", ":instance_id"),
  9629. (agent_set_attached_scene_prop, ":attach_agent_id", ":new_attached_scene_prop"),
  9630. (try_end),
  9631. (else_try),
  9632. (gt, ":attached_scene_prop", -1),
  9633. (try_begin),
  9634. (eq, ":instance_id", -1),
  9635. (assign, ":instance_id", ":attached_scene_prop"),
  9636. (try_end),
  9637. (eq, ":attached_scene_prop", ":instance_id"),
  9638. (scene_prop_set_slot, ":instance_id", slot_scene_prop_attached_to_agent, -1),
  9639. (assign, ":new_attached_scene_prop", -1),
  9640. (agent_set_attached_scene_prop, ":attach_agent_id", ":new_attached_scene_prop"),
  9641. (call_script, "script_cart_set_detached_position", ":instance_id"),
  9642. (else_try),
  9643. (assign, ":fail", 1),
  9644. (try_end),
  9645. (eq, ":fail", 0),
  9646. (get_max_players, ":max_players"),
  9647. (try_for_range, ":player_id", 1, ":max_players"),
  9648. (player_is_active, ":player_id"),
  9649. (multiplayer_send_2_int_to_player, ":player_id", server_event_set_attached_scene_prop, ":attach_agent_id", ":new_attached_scene_prop"),
  9650. (try_end),
  9651. (try_begin),
  9652. (neq, ":attach_agent_id", ":agent_id"),
  9653. (call_script, "script_check_agent_horse_speed_factor", ":agent_id", ":attach_agent_id", 0),
  9654. (try_end),
  9655. ]),
  9656.  
  9657. ("cart_set_detached_position", # server: align cart to ground level when detached
  9658. [(store_script_param, ":instance_id", 1), # must be valid
  9659.  
  9660. (set_fixed_point_multiplier, 100),
  9661. (prop_instance_get_position, pos1, ":instance_id"),
  9662. (position_get_z, ":height", pos1),
  9663. (try_begin),
  9664. (gt, ":height", z_position_water_level),
  9665. (position_set_z_to_ground_level, pos1),
  9666. (position_get_z, ":height", pos1),
  9667. (gt, ":height", z_position_water_level),
  9668. (scene_prop_get_slot, ":detach_rotation", ":instance_id", slot_scene_prop_rotation),
  9669. (position_rotate_x, pos1, ":detach_rotation"),
  9670. (else_try), # float on water
  9671. (position_set_z, pos1, z_position_water_level),
  9672. (try_end),
  9673. (scene_prop_get_slot, ":detach_offset", ":instance_id", slot_scene_prop_position),
  9674. (position_move_z, pos1, ":detach_offset", 1),
  9675. (position_get_z, ":animation_time", pos1),
  9676. (val_sub, ":animation_time", ":height"),
  9677. (val_abs, ":animation_time"),
  9678. (try_begin),
  9679. (gt, ":animation_time", 100),
  9680. (val_div, ":animation_time", 2),
  9681. (try_end),
  9682. (val_max, ":animation_time", 50),
  9683. (prop_instance_animate_to_position, ":instance_id", pos1, ":animation_time"),
  9684. ]),
  9685.  
  9686. ("add_cart_to_list", # add each cart to a list when loading the scene for faster proximity checks
  9687. [(store_script_param, ":instance_id", 1),
  9688.  
  9689. (troop_get_slot, ":cart_count", "trp_cart_array", slot_array_count),
  9690. (val_add, ":cart_count", 1),
  9691. (troop_set_slot, "trp_cart_array", ":cart_count", ":instance_id"),
  9692. (troop_set_slot, "trp_cart_array", slot_array_count, ":cart_count"),
  9693. ]),
  9694.  
  9695. ("cf_rest", # server: handle players resting at beds
  9696. [(store_script_param, ":agent_id", 1), # must be valid
  9697. (store_script_param, ":target_horse", 2), # 0 = heal humans, 1 = heal horses
  9698. (store_script_param, ":heal_percent", 3), # percentage healed per use
  9699. (store_script_param, ":min_health_percent", 4), # minimum health percentage to be able to use this bed
  9700.  
  9701. (agent_get_player_id, ":player_id", ":agent_id"),
  9702. (player_is_active, ":player_id"),
  9703. (assign, ":fail", 0),
  9704. (try_begin),
  9705. (try_begin), # only require food for resting humans
  9706. (eq, ":target_horse", 0),
  9707. (assign, ":target_agent_id", ":agent_id"),
  9708. (agent_get_slot, ":food_amount", ":target_agent_id", slot_agent_food_amount),
  9709. (else_try),
  9710. (agent_get_horse, ":target_agent_id", ":agent_id"),
  9711. (assign, ":food_amount", max_food_amount),
  9712. (try_end),
  9713. (assign, ":error_string_id", "str_no_horse"),
  9714. (neq, ":target_agent_id", -1),
  9715. (store_agent_hit_points, ":health_percent", ":target_agent_id", 0),
  9716. (assign, ":error_string_id", "str_too_wounded_to_rest"),
  9717. (gt, ":health_percent", ":min_health_percent"),
  9718. (assign, ":error_string_id", "str_too_hungry_to_rest"),
  9719. (gt, ":food_amount", 0),
  9720. (try_begin),
  9721. (neq, ":heal_percent", 0),
  9722. (lt, ":health_percent", 100),
  9723. (val_min, ":heal_percent", ":food_amount"),
  9724. (val_add, ":health_percent", ":heal_percent"),
  9725. (val_min, ":health_percent", 100),
  9726. (agent_set_hit_points, ":target_agent_id" , ":health_percent", 0),
  9727. (try_begin),
  9728. (eq, ":target_horse", 0),
  9729. (agent_play_sound, ":target_agent_id", "snd_man_yawn"),
  9730. (val_sub, ":food_amount", ":heal_percent"),
  9731. (agent_set_slot, ":target_agent_id", slot_agent_food_amount, ":food_amount"),
  9732. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":target_agent_id", slot_agent_food_amount, ":food_amount"),
  9733. (else_try),
  9734. (agent_play_sound, ":target_agent_id", "snd_horse_snort"),
  9735. (try_end),
  9736. (try_end),
  9737. (else_try),
  9738. (assign, ":fail", 1),
  9739. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":error_string_id", preset_message_error),
  9740. (try_end),
  9741. (eq, ":fail", 0),
  9742. ]),
  9743.  
  9744. ("cf_clean_blood", # server: allow players to remove blood from their agent if healthy
  9745. [(store_script_param, ":agent_id", 1), # must be valid
  9746.  
  9747. (store_agent_hit_points, ":hit_points", ":agent_id", 0),
  9748. (gt, ":hit_points", 70),
  9749. (get_max_players, ":max_players"),
  9750. (try_for_range, ":player_id", 1, ":max_players"),
  9751. (player_is_active, ":player_id"),
  9752. (multiplayer_send_2_int_to_player, ":player_id", server_event_agent_equip_armor, ":agent_id", -1), # magic value to redraw all armor
  9753. (try_end),
  9754. ]),
  9755.  
  9756. ("agent_clean_blood", # clients: re-equip all visual armor meshes to remove blood
  9757. [(store_script_param, ":agent_id", 1), # must be valid
  9758.  
  9759. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  9760. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  9761. (store_sub, ":invisible_item_id", ":equip_slot", ek_head),
  9762. (val_add, ":invisible_item_id", "itm_invisible_head"),
  9763. (agent_equip_item, ":agent_id", ":invisible_item_id"),
  9764. (try_begin),
  9765. (gt, ":item_id", -1),
  9766. (agent_equip_item, ":agent_id", ":item_id"),
  9767. (else_try),
  9768. (agent_unequip_item, ":agent_id", ":invisible_item_id"),
  9769. (try_end),
  9770. (try_end),
  9771. ]),
  9772.  
  9773. ("agent_hit_with_scripted_item", # server: check for scripted effects when the agent is hit by a special item; sets damage dealt when be called from ti_on_agent_hit
  9774. [(store_script_param, ":attacked_agent_id", 1), # must be valid
  9775. (store_script_param, ":attacker_agent_id", 2), # must be valid
  9776. (store_script_param, ":damage_dealt", 3),
  9777. (store_script_param, ":weapon_item_id", 4),
  9778.  
  9779. (assign, ":damage_result", ":damage_dealt"),
  9780. (try_begin),
  9781. (eq, ":weapon_item_id", "itm_surgeon_scalpel"),
  9782. (try_begin),
  9783. (agent_get_troop_id, ":attacker_troop_id", ":attacker_agent_id"),
  9784. (store_skill_level, ":skill_level", "skl_wound_treatment", ":attacker_troop_id"),
  9785. (gt, ":skill_level", 0),
  9786. (store_mul, ":healing_limit", ":skill_level", 5),
  9787. (val_add, ":healing_limit", 50),
  9788. (store_agent_hit_points, ":health_percent", ":attacked_agent_id", 0),
  9789. (try_begin),
  9790. (lt, ":health_percent", ":healing_limit"),
  9791. (store_mul, ":healing", ":skill_level", 2),
  9792. (val_add, ":healing", 2),
  9793. (val_add, ":health_percent", ":healing"),
  9794. (val_min, ":health_percent", ":healing_limit"),
  9795. (agent_set_hit_points, ":attacked_agent_id", ":health_percent", 0),
  9796. (try_end),
  9797. (assign, ":damage_result", 0),
  9798. (try_end),
  9799. (else_try),
  9800. (eq, ":weapon_item_id", "itm_admin_scalpel"),
  9801. (try_begin),
  9802. (agent_get_troop_id, ":attacker_troop_id", ":attacker_agent_id"),
  9803. (eq, ":attacker_troop_id", "trp_godlike_hero"),
  9804. (agent_set_hit_points, ":attacked_agent_id", 100, 0),
  9805. (assign, ":damage_result", 0),
  9806. (call_script, "script_cf_clean_blood", ":attacked_agent_id"),
  9807. (try_end),
  9808. (else_try),
  9809. (eq, ":weapon_item_id", "itm_healing_herb"),
  9810. (try_begin),
  9811. (agent_get_troop_id, ":attacker_troop_id", ":attacker_agent_id"),
  9812. (store_skill_level, ":skill_level", "skl_wound_treatment", ":attacker_troop_id"),
  9813. (gt, ":skill_level", 0),
  9814. (assign, ":damage_result", 0),
  9815. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", "itm_healing_herb", 1),
  9816. (agent_get_slot, ":poison", ":attacked_agent_id", slot_agent_poison_amount),
  9817. (val_sub, ":poison", 1),
  9818. (agent_set_slot, ":attacked_agent_id", slot_agent_poison_amount, ":poison"),
  9819. (try_end),
  9820. (else_try),
  9821. (eq, ":weapon_item_id", "itm_poisoned_dagger"),
  9822. (try_begin),
  9823. (gt, ":damage_dealt", 5),
  9824. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", "itm_poisoned_dagger", 1),
  9825. (agent_equip_item, ":attacker_agent_id", "itm_dagger"),
  9826. (agent_set_wielded_item, ":attacker_agent_id", "itm_dagger"),
  9827. (agent_get_slot, ":poison", ":attacked_agent_id", slot_agent_poison_amount),
  9828. (val_add, ":poison", 1),
  9829. (agent_set_slot, ":attacked_agent_id", slot_agent_poison_amount, ":poison"),
  9830. (agent_set_slot, ":attacked_agent_id", slot_agent_poisoner_agent_id, ":attacker_agent_id"),
  9831. (try_begin),
  9832. (agent_get_player_id, ":attacker_player_id", ":attacker_agent_id"),
  9833. (player_is_active, ":attacker_player_id"),
  9834. (player_get_unique_id, ":attacker_player_uid", ":attacker_player_id"),
  9835. (else_try),
  9836. (assign, ":attacker_player_uid", -1),
  9837. (try_end),
  9838. (agent_set_slot, ":attacked_agent_id", slot_agent_poisoner_player_uid, ":attacker_player_uid"),
  9839. (try_end),
  9840. (else_try),
  9841. (eq, ":weapon_item_id", "itm_thin_lance"),
  9842. (try_begin),
  9843. (gt, ":damage_dealt", 10),
  9844. (agent_get_horse, ":horse_agent_id", ":attacker_agent_id"),
  9845. (agent_is_active, ":horse_agent_id"),
  9846. (set_fixed_point_multiplier, 100),
  9847. (agent_get_speed, pos1, ":attacker_agent_id"),
  9848. (position_get_y, ":forward_speed", pos1),
  9849. (this_or_next|gt, ":forward_speed", 500),
  9850. (gt, ":damage_dealt", 40),
  9851. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", "itm_thin_lance", 1),
  9852. (agent_get_position, pos1, ":attacker_agent_id"),
  9853. (position_move_x, pos1, 50),
  9854. (set_spawn_position, pos1),
  9855. (spawn_item, "itm_broken_lance", 0, 60),
  9856. (agent_play_sound, ":attacker_agent_id", "snd_lance_break"),
  9857. (position_move_z, pos1, 50),
  9858. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  9859. (try_end),
  9860. (try_end),
  9861. (set_trigger_result, ":damage_result"),
  9862. ]),
  9863.  
  9864. ("cf_use_bucket", # server: fill the bucket if below water level
  9865. [(store_script_param, ":agent_id", 1), # must be valid
  9866.  
  9867. (position_move_z, pos1, -100),
  9868. (position_get_z, ":z_pos", pos1),
  9869. (lt, ":z_pos", 0),
  9870. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_bucket", 1),
  9871. (agent_equip_item, ":agent_id", "itm_water_bucket", reg0),
  9872. (agent_set_wielded_item, ":agent_id", "itm_water_bucket"),
  9873. ]),
  9874.  
  9875. ("move_fish_school", # server: move the fish school to a new position inside the water depth limits
  9876. [(store_script_param, ":instance_id", 1), # must be valid
  9877.  
  9878. (set_fixed_point_multiplier, 100),
  9879. (prop_instance_get_position, pos1, ":instance_id"),
  9880. (prop_instance_get_variation_id, ":maximum_depth", ":instance_id"),
  9881. (try_begin),
  9882. (le, ":maximum_depth", fish_school_minimum_depth / 100),
  9883. (assign, ":maximum_depth", 1000),
  9884. (else_try),
  9885. (val_mul, ":maximum_depth", 100),
  9886. (try_end),
  9887. (position_set_z, pos1, z_position_water_level),
  9888. (assign, ":closest_depth", 999999),
  9889. (get_scene_boundaries, pos5, pos6),
  9890. (store_random_in_range, ":distance", fish_school_min_move_distance, fish_school_max_move_distance),
  9891. (store_mul, ":negative_distance", ":distance", -1),
  9892. (store_random_in_range, ":initial_direction", 0, 4),
  9893. (store_add, ":loop_end", ":initial_direction", 4),
  9894. (try_for_range, ":direction", ":initial_direction", ":loop_end"),
  9895. (copy_position, pos2, pos1),
  9896. (val_mod, ":direction", 4),
  9897. (try_begin),
  9898. (eq, ":direction", 0),
  9899. (position_move_x, pos2, ":distance", 1),
  9900. (position_get_x, ":pos_x", pos2),
  9901. (position_get_x, ":max_x", pos6),
  9902. (lt, ":pos_x", ":max_x"),
  9903. (else_try),
  9904. (eq, ":direction", 1),
  9905. (position_move_x, pos2, ":negative_distance", 1),
  9906. (position_get_x, ":pos_x", pos2),
  9907. (position_get_x, ":min_x", pos5),
  9908. (gt, ":pos_x", ":min_x"),
  9909. (else_try),
  9910. (eq, ":direction", 2),
  9911. (position_move_y, pos2, ":distance", 1),
  9912. (position_get_y, ":pos_y", pos2),
  9913. (position_get_y, ":max_y", pos6),
  9914. (lt, ":pos_y", ":max_y"),
  9915. (else_try),
  9916. (eq, ":direction", 3),
  9917. (position_move_y, pos2, ":negative_distance", 1),
  9918. (position_get_y, ":pos_y", pos2),
  9919. (position_get_y, ":min_y", pos5),
  9920. (gt, ":pos_y", ":min_y"),
  9921. (else_try),
  9922. (assign, ":direction", -1),
  9923. (try_end),
  9924. (gt, ":direction", -1),
  9925. (position_get_distance_to_terrain, ":water_depth", pos2),
  9926. (try_begin),
  9927. (is_between, ":water_depth", fish_school_minimum_depth, ":maximum_depth"),
  9928. (assign, ":loop_end", -1),
  9929. (copy_position, pos3, pos2),
  9930. (else_try),
  9931. (val_sub, ":water_depth", ":maximum_depth"),
  9932. (val_abs, ":water_depth"),
  9933. (lt, ":water_depth", ":closest_depth"),
  9934. (assign, ":closest_depth", ":water_depth"),
  9935. (copy_position, pos3, pos2),
  9936. (try_end),
  9937. (try_end),
  9938. (try_begin),
  9939. (this_or_next|eq, ":loop_end", -1),
  9940. (lt, ":closest_depth", 999999),
  9941. (prop_instance_set_position, ":instance_id", pos3, 1),
  9942. (try_end),
  9943. (prop_instance_get_variation_id_2, ":maximum_count", ":instance_id"),
  9944. (try_begin),
  9945. (eq, ":maximum_count", 0),
  9946. (assign, ":maximum_count", 100),
  9947. (try_end),
  9948. (scene_prop_get_slot, ":fish_count", ":instance_id", slot_scene_prop_stock_count),
  9949. (try_begin),
  9950. (lt, ":fish_count", ":maximum_count"),
  9951. (store_random_in_range, ":adjust_fish", -2, 4),
  9952. (val_add, ":fish_count", ":adjust_fish"),
  9953. (val_max, ":fish_count", 0),
  9954. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":fish_count"),
  9955. (try_end),
  9956. (try_begin),
  9957. (gt, ":fish_count", 0),
  9958. (store_random_in_range, ":random", 0, 20),
  9959. (gt, ":fish_count", ":random"),
  9960. (store_random_in_range, ":move_x", -500, 501),
  9961. (position_move_x, pos3, ":move_x"),
  9962. (store_random_in_range, ":move_y", -500, 501),
  9963. (position_move_y, pos3, ":move_y"),
  9964. (store_random_in_range, ":rotate_z", 0, 360),
  9965. (position_rotate_z, pos3, ":rotate_z"),
  9966. (position_set_z, pos3, -30, 1),
  9967. (particle_system_burst, "psys_fish_rise", pos3, 1),
  9968. (val_mul, ":random", 2),
  9969. (try_begin),
  9970. (gt, ":fish_count", ":random"),
  9971. (particle_system_burst, "psys_game_water_splash_1", pos3, 5),
  9972. (particle_system_burst, "psys_game_water_splash_2", pos3, 5),
  9973. (copy_position, pos0, pos3),
  9974. (call_script, "script_play_sound_at_position", "snd_jump_end_water"),
  9975. (try_end),
  9976. (try_end),
  9977. ]),
  9978.  
  9979. ("check_fishing_nets", # server: check all fishing nets to see if anything was caught
  9980. [
  9981. (set_fixed_point_multiplier, 100),
  9982. (scene_spawned_item_get_num_instances, ":net_num", "itm_fishing_net"),
  9983. (try_for_range, ":net_no", 0, ":net_num"),
  9984. (scene_spawned_item_get_instance, ":net_instance_id", "itm_fishing_net", ":net_no"),
  9985. (scene_prop_get_slot, ":placement_skill", ":net_instance_id", slot_scene_prop_position),
  9986. (gt, ":placement_skill", 0),
  9987. (prop_instance_get_position, pos1, ":net_instance_id"),
  9988. (position_get_z, ":height", pos1),
  9989. (lt, ":height", -100),
  9990. (copy_position, pos2, pos1),
  9991. (position_set_z, pos2, z_position_water_level),
  9992. (scene_prop_get_slot, ":linked_instance_id", ":net_instance_id", slot_scene_prop_linked_scene_prop),
  9993. (assign, ":school_instance_id", ":linked_instance_id"),
  9994. (scene_prop_get_num_instances, ":school_num", "spr_pw_fish_school"),
  9995. (store_add, ":loop_end", ":school_num", 1),
  9996. (try_for_range, ":school_no", 0, ":loop_end"), # find the closest school to the net
  9997. (gt, ":school_instance_id", 0),
  9998. (scene_prop_get_slot, ":fish_count", ":school_instance_id", slot_scene_prop_stock_count),
  9999. (gt, ":fish_count", 0),
  10000. (prop_instance_get_position, pos3, ":school_instance_id"),
  10001. (get_sq_distance_between_positions, ":sq_distance", pos2, pos3),
  10002. (lt, ":sq_distance", sq(max_distance_to_catch_fish)),
  10003. (scene_prop_set_slot, ":net_instance_id", slot_scene_prop_linked_scene_prop, ":school_instance_id"),
  10004. (assign, ":loop_end", -1),
  10005. (else_try),
  10006. (lt, ":school_no", ":school_num"),
  10007. (scene_prop_get_instance, ":school_instance_id", "spr_pw_fish_school", ":school_no"),
  10008. (eq, ":school_instance_id", ":linked_instance_id"),
  10009. (assign, ":school_instance_id", -1),
  10010. (try_end),
  10011. (try_begin),
  10012. (eq, ":loop_end", -1),
  10013. (store_sqrt, ":distance", ":sq_distance"),
  10014. (store_mul, ":fish_factor", ":fish_count", ":placement_skill"),
  10015. (store_random_in_range, ":random", 0, ":distance"),
  10016. (lt, ":random", ":fish_factor"),
  10017. (store_random_in_range, ":move_x", -50, 51),
  10018. (position_move_x, pos1, ":move_x"),
  10019. (position_move_y, pos1, -15),
  10020. (position_get_z, ":height", pos1),
  10021. (val_abs, ":height"),
  10022. (val_sub, ":height", 30),
  10023. (val_min, ":height", 176),
  10024. (store_random_in_range, ":move_z", 50, ":height"),
  10025. (position_move_z, pos1, ":move_z"),
  10026. (set_spawn_position, pos1),
  10027. (spawn_item, "itm_fish", 0, fish_spawn_time),
  10028. (prop_instance_set_position, reg0, pos1),
  10029. (val_sub, ":fish_count", 1),
  10030. (scene_prop_set_slot, ":school_instance_id", slot_scene_prop_stock_count, ":fish_count"),
  10031. (try_end),
  10032. (try_end),
  10033. ]),
  10034.  
  10035. ("cf_use_fishing_tool", # server: check if the player meets all requirements to catch a fish, then success is based on chance; should be called from ti_on_weapon_attack
  10036. [(multiplayer_is_server),
  10037. (store_script_param, ":agent_id", 1), # must be valid
  10038.  
  10039. (set_fixed_point_multiplier, 100),
  10040. (position_get_z, ":z_pos", pos1),
  10041. (lt, ":z_pos", z_position_water_level),
  10042. (agent_get_troop_id, ":troop_id", ":agent_id"),
  10043. (store_skill_level, ":labouring", "skl_labouring", ":troop_id"),
  10044. (gt, ":labouring", 0),
  10045. (agent_get_player_id, ":player_id", ":agent_id"),
  10046. (player_is_active, ":player_id"),
  10047. (agent_get_slot, ":last_fish_instance_id", ":agent_id", slot_agent_fishing_last_school),
  10048. (try_begin), # first check the last fishing school used, to save time
  10049. (gt, ":last_fish_instance_id", -1),
  10050. (prop_instance_get_position, pos2, ":last_fish_instance_id"),
  10051. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10052. (lt, ":sq_distance", sq(max_distance_to_catch_fish)),
  10053. (assign, ":num_instances", -1),
  10054. (assign, ":fish_instance_id", ":last_fish_instance_id"),
  10055. (else_try), # else check all other schools
  10056. (scene_prop_get_num_instances, ":num_instances", "spr_pw_fish_school"),
  10057. (try_for_range, ":instance_no", 0, ":num_instances"),
  10058. (scene_prop_get_instance, ":fish_instance_id", "spr_pw_fish_school", ":instance_no"),
  10059. (scene_prop_slot_ge, ":fish_instance_id", slot_scene_prop_stock_count, 1),
  10060. (neq, ":fish_instance_id", ":last_fish_instance_id"),
  10061. (prop_instance_get_position, pos2, ":fish_instance_id"),
  10062. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10063. (lt, ":sq_distance", sq(max_distance_to_catch_fish)),
  10064. (assign, ":num_instances", -1),
  10065. (agent_set_slot, ":agent_id", slot_agent_fishing_last_school, ":fish_instance_id"),
  10066. (try_end),
  10067. (gt, ":num_instances", -1),
  10068. (agent_set_slot, ":agent_id", slot_agent_fishing_last_school, -1),
  10069. (try_end),
  10070. (eq, ":num_instances", -1),
  10071. (store_sqrt, ":distance", ":sq_distance"),
  10072. (val_add, ":distance", 1000),
  10073. (store_random_in_range, ":success", 0, ":distance"),
  10074. (val_mul, ":labouring", 100),
  10075. (lt, ":success", ":labouring"),
  10076. (scene_prop_get_slot, ":fish_count", ":fish_instance_id", slot_scene_prop_stock_count),
  10077. (gt, ":fish_count", 0),
  10078. (val_sub, ":fish_count", 1),
  10079. (scene_prop_set_slot, ":fish_instance_id", slot_scene_prop_stock_count, ":fish_count"),
  10080. (position_get_rotation_around_z, ":rotation", pos1),
  10081. (init_position, pos2),
  10082. (position_copy_rotation, pos1, pos2),
  10083. (val_sub, ":rotation", 90),
  10084. (position_rotate_z, pos1, ":rotation"),
  10085. (set_spawn_position, pos1),
  10086. (spawn_item, "itm_fish", 0, fish_spawn_time),
  10087. (prop_instance_set_position, reg0, pos1),
  10088. (particle_system_burst, "psys_game_water_splash_2", pos1, 10),
  10089. (agent_play_sound, ":agent_id", "snd_jump_begin_water"),
  10090. ]),
  10091.  
  10092. ("cf_eat_food", # server: handle players consuming food items
  10093. [(multiplayer_is_server),
  10094. (store_script_param, ":agent_id", 1), # must be valid
  10095. (store_script_param, ":item_id", 2),
  10096.  
  10097. (agent_is_alive, ":agent_id"),
  10098. (agent_get_action_dir, ":direction", ":agent_id"),
  10099. (eq, ":direction", 0),
  10100. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  10101. (item_get_slot, ":food", ":item_id", slot_item_resource_amount),
  10102. (try_begin),
  10103. (gt, ":food", 1),
  10104. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  10105. (lt, ":food_amount", max_food_amount),
  10106. (val_add, ":food_amount", ":food"),
  10107. (val_min, ":food_amount", max_food_amount),
  10108. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10109. (agent_get_player_id, ":player_id", ":agent_id"),
  10110. (player_is_active, ":player_id"),
  10111. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10112. (else_try),#ramaraunt add poison food
  10113. (eq, ":food", 1),
  10114. (agent_get_slot, ":poison", ":agent_id", slot_agent_poison_amount),
  10115. (val_add, ":poison", 1),
  10116. (agent_set_slot, ":agent_id", slot_agent_poison_amount, ":poison"),
  10117. (agent_set_slot, ":agent_id", slot_agent_poisoner_agent_id, ":agent_id"),
  10118. (try_end),
  10119. (try_begin),#drunkeness gained food
  10120. (this_or_next|eq, ":item_id", "itm_beer_jug"),
  10121. (eq, ":item_id", "itm_wine_jar"),
  10122. (agent_get_player_id, ":player_id", ":agent_id"),
  10123. (assign, ":drunkenadd", 20),
  10124. (player_get_slot, ":drunkeness",":player_id", slot_player_drunkeness),
  10125. (store_add, ":drunkentest", ":drunkeness", ":drunkenadd"),
  10126. (try_begin),
  10127. (gt, ":drunkentest", 100),
  10128. (assign, ":drunkeness", 100),
  10129. (else_try),
  10130. (val_add, ":drunkeness", ":drunkenadd"),
  10131. (try_end),
  10132. (multiplayer_send_int_to_player, ":player_id", server_event_drunk_update_client, ":drunkeness"),
  10133. (player_set_slot, ":player_id", slot_player_drunkeness, ":drunkeness"),
  10134. (else_try),#cold inducer
  10135. (eq, ":item_id", "itm_cold_inducer"),
  10136. (agent_get_player_id, ":player_id", ":agent_id"),
  10137. (call_script, "script_cf_imbed_cold", ":player_id"),
  10138. (else_try), #flu inducer
  10139. (eq, ":item_id", "itm_flu_inducer"),
  10140. (agent_get_player_id, ":player_id", ":agent_id"),
  10141. (call_script, "script_cf_imbed_flu", ":player_id"),
  10142. (else_try),
  10143. (eq, ":item_id", "itm_plague_inducer"),
  10144. (agent_get_player_id, ":player_id", ":agent_id"),
  10145. (call_script, "script_cf_imbed_plague", ":player_id"),
  10146. (try_end),
  10147. ]),
  10148.  
  10149. ("check_agent_health", # server: check for armor encumbrance, poison, and passive healing effects
  10150. [(store_script_param, ":agent_id", 1), # must be valid
  10151.  
  10152. (try_begin),
  10153. (agent_is_alive, ":agent_id"),
  10154. (agent_get_slot, ":armor_speed_factor", ":agent_id", slot_agent_armor_speed_factor),
  10155. (try_begin),
  10156. (is_between, ":armor_speed_factor", 20, reduction_factor_base),
  10157. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  10158. (eq, ":horse_agent_id", -1),
  10159. (set_fixed_point_multiplier, 100),
  10160. (agent_get_speed, pos1, ":agent_id"),
  10161. (position_get_y, ":speed", pos1),
  10162. (gt, ":speed", 10),
  10163. (store_random_in_range, ":pause", 0, ":armor_speed_factor"),
  10164. (gt, ":pause", 20),
  10165. (agent_set_animation, ":agent_id", "anim_pause_encumbered"),
  10166. (try_end),
  10167. (agent_get_slot, ":poison_amount", ":agent_id", slot_agent_poison_amount),
  10168. (try_begin),
  10169. (gt, ":poison_amount", 0),
  10170. (store_mul, ":damage", ":poison_amount", 6),
  10171. (val_min, ":damage", 10),
  10172. (store_agent_hit_points, ":hit_points", ":agent_id", 1),
  10173. (val_sub, ":hit_points", ":damage"),
  10174. (agent_set_hit_points, ":agent_id", ":hit_points", 1),
  10175. (try_begin),
  10176. (le, ":hit_points", 0),
  10177. (agent_get_slot, ":poisoner_agent_id", ":agent_id", slot_agent_poisoner_agent_id),
  10178. (try_begin),
  10179. (gt, ":poisoner_agent_id", -1),
  10180. (agent_is_active, ":poisoner_agent_id"),
  10181. (agent_get_slot, ":poisoner_player_uid", ":agent_id", slot_agent_poisoner_player_uid),
  10182. (try_begin),
  10183. (gt, ":poisoner_player_uid", -1),
  10184. (agent_get_player_id, ":poisoner_player_id", ":poisoner_agent_id"),
  10185. (player_is_active, ":poisoner_player_id"),
  10186. (player_get_unique_id, ":poisoner_check_uid", ":poisoner_player_id"),
  10187. (eq, ":poisoner_check_uid", ":poisoner_player_uid"),
  10188. (assign, ":poisoner_player_uid", -1),
  10189. (try_end),
  10190. (eq, ":poisoner_player_uid", -1),
  10191. (else_try),
  10192. (assign, ":poisoner_agent_id", ":agent_id"),
  10193. (try_end),
  10194. (agent_deliver_damage_to_agent, ":poisoner_agent_id", ":agent_id", 10),
  10195. (try_end),
  10196. (try_end),
  10197. (try_begin),
  10198. (neg|agent_is_non_player, ":agent_id"),
  10199. (agent_get_player_id, ":player_id", ":agent_id"),
  10200. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  10201. (player_get_slot, ":drunkeness", ":player_id", slot_player_drunkeness),
  10202. (player_get_slot, ":cur_food_tick", ":player_id", slot_player_food_tick),
  10203. (try_begin),
  10204. (call_script, "script_cf_progress_illnesses", ":player_id"),
  10205. (try_end),
  10206. (try_begin), #RAMARAUNT ADD HUNGER
  10207. (try_begin), #drunkeness makes you lose food faster
  10208. (ge, ":drunkeness", 80),
  10209. (assign, ":tick_amount", 3),
  10210. (else_try),
  10211. (ge, ":drunkeness", 60),
  10212. (assign, ":tick_amount", 5),
  10213. (else_try),
  10214. (ge, ":drunkeness", 40),
  10215. (assign, ":tick_amount", 7),
  10216. (else_try),
  10217. (assign, ":tick_amount", 9),
  10218. (try_end),
  10219. (ge, ":cur_food_tick", ":tick_amount"),
  10220. (player_set_slot, ":player_id", slot_player_food_tick, 0),
  10221. (val_sub, ":food_amount", 2),
  10222. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10223. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10224. (else_try),
  10225. (val_add, ":cur_food_tick", 1),
  10226. (player_set_slot, ":player_id", slot_player_food_tick, ":cur_food_tick"),
  10227. (try_end),
  10228. #hunger damage begin (comment out to disable)
  10229. #NOTE: This damages you till you are blackbarred, but doesn't kill you. - Ramaraunt
  10230. (try_begin),
  10231. (le, ":food_amount", 1),
  10232. (store_agent_hit_points, ":hit_points", ":agent_id", 0),
  10233. (val_sub, ":hit_points", 3),
  10234. (agent_set_hit_points, ":agent_id", ":hit_points", 0),
  10235. (try_end),
  10236. #hunger damage end (comment out to disable)
  10237. (try_begin), #drunkeness add
  10238. (ge, ":drunkeness", 1),
  10239. (val_sub, ":drunkeness", 1),
  10240. (try_begin), #vomiting roll
  10241. (ge, ":drunkeness", 50),
  10242. (store_mod, ":mod", ":drunkeness", 3),
  10243. (eq, ":mod", 0),
  10244. (store_random_in_range, ":random", 0, 100),
  10245. (lt, ":random", 30),
  10246. (call_script, "script_player_vomit", ":player_id"),
  10247. (try_end),
  10248. (try_begin), #client updates
  10249. (this_or_next|eq, ":drunkeness", 89),
  10250. (this_or_next|eq, ":drunkeness", 74),
  10251. (this_or_next|eq, ":drunkeness", 59),
  10252. (this_or_next|eq, ":drunkeness", 29),
  10253. (eq, ":drunkeness", 0),
  10254. (multiplayer_send_int_to_player, ":player_id", server_event_drunk_update_client, ":drunkeness"),
  10255. (try_end),
  10256. (player_set_slot, ":player_id", slot_player_drunkeness, ":drunkeness"),
  10257. (try_end),
  10258. (try_end),
  10259. (try_end),
  10260. ]),
  10261.  
  10262. ("player_vomit", #SERVER: player vomits RAMARAUNT ADD
  10263. [
  10264. (store_script_param, ":player_id", 1),
  10265. (player_get_agent_id, ":agent_id", ":player_id"),
  10266. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_vomit", 1),
  10267. (agent_get_position, pos0, ":agent_id"),
  10268. (call_script, "script_play_sound_at_position", "snd_vomit"),
  10269. (multiplayer_send_int_to_player, ":player_id", server_event_player_has_vomited, -1),
  10270. (agent_get_position, pos1, ":agent_id"),
  10271. (position_move_z, pos1, 160),
  10272. (try_for_agents, ":other_agent_id"), # send the chat message to other players whoose agents are close enough
  10273. (agent_is_alive, ":other_agent_id"),
  10274. (neg|agent_is_non_player, ":other_agent_id"),
  10275. (agent_get_player_id, ":other_player_id", ":other_agent_id"),
  10276. (player_is_active, ":other_player_id"),
  10277. (agent_get_position, pos2, ":other_agent_id"),
  10278. (position_move_z, pos2, 160),
  10279. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10280. (le, ":sq_distance", sq(max_distance_to_play_sound)),
  10281. (neq, ":other_player_id", ":player_id"),
  10282. (multiplayer_send_int_to_player, ":other_player_id", server_event_player_has_vomited, ":player_id"),
  10283. (try_end),
  10284.  
  10285. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  10286. (try_begin),
  10287. (gt, ":food_amount", 20),
  10288. (val_sub, ":food_amount", 20),
  10289. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10290. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10291. (else_try),
  10292. (agent_set_slot, ":agent_id", slot_agent_food_amount, 0),
  10293. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, 0),
  10294. (try_end),
  10295.  
  10296.  
  10297.  
  10298. ]),
  10299.  
  10300. #RAMARAUNT ILLNESSES BEGIN
  10301. ("reset_illnesses", #server: respet illness variables (usually done after death). RAMARAUNT ADD
  10302. [(store_script_param, ":player_id", 1),
  10303.  
  10304. (try_begin),
  10305. (player_is_active, ":player_id"),
  10306. (player_set_slot, ":player_id", slot_player_drunkeness, -1),
  10307. (player_set_slot, ":player_id", slot_player_food_tick, -1),
  10308. #(player_set_slot, ":player_id", slot_player_trippiness, -1),
  10309. (player_set_slot, ":player_id", slot_player_cold_progression, -1),
  10310. (player_set_slot, ":player_id", slot_player_cold_direction, -1),
  10311. (player_set_slot, ":player_id", slot_player_cold_immunity_timer, -1),
  10312. (player_set_slot, ":player_id", slot_player_flu_progression, -1),
  10313. (player_set_slot, ":player_id", slot_player_flu_direction, -1),
  10314. (player_set_slot, ":player_id", slot_player_flu_immunity_timer, -1),
  10315. (player_set_slot, ":player_id", slot_player_plague_progression, -1),
  10316. (player_set_slot, ":player_id", slot_player_plague_direction, -1),
  10317. (player_set_slot, ":player_id", slot_player_plague_immunity_timer, -1),
  10318. #(player_set_slot, ":player_id", slot_player_zombie_infected, -1),
  10319. (try_end),
  10320.  
  10321.  
  10322. ]),
  10323. ("cf_catch_cold", #SERVER: player catches a cold RAMARAUNT ADD
  10324. [(store_script_param, ":player_id", 1),
  10325.  
  10326. (player_is_active, ":player_id"),
  10327. #(player_get_agent_id, ":agent_id", ":player_id"),
  10328. (player_get_slot, ":direction", ":player_id", slot_player_cold_direction),
  10329. (player_get_slot, ":flu_direction", ":player_id", slot_player_flu_direction),
  10330. (player_get_slot, ":plague_direction",":player_id", slot_player_plague_direction),
  10331. (player_get_slot, ":immunity", ":player_id", slot_player_cold_immunity_timer),
  10332. (eq, ":flu_direction", -1),
  10333. (neq, ":plague_direction", -1),
  10334. (eq, ":direction", -1), #player doesnt already have a cold
  10335. (eq, ":immunity", -1), #player isnt immune
  10336. (player_set_slot, ":player_id", slot_player_cold_progression, 1), #its begining...
  10337. (player_set_slot, ":player_id", slot_player_cold_direction, 1), #its going up
  10338.  
  10339. (str_store_player_username, s0, ":player_id"),
  10340. (server_add_message_to_log, "str_log_player_caught_cold"),
  10341.  
  10342. ]),
  10343.  
  10344. ("cf_imbed_cold", #SERVER: player catches forcefully a cold RAMARAUNT ADD
  10345. [(store_script_param, ":player_id", 1),
  10346.  
  10347. (player_is_active, ":player_id"),
  10348. (call_script, "script_reset_illnesses",":player_id"),
  10349. #(player_get_agent_id, ":agent_id", ":player_id"),
  10350. (player_set_slot, ":player_id", slot_player_cold_progression, 74), #its begining...
  10351. (player_set_slot, ":player_id", slot_player_cold_direction, 1), #its going up
  10352.  
  10353. (str_store_player_username, s0, ":player_id"),
  10354. (server_add_message_to_log, "str_log_player_caught_cold"),
  10355.  
  10356. ]),
  10357.  
  10358. ("cf_lose_cold", #SERVER: player loses a cold RAMARAUNT ADD
  10359. [(store_script_param, ":player_id", 1),
  10360.  
  10361. (player_is_active, ":player_id"),
  10362. #(player_get_agent_id, ":agent_id", ":player_id"),
  10363. (player_set_slot, ":player_id", slot_player_cold_progression, -1), #its done
  10364. (player_set_slot, ":player_id", slot_player_cold_direction, -1), #its done
  10365. (player_set_slot, ":player_id", slot_player_cold_immunity_timer, 40), #imumne for 40 food ticks
  10366.  
  10367. (str_store_player_username, s0, ":player_id"),
  10368. (server_add_message_to_log, "str_log_player_lost_cold"),
  10369.  
  10370. ]),
  10371.  
  10372. ("cf_catch_flu", #SERVER: player catches a cold RAMARAUNT ADD
  10373. [(store_script_param, ":player_id", 1),
  10374.  
  10375. (player_is_active, ":player_id"),
  10376. #(player_get_agent_id, ":agent_id", ":player_id"),
  10377. (player_get_slot, ":direction", ":player_id", slot_player_flu_direction),
  10378. (player_get_slot, ":immunity", ":player_id", slot_player_flu_immunity_timer),
  10379. (player_get_slot, ":plague_direction",":player_id", slot_player_plague_direction),
  10380. (neq, ":plague_direction", -1),
  10381. (eq, ":direction", -1), #player doesnt already have a cold
  10382. (eq, ":immunity", -1), #player isnt immune
  10383. (assign, ":progression", 1),
  10384. (assign, ":direction", 1),
  10385. (try_begin),
  10386. (player_get_slot, ":cold_direction", ":player_id", slot_player_cold_direction),
  10387. (neq, ":cold_direction", -1),#if has cold...
  10388. (player_get_slot, ":progression", ":player_id", slot_player_cold_progression), #overwrite it with flu
  10389. (call_script, "script_cf_lose_cold", ":player_id"),#end cold
  10390. (try_end),
  10391. (player_set_slot, ":player_id", slot_player_flu_progression, ":progression"), #its begining...
  10392. (player_set_slot, ":player_id", slot_player_flu_direction, ":direction"), #its going up
  10393.  
  10394. (str_store_player_username, s0, ":player_id"),
  10395. (server_add_message_to_log, "str_log_player_caught_flu"),
  10396.  
  10397. ]),
  10398.  
  10399. ("cf_imbed_flu", #SERVER: player catches forcefully a cold RAMARAUNT ADD
  10400. [(store_script_param, ":player_id", 1),
  10401.  
  10402. (player_is_active, ":player_id"),
  10403. #(player_get_agent_id, ":agent_id", ":player_id"),
  10404. (call_script, "script_reset_illnesses",":player_id"),
  10405. (player_set_slot, ":player_id", slot_player_flu_progression, 74), #its begining...
  10406. (player_set_slot, ":player_id", slot_player_flu_direction, 1), #its going up
  10407.  
  10408. (str_store_player_username, s0, ":player_id"),
  10409. (server_add_message_to_log, "str_log_player_caught_flu"),
  10410.  
  10411. ]),
  10412.  
  10413. ("cf_lose_flu", #SERVER: player loses a cold RAMARAUNT ADD
  10414. [(store_script_param, ":player_id", 1),
  10415.  
  10416. (player_is_active, ":player_id"),
  10417. #(player_get_agent_id, ":agent_id", ":player_id"),
  10418. (player_set_slot, ":player_id", slot_player_flu_progression, -1), #its done
  10419. (player_set_slot, ":player_id", slot_player_flu_direction, -1), #its done
  10420. (player_set_slot, ":player_id", slot_player_flu_immunity_timer, 40), #imumne for 40 food ticks
  10421.  
  10422. (str_store_player_username, s0, ":player_id"),
  10423. (server_add_message_to_log, "str_log_player_lost_flu"),
  10424.  
  10425. ]),
  10426.  
  10427. ("cf_catch_plague", #SERVER: player catches a cold RAMARAUNT ADD
  10428. [(store_script_param, ":player_id", 1),
  10429.  
  10430. (player_is_active, ":player_id"),
  10431. #(player_get_agent_id, ":agent_id", ":player_id"),
  10432. (player_get_slot, ":direction", ":player_id", slot_player_plague_direction),
  10433. (player_get_slot, ":immunity", ":player_id", slot_player_plague_immunity_timer),
  10434. (eq, ":direction", -1), #player doesnt already have plague
  10435. (eq, ":immunity", -1), #player isnt immune
  10436. (assign, ":progression", 1),
  10437. (assign, ":direction", 1),
  10438. (try_begin),
  10439. (player_get_slot, ":cold_direction", ":player_id", slot_player_cold_direction),
  10440. (neq, ":cold_direction", -1),#if has cold...
  10441. (player_get_slot, ":progression", ":player_id", slot_player_cold_progression), #overwrite it with flu
  10442. (call_script, "script_cf_lose_cold", ":player_id"),#end cold
  10443. (else_try),
  10444. (player_get_slot, ":flu_direction", ":player_id", slot_player_flu_direction),
  10445. (neq, ":flu_direction", -1),#if has flu...
  10446. (player_get_slot, ":progression", ":player_id", slot_player_flu_progression), #overwrite it with flu
  10447. (call_script, "script_cf_lose_flu", ":player_id"),#end cold
  10448. (try_end),
  10449. (player_set_slot, ":player_id", slot_player_plague_progression, ":progression"), #its begining...
  10450. (player_set_slot, ":player_id", slot_player_plague_direction, ":direction"), #its going up
  10451.  
  10452. (str_store_player_username, s0, ":player_id"),
  10453. (server_add_message_to_log, "str_log_player_caught_plague"),
  10454.  
  10455. ]),
  10456.  
  10457. ("cf_imbed_plague", #SERVER: player catches forcefully a cold RAMARAUNT ADD
  10458. [(store_script_param, ":player_id", 1),
  10459.  
  10460. (player_is_active, ":player_id"),
  10461. #(player_get_agent_id, ":agent_id", ":player_id"),
  10462. (call_script, "script_reset_illnesses",":player_id"),
  10463. (player_set_slot, ":player_id", slot_player_plague_progression, 74), #its begining...
  10464. (player_set_slot, ":player_id", slot_player_plague_direction, 1), #its going up
  10465.  
  10466. (str_store_player_username, s0, ":player_id"),
  10467. (server_add_message_to_log, "str_log_player_caught_plague"),
  10468.  
  10469. ]),
  10470.  
  10471. ("cf_lose_plague", #SERVER: player loses a cold RAMARAUNT ADD
  10472. [(store_script_param, ":player_id", 1),
  10473.  
  10474. (player_is_active, ":player_id"),
  10475. #(player_get_agent_id, ":agent_id", ":player_id"),
  10476. (player_set_slot, ":player_id", slot_player_plague_progression, -1), #its done
  10477. (player_set_slot, ":player_id", slot_player_plague_direction, -1), #its done
  10478. (player_set_slot, ":player_id", slot_player_plague_immunity_timer, 40), #imumne for 40 food ticks
  10479.  
  10480. (str_store_player_username, s0, ":player_id"),
  10481. (server_add_message_to_log, "str_log_player_lost_plague"),
  10482.  
  10483. ]),
  10484.  
  10485. ("player_cough",
  10486. [
  10487. (store_script_param, ":player_id", 1),
  10488. (store_script_param, ":illness", 2), #1 = cold, 2 = flu, 3 = plague
  10489. (player_get_agent_id, ":agent_id", ":player_id"),
  10490. (agent_get_position, pos0, ":agent_id"),
  10491. (player_get_gender, ":gender", ":player_id"),
  10492.  
  10493. (try_begin),
  10494. (eq, ":gender", tf_female),
  10495. (call_script, "script_play_sound_at_position", "snd_woman_cough_sick"),
  10496. (else_try),
  10497. (call_script, "script_play_sound_at_position", "snd_man_cough_sick"),
  10498. (try_end),
  10499.  
  10500. (multiplayer_send_int_to_player, ":player_id", server_event_player_has_coughed, -1, ":illness"),
  10501. (agent_get_position, pos1, ":agent_id"),
  10502. (position_move_z, pos1, 160),
  10503. (try_for_agents, ":other_agent_id"), # send the chat message to other players whoose agents are close enough
  10504. (agent_is_alive, ":other_agent_id"),
  10505. (neq, ":other_agent_id", ":agent_id"),
  10506. (neg|agent_is_non_player, ":other_agent_id"),
  10507. (agent_get_player_id, ":other_player_id", ":other_agent_id"),
  10508. (player_is_active, ":other_player_id"),
  10509. (agent_get_position, pos2, ":other_agent_id"),
  10510. (position_move_z, pos2, 160),
  10511. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10512. (le, ":sq_distance", sq(max_distance_to_play_sound)),
  10513.  
  10514. (multiplayer_send_int_to_player, ":other_player_id", server_event_player_has_coughed, ":player_id", ":illness"),
  10515. (try_end),
  10516.  
  10517. #spreading of illness
  10518.  
  10519. (try_for_agents, ":other_agent_id"), # find players that are close enough
  10520. (agent_is_alive, ":other_agent_id"),
  10521. (neg|agent_is_non_player, ":other_agent_id"),
  10522. (agent_get_player_id, ":other_player_id", ":other_agent_id"),
  10523. (player_is_active, ":other_player_id"),
  10524. (assign, ":continue", 1),
  10525. (agent_get_item_slot, ":hat", ":other_agent_id", ek_head),
  10526. (try_begin),
  10527. (eq, ":hat", "itm_plague_mask"),
  10528. (agent_get_troop_id, ":troop_id", ":other_agent_id"),
  10529. (eq, ":troop_id", "trp_doctor"),
  10530. (assign, ":continue", 0),
  10531. (try_end),
  10532. (eq, ":continue", 1),
  10533. (neq, ":hat", "itm_invisible_head"),
  10534. (neq, ":hat", "itm_black_helmet"),
  10535. (agent_get_position, pos2, ":other_agent_id"),
  10536. (position_move_z, pos2, 160),
  10537. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10538. (le, ":sq_distance", sq(max_distance_to_catch_cough)),
  10539. (position_has_line_of_sight_to_position, pos1, pos2),
  10540. (store_random_in_range, ":cold_catch_chance", 0, 100),
  10541. (gt, ":cold_catch_chance", 50),
  10542. (try_begin),
  10543. (eq, ":illness", 1), #common cold
  10544. (call_script, "script_cf_catch_cold", ":other_player_id"),
  10545. (else_try),
  10546. (eq, ":illness", 2),
  10547. (call_script, "script_cf_catch_flu", ":other_player_id"),
  10548. (else_try),
  10549. (eq, ":illness", 3),
  10550. (call_script, "script_cf_catch_plague", ":other_player_id"),
  10551. (try_end),
  10552. (try_end),
  10553. ]),
  10554.  
  10555. ("player_vomit_blood", #SERVER: player vomits blood
  10556. [
  10557. (store_script_param, ":player_id", 1),
  10558. (player_get_agent_id, ":agent_id", ":player_id"),
  10559. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_bloody_vomit", 1),
  10560. (agent_get_position, pos0, ":agent_id"),
  10561. (call_script, "script_play_sound_at_position", "snd_vomit"),
  10562. (multiplayer_send_int_to_player, ":player_id", server_event_player_has_vomited, -1),
  10563. (agent_get_position, pos1, ":agent_id"),
  10564. (position_move_z, pos1, 160),
  10565. (try_for_agents, ":other_agent_id"), # send the chat message to other players whoose agents are close enough
  10566. (agent_is_alive, ":other_agent_id"),
  10567. (neg|agent_is_non_player, ":other_agent_id"),
  10568. (agent_get_player_id, ":other_player_id", ":other_agent_id"),
  10569. (player_is_active, ":other_player_id"),
  10570. (agent_get_position, pos2, ":other_agent_id"),
  10571. (position_move_z, pos2, 160),
  10572. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10573. (le, ":sq_distance", sq(max_distance_to_play_sound)),
  10574. (neq, ":other_player_id", ":player_id"),
  10575. (multiplayer_send_int_to_player, ":other_player_id", server_event_player_has_vomited, ":player_id"),
  10576. (try_end),
  10577.  
  10578. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  10579. (try_begin),
  10580. (gt, ":food_amount", 20),
  10581. (val_sub, ":food_amount", 20),
  10582. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10583. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10584. (else_try),
  10585. (agent_set_slot, ":agent_id", slot_agent_food_amount, 0),
  10586. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, 0),
  10587. (try_end),
  10588.  
  10589.  
  10590. ]),
  10591.  
  10592. ("cf_illness_lower_immunities", #SERVER: player loses some immunity to illnesses RAMARAUNT ADD
  10593. [(store_script_param, ":player_id", 1),
  10594.  
  10595. (player_is_active, ":player_id"),
  10596. (player_get_slot, ":cold_immunity", ":player_id", slot_player_cold_immunity_timer),
  10597. (player_get_slot, ":flu_immunity", ":player_id", slot_player_flu_immunity_timer),
  10598. (player_get_slot, ":plague_immunity", ":player_id", slot_player_plague_immunity_timer),
  10599.  
  10600. (try_begin),
  10601. (neq, -1, ":cold_immunity"),
  10602. (val_sub, ":cold_immunity", 1),
  10603. (player_set_slot, ":player_id", slot_player_cold_immunity_timer, ":cold_immunity"),
  10604. (try_end),
  10605. (try_begin),
  10606. (neq, -1, ":flu_immunity"),
  10607. (val_sub, ":flu_immunity", 1),
  10608. (player_set_slot, ":player_id", slot_player_flu_immunity_timer, ":flu_immunity"),
  10609. (try_end),
  10610. (try_begin),
  10611. (neq, -1, ":plague_immunity"),
  10612. (val_sub, ":plague_immunity", 1),
  10613. (player_set_slot, ":player_id", slot_player_plague_immunity_timer, ":plague_immunity"),
  10614. (try_end),
  10615.  
  10616.  
  10617. ]),
  10618.  
  10619. ("cf_progress_illnesses", #SERVER: player's illness progresses RAMARAUNT ADD
  10620. [(store_script_param_1, ":player_id"),
  10621.  
  10622. (player_is_active, ":player_id"),
  10623.  
  10624. (try_begin),#randomly catch flu
  10625. (store_random_in_range, ":rand", 0, 500), # 1 out of 500 chance every food tick
  10626. (eq, ":rand", 100),
  10627. (call_script, "script_cf_catch_flu", ":player_id"),
  10628. (else_try),#randomly catch cold
  10629. (store_random_in_range, ":rand", 0, 200),
  10630. (eq, ":rand", 100),
  10631. (call_script, "script_cf_catch_cold", ":player_id"),
  10632. (try_end),
  10633. (player_get_slot, ":cold_direction", ":player_id", slot_player_cold_direction),
  10634. (try_begin),
  10635. (neq, ":cold_direction", -1),
  10636. (player_get_slot, ":cold_progression", ":player_id", slot_player_cold_progression),
  10637. (try_begin), #cold
  10638. (eq, ":cold_direction", 1), #going up
  10639. (val_add, ":cold_progression", 5),
  10640. (try_begin),
  10641. (ge, ":cold_progression", 100),
  10642. (assign, ":cold_direction", 0),
  10643. (player_set_slot, ":player_id", slot_player_cold_direction, 0),
  10644. (try_end),
  10645. (else_try),
  10646. (eq, ":cold_direction", 0), #going down
  10647. (val_sub, ":cold_progression", 5),
  10648. (try_begin),
  10649. (eq, ":cold_progression", 0),
  10650. (call_script, "script_cf_lose_cold", ":player_id"),
  10651. (try_end),
  10652. (try_end),
  10653. (player_set_slot, ":player_id", slot_player_cold_progression, ":cold_progression"),
  10654.  
  10655. (try_begin), #cough from cold
  10656. (store_random_in_range, ":cough", 0,100),
  10657. (gt, ":cold_progression", ":cough"),
  10658. (call_script, "script_player_cough", ":player_id", 1),
  10659. (try_end),
  10660.  
  10661. (try_begin), #cold client updates
  10662. (eq, ":cold_direction", 1),
  10663. (this_or_next|eq, ":cold_progression", 25),
  10664. (eq, ":cold_progression", 75),
  10665. (multiplayer_send_int_to_player, ":player_id", server_event_illness_update , 1, ":cold_progression"),
  10666. (else_try),
  10667. (eq, ":cold_direction", 0),
  10668. (this_or_next|eq, ":cold_progression", 25),
  10669. (eq, ":cold_progression", 0),
  10670. (try_begin),
  10671. (eq, ":cold_progression", 25),
  10672. (assign, ":cold_progression", 24),
  10673. (try_end),
  10674. (multiplayer_send_int_to_player, ":player_id", server_event_illness_update , 1, ":cold_progression"),
  10675. (try_end),
  10676.  
  10677.  
  10678.  
  10679. (else_try),
  10680. (player_get_slot, ":flu_direction", ":player_id", slot_player_flu_direction),
  10681. (neq, ":flu_direction", -1),
  10682. (player_get_slot, ":flu_progression", ":player_id", slot_player_flu_progression),
  10683. (try_begin), #flu
  10684. (eq, ":flu_direction", 1), #going up
  10685. (val_add, ":flu_progression", 5),
  10686. (try_begin),
  10687. (eq, ":flu_progression", 100),
  10688. (assign, ":flu_direction", 0),
  10689. (player_set_slot, ":player_id", slot_player_flu_direction, 0),
  10690. (try_end),
  10691. (else_try),
  10692. (eq, ":flu_direction", 0), #going down
  10693. (val_sub, ":flu_progression", 5),
  10694. (try_begin),
  10695. (eq, ":flu_progression", 0),
  10696. (call_script, "script_cf_lose_flu", ":player_id"),
  10697. (try_end),
  10698. (try_end),
  10699. (player_set_slot, ":player_id", slot_player_flu_progression, ":flu_progression"),
  10700.  
  10701. (try_begin), #flu client updates
  10702. (eq, ":flu_direction", 1),
  10703. (this_or_next|eq, ":flu_progression", 25),
  10704. (this_or_next|eq, ":flu_progression", 50),
  10705. (eq, ":flu_progression", 75),
  10706. (multiplayer_send_int_to_player, ":player_id", server_event_illness_update , 2 , ":flu_progression"),
  10707. (else_try),
  10708. (eq, ":flu_direction", 0),
  10709. (this_or_next|eq, ":flu_progression", 50),
  10710. (this_or_next|eq, ":flu_progression", 25),
  10711. (eq, ":flu_progression", 0),
  10712. (try_begin),
  10713. (neq, ":flu_progression", 0),
  10714. (val_sub, ":flu_progression", 1),
  10715. (try_end),
  10716. (multiplayer_send_int_to_player, ":player_id", server_event_illness_update , 2 , ":flu_progression"),
  10717. (try_end),
  10718.  
  10719. (try_begin),#vomiting
  10720. (gt, ":flu_progression", 50),
  10721. (store_random_in_range, ":rand",0,100),
  10722. (lt, ":rand", 30),
  10723. (call_script, "script_player_vomit", ":player_id"),
  10724. (else_try),
  10725. (store_random_in_range, ":rand",0,100),
  10726. (lt, ":rand", ":flu_progression"),
  10727. (call_script, "script_player_cough", ":player_id", 2),
  10728. (try_end),
  10729. (else_try), #plague begin
  10730. (player_get_slot, ":plague_direction", ":player_id", slot_player_plague_direction),
  10731. (neq, ":plague_direction", -1),
  10732. (player_get_slot, ":plague_progression", ":player_id", slot_player_plague_progression),
  10733. (try_begin), #plague
  10734. (eq, ":plague_direction", 1), #going up
  10735. (val_add, ":plague_progression", 5),
  10736. (try_begin),
  10737. (eq, ":plague_progression", 100),
  10738. (assign, ":plague_direction", 0),
  10739. (player_set_slot, ":player_id", slot_player_plague_direction, 0),
  10740. (try_end),
  10741. (else_try),
  10742. (eq, ":plague_direction", 0), #going down
  10743. (val_sub, ":plague_progression", 5),
  10744. (try_begin),
  10745. (eq, ":plague_progression", 0),
  10746. (call_script, "script_cf_lose_plague", ":player_id"),
  10747. (try_end),
  10748. (try_end),
  10749. (player_set_slot, ":player_id", slot_player_plague_progression, ":plague_progression"),
  10750.  
  10751.  
  10752. (try_begin), #plague client updates
  10753. (eq, ":plague_direction", 1),
  10754. (this_or_next|eq, ":plague_progression", 25),
  10755. (this_or_next|eq, ":plague_progression", 50),
  10756. (eq, ":plague_progression", 75),
  10757. (multiplayer_send_int_to_player, ":player_id", server_event_illness_update , 3, ":plague_progression"),
  10758. (else_try),
  10759. (eq, ":plague_direction", 0),
  10760. (this_or_next|eq, ":plague_progression", 50),
  10761. (this_or_next|eq, ":plague_progression", 25),
  10762. (eq, ":plague_progression", 0),
  10763. (try_begin),
  10764. (neq, ":plague_progression", 0),
  10765. (val_sub, ":plague_progression", 1),
  10766. (try_end),
  10767. (multiplayer_send_int_to_player, ":player_id", server_event_illness_update , 3, ":plague_progression"),
  10768. (try_end),
  10769. (try_begin),#vomiting
  10770. (gt, ":plague_progression", 50),
  10771. (store_random_in_range, ":rand",0,100),
  10772. (lt, ":rand", 30),
  10773. (call_script, "script_player_vomit_blood", ":player_id"),
  10774. (else_try),#coughing
  10775. (store_random_in_range, ":rand",0,30),
  10776. (lt, ":rand", ":plague_progression"),
  10777. (call_script, "script_player_cough", ":player_id", 3),
  10778. (try_end),
  10779. #lower health
  10780. (try_begin),
  10781. (gt, ":plague_progression", 50),
  10782. (player_get_agent_id, ":agent_id", ":player_id"),
  10783. (agent_deliver_damage_to_agent, ":agent_id", ":agent_id", 10),
  10784. (try_end),
  10785.  
  10786.  
  10787. (try_end),
  10788.  
  10789.  
  10790.  
  10791. ]),
  10792. #ILLNESSES END
  10793.  
  10794.  
  10795. ("check_kill_excess_animals", # server: kill random herd animals when the herd animal limit setting is exceeded
  10796. [
  10797. (try_begin),
  10798. (multiplayer_is_server),
  10799. (assign, ":copied_herd_animal_count", "$g_herd_animal_count"),
  10800. (try_for_agents, ":agent_id"),
  10801. (gt, ":copied_herd_animal_count", "$g_max_herd_animal_count"),
  10802. (agent_slot_ge, ":agent_id", slot_agent_animal_birth_time, 1),
  10803. (agent_is_alive, ":agent_id"),
  10804. (neg|agent_is_human, ":agent_id"),
  10805. (remove_agent, ":agent_id"),
  10806. (val_sub, ":copied_herd_animal_count", 1),
  10807. (try_end),
  10808. (try_end),
  10809. ]),
  10810.  
  10811. ("check_animal_killed", # server: when an animal is killed, play death sounds, spawn carcass if a herd animal, storing meat and hide counts
  10812. [(store_script_param, ":dead_agent_id", 1), # must be valid
  10813. (store_script_param, ":killer_agent_id", 2),
  10814.  
  10815. (try_begin),
  10816. (multiplayer_is_server),
  10817. (agent_get_item_id, ":horse_item_id", ":dead_agent_id"),
  10818. (gt, ":horse_item_id", -1),
  10819. (try_begin),
  10820. (item_slot_eq, ":horse_item_id", slot_item_animal_adult_item_id, 0),
  10821. (agent_play_sound, ":dead_agent_id", "snd_horse_neigh"),
  10822. (else_try),
  10823. (val_sub, "$g_herd_animal_count", 1),
  10824. (store_mission_timer_a, "$g_time_last_herd_animal_disappeared"),
  10825. (val_add, "$g_time_last_herd_animal_disappeared", "$g_spawn_item_prune_time"),
  10826. (item_get_slot, ":death_sound", ":horse_item_id", slot_item_animal_death_sound),
  10827. (try_begin),
  10828. (gt, ":death_sound", 0),
  10829. (agent_play_sound, ":dead_agent_id", ":death_sound"),
  10830. (try_end),
  10831. (call_script, "script_animal_remove_from_herd", ":dead_agent_id", -1),
  10832. (item_get_slot, ":meat_count", ":horse_item_id", slot_item_animal_meat_count),
  10833. (item_get_slot, ":hide_count", ":horse_item_id", slot_item_animal_hide_count),
  10834. (try_begin),
  10835. (agent_is_active, ":killer_agent_id"),
  10836. (agent_get_wielded_item, ":wielded_item_id", ":killer_agent_id", 0),
  10837. (try_begin),
  10838. (this_or_next|le, ":wielded_item_id", -1),
  10839. (neg|item_slot_eq, ":wielded_item_id", slot_item_class, item_class_knife),
  10840. (val_sub, ":meat_count", 1),
  10841. (val_sub, ":hide_count", 2),
  10842. (try_end),
  10843. (agent_get_troop_id, ":troop_id", ":killer_agent_id"),
  10844. (store_skill_level, ":butchering_skill", "skl_herding", ":troop_id"),
  10845. (store_proficiency_level, ":weapon_skill", ":troop_id", wpt_one_handed_weapon),
  10846. (try_begin),
  10847. (lt, ":butchering_skill", 1),
  10848. (lt, ":weapon_skill", 90),
  10849. (val_sub, ":meat_count", 1),
  10850. (val_sub, ":hide_count", 1),
  10851. (try_end),
  10852. (else_try),
  10853. (val_div, ":meat_count", 2),
  10854. (val_div, ":hide_count", 2),
  10855. (try_end),
  10856. (agent_get_slot, ":food_count", ":dead_agent_id", slot_agent_animal_food),
  10857. (val_clamp, ":food_count", -2, 2),
  10858. (val_add, ":meat_count", ":food_count"),
  10859. (agent_get_position, pos1, ":dead_agent_id"),
  10860. (set_spawn_position, pos1),
  10861. (spawn_item, "itm_animal_carcass", 0, "$g_spawn_item_prune_time"),
  10862. (prop_instance_set_position, reg0, pos1),
  10863. (agent_set_slot, ":dead_agent_id", slot_agent_animal_carcass_instance_id, reg0),
  10864. (scene_prop_set_slot, reg0, slot_animal_carcass_meat_count, ":meat_count"),
  10865. (scene_prop_set_slot, reg0, slot_animal_carcass_hide_count, ":hide_count"),
  10866. (try_end),
  10867. (try_end),
  10868. ]),
  10869.  
  10870. ("cf_use_butchering_knife", # server: check for nearby animal carcasses for the agent to butcher
  10871. [(store_script_param, ":agent_id", 1), # must be valid
  10872.  
  10873. (assign, ":found", 0),
  10874. (agent_get_slot, ":carcass_instance_id", ":agent_id", slot_agent_hunting_last_carcass),
  10875. (try_begin), # first check the last carcass used, to save time
  10876. (prop_instance_is_valid, ":carcass_instance_id"),
  10877. (this_or_next|scene_prop_slot_ge, ":carcass_instance_id", slot_animal_carcass_meat_count, 1),
  10878. (scene_prop_slot_ge, ":carcass_instance_id", slot_animal_carcass_hide_count, 1),
  10879. (prop_instance_get_position, pos2, ":carcass_instance_id"),
  10880. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10881. (lt, ":sq_distance", sq(max_distance_to_use)),
  10882. (assign, ":found", 1),
  10883. (else_try), # otherwise check all other carcasses
  10884. (agent_get_player_id, ":player_id", ":agent_id"),
  10885. (player_is_active, ":player_id"),
  10886. (store_mission_timer_a, ":time"),
  10887. (lt, ":time", "$g_time_last_herd_animal_disappeared"),
  10888. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  10889. (store_sub, ":interval", ":time", ":last_action_time"),
  10890. (ge, ":interval", carcass_search_min_interval),
  10891. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  10892. (scene_spawned_item_get_num_instances, ":carcass_count", "itm_animal_carcass"),
  10893. (try_for_range, ":other_carcass_no", 0, ":carcass_count"),
  10894. (scene_spawned_item_get_instance, ":other_carcass_instance_id", "itm_animal_carcass", ":other_carcass_no"),
  10895. (this_or_next|scene_prop_slot_ge, ":other_carcass_instance_id", slot_animal_carcass_meat_count, 1),
  10896. (scene_prop_slot_ge, ":other_carcass_instance_id", slot_animal_carcass_hide_count, 1),
  10897. (prop_instance_get_position, pos2, ":other_carcass_instance_id"),
  10898. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10899. (lt, ":sq_distance", sq(max_distance_to_use)),
  10900. (assign, ":carcass_count", -1),
  10901. (assign, ":found", 1),
  10902. (assign, ":carcass_instance_id", ":other_carcass_instance_id"),
  10903. (agent_set_slot, ":agent_id", slot_agent_hunting_last_carcass, ":other_carcass_instance_id"),
  10904. (try_end),
  10905. (try_begin),
  10906. (eq, ":found", 0),
  10907. (agent_set_slot, ":agent_id", slot_agent_hunting_last_carcass, -1),
  10908. (try_end),
  10909. (try_end),
  10910. (eq, ":found", 1),
  10911. (scene_prop_get_slot, ":hide_count", ":carcass_instance_id", slot_animal_carcass_hide_count),
  10912. (try_begin),
  10913. (gt, ":hide_count", 0),
  10914. (val_sub, ":hide_count", 1),
  10915. (scene_prop_set_slot, ":carcass_instance_id", slot_animal_carcass_hide_count, ":hide_count"),
  10916. (call_script, "script_set_random_spawn_position", 50),
  10917. (spawn_item, "itm_raw_hide", 0, "$g_spawn_item_prune_time"),
  10918. (else_try),
  10919. (scene_prop_get_slot, ":meat_count", ":carcass_instance_id", slot_animal_carcass_meat_count),
  10920. (gt, ":meat_count", 0),
  10921. (val_sub, ":meat_count", 1),
  10922. (scene_prop_set_slot, ":carcass_instance_id", slot_animal_carcass_meat_count, ":meat_count"),
  10923. (call_script, "script_set_random_spawn_position", 50),
  10924. (spawn_item, "itm_raw_meat", 0, "$g_spawn_item_prune_time"),
  10925. (try_end),
  10926. (try_begin),
  10927. (le, ":hide_count", 0),
  10928. (le, ":meat_count", 0),
  10929. (scene_prop_set_prune_time, ":carcass_instance_id", 1),
  10930. (try_end),
  10931. ]),
  10932.  
  10933. ("cf_animal_add_to_herd", # server: try find a free space for an animal in a herd
  10934. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10935. (store_script_param, ":herd_manager", 2), # must be a valid instance id
  10936. (store_script_param, ":adult_item_id", 3),
  10937.  
  10938. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  10939. (assign, ":free_slot", -1),
  10940. (assign, ":found_herd", 0),
  10941. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  10942. (try_for_range, ":herd_slot", 0, ":loop_end"),
  10943. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  10944. (agent_is_active, ":herd_agent_id"),
  10945. (agent_slot_eq, ":herd_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  10946. (agent_get_item_id, ":herd_item_id", ":herd_agent_id"),
  10947. (gt, ":herd_item_id", -1),
  10948. (item_slot_eq, ":herd_item_id", slot_item_animal_adult_item_id, ":adult_item_id"),
  10949. (agent_get_position, pos50, ":herd_agent_id"),
  10950. (get_sq_distance_between_positions, ":sq_distance", pos1, pos50),
  10951. (try_begin),
  10952. (le, ":sq_distance", sq(max_distance_to_include_in_herd)),
  10953. (assign, ":found_herd", 1),
  10954. (else_try),
  10955. (assign, ":loop_end", -1),
  10956. (try_end),
  10957. (else_try),
  10958. (scene_prop_set_slot, ":herd_manager", ":herd_slot", -1),
  10959. (eq, ":free_slot", -1),
  10960. (assign, ":free_slot", ":herd_slot"),
  10961. (try_end),
  10962. (eq, ":found_herd", 1),
  10963. (gt, ":free_slot", -1),
  10964. (scene_prop_set_slot, ":herd_manager", ":free_slot", ":animal_agent_id"),
  10965. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  10966. (scene_prop_set_prune_time, ":herd_manager", 999999),
  10967. ]),
  10968.  
  10969. ("animal_add_to_nearby_herd", # server: try add the animal to the herd or another nearby, otherwise spawn a new herd manager
  10970. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10971. (store_script_param, ":herd_manager", 2),
  10972.  
  10973. (try_begin),
  10974. (agent_is_active, ":animal_agent_id"),
  10975. (agent_get_position, pos1, ":animal_agent_id"),
  10976. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10977. (gt, ":animal_item_id", -1),
  10978. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  10979. (gt, ":adult_item_id", 0),
  10980. (agent_get_slot, ":old_herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10981. (try_begin),
  10982. (prop_instance_is_valid, ":herd_manager"),
  10983. (call_script, "script_cf_animal_add_to_herd", ":animal_agent_id", ":herd_manager", ":adult_item_id"),
  10984. (else_try),
  10985. (assign, ":checked_herd_manager", ":herd_manager"),
  10986. (scene_spawned_item_get_num_instances, ":herds_end", "itm_animal_herd_manager"),
  10987. (try_for_range, ":herd_no", 0, ":herds_end"),
  10988. (scene_spawned_item_get_instance, ":herd_manager", "itm_animal_herd_manager", ":herd_no"),
  10989. (neq, ":herd_manager", ":checked_herd_manager"),
  10990. (call_script, "script_cf_animal_add_to_herd", ":animal_agent_id", ":herd_manager", ":adult_item_id"),
  10991. (assign, ":herds_end", -1),
  10992. (try_end),
  10993. (eq, ":herds_end", -1),
  10994. (else_try),
  10995. (set_fixed_point_multiplier, 100),
  10996. (init_position, pos0),
  10997. (position_set_z, pos0, -5000),
  10998. (set_spawn_position, pos0),
  10999. (spawn_item, "itm_animal_herd_manager", 0, 999999),
  11000. (assign, ":herd_manager", reg0),
  11001. (prop_instance_set_position, ":herd_manager", pos1, 1),
  11002. (scene_prop_set_slot, ":herd_manager", 0, ":animal_agent_id"),
  11003. (scene_prop_set_slot, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  11004. (item_get_slot, ":loop_end", ":animal_item_id", slot_item_animal_max_in_herd),
  11005. (try_for_range, ":herd_slot", 1, ":loop_end"),
  11006. (scene_prop_set_slot, ":herd_manager", ":herd_slot", -1),
  11007. (try_end),
  11008. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  11009. (try_end),
  11010. (try_begin),
  11011. (gt, ":old_herd_manager", -1),
  11012. (neq, ":herd_manager", ":old_herd_manager"),
  11013. (call_script, "script_animal_remove_from_herd", ":animal_agent_id", ":old_herd_manager"),
  11014. (try_end),
  11015. (try_end),
  11016. ]),
  11017.  
  11018. ("animal_remove_from_herd", # server: remove the animal from the herd manager, if valid
  11019. [(store_script_param, ":animal_agent_id", 1), # must be valid
  11020. (store_script_param, ":herd_manager", 2),
  11021.  
  11022. (try_begin),
  11023. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  11024. (gt, ":animal_item_id", -1),
  11025. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  11026. (gt, ":adult_item_id", 0),
  11027. (try_begin),
  11028. (le, ":herd_manager", -1),
  11029. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  11030. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, -1),
  11031. (try_end),
  11032. (prop_instance_is_valid, ":herd_manager"),
  11033. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  11034. (item_get_slot, ":loop_end", ":animal_item_id", slot_item_animal_max_in_herd),
  11035. (try_for_range, ":herd_slot", 0, ":loop_end"),
  11036. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  11037. (eq, ":herd_agent_id", ":animal_agent_id"),
  11038. (scene_prop_set_slot, ":herd_manager", ":herd_slot", -1),
  11039. (assign, ":loop_end", -1),
  11040. (try_end),
  11041. (try_end),
  11042. ]),
  11043.  
  11044. ("cf_spawn_herd_animal", # server: spawn an animal and add to a nearby herd
  11045. [(store_script_param, ":animal_item_id", 1),
  11046. (store_script_param, ":herd_manager", 2),
  11047.  
  11048. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  11049. (gt, ":adult_item_id", 0),
  11050. (val_add, "$g_herd_animal_count", 1),
  11051. (set_spawn_position, pos1),
  11052. (spawn_horse, ":animal_item_id"),
  11053. (assign, ":animal_agent_id", reg0),
  11054. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, -1),
  11055. (agent_set_slot, ":animal_agent_id", slot_agent_animal_carcass_instance_id, -1),
  11056. (call_script, "script_animal_add_to_nearby_herd", ":animal_agent_id", ":herd_manager"),
  11057. (store_mission_timer_a, ":time"),
  11058. (try_begin),
  11059. (eq, ":animal_item_id", ":adult_item_id"),
  11060. (item_get_slot, ":grow_time", ":animal_item_id", slot_item_animal_grow_time),
  11061. (val_sub, ":time", ":grow_time"),
  11062. (try_end),
  11063. (val_max, ":time", 1),
  11064. (agent_set_slot, ":animal_agent_id", slot_agent_animal_birth_time, ":time"),
  11065. ]),
  11066.  
  11067. ("cf_can_spawn_herd_animal", # server: check whether a player can spawn a new herd animal
  11068. [(store_script_param, ":agent_id", 1), # must be valid
  11069.  
  11070. (agent_get_player_id, ":player_id", ":agent_id"),
  11071. (player_is_active, ":player_id"),
  11072. (try_begin),
  11073. (ge, "$g_herd_animal_count", "$g_max_herd_animal_count"),
  11074. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_herd_animal_limit_reached", preset_message_error),
  11075. (try_end),
  11076. (lt, "$g_herd_animal_count", "$g_max_herd_animal_count"),
  11077. ]),
  11078.  
  11079. ("animal_get_age", # server: reg0 = the seconds since the animal was born as a child, or extrapolated for spawned adults
  11080. [(store_script_param, ":animal_agent_id", 1), # must be valid
  11081.  
  11082. (agent_get_slot, ":birth_time", ":animal_agent_id", slot_agent_animal_birth_time),
  11083. (store_mission_timer_a, ":age"),
  11084. (val_sub, ":age", ":birth_time"),
  11085. (val_div, ":age", 60),
  11086. (assign, reg0, ":age"),
  11087. ]),
  11088.  
  11089. ("animal_check_grow", # server: check if the animal should grow into an adult or birth a child; reg0 = the animal agent id
  11090. [(store_script_param, ":animal_agent_id", 1), # must be valid
  11091.  
  11092. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  11093. (store_mission_timer_a, ":time"),
  11094. (try_begin),
  11095. (item_slot_eq, ":animal_item_id", slot_item_animal_child_item_id, ":animal_item_id"),
  11096. (agent_get_slot, ":grow_time", ":animal_agent_id", slot_agent_animal_grow_time),
  11097. (try_begin),
  11098. (le, ":grow_time", 0),
  11099. (item_get_slot, ":grow_time", ":animal_item_id", slot_item_animal_grow_time),
  11100. (agent_get_slot, ":birth_time", ":animal_agent_id", slot_agent_animal_birth_time),
  11101. (val_add, ":grow_time", ":birth_time"),
  11102. (agent_set_slot, ":animal_agent_id", slot_agent_animal_grow_time, ":grow_time"),
  11103. (try_end),
  11104. (ge, ":time", ":grow_time"),
  11105. (agent_set_slot, ":animal_agent_id", slot_agent_animal_grow_time, 0),
  11106. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  11107. (agent_get_position, pos1, ":animal_agent_id"),
  11108. (set_spawn_position, pos1),
  11109. (spawn_horse, ":adult_item_id"),
  11110. (assign, ":adult_agent_id", reg0),
  11111. (store_agent_hit_points, ":hit_points", ":animal_agent_id", 1),
  11112. (agent_set_hit_points, ":adult_agent_id", ":hit_points", 1),
  11113. (try_for_range, ":slot", 0, slot_agent_animal_end),
  11114. (agent_get_slot, ":value", ":animal_agent_id", ":slot"),
  11115. (agent_set_slot, ":adult_agent_id", ":slot", ":value"),
  11116. (try_end),
  11117. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  11118. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, -1),
  11119. (try_begin), # try add the new adult to the herd replacing the child
  11120. (prop_instance_is_valid, ":herd_manager"),
  11121. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  11122. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  11123. (try_for_range, ":herd_slot", 0, ":loop_end"),
  11124. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  11125. (eq, ":herd_agent_id", ":animal_agent_id"),
  11126. (scene_prop_set_slot, ":herd_manager", ":herd_slot", ":adult_agent_id"),
  11127. (agent_set_slot, ":adult_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  11128. (assign, ":loop_end", -1),
  11129. (try_end),
  11130. (eq, ":loop_end", -1),
  11131. (else_try),
  11132. (call_script, "script_animal_add_to_nearby_herd", ":adult_agent_id", -1),
  11133. (try_end),
  11134. (agent_fade_out, ":animal_agent_id"),
  11135. (assign, ":animal_agent_id", ":adult_agent_id"),
  11136. (else_try),
  11137. (item_slot_eq, ":animal_item_id", slot_item_animal_adult_item_id, ":animal_item_id"),
  11138. (lt, "$g_herd_animal_count", "$g_max_herd_animal_count"),
  11139. (agent_get_slot, ":reproduce_time", ":animal_agent_id", slot_agent_animal_grow_time),
  11140. (this_or_next|le, ":reproduce_time", 0),
  11141. (ge, ":time", ":reproduce_time"),
  11142. (try_begin), # wait one cycle after growing to adult before reproducing
  11143. (gt, ":reproduce_time", 0),
  11144. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  11145. (try_begin),
  11146. (prop_instance_is_valid, ":herd_manager"),
  11147. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":animal_item_id"),
  11148. (item_get_slot, ":loop_end", ":animal_item_id", slot_item_animal_max_in_herd),
  11149. (try_for_range, ":herd_slot", 0, ":loop_end"), # verify that there is at least one other adult in the herd
  11150. (scene_prop_get_slot, ":other_animal_agent_id", ":herd_manager", ":herd_slot"),
  11151. (neq, ":other_animal_agent_id", ":animal_agent_id"),
  11152. (agent_is_active, ":other_animal_agent_id"),
  11153. (agent_is_alive, ":other_animal_agent_id"),
  11154. (agent_get_item_id, ":other_animal_item_id", ":other_animal_agent_id"),
  11155. (eq, ":other_animal_item_id", ":animal_item_id"),
  11156. (assign, ":loop_end", -1),
  11157. (try_end),
  11158. (eq, ":loop_end", -1),
  11159. (item_get_slot, ":child_item_id", ":animal_item_id", slot_item_animal_child_item_id),
  11160. (agent_get_position, pos1, ":animal_agent_id"),
  11161. (call_script, "script_set_random_spawn_position", 50),
  11162. (copy_position, pos1, pos10),
  11163. (call_script, "script_cf_spawn_herd_animal", ":child_item_id", ":herd_manager"),
  11164. (try_end),
  11165. (try_end),
  11166. (item_get_slot, ":max_reproduce_time", ":animal_item_id", slot_item_animal_grow_time),
  11167. (store_div, ":reproduce_time", ":reproduce_time", 2),
  11168. (val_mul, ":max_reproduce_time", 2),
  11169. (store_random_in_range, ":reproduce_time", ":reproduce_time", ":max_reproduce_time"),
  11170. (val_add, ":reproduce_time", ":time"),
  11171. (agent_set_slot, ":animal_agent_id", slot_agent_animal_grow_time, ":reproduce_time"),
  11172. (try_end),
  11173. (assign, reg0, ":animal_agent_id"),
  11174. ]),
  11175.  
  11176. ("animal_move", # server: move animals, trying to avoid drowning and running into walls, following the herd leader; failing to reproduce and starving if the leader couldn't move far enough
  11177. [(store_script_param, ":animal_agent_id", 1), # must be valid
  11178. (store_script_param, ":leader_agent_id", 2), # must be valid
  11179.  
  11180. (set_fixed_point_multiplier, 100),
  11181. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  11182. (assign, ":herd_is_starving", 0),
  11183. (try_begin), # for the leader, check the actual distance moved since last time
  11184. (eq, ":animal_agent_id", ":leader_agent_id"),
  11185. (agent_get_position, pos1, ":animal_agent_id"),
  11186. (store_random_in_range, ":random_angle", -30, 30),
  11187. (prop_instance_get_position, pos6, ":herd_manager"),
  11188. (get_sq_distance_between_positions, ":sq_distance_moved", pos1, pos6),
  11189. (try_begin), # if the distance is insufficient, turn around to try avoid a possible obstruction
  11190. (le, ":sq_distance_moved", sq(500)),
  11191. (assign, ":herd_is_starving", 1),
  11192. (val_add, ":random_angle", 180),
  11193. (else_try),
  11194. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  11195. (val_abs, ":terrain_distance"),
  11196. (ge, ":terrain_distance", 100),
  11197. (assign, ":herd_is_starving", 1),
  11198. (try_end),
  11199. (scene_prop_set_slot, ":herd_manager", slot_animal_herd_manager_starving, ":herd_is_starving"),
  11200. (prop_instance_set_position, ":herd_manager", pos1, 1),
  11201. (else_try),
  11202. (agent_get_scripted_destination, pos1, ":leader_agent_id"),
  11203. (store_random_in_range, ":random_angle", -180, 180),
  11204. (scene_prop_get_slot, ":herd_is_starving", ":herd_manager", slot_animal_herd_manager_starving),
  11205. (try_end),
  11206. (agent_get_slot, ":times_stuck", ":animal_agent_id", slot_agent_animal_times_stuck),
  11207. (agent_get_slot, ":food_amount", ":animal_agent_id", slot_agent_animal_food),
  11208. (try_begin),
  11209. (this_or_next|eq, ":herd_is_starving", 1),
  11210. (ge, ":times_stuck", 5),
  11211. (store_random_in_range, ":starve_chance", 0, 100),
  11212. (lt, ":starve_chance", 50),
  11213. (val_sub, ":food_amount", 1),
  11214. (agent_set_slot, ":animal_agent_id", slot_agent_animal_food, ":food_amount"),
  11215. (lt, ":food_amount", 0),
  11216. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  11217. (item_get_slot, ":death_sound", ":animal_item_id", slot_item_animal_death_sound),
  11218. (try_begin),
  11219. (gt, ":death_sound", 0),
  11220. (agent_play_sound, ":animal_agent_id", ":death_sound"),
  11221. (try_end),
  11222. (item_get_slot, ":starvation_meat_loss", ":animal_item_id", slot_item_animal_meat_count),
  11223. (val_mul, ":starvation_meat_loss", -1),
  11224. (val_sub, ":starvation_meat_loss", 3),
  11225. (lt, ":food_amount", ":starvation_meat_loss"),
  11226. (remove_agent, ":animal_agent_id"),
  11227. (assign, ":animal_agent_id", -1),
  11228. (else_try),
  11229. (eq, ":herd_is_starving", 0),
  11230. (call_script, "script_animal_check_grow", ":animal_agent_id"),
  11231. (assign, ":animal_agent_id", reg0),
  11232. (lt, ":food_amount", 0),
  11233. (val_add, ":food_amount", 1),
  11234. (agent_set_slot, ":animal_agent_id", slot_agent_animal_food, ":food_amount"),
  11235. (try_end),
  11236. (try_begin),
  11237. (neq, ":animal_agent_id", -1),
  11238. (get_scene_boundaries, pos8, pos9),
  11239. (position_get_x, ":scene_min_x", pos8),
  11240. (position_get_y, ":scene_min_y", pos8),
  11241. (position_get_x, ":scene_max_x", pos9),
  11242. (position_get_y, ":scene_max_y", pos9),
  11243. (assign, ":loop_end", 10),
  11244. (try_for_range, ":unused", 0, ":loop_end"), # test multiple different distances and angles diverging from the current heading
  11245. (copy_position, pos2, pos1),
  11246. (position_rotate_z, pos2, ":random_angle"),
  11247. (try_begin),
  11248. (eq, ":animal_agent_id", ":leader_agent_id"),
  11249. (store_random_in_range, ":random_distance", 1500, 2000),
  11250. (else_try),
  11251. (store_random_in_range, ":random_distance", 100, 1000),
  11252. (try_end),
  11253. (position_move_y, pos2, ":random_distance"),
  11254. (copy_position, pos3, pos2),
  11255. (position_set_z, pos3, 0),
  11256. (position_get_distance_to_terrain, ":water_depth", pos3),
  11257. (try_begin), # avoid water and scene boundaries
  11258. (lt, ":water_depth", z_position_water_level * -1),
  11259. (assign, ":continue", 1),
  11260. (try_begin),
  11261. (position_get_x, ":agent_x", pos2),
  11262. (is_between, ":agent_x", ":scene_min_x", ":scene_max_x"),
  11263. (position_get_y, ":agent_y", pos2),
  11264. (is_between, ":agent_y", ":scene_min_y", ":scene_max_y"),
  11265. (else_try),
  11266. (val_add, ":random_angle", 180),
  11267. (assign, ":continue", 0),
  11268. (try_end),
  11269. (eq, ":continue", 1),
  11270. (position_get_distance_to_terrain, ":distance_to_terrain", pos2),
  11271. (val_mul, ":distance_to_terrain", -1),
  11272. (position_move_z, pos2, ":distance_to_terrain"),
  11273. (try_begin),
  11274. (eq, ":animal_agent_id", ":leader_agent_id"),
  11275. (eq, ":times_stuck", 0), # unless the animal didn't move last time, avoid trying to move to a position without clear line of sight
  11276. (copy_position, pos4, pos1),
  11277. (copy_position, pos5, pos2),
  11278. (position_move_z, pos4, 100, 1),
  11279. (position_move_x, pos4, 50),
  11280. (position_move_z, pos5, 100, 1),
  11281. (neg|position_has_line_of_sight_to_position, pos4, pos5),
  11282. (assign, ":continue", 0),
  11283. (try_end),
  11284. (eq, ":continue", 1),
  11285. (store_random_in_range, ":speed", 10, 20),
  11286. (agent_set_speed_limit, ":animal_agent_id", ":speed"),
  11287. (agent_set_scripted_destination, ":animal_agent_id", pos2, 1),
  11288. (assign, ":loop_end", -1),
  11289. (else_try),
  11290. (store_random_in_range, ":random", 0, 45),
  11291. (try_begin),
  11292. (lt, ":random_angle", 0),
  11293. (val_mul, ":random", -1),
  11294. (try_end),
  11295. (val_add, ":random_angle", ":random"),
  11296. (try_end),
  11297. (try_end),
  11298. (try_begin),
  11299. (neq, ":loop_end", -1),
  11300. (val_add, ":times_stuck", 1),
  11301. (else_try),
  11302. (assign, ":times_stuck", 0),
  11303. (try_end),
  11304. (agent_set_slot, ":animal_agent_id", slot_agent_animal_times_stuck, ":times_stuck"),
  11305. (try_end),
  11306. ]),
  11307.  
  11308. ("animal_hit", # server: handle animal reactions to being hit by various tools and weapons; the damage result is set for ti_on_agent_hit
  11309. [(store_script_param, ":animal_agent_id", 1), # must be valid
  11310. (store_script_param, ":attacker_agent_id", 2), # must be valid
  11311. (store_script_param, ":damage_dealt", 3),
  11312. (store_script_param, ":weapon_item_id", 4),
  11313.  
  11314. (assign, ":damage_result", ":damage_dealt"),
  11315. (agent_get_troop_id, ":troop_id", ":attacker_agent_id"),
  11316. (store_skill_level, ":herding_skill", "skl_herding", ":troop_id"),
  11317. (try_begin),
  11318. (ge, ":herding_skill", 1),
  11319. (ge, ":weapon_item_id", all_items_begin),
  11320. (item_get_slot, ":item_class", ":weapon_item_id", slot_item_class),
  11321. (try_begin),
  11322. (is_between, ":item_class", item_class_herding_calm, item_class_herding_rouse + 1),
  11323. (assign, ":damage_result", 0),
  11324. (agent_get_position, pos1, ":animal_agent_id"),
  11325. (try_begin), # move the animal in the oppisite direction from the hitting agent, with a random angle variation depending on skill and wildness
  11326. (eq, ":item_class", item_class_herding_rouse),
  11327. (set_fixed_point_multiplier, 100),
  11328. (agent_get_position, pos2, ":attacker_agent_id"),
  11329. (position_transform_position_to_local, pos3, pos2, pos1),
  11330. (position_get_x, ":relative_x", pos3),
  11331. (position_get_y, ":relative_y", pos3),
  11332. (store_atan2, ":angle", ":relative_x", ":relative_y"),
  11333. (convert_from_fixed_point, ":angle"),
  11334. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  11335. (item_get_slot, ":wildness", ":animal_item_id", slot_item_animal_wildness),
  11336. (try_begin),
  11337. (gt, ":wildness", 0),
  11338. (store_mul, ":min_angle", ":wildness", -10),
  11339. (store_mul, ":max_angle", ":wildness", 10),
  11340. (store_random_in_range, ":random_angle", ":min_angle", ":max_angle"),
  11341. (val_div, ":random_angle", ":herding_skill"),
  11342. (val_add, ":angle", ":random_angle"),
  11343. (store_div, ":random_scare_limit", 400, ":herding_skill"),
  11344. (val_mul, ":random_scare_limit", ":wildness"),
  11345. (store_random_in_range, ":distance", 0, ":random_scare_limit"),
  11346. (else_try),
  11347. (assign, ":distance", 0),
  11348. (try_end),
  11349. (val_mul, ":angle", -1),
  11350. (position_copy_rotation, pos1, pos2),
  11351. (position_rotate_z, pos1, ":angle"),
  11352. (val_add, ":distance", 500),
  11353. (store_mul, ":damage_component", ":damage_dealt", 10),
  11354. (val_add, ":distance", ":damage_component"),
  11355. (agent_get_action_dir, ":attack_type", ":attacker_agent_id"),
  11356. (try_begin),
  11357. (eq, ":attack_type", 3),
  11358. (val_mul, ":distance", 2),
  11359. (try_end),
  11360. (position_move_y, pos1, ":distance"),
  11361. (store_random_in_range, ":speed", 10, 20),
  11362. (val_add, ":speed", ":herding_skill"),
  11363. (agent_set_speed_limit, ":animal_agent_id", ":speed"),
  11364. (try_end),
  11365. (agent_set_scripted_destination, ":animal_agent_id", pos1, 0),
  11366. (agent_force_rethink, ":animal_agent_id"),
  11367. (agent_set_slot, ":animal_agent_id", slot_agent_horse_last_rider, -1),
  11368. (try_begin),
  11369. (eq, ":item_class", item_class_herding_calm),
  11370. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  11371. (call_script, "script_animal_add_to_nearby_herd", ":animal_agent_id", ":herd_manager"),
  11372. (else_try), # more likely with higher herding skill: move some other animals in the herd with the target
  11373. (eq, ":item_class", item_class_herding_rouse),
  11374. (assign, ":found_leader", 0),
  11375. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  11376. (try_begin),
  11377. (prop_instance_is_valid, ":herd_manager"),
  11378. (scene_prop_get_slot, ":adult_item_id", ":herd_manager", slot_animal_herd_manager_adult_item_id),
  11379. (ge, ":adult_item_id", all_items_begin),
  11380. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  11381. (try_for_range, ":herd_slot", 0, ":loop_end"),
  11382. (store_random_in_range, ":random_move", ":herding_skill", 21),
  11383. (ge, ":random_move", 10),
  11384. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  11385. (neq, ":herd_agent_id", ":animal_agent_id"),
  11386. (agent_is_active, ":herd_agent_id"),
  11387. (agent_is_alive, ":herd_agent_id"),
  11388. (copy_position, pos4, pos1),
  11389. (store_random_in_range, ":random_angle", 0, 360),
  11390. (position_rotate_z, pos4, ":random_angle"),
  11391. (store_random_in_range, ":random_distance", 100, 1000),
  11392. (position_move_y, pos4, ":random_distance"),
  11393. (agent_set_speed_limit, ":herd_agent_id", ":speed"),
  11394. (agent_set_scripted_destination, ":herd_agent_id", pos4, 0),
  11395. (eq, ":found_leader", 0),
  11396. (assign, ":found_leader", 1),
  11397. (agent_get_slot, ":move_time", ":herd_agent_id", slot_agent_animal_move_time),
  11398. (gt, ":move_time", 0),
  11399. (store_random_in_range, ":extra_time", 10, 21),
  11400. (val_add, ":move_time", ":extra_time"),
  11401. (agent_set_slot, ":herd_agent_id", slot_agent_animal_move_time, ":move_time"),
  11402. (try_end),
  11403. (try_end),
  11404. (try_end),
  11405. (try_end),
  11406. (eq, ":damage_result", 0),
  11407. (else_try),
  11408. (eq, ":weapon_item_id", "itm_wheat_sheaf"),
  11409. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", ":weapon_item_id", 1),
  11410. (agent_get_slot, ":food", ":animal_agent_id", slot_agent_animal_food),
  11411. (val_add, ":food", 5),
  11412. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  11413. (item_get_slot, ":food_capacity", ":animal_item_id", slot_item_animal_meat_count),
  11414. (val_mul, ":food_capacity", 2),
  11415. (val_min, ":food", ":food_capacity"),
  11416. (agent_set_slot, ":animal_agent_id", slot_agent_animal_food, ":food"),
  11417. (assign, ":damage_result", 0),
  11418. (else_try), # if enough damage is dealt with other weapons, check the whole herd for reactions
  11419. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  11420. (item_get_slot, ":wildness", ":animal_item_id", slot_item_animal_wildness),
  11421. (store_random_in_range, ":minimum_startle_damage", 1, 10),
  11422. (val_sub, ":minimum_startle_damage", ":wildness"),
  11423. (ge, ":damage_dealt", ":minimum_startle_damage"),
  11424. (call_script, "script_animal_react_to_attack", ":attacker_agent_id", ":animal_agent_id", ":damage_dealt"),
  11425. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  11426. (try_begin),
  11427. (prop_instance_is_valid, ":herd_manager"),
  11428. (assign, ":found_leader", 0),
  11429. (scene_prop_get_slot, ":adult_item_id", ":herd_manager", slot_animal_herd_manager_adult_item_id),
  11430. (ge, ":adult_item_id", all_items_begin),
  11431. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  11432. (try_for_range, ":herd_slot", 0, ":loop_end"),
  11433. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  11434. (agent_is_active, ":herd_agent_id"),
  11435. (agent_is_alive, ":herd_agent_id"),
  11436. (call_script, "script_animal_react_to_attack", ":attacker_agent_id", ":herd_agent_id", ":damage_dealt"),
  11437. (eq, ":found_leader", 0),
  11438. (assign, ":found_leader", 1),
  11439. (agent_get_slot, ":move_time", ":herd_agent_id", slot_agent_animal_move_time),
  11440. (gt, ":move_time", 0),
  11441. (store_random_in_range, ":extra_time", 10, 21),
  11442. (val_add, ":move_time", ":extra_time"),
  11443. (agent_set_slot, ":herd_agent_id", slot_agent_animal_move_time, ":move_time"),
  11444. (try_end),
  11445. (try_end),
  11446. (try_end),
  11447. (set_trigger_result, ":damage_result"),
  11448. ]),
  11449.  
  11450. ("animal_react_to_attack", # server: handle specific animal reactions to being attacked, whether to charge or flee
  11451. [(store_script_param, ":attacker_agent_id", 1), # must be valid
  11452. (store_script_param, ":animal_agent_id", 2), # must be valid
  11453. (store_script_param, ":damage_dealt", 3),
  11454.  
  11455. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  11456. (try_begin),
  11457. (gt, ":animal_item_id", -1),
  11458. (set_fixed_point_multiplier, 100),
  11459. (agent_get_position, pos1, ":animal_agent_id"),
  11460. (agent_get_position, pos2, ":attacker_agent_id"),
  11461. (position_transform_position_to_local, pos3, pos2, pos1),
  11462. (position_normalize_origin, ":distance_to_animal", pos3),
  11463. (lt, ":distance_to_animal", max_distance_to_include_in_herd),
  11464. (item_get_slot, ":reaction", ":animal_item_id", slot_item_animal_attack_reaction),
  11465. (position_get_x, ":relative_x", pos3),
  11466. (position_get_y, ":relative_y", pos3),
  11467. (store_atan2, ":angle", ":relative_x", ":relative_y"),
  11468. (convert_from_fixed_point, ":angle"),
  11469. (val_mul, ":angle", -1),
  11470. (try_begin),
  11471. (eq, ":reaction", animal_reaction_charge),
  11472. (store_random_in_range, ":distance", 500, 700), # move past the targeted agent, so the animal charges through at speed
  11473. (try_begin),
  11474. (lt, ":distance_to_animal", 200),
  11475. (position_copy_rotation, pos1, pos2),
  11476. (else_try),
  11477. (copy_position, pos1, pos2),
  11478. (val_add, ":angle", 180),
  11479. (try_end),
  11480. (position_rotate_z, pos1, ":angle"),
  11481. (assign, ":speed", 100),
  11482. (else_try),
  11483. (eq, ":reaction", animal_reaction_flee),
  11484. (store_random_in_range, ":random_angle", -70, 71),
  11485. (position_copy_rotation, pos1, pos2),
  11486. (val_add, ":angle", ":random_angle"),
  11487. (position_rotate_z, pos1, ":angle"),
  11488. (store_agent_hit_points, ":max_multiplier", ":animal_agent_id", 0),
  11489. (store_sub, ":min_multiplier", ":max_multiplier", 50),
  11490. (assign, ":speed_limit", ":max_multiplier"),
  11491. (val_clamp, ":max_multiplier", 50, 100),
  11492. (val_clamp, ":min_multiplier", 25, 50),
  11493. (val_clamp, ":speed_limit", 25, 100),
  11494. (store_random_in_range, ":random_multiplier", ":min_multiplier", ":max_multiplier"),
  11495. (assign, ":distance", ":damage_dealt"),
  11496. (val_max, ":distance", 10),
  11497. (val_mul, ":distance", ":random_multiplier"),
  11498. (item_get_slot, ":wildness", ":animal_item_id", slot_item_animal_wildness),
  11499. (try_begin),
  11500. (gt, ":wildness", 0),
  11501. (store_mul, ":extra_distance", ":distance", ":wildness"),
  11502. (val_div, ":extra_distance", 10),
  11503. (val_add, ":distance", ":extra_distance"),
  11504. (try_end),
  11505. (val_max, ":wildness", 1),
  11506. (store_random_in_range, ":speed", ":wildness", 10),
  11507. (val_mul, ":speed", ":damage_dealt"),
  11508. (val_max, ":speed", ":speed_limit"),
  11509. (try_end),
  11510. (position_move_y, pos1, ":distance"),
  11511. (agent_set_speed_limit, ":animal_agent_id", ":speed"),
  11512. (agent_set_scripted_destination, ":animal_agent_id", pos1, 1),
  11513. (agent_force_rethink, ":animal_agent_id"),
  11514. (try_end),
  11515. ]),
  11516.  
  11517. ("check_agent_horse_speed_factor", # server: adjust riding speed for water, horse health, and the agent being overloaded by weapons or armor
  11518. [(store_script_param, ":agent_id", 1), # must be valid
  11519. (store_script_param, ":horse_agent_id", 2), # must be valid
  11520. (store_script_param, ":under_water", 3), # 1 if the horse is below water level
  11521.  
  11522. (store_agent_hit_points, ":speed_factor", ":horse_agent_id", 0), # horse speed corresponds to health
  11523. (try_begin), # underwater or attached to a cart, speed is clamped down below 50%
  11524. (agent_get_attached_scene_prop, ":attached_spr", ":horse_agent_id"),
  11525. (this_or_next|ge, ":under_water", 1),
  11526. (neq, ":attached_spr", -1),
  11527. (val_clamp, ":speed_factor", 20, 50),
  11528. (else_try), # otherwise, speed reduction for health is between 100% - 50%
  11529. (val_add, ":speed_factor", 50),
  11530. (val_min, ":speed_factor", 100),
  11531. (try_end),
  11532. (agent_get_slot, ":rider_speed_factor", ":agent_id", slot_agent_armor_speed_factor),
  11533. (agent_get_slot, ":weapon_speed_factor", ":agent_id", slot_agent_weapon_speed_factor),
  11534. (val_add, ":rider_speed_factor", ":weapon_speed_factor"),
  11535. (try_begin), # if the agent is using weapons or armor they don't meet requirements for, reduce the speed further
  11536. (gt, ":rider_speed_factor", 0),
  11537. (store_sub, ":rider_speed_factor", reduction_factor_base, ":rider_speed_factor"),
  11538. (val_div, ":rider_speed_factor", 2),
  11539. (val_min, ":speed_factor", ":rider_speed_factor"),
  11540. (val_max, ":speed_factor", 0),
  11541. (try_end),
  11542. (agent_set_horse_speed_factor, ":agent_id", ":speed_factor"),
  11543. (try_begin), # drop couchable lances if unusable, since the different attack method won't be detected by the normal check
  11544. (agent_slot_eq, ":agent_id", slot_agent_cannot_attack, 1),
  11545. (agent_get_wielded_item, ":item_id", ":agent_id", 0),
  11546. (neq, ":item_id", -1),
  11547. (item_slot_eq, ":item_id", slot_item_couchable, 1),
  11548. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  11549. (agent_get_position, pos1, ":agent_id"),
  11550. (set_spawn_position, pos1),
  11551. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  11552. (try_end),
  11553. ]),
  11554.  
  11555. ("check_remove_lost_horse", # server: remove horses that have strayed away from their last rider for a long time, to reduce server load
  11556. [(store_script_param, ":horse_agent_id", 1), # must be valid
  11557.  
  11558. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  11559. (try_begin),
  11560. (le, ":horse_item_id", -1),
  11561. (else_try),
  11562. (neg|item_slot_eq, ":horse_item_id", slot_item_animal_adult_item_id, 0),
  11563. (else_try),
  11564. (agent_get_slot, ":last_rider", ":horse_agent_id", slot_agent_horse_last_rider),
  11565. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  11566. (gt, ":rider_agent_id", -1),
  11567. (try_begin),
  11568. (neq, ":last_rider", ":rider_agent_id"),
  11569. (agent_set_slot, ":horse_agent_id", slot_agent_horse_last_rider, ":rider_agent_id"),
  11570. (try_end),
  11571. (call_script, "script_check_agent_horse_speed_factor", ":rider_agent_id", ":horse_agent_id", 0),
  11572. (else_try), # don't remove horses with carts attached
  11573. (agent_get_attached_scene_prop, ":attached_instance_id", ":horse_agent_id"),
  11574. (prop_instance_is_valid, ":attached_instance_id"),
  11575. (else_try),
  11576. (gt, ":last_rider", -1),
  11577. (try_begin),
  11578. (agent_is_active, ":last_rider"),
  11579. (agent_is_alive, ":last_rider"),
  11580. (agent_get_position, pos1, ":last_rider"),
  11581. (agent_get_position, pos2, ":horse_agent_id"),
  11582. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  11583. (le, ":sq_distance", sq(max_distance_horse_rider)),
  11584. (else_try),
  11585. (agent_set_slot, ":horse_agent_id", slot_agent_horse_last_rider, -1),
  11586. (agent_is_in_special_mode, ":horse_agent_id"),
  11587. (agent_clear_scripted_mode, ":horse_agent_id"),
  11588. (agent_force_rethink, ":horse_agent_id"),
  11589. (try_end),
  11590. (else_try), # negative last rider values count up the amount of checks while strayed
  11591. (le, ":last_rider", -20),
  11592. (store_item_value, ":horse_value", ":horse_item_id"),
  11593. (assign, ":kill", 1),
  11594. (try_begin),
  11595. (ge, ":horse_value", 5000),
  11596. (gt, ":last_rider", -60),
  11597. (assign, ":kill", 0),
  11598. (else_try),
  11599. (ge, ":horse_value", 2000),
  11600. (gt, ":last_rider", -40),
  11601. (assign, ":kill", 0),
  11602. (try_end),
  11603. (eq, ":kill", 1),
  11604. (agent_fade_out, ":horse_agent_id"),
  11605. (else_try),
  11606. (val_sub, ":last_rider", 1),
  11607. (agent_set_slot, ":horse_agent_id", slot_agent_horse_last_rider, ":last_rider"),
  11608. (try_end),
  11609. ]),
  11610.  
  11611. ("check_agent_drowning", # server: check whether the agent's mouth is below water level, dealing damage after a length of time
  11612. [(store_script_param, ":agent_id", 1), # must be valid
  11613.  
  11614. (try_begin),
  11615. (agent_is_alive, ":agent_id"),
  11616. (agent_get_troop_id, ":troop_id", ":agent_id"),
  11617. (neq, ":troop_id", "trp_godlike_hero"),
  11618. (agent_get_item_id, ":horse_item_id", ":agent_id"),
  11619. (neq, ":horse_item_id", "itm_admin_horse"),
  11620. (agent_get_position, pos1, ":agent_id"),
  11621. (agent_get_slot, ":drowning_count", ":agent_id", slot_agent_drowning_count),
  11622. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  11623. (assign, ":drown_height", -192),
  11624. (set_fixed_point_multiplier, 100),
  11625. (position_get_z, ":height", pos1),
  11626. (try_begin), # adjust for the angle of a horses's body making the head higher or lower
  11627. (gt, ":horse_item_id", -1),
  11628. (copy_position, pos2, pos1),
  11629. (position_move_y, pos2, 50),
  11630. (position_move_z, pos2, -200, 1),
  11631. (position_set_z_to_ground_level, pos2),
  11632. (position_get_z, ":horse_height", pos2),
  11633. (store_sub, ":horse_height_difference", ":horse_height", ":height"),
  11634. (val_abs, ":horse_height_difference"),
  11635. (lt, ":horse_height_difference", 100),
  11636. (assign, ":height", ":horse_height"),
  11637. (else_try), # if a rider, add the approximate height of the horse
  11638. (gt, ":horse_agent_id", -1),
  11639. (assign, ":drown_height", -275),
  11640. (else_try),
  11641. (agent_get_crouch_mode, ":is_crouched", ":agent_id"),
  11642. (eq, ":is_crouched", 1),
  11643. (assign, ":drown_height", -127),
  11644. (try_end),
  11645. (try_begin),
  11646. (le, ":height", ":drown_height"),
  11647. (assign, ":under_water", 1),
  11648. (agent_get_speed, pos4, ":agent_id"),
  11649. (position_get_y, ":forwards_speed", pos4),
  11650. (val_abs, ":forwards_speed"),
  11651. (val_div, ":forwards_speed", 200),
  11652. (val_add, ":forwards_speed", 1),
  11653. (val_add, ":drowning_count", ":forwards_speed"), # drown more quickly at higher speed
  11654. (agent_set_slot, ":agent_id", slot_agent_drowning_count, ":drowning_count"),
  11655. (store_sub, ":damage", ":drowning_count", 2),
  11656. (agent_get_troop_id, ":troop_id", ":agent_id"),
  11657. (store_skill_level, ":sailing_skill", "skl_sailing", ":troop_id"),
  11658. (val_div, ":sailing_skill", 4),
  11659. (val_sub, ":damage", ":sailing_skill"),
  11660. (try_begin),
  11661. (gt, ":damage", 1),
  11662. (val_mul, ":damage", ":damage"),
  11663. (try_begin),
  11664. (eq, "$g_full_respawn_health", 0),
  11665. (val_mul, ":damage", 2),
  11666. (try_end),
  11667. (store_agent_hit_points, ":original_hit_points", ":agent_id", 1),
  11668. (store_sub, ":hit_points", ":original_hit_points", ":damage"),
  11669. (agent_deliver_damage_to_agent, ":agent_id", ":agent_id", 5),
  11670. (agent_set_hit_points, ":agent_id", ":hit_points", 1),
  11671. (try_begin),
  11672. (gt, ":original_hit_points", 5),
  11673. (try_begin),
  11674. (agent_is_human, ":agent_id"),
  11675. (agent_get_player_id, ":player_id", ":agent_id"),
  11676. (try_begin),
  11677. (player_is_active, ":player_id"),
  11678. (player_get_gender, ":gender", ":player_id"),
  11679. (eq, ":gender", tf_female),
  11680. (agent_play_sound, ":agent_id", "snd_woman_drown"),
  11681. (else_try),
  11682. (agent_play_sound, ":agent_id", "snd_man_drown"),
  11683. (try_end),
  11684. (else_try),
  11685. (item_slot_eq, ":horse_item_id", slot_item_animal_adult_item_id, 0),
  11686. (agent_play_sound, ":agent_id", "snd_horse_low_whinny"),
  11687. (try_end),
  11688. (try_end),
  11689. (try_end),
  11690. (else_try),
  11691. (assign, ":under_water", 0),
  11692. (gt, ":drowning_count", 0),
  11693. (agent_set_slot, ":agent_id", slot_agent_drowning_count, 0),
  11694. (try_begin),
  11695. (agent_is_human, ":agent_id"),
  11696. (agent_play_sound, ":agent_id", "snd_man_cough"),
  11697. (else_try),
  11698. (agent_play_sound, ":agent_id", "snd_horse_snort"),
  11699. (try_end),
  11700. (try_end),
  11701. (try_begin),
  11702. (neq, ":horse_agent_id", -1),
  11703. (call_script, "script_check_agent_horse_speed_factor", ":agent_id", ":horse_agent_id", ":under_water"),
  11704. (try_end),
  11705. (try_end),
  11706. ]),
  11707.  
  11708. ("setup_ship", # server: spawn the necessary parts for a ship at mission start
  11709. [(store_script_param, ":hull_instance_id", 1), # must be valid
  11710.  
  11711. (troop_get_slot, ":ship_array_count", "trp_ship_array", 0),
  11712. (val_add, ":ship_array_count", 1),
  11713. (troop_set_slot, "trp_ship_array", ":ship_array_count", ":hull_instance_id"),
  11714. (troop_set_slot, "trp_ship_array", 0, ":ship_array_count"),
  11715. (try_begin),
  11716. (multiplayer_is_server),
  11717. (neq, "$g_edit_scene", 1),
  11718. (store_script_param, ":sail_scene_prop_id", 2),
  11719. (store_script_param, ":sail_off_scene_prop_id", 3),
  11720. (store_script_param, ":ramp_scene_prop_id", 4),
  11721. (store_script_param, ":hold_scene_prop_id", 5),
  11722. (prop_instance_get_position, pos1, ":hull_instance_id"),
  11723. (try_begin),
  11724. (gt, ":sail_scene_prop_id", -1),
  11725. (copy_position, pos2, pos1),
  11726. (position_set_z, pos2, z_position_to_hide_object),
  11727. (set_spawn_position, pos2),
  11728. (spawn_scene_prop, ":sail_scene_prop_id"),
  11729. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail, reg0),
  11730. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  11731. (else_try),
  11732. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail, -1),
  11733. (try_end),
  11734. (try_begin),
  11735. (gt, ":sail_off_scene_prop_id", -1),
  11736. (set_spawn_position, pos1),
  11737. (spawn_scene_prop, ":sail_off_scene_prop_id"),
  11738. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail_off, reg0),
  11739. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  11740. (else_try),
  11741. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail_off, -1),
  11742. (try_end),
  11743. (try_begin),
  11744. (gt, ":ramp_scene_prop_id", -1),
  11745. (prop_instance_get_variation_id, ":ramp_start_position", ":hull_instance_id"),
  11746. (try_begin),
  11747. (gt, ":ramp_start_position", 1),
  11748. (assign, ":ramp_start_position", -1),
  11749. (try_end),
  11750. (call_script, "script_ship_get_ramp_relative_position", ":ramp_start_position", 1),
  11751. (position_transform_position_to_parent, pos2, pos1, pos30),
  11752. (set_spawn_position, pos2),
  11753. (spawn_scene_prop, ":ramp_scene_prop_id"),
  11754. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_ramp, reg0),
  11755. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  11756. (scene_prop_set_slot, reg0, slot_scene_prop_position, ":ramp_start_position"),
  11757. (else_try),
  11758. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_ramp, -1),
  11759. (try_end),
  11760. (try_begin),
  11761. (gt, ":hold_scene_prop_id", -1),
  11762. (set_spawn_position, pos1),
  11763. (spawn_scene_prop, ":hold_scene_prop_id"),
  11764. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_hold, reg0),
  11765. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  11766. (else_try),
  11767. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_hold, -1),
  11768. (try_end),
  11769. (scene_prop_get_slot, ":cd_scene_prop_id", ":hull_instance_id", slot_scene_prop_collision_kind),
  11770. (try_begin),
  11771. (gt, ":cd_scene_prop_id", -1),
  11772. (scene_prop_get_num_instances, ":num_instances", ":cd_scene_prop_id"),
  11773. (lt, ":num_instances", 2),
  11774. (init_position, pos1),
  11775. (position_set_z, pos1, z_position_to_hide_object),
  11776. (set_spawn_position, pos1),
  11777. (spawn_scene_prop, ":cd_scene_prop_id"),
  11778. (spawn_scene_prop, ":cd_scene_prop_id"),
  11779. (try_end),
  11780. (try_end),
  11781. #RAMARAUNT ADD sink the ship (so you have to build it)
  11782. (scene_prop_get_slot, ":hit_points",":hull_instance_id", slot_scene_prop_full_hit_points),
  11783. (try_begin),
  11784. (call_script, "script_cf_damage_ship", ":hull_instance_id", ":hit_points", ":hit_points", 1),
  11785. (try_end),
  11786.  
  11787.  
  11788. ]),
  11789.  
  11790. ("agent_get_ship_station", # check if an agent is within the correct area on a ship to operate one of the stations; reg0 = constant starting with ship_station_
  11791. [(store_script_param, ":agent_id", 1), # must be valid
  11792. (store_script_param, ":instance_id", 2), # must be valid
  11793.  
  11794. (assign, ":station", ship_station_not_on_ship),
  11795. (try_begin),
  11796. (agent_is_active, ":agent_id"),
  11797. (agent_is_alive, ":agent_id"),
  11798. (scene_prop_has_agent_on_it, ":instance_id", ":agent_id"),
  11799. (assign, ":station", ship_station_none),
  11800. (prop_instance_get_position, pos1, ":instance_id"),
  11801. (agent_get_position, pos20, ":agent_id"),
  11802. (position_transform_position_to_local, pos21, pos1, pos20),
  11803. (set_fixed_point_multiplier, 100),
  11804. (position_get_x, ":x_pos", pos21),
  11805. (position_get_y, ":y_pos", pos21),
  11806. (position_get_z, ":z_pos", pos21),
  11807. (is_between, ":y_pos", -150, 150),
  11808. (try_begin),
  11809. (is_between, ":x_pos", -50, 250),
  11810. (assign, ":station", ship_station_mast),
  11811. (else_try),
  11812. (scene_prop_get_slot, ":hull_length", ":instance_id", slot_scene_prop_length),
  11813. (val_mul, ":hull_length", -1),
  11814. (lt, ":x_pos", ":hull_length"),
  11815. (lt, ":z_pos", 500),
  11816. (assign, ":station", ship_station_rudder),
  11817. (try_end),
  11818. (try_end),
  11819. (assign, reg0, ":station"),
  11820. ]),
  11821.  
  11822. ("ship_get_ramp_relative_position", # return the relative position of a ramp on a ship in pos30, for use with position_transform_position_to_parent
  11823. [(store_script_param, ":ramp_target", 1), # 0 = middle, -1 = left, 1 = right
  11824. (store_script_param, ":match_ground", 2), # 1 = try to angle the ramp down so the end meets ground level
  11825.  
  11826. (init_position, pos30),
  11827. (try_begin),
  11828. (position_move_x, pos30, 200),
  11829. (try_begin),
  11830. (eq, ":ramp_target", 0),
  11831. (position_move_z, pos30, 220),
  11832. (position_rotate_y, pos30, -3),
  11833. (else_try),
  11834. (position_move_z, pos30, 305),
  11835. (copy_position, pos31, pos30),
  11836. (try_begin),
  11837. (gt, ":ramp_target", 0),
  11838. (position_move_y, pos30, 500),
  11839. (position_move_y, pos31, 1250),
  11840. (position_rotate_z, pos30, 90),
  11841. (else_try),
  11842. (position_move_y, pos30, -500),
  11843. (position_move_y, pos31, -1250),
  11844. (position_rotate_z, pos30, -90),
  11845. (try_end),
  11846. (try_begin),
  11847. (eq, ":match_ground", 1),
  11848. (position_transform_position_to_parent, pos32, pos1, pos31),
  11849. (position_move_z, pos32, 500),
  11850. (set_fixed_point_multiplier, 100),
  11851. (position_get_distance_to_ground_level, ":ground_clearance", pos32),
  11852. (val_sub, ":ground_clearance", 500),
  11853. (lt, ":ground_clearance", 750),
  11854. (assign, ":clearance_ramp", ":ground_clearance"),
  11855. (val_abs, ":clearance_ramp"),
  11856. (convert_to_fixed_point, ":clearance_ramp"),
  11857. (val_div, ":clearance_ramp", 750),
  11858. (store_asin, ":ramp_angle", ":clearance_ramp"),
  11859. (convert_from_fixed_point, ":ramp_angle"),
  11860. (val_min, ":ramp_angle", 50),
  11861. (try_begin),
  11862. (lt, ":ground_clearance", 0),
  11863. (val_mul, ":ramp_angle", -1),
  11864. (try_end),
  11865. (position_rotate_y, pos30, ":ramp_angle"),
  11866. (try_end),
  11867. (try_end),
  11868. (try_end),
  11869. ]),
  11870.  
  11871. ("use_ship_ramp", # server: move a ship's ramp to a different position, based on the relative position of the agent to the ramp
  11872. [(store_script_param, ":agent_id", 1), # must be valid
  11873. (store_script_param, ":instance_id", 2), # must be valid
  11874.  
  11875. (prop_instance_get_position, pos1, ":instance_id"),
  11876. (agent_get_position, pos2, ":agent_id"),
  11877. (scene_prop_get_slot, ":hull_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  11878. (scene_prop_get_slot, ":ramp_position", ":instance_id", slot_scene_prop_target_position),
  11879. (assign, ":ramp_target", ":ramp_position"),
  11880. (try_begin),
  11881. (eq, ":ramp_position", 0),
  11882. (position_transform_position_to_local, pos3, pos1, pos2),
  11883. (position_get_y, ":y_pos", pos3),
  11884. (try_begin),
  11885. (lt, ":y_pos", 0),
  11886. (assign, ":ramp_target", 1),
  11887. (else_try),
  11888. (assign, ":ramp_target", -1),
  11889. (try_end),
  11890. (else_try), # don't allow agents off the ship to withdraw the ramp
  11891. (scene_prop_has_agent_on_it, ":hull_instance_id", ":agent_id"),
  11892. (assign, ":ramp_target", 0),
  11893. (try_end),
  11894. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, ":ramp_target"),
  11895. ]),
  11896.  
  11897. ("cf_check_ship_climb_side", # server and clients: check if the agent is near enough to climb on the ship, performing the movement if the server
  11898. [(store_script_param, ":agent_id", 1), # must be valid
  11899. (store_script_param, ":instance_id", 2), # must be valid
  11900.  
  11901. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  11902. (set_fixed_point_multiplier, 100),
  11903. (prop_instance_get_position, pos1, ":instance_id"),
  11904. (agent_get_position, pos2, ":agent_id"),
  11905. (position_transform_position_to_local, pos3, pos1, pos2),
  11906. (position_get_x, ":relative_x", pos3),
  11907. (scene_prop_get_slot, ":hull_length", ":instance_id", slot_scene_prop_length),
  11908. (store_mul, ":neg_hull_length", ":hull_length", -1),
  11909. (is_between, ":relative_x", ":neg_hull_length", ":hull_length"),
  11910. (position_get_y, ":relative_y", pos3),
  11911. (scene_prop_get_slot, ":hull_width", ":instance_id", slot_scene_prop_width),
  11912. (store_mul, ":neg_hull_width", ":hull_width", -1),
  11913. (neg|is_between, ":relative_y", ":neg_hull_width", ":hull_width"),
  11914. (store_add, ":climb_width", ":hull_width", 300),
  11915. (store_mul, ":neg_climb_width", ":climb_width", -1),
  11916. (is_between, ":relative_y", ":neg_climb_width", ":climb_width"),
  11917. (try_begin),
  11918. (multiplayer_is_server),
  11919. (try_begin),
  11920. (gt, ":relative_y", 0),
  11921. (position_set_y, pos3, ":hull_width"),
  11922. (else_try),
  11923. (position_set_y, pos3, ":neg_hull_width"),
  11924. (try_end),
  11925. (position_set_z, pos3, 300),
  11926. (position_transform_position_to_parent, pos4, pos1, pos3),
  11927. (agent_set_position, ":agent_id", pos4),
  11928. (try_end),
  11929. ]),
  11930.  
  11931. ("cf_client_check_control_ship", # clients: check for keys pressed when at the correct areas of a ship, sending the commands to the server
  11932. [
  11933. (multiplayer_get_my_player, ":my_player_id"),
  11934. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  11935. (agent_is_active, ":my_agent_id"),
  11936. (agent_is_alive, ":my_agent_id"),
  11937. (troop_get_slot, ":ship_array_count", "trp_ship_array", 0),
  11938. (store_add, ":ship_array_end", ":ship_array_count", 1),
  11939. (assign, ":climb_instance_id", -1),
  11940. (try_for_range, ":ship_no", 1, ":ship_array_end"),
  11941. (troop_get_slot, ":hull_instance_id", "trp_ship_array", ":ship_no"),
  11942. (call_script, "script_agent_get_ship_station", ":my_agent_id", ":hull_instance_id"),
  11943. (try_begin),
  11944. (eq, reg0, ship_station_not_on_ship),
  11945. (key_clicked, key_up),
  11946. (call_script, "script_cf_check_ship_climb_side", ":my_agent_id", ":hull_instance_id"),
  11947. (assign, ":climb_instance_id", ":hull_instance_id"),
  11948. (try_end),
  11949. (gt, reg0, ship_station_not_on_ship),
  11950. (assign, ":station", reg0),
  11951. (assign, ":forwards", 0),
  11952. (assign, ":rotation", 0),
  11953. (assign, ":fail", 0),
  11954. (try_begin),
  11955. (eq, ":station", ship_station_mast),
  11956. (try_begin),
  11957. (key_clicked, key_up),
  11958. (assign, ":forwards", 1),
  11959. (else_try),
  11960. (key_clicked, key_down),
  11961. (assign, ":forwards", -1),
  11962. (try_end),
  11963. (else_try),
  11964. (eq, ":station", ship_station_rudder),
  11965. (try_begin),
  11966. (key_clicked, key_left),
  11967. (assign, ":rotation", 1),
  11968. (else_try),
  11969. (key_clicked, key_right),
  11970. (assign, ":rotation", -1),
  11971. (try_end),
  11972. (else_try),
  11973. (assign, ":fail", 1),
  11974. (call_script, "script_preset_message", "str_not_at_mast_or_rudder", preset_message_error, 0, 0),
  11975. (try_end),
  11976. (eq, ":fail", 0),
  11977. (multiplayer_send_3_int_to_server, client_event_control_scene_prop, ":hull_instance_id", ":forwards", ":rotation"),
  11978. (assign, ":ship_array_end", -1),
  11979. (try_end),
  11980. (try_begin),
  11981. (neq, ":ship_array_end", -1),
  11982. (neq, ":climb_instance_id", -1),
  11983. (multiplayer_send_2_int_to_server, client_event_control_scene_prop, ":climb_instance_id", 1),
  11984. (try_end),
  11985. (eq, ":ship_array_end", -1),
  11986. ]),
  11987.  
  11988. ("cf_control_ship", # server: handle player requests to control a ship
  11989. [(store_script_param, ":player_id", 1),
  11990. (store_script_param, ":instance_id", 2), # must be valid
  11991. (store_script_param, ":forwards", 3),
  11992. (store_script_param, ":rotation", 4),
  11993.  
  11994. (val_clamp, ":forwards", -1, 2),
  11995. (val_clamp, ":rotation", -1, 2),
  11996. (player_is_active, ":player_id"),
  11997. (player_get_agent_id, ":agent_id", ":player_id"),
  11998. (agent_is_alive, ":agent_id"),
  11999. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  12000. (try_begin),
  12001. (call_script, "script_agent_get_ship_station", ":agent_id", ":instance_id"),
  12002. (try_begin),
  12003. (eq, reg0, ship_station_not_on_ship),
  12004. (eq, ":forwards", 1),
  12005. (call_script, "script_cf_check_ship_climb_side", ":agent_id", ":instance_id"),
  12006. (try_end),
  12007. (gt, reg0, ship_station_not_on_ship),
  12008. (assign, ":station", reg0),
  12009. (try_begin),
  12010. (eq, ":station", ship_station_mast),
  12011. (try_begin),
  12012. (neq, ":forwards", 0),
  12013. (scene_prop_get_slot, ":current_forwards", ":instance_id", slot_scene_prop_target_position),
  12014. (val_add, ":current_forwards", ":forwards"),
  12015. (scene_prop_get_slot, ":speed_limit", ":instance_id", slot_scene_prop_speed_limit),
  12016. (val_clamp, ":current_forwards", -1, ":speed_limit"),
  12017. (agent_get_troop_id, ":troop_id", ":agent_id"),
  12018. (store_skill_level, ":sailing_skill", "skl_sailing", ":troop_id"),
  12019. (val_max, ":sailing_skill", 1),
  12020. (ge, ":sailing_skill", ":current_forwards"),
  12021. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, ":current_forwards"),
  12022. (try_end),
  12023. (else_try),
  12024. (eq, ":station", ship_station_rudder),
  12025. (scene_prop_set_slot, ":instance_id", slot_scene_prop_controlling_agent, ":agent_id"),
  12026. (try_begin),
  12027. (eq, ":rotation", 0),
  12028. (eq, ":forwards", 0),
  12029. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_rotation, 0),
  12030. (else_try),
  12031. (scene_prop_get_slot, ":current_rotation", ":instance_id", slot_scene_prop_target_rotation),
  12032. (val_add, ":current_rotation", ":rotation"),
  12033. (val_clamp, ":current_rotation", -ship_rotation_maximum, ship_rotation_maximum + 1),
  12034. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_rotation, ":current_rotation"),
  12035. (try_end),
  12036. (try_end),
  12037. (try_end),
  12038. (gt, reg0, ship_station_not_on_ship),
  12039. ]),
  12040.  
  12041. ("move_ship", # server: animate movement of all ship parts together, also handling collision detection
  12042. [(store_script_param, ":hull_instance_id", 1), # must be valid
  12043.  
  12044. (scene_prop_get_slot, ":ramp_instance_id", ":hull_instance_id", slot_scene_prop_linked_ramp),
  12045. (scene_prop_get_slot, ":forwards", ":hull_instance_id", slot_scene_prop_position),
  12046. (scene_prop_get_slot, ":target_forwards", ":hull_instance_id", slot_scene_prop_target_position),
  12047. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_position, ":target_forwards"),
  12048. (try_begin),
  12049. (neq, ":forwards", 0), # ship is moving
  12050. (set_fixed_point_multiplier, 100),
  12051. (prop_instance_get_position, pos1, ":hull_instance_id"),
  12052. (assign, ":crashed", 0),
  12053. (scene_prop_get_slot, ":cd_scene_prop_id", ":hull_instance_id", slot_scene_prop_collision_kind),
  12054. (scene_prop_get_instance, ":cd_instance_id", ":cd_scene_prop_id", 0),
  12055. (prop_instance_set_position, ":cd_instance_id", pos1, 1),
  12056. (init_position, pos4),
  12057. (position_set_z, pos4, z_position_to_hide_object),
  12058. (troop_get_slot, ":ship_array_end", "trp_ship_array", 0),
  12059. (val_add, ":ship_array_end", 1),
  12060. (try_for_range, ":ship_array_slot", 1, ":ship_array_end"), # check collision with other ships
  12061. (troop_get_slot, ":other_hull_instance_id", "trp_ship_array", ":ship_array_slot"),
  12062. (neq, ":other_hull_instance_id", ":hull_instance_id"),
  12063. (scene_prop_get_slot, ":other_forwards", ":other_hull_instance_id", slot_scene_prop_position),
  12064. (assign, ":continue", 1),
  12065. (try_begin), # only check if the other ship is moving or it is later in the list (hasn't been moved and checked itself yet)
  12066. (eq, ":other_forwards", 0),
  12067. (else_try),
  12068. (gt, ":ship_array_slot", "$g_loop_ship_to_check"),
  12069. (else_try),
  12070. (assign, ":continue", 0),
  12071. (try_end),
  12072. (eq, ":continue", 1),
  12073. (scene_prop_get_slot, ":other_cd_scene_prop_id", ":other_hull_instance_id", slot_scene_prop_collision_kind),
  12074. (scene_prop_get_instance, ":other_cd_instance_id", ":other_cd_scene_prop_id", 1), # use primitive collision detecting meshes
  12075. (prop_instance_get_position, pos2, ":other_hull_instance_id"),
  12076. (prop_instance_set_position, ":other_cd_instance_id", pos2, 1),
  12077. (try_begin),
  12078. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":other_cd_instance_id"),
  12079. (copy_position, pos2, pos1),
  12080. (scene_prop_get_slot, ":speed_limit", ":hull_instance_id", slot_scene_prop_speed_limit),
  12081. (store_mul, ":max_distance", ":speed_limit", ship_forwards_multiplier),
  12082. (try_begin),
  12083. (le, ":forwards", -1),
  12084. (val_mul, ":max_distance", -1),
  12085. (try_end),
  12086. (position_move_x, pos2, ":max_distance"),
  12087. (prop_instance_set_position, ":cd_instance_id", pos2, 1),
  12088. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":other_cd_instance_id"),
  12089. (assign, ":crashed", 1),
  12090. (assign, ":ship_array_end", -1),
  12091. (try_end),
  12092. (prop_instance_set_position, ":other_cd_instance_id", pos4, 1),
  12093. (try_end),
  12094. (try_begin),
  12095. (eq, ":crashed", 0),
  12096. (troop_get_slot, ":collision_props_count", "trp_ship_array", slot_ship_array_collision_props_count),
  12097. (store_add, ":collision_props_end", slot_ship_array_collision_props_begin, ":collision_props_count"),
  12098. (try_for_range, ":collision_prop_slot", slot_ship_array_collision_props_begin, ":collision_props_end"), # check collision with the list of static props near water
  12099. (troop_get_slot, ":collision_instance_id", "trp_ship_array", ":collision_prop_slot"),
  12100. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":collision_instance_id"),
  12101. (copy_position, pos2, pos1),
  12102. (scene_prop_get_slot, ":speed_limit", ":hull_instance_id", slot_scene_prop_speed_limit),
  12103. (store_mul, ":max_distance", ":speed_limit", ship_forwards_multiplier),
  12104. (try_begin),
  12105. (le, ":forwards", -1),
  12106. (val_mul, ":max_distance", -1),
  12107. (try_end),
  12108. (position_move_x, pos2, ":max_distance"),
  12109. (prop_instance_set_position, ":cd_instance_id", pos2, 1),
  12110. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":collision_instance_id"),
  12111. (assign, ":crashed", 1),
  12112. (assign, ":collision_props_end", -1),
  12113. (try_end),
  12114. (try_end),
  12115. (prop_instance_set_position, ":cd_instance_id", pos4, 1),
  12116. (scene_prop_get_slot, ":ship_length", ":hull_instance_id", slot_scene_prop_length),
  12117. (init_position, pos4),
  12118. (try_begin),
  12119. (gt, ":forwards", 0),
  12120. (position_move_x, pos4, ":ship_length"),
  12121. (else_try),
  12122. (val_mul, ":ship_length", -1),
  12123. (position_move_x, pos4, ":ship_length"),
  12124. (try_end),
  12125. (position_transform_position_to_parent, pos5, pos1, pos4),
  12126. (try_begin), # check collision with the terrain
  12127. (eq, ":crashed", 0),
  12128. (copy_position, pos6, pos5),
  12129. (position_get_distance_to_terrain, ":ground_clearance", pos6),
  12130. (scene_prop_get_slot, ":hull_clearance", ":hull_instance_id", slot_scene_prop_height),
  12131. (gt, ":ground_clearance", ":hull_clearance"),
  12132. (else_try),
  12133. (assign, ":crashed", 1),
  12134. (gt, ":forwards", 1), # don't apply any terrain collision damage at the slowest speed
  12135. (copy_position, pos3, pos1),
  12136. (copy_position, pos1, pos5),
  12137. (store_sub, ":damage", ":forwards", 1),
  12138. (val_mul, ":damage", ":damage"),
  12139. (val_mul, ":damage", 100),
  12140. (try_begin),
  12141. (call_script, "script_cf_damage_ship", ":hull_instance_id", ":damage", 0, 1),
  12142. (eq, ":ship_array_end", -1),
  12143. (call_script, "script_cf_damage_ship", ":other_hull_instance_id", ":damage", 0, 1),
  12144. (try_end),
  12145. (copy_position, pos1, pos3),
  12146. (try_end),
  12147. (try_begin),
  12148. (eq, ":crashed", 0), # stop without damage at the scene boundaries
  12149. (get_scene_boundaries, pos7, pos8),
  12150. (position_get_x, ":hull_end_x", pos5),
  12151. (position_get_x, ":scene_min_x", pos7),
  12152. (gt, ":hull_end_x", ":scene_min_x"),
  12153. (position_get_y, ":hull_end_y", pos5),
  12154. (position_get_y, ":scene_min_y", pos7),
  12155. (gt, ":hull_end_y", ":scene_min_y"),
  12156. (position_get_x, ":scene_max_x", pos8),
  12157. (lt, ":hull_end_x", ":scene_max_x"),
  12158. (position_get_y, ":scene_max_y", pos8),
  12159. (lt, ":hull_end_y", ":scene_max_y"),
  12160. (else_try),
  12161. (assign, ":crashed", 1),
  12162. (try_end),
  12163. (try_begin),
  12164. (eq, ":crashed", 1),
  12165. (assign, ":target_forwards", 0),
  12166. (assign, ":forwards", 0),
  12167. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_position, 0),
  12168. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_position, 0),
  12169. (copy_position, pos3, pos1),
  12170. (else_try),
  12171. (init_position, pos2),
  12172. (store_mul, ":distance", ":forwards", ship_forwards_multiplier),
  12173. (position_move_x, pos2, ":distance"),
  12174. (scene_prop_get_slot, ":rotation", ":hull_instance_id", slot_scene_prop_target_rotation),
  12175. (try_begin),
  12176. (neq, ":rotation", 0),
  12177. (scene_prop_get_slot, ":agent_id", ":hull_instance_id", slot_scene_prop_controlling_agent),
  12178. (call_script, "script_agent_get_ship_station", ":agent_id", ":hull_instance_id"),
  12179. (try_begin), # only keep the rudder setting while the steering agent stays there
  12180. (neq, reg0, ship_station_rudder),
  12181. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_rotation, 0),
  12182. (try_end),
  12183. (eq, reg0, ship_station_rudder),
  12184. (assign, ":forwards_multiplier", ":forwards"),
  12185. (val_abs, ":forwards_multiplier"),
  12186. (store_mul, ":move_sideways", ":rotation", ":forwards_multiplier"),
  12187. (position_move_y, pos2, ":move_sideways"),
  12188. (store_mul, ":fore_side_ratio", ":move_sideways", ship_rotation_multiplier),
  12189. (convert_to_fixed_point, ":fore_side_ratio"),
  12190. (val_div, ":fore_side_ratio", ":distance"),
  12191. (val_abs, ":fore_side_ratio"),
  12192. (store_atan, ":rotate_angle", ":fore_side_ratio"),
  12193. (convert_from_fixed_point, ":rotate_angle"),
  12194. (try_begin), # the rotation was converted to positive for the trigonometry calculations, convert it back if necessary
  12195. (this_or_next|is_between, 0, ":rotation", ":forwards"),
  12196. (is_between, 0, ":forwards", ":rotation"),
  12197. (val_mul, ":rotate_angle", -1),
  12198. (try_end),
  12199. (position_rotate_z, pos2, ":rotate_angle"),
  12200. (try_end),
  12201. (position_transform_position_to_parent, pos3, pos1, pos2),
  12202. (prop_instance_animate_to_position, ":hull_instance_id", pos3, 100),
  12203. (scene_prop_get_slot, ":hold_instance_id", ":hull_instance_id", slot_scene_prop_linked_hold),
  12204. (try_begin),
  12205. (neq, ":hold_instance_id", -1),
  12206. (prop_instance_animate_to_position, ":hold_instance_id", pos3, 100),
  12207. (try_end),
  12208. (try_end),
  12209. (try_begin),
  12210. (gt, ":target_forwards", 0),
  12211. (scene_prop_get_slot, ":active_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail),
  12212. (scene_prop_get_slot, ":inactive_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail_off),
  12213. (else_try),
  12214. (scene_prop_get_slot, ":active_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail_off),
  12215. (scene_prop_get_slot, ":inactive_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail),
  12216. (try_end),
  12217. (try_begin),
  12218. (neq, ":active_sail_instance_id", -1),
  12219. (prop_instance_set_position, ":active_sail_instance_id", pos1),
  12220. (eq, ":crashed", 0),
  12221. (prop_instance_enable_physics, ":active_sail_instance_id", 1),
  12222. (prop_instance_animate_to_position, ":active_sail_instance_id", pos3, 100),
  12223. (try_end),
  12224. (try_begin),
  12225. (neq, ":inactive_sail_instance_id", -1),
  12226. (neg|scene_prop_slot_eq, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  12227. (init_position, pos4),
  12228. (position_set_z, pos4, z_position_to_hide_object),
  12229. (prop_instance_stop_animating, ":inactive_sail_instance_id"),
  12230. (prop_instance_set_position, ":inactive_sail_instance_id", pos4),
  12231. (prop_instance_enable_physics, ":inactive_sail_instance_id", 0),
  12232. (try_end),
  12233. (try_end),
  12234. (try_begin), # animate the ramp if necessary, even if the ship is not moving
  12235. (neq, ":ramp_instance_id", -1),
  12236. (scene_prop_get_slot, ":ramp_target", ":ramp_instance_id", slot_scene_prop_target_position),
  12237. (assign, ":continue", 1),
  12238. (try_begin),
  12239. (neq, ":forwards", 0),
  12240. (assign, ":match_ground", 0),
  12241. (else_try),
  12242. (scene_prop_get_slot, ":ramp_position", ":ramp_instance_id", slot_scene_prop_position),
  12243. (neq, ":ramp_position", ":ramp_target"),
  12244. (prop_instance_get_position, pos3, ":hull_instance_id"),
  12245. (assign, ":match_ground", 1),
  12246. (else_try),
  12247. (assign, ":continue", 0),
  12248. (try_end),
  12249. (eq, ":continue", 1),
  12250. (call_script, "script_ship_get_ramp_relative_position", ":ramp_target", ":match_ground"),
  12251. (position_transform_position_to_parent, pos5, pos3, pos30),
  12252. (prop_instance_animate_to_position, ":ramp_instance_id", pos5, 100),
  12253. (scene_prop_set_slot, ":ramp_instance_id", slot_scene_prop_position, ":ramp_target"),
  12254. (try_end),
  12255. ]),
  12256.  
  12257. ("animate_ship_parts", # server: animate the ship parts together to pos20
  12258. [(store_script_param, ":instance_id", 1), # must be valid
  12259. (store_script_param, ":animation_time", 2),
  12260.  
  12261. (set_fixed_point_multiplier, 100),
  12262. (prop_instance_get_position, pos22, ":instance_id"),
  12263. (prop_instance_animate_to_position, ":instance_id", pos20, ":animation_time"),
  12264. (copy_position, pos21, pos20),
  12265. (position_set_z, pos21, z_position_to_hide_object),
  12266. (scene_prop_get_slot, ":sail_instance_id", ":instance_id", slot_scene_prop_linked_sail),
  12267. (try_begin),
  12268. (neq, ":sail_instance_id", -1),
  12269. (prop_instance_enable_physics, ":sail_instance_id", 0),
  12270. (prop_instance_stop_animating, ":sail_instance_id"),
  12271. (prop_instance_animate_to_position, ":sail_instance_id", pos21, ":animation_time"),
  12272. (try_end),
  12273. (scene_prop_get_slot, ":sail_off_instance_id", ":instance_id", slot_scene_prop_linked_sail_off),
  12274. (try_begin),
  12275. (neq, ":sail_off_instance_id", -1),
  12276. (prop_instance_stop_animating, ":sail_off_instance_id"),
  12277. (prop_instance_set_position, ":sail_off_instance_id", pos22),
  12278. (prop_instance_enable_physics, ":sail_off_instance_id", 1),
  12279. (prop_instance_animate_to_position, ":sail_off_instance_id", pos20, ":animation_time"),
  12280. (try_end),
  12281. (scene_prop_get_slot, ":ramp_instance_id", ":instance_id", slot_scene_prop_linked_ramp),
  12282. (try_begin),
  12283. (neq, ":ramp_instance_id", -1),
  12284. (prop_instance_animate_to_position, ":ramp_instance_id", pos20, ":animation_time"),
  12285. (try_end),
  12286. (scene_prop_get_slot, ":hold_instance_id", ":instance_id", slot_scene_prop_linked_hold),
  12287. (try_begin),
  12288. (neq, ":hold_instance_id", -1),
  12289. (prop_instance_animate_to_position, ":hold_instance_id", pos20, ":animation_time"),
  12290. (try_end),
  12291. ]),
  12292.  
  12293. ("cf_damage_ship", # server: apply damage or repairs to the ship, whether from an agent or from crashing
  12294. [(multiplayer_is_server),
  12295. (store_script_param, ":instance_id", 1), # must be valid
  12296. (store_script_param, ":hit_damage", 2),
  12297. (store_script_param, ":full_hit_points", 3),
  12298. (store_script_param, ":script_damage", 4), # 0 = called from ti_on_scene_prop_hit, 1 = apply the damage manually
  12299.  
  12300. (try_begin),
  12301. (eq, ":script_damage", 1),
  12302. (assign, ":agent_id", -1),
  12303. (else_try),
  12304. (set_fixed_point_multiplier, 1),
  12305. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  12306. (try_end),
  12307. (set_fixed_point_multiplier, 100),
  12308. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, ":script_damage"),
  12309. (assign, ":result", reg0),
  12310. (assign, ":hit_points", reg1),
  12311. (try_begin),
  12312. (eq, ":result", repairable_hit),
  12313. (try_begin),
  12314. (eq, ":script_damage", 1),
  12315. (particle_system_burst, "psys_dummy_smoke_big", pos1, 2),
  12316. (particle_system_burst, "psys_dummy_straw_big", pos1, 2),
  12317. (copy_position, pos0, pos1),
  12318. (call_script, "script_play_sound_at_position", "snd_damage_ship"),
  12319. (else_try),
  12320. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  12321. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  12322. (try_end),
  12323. (else_try),
  12324. (eq, ":result", repairable_destroyed),
  12325. (prop_instance_get_position, pos20, ":instance_id"),
  12326. (position_get_distance_to_ground_level, ":sinking_time", pos20),
  12327. (position_set_z_to_ground_level, pos20),
  12328. (position_rotate_x, pos20, 40),
  12329. (val_mul, ":sinking_time", 2),
  12330. (call_script, "script_animate_ship_parts", ":instance_id", ":sinking_time"),
  12331. (store_mission_timer_a, ":time"),
  12332. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  12333. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state_time, ":time"),
  12334. (scene_prop_set_slot, ":instance_id", slot_scene_prop_position, 0),
  12335. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, 0),
  12336. (call_script, "script_scene_prop_play_sound", ":instance_id", "snd_cut_wood_break"),
  12337. (else_try),
  12338. (eq, ":result", repairable_repairing),
  12339. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  12340. (try_begin),
  12341. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  12342. (gt, ":hit_points", 1000), # raise a sunken ship when repaired to over 1000 hit points, to then be used or further repaired
  12343. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_regenerating),
  12344. (prop_instance_get_position, pos20, ":instance_id"),
  12345. (prop_instance_get_starting_position, pos21, ":instance_id"),
  12346. (position_get_z, ":sunk_z", pos20),
  12347. (position_get_z, ":floating_z", pos21),
  12348. (position_set_z, pos20, ":floating_z"),
  12349. (position_get_rotation_around_z, ":z_angle", pos20),
  12350. (init_position, pos22),
  12351. (position_copy_rotation, pos20, pos22),
  12352. (position_rotate_z, pos20, ":z_angle"),
  12353. (store_sub, ":ground_distance", ":floating_z", ":sunk_z"),
  12354. (call_script, "script_animate_ship_parts", ":instance_id", ":ground_distance"),
  12355. (try_end),
  12356. (try_end),
  12357. ]),
  12358.  
  12359. ("setup_ship_collision_props", # server, edit mode: at mission start, store in an array all scene props near water that seem possible to collide ships into
  12360. [
  12361. (set_fixed_point_multiplier, 100),
  12362. (assign, ":current_index", slot_ship_array_collision_props_begin),
  12363. (assign, ":count", 0),
  12364. (try_for_range, ":instance_id", 0, max_scene_prop_instance_id),
  12365. (prop_instance_is_valid, ":instance_id"),
  12366. (prop_instance_get_position, pos1, ":instance_id"),
  12367. (position_get_z, ":prop_height", pos1),
  12368. (le, ":prop_height", 500),
  12369. (position_set_z, pos1, 0),
  12370. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  12371. (gt, ":terrain_distance", -500),
  12372. (this_or_next|gt, ":terrain_distance", 0),
  12373. (le, ":prop_height", 0),
  12374. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_collision_kind, 0),
  12375. (troop_set_slot, "trp_ship_array", ":current_index", ":instance_id"),
  12376. (val_add, ":current_index", 1),
  12377. (try_end),
  12378. (store_sub, ":count", ":current_index", slot_ship_array_collision_props_begin),
  12379. (troop_set_slot, "trp_ship_array", slot_ship_array_collision_props_count, ":count"),
  12380. ]),
  12381.  
  12382. ("setup_ferry", # server: at mission start, calculate angle, positions, and movement distances for the ferry boat
  12383. [(store_script_param, ":instance_id", 1), # must be valid
  12384. (store_script_param, ":winch_scene_prop_id", 2),
  12385.  
  12386. (scene_prop_get_slot, ":platform_1_instance_id", ":instance_id", slot_scene_prop_linked_platform_1),
  12387. (scene_prop_get_slot, ":platform_2_instance_id", ":instance_id", slot_scene_prop_linked_platform_2),
  12388. (try_begin),
  12389. (gt, ":platform_1_instance_id", 0),
  12390. (gt, ":platform_2_instance_id", 0),
  12391. (set_fixed_point_multiplier, 100),
  12392. (prop_instance_get_position, pos1, ":platform_1_instance_id"),
  12393. (prop_instance_get_position, pos2, ":platform_2_instance_id"),
  12394. (position_set_z, pos1, 0),
  12395. (position_set_z, pos2, 0),
  12396. (scene_prop_get_slot, ":length", ":instance_id", slot_scene_prop_length),
  12397. (get_distance_between_positions, ":max_distance", pos1, pos2),
  12398. (val_sub, ":max_distance", ":length"),
  12399. (val_sub, ":max_distance", ":length"),
  12400. (scene_prop_set_slot, ":instance_id", slot_scene_prop_max_distance, ":max_distance"),
  12401. (scene_prop_get_slot, ":move_distance", ":instance_id", slot_scene_prop_speed_limit),
  12402. (store_div, ":max_position", ":max_distance", ":move_distance"),
  12403. (store_mod, ":remainder", ":max_distance", ":move_distance"),
  12404. (try_begin),
  12405. (gt, ":remainder", 20),
  12406. (val_add, ":max_position", 1),
  12407. (try_end),
  12408. (val_add, ":max_position", 1),
  12409. (scene_prop_set_slot, ":instance_id", slot_scene_prop_max_position, ":max_position"),
  12410. (set_fixed_point_multiplier, 1000000), # line up the ferry boat pointing exactly between platforms
  12411. (position_transform_position_to_local, pos3, pos1, pos2),
  12412. (position_get_x, ":relative_x", pos3),
  12413. (position_get_y, ":relative_y", pos3),
  12414. (store_atan2, ":angle", ":relative_x", ":relative_y"),
  12415. (val_mul, ":angle", -1),
  12416. (position_rotate_x_floating, pos1, 90 * 1000000), # hack to emulate missing position_rotate_z_floating operation
  12417. (position_rotate_y_floating, pos1, ":angle"),
  12418. (position_rotate_x_floating, pos1, -90 * 1000000),
  12419. (set_fixed_point_multiplier, 100),
  12420. (position_move_y, pos1, ":length"),
  12421. (prop_instance_set_position, ":instance_id", pos1),
  12422. (scene_prop_get_slot, ":winch_height", ":instance_id", slot_scene_prop_height),
  12423. (position_move_z, pos1, ":winch_height"),
  12424. (set_spawn_position, pos1),
  12425. (spawn_scene_prop, ":winch_scene_prop_id"),
  12426. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":instance_id"),
  12427. (scene_prop_set_slot, ":instance_id", slot_scene_prop_linked_ferry_winch, reg0),
  12428. (scene_prop_set_slot, ":instance_id", slot_scene_prop_controlling_agent, -1),
  12429. (try_end),
  12430. ]),
  12431.  
  12432. ("cf_use_ferry_winch", # server: handle players controlling a ferry boat
  12433. [(store_script_param, ":agent_id", 1), # must be valid
  12434. (store_script_param, ":winch_instance_id", 2), # must be valid
  12435. (store_script_param, ":is_platform", 3), # 0 = winch with full control, 1 = platform only allowing pulling the boat towards it
  12436.  
  12437. (agent_get_player_id, ":player_id", ":agent_id"),
  12438. (player_is_active, ":player_id"),
  12439. (agent_is_alive, ":agent_id"),
  12440. (scene_prop_get_slot, ":ferry_instance_id", ":winch_instance_id", slot_scene_prop_linked_scene_prop),
  12441. (gt, ":ferry_instance_id", 0),
  12442. (set_fixed_point_multiplier, 100),
  12443. (assign, ":direction", 0),
  12444. (try_begin),
  12445. (eq, ":is_platform", 0),
  12446. (prop_instance_get_position, pos1, ":ferry_instance_id"),
  12447. (agent_get_position, pos2, ":agent_id"),
  12448. (position_transform_position_to_local, pos3, pos1, pos2),
  12449. (position_get_y, ":relative_y_position", pos3),
  12450. (try_begin),
  12451. (ge, ":relative_y_position", 0),
  12452. (assign, ":direction", -1),
  12453. (else_try),
  12454. (assign, ":direction", 1),
  12455. (try_end),
  12456. (scene_prop_set_slot, ":ferry_instance_id", slot_scene_prop_controlling_agent, ":agent_id"),
  12457. (else_try),
  12458. (assign, ":platform_instance_id", ":winch_instance_id"),
  12459. (scene_prop_get_slot, ":winch_instance_id", ":ferry_instance_id", slot_scene_prop_linked_ferry_winch),
  12460. (scene_prop_get_slot, ":controlling_agent_id", ":ferry_instance_id", slot_scene_prop_controlling_agent),
  12461. (try_begin), # don't allow pulling from the platforms if the previously controlling agent is still on board
  12462. (neq, ":controlling_agent_id", ":agent_id"),
  12463. (agent_is_active, ":controlling_agent_id"),
  12464. (agent_is_alive, ":controlling_agent_id"),
  12465. (scene_prop_has_agent_on_it, ":ferry_instance_id", ":controlling_agent_id"),
  12466. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  12467. (assign, ":is_platform", -1),
  12468. (else_try),
  12469. (scene_prop_set_slot, ":ferry_instance_id", slot_scene_prop_controlling_agent, -1),
  12470. (try_end),
  12471. (neq, ":is_platform", -1),
  12472. (scene_prop_get_slot, ":platform_1_instance_id", ":ferry_instance_id", slot_scene_prop_linked_platform_1),
  12473. (try_begin),
  12474. (eq, ":platform_instance_id", ":platform_1_instance_id"),
  12475. (assign, ":direction", -1),
  12476. (else_try),
  12477. (scene_prop_get_slot, ":platform_2_instance_id", ":ferry_instance_id", slot_scene_prop_linked_platform_2),
  12478. (eq, ":platform_instance_id", ":platform_2_instance_id"),
  12479. (assign, ":direction", 1),
  12480. (try_end),
  12481. (try_end),
  12482. (neq, ":direction", 0),
  12483. (scene_prop_get_slot, ":current_target", ":ferry_instance_id", slot_scene_prop_target_position),
  12484. (scene_prop_get_slot, ":max_position", ":ferry_instance_id", slot_scene_prop_max_position),
  12485. (val_add, ":current_target", ":direction"),
  12486. (is_between, ":current_target", 0, ":max_position"),
  12487. (store_sub, ":last_position", ":max_position"),
  12488. (scene_prop_get_slot, ":move_distance", ":ferry_instance_id", slot_scene_prop_speed_limit),
  12489. (scene_prop_get_slot, ":max_distance", ":ferry_instance_id", slot_scene_prop_max_distance),
  12490. (try_begin),
  12491. (eq, ":current_target", ":last_position"),
  12492. (assign, ":total_distance", ":max_distance"),
  12493. (else_try), # calculate the total distance from the start to avoid accumulating errors
  12494. (store_mul, ":total_distance", ":current_target", ":move_distance"),
  12495. (val_clamp, ":total_distance", 0, ":max_distance"),
  12496. (try_end),
  12497. (prop_instance_get_starting_position, pos1, ":winch_instance_id"),
  12498. (position_set_z, pos1, 0),
  12499. (position_move_y, pos1, ":total_distance"),
  12500. (prop_instance_stop_animating, ":ferry_instance_id"),
  12501. (prop_instance_get_position, pos5, ":ferry_instance_id"),
  12502. (prop_instance_set_position, ":ferry_instance_id", pos1, 1),
  12503. (assign, ":crashed", 0),
  12504. (init_position, pos4),
  12505. (position_set_z, pos4, z_position_to_hide_object),
  12506. (troop_get_slot, ":ship_array_end", "trp_ship_array", 0),
  12507. (val_add, ":ship_array_end", slot_ship_array_begin),
  12508. (try_for_range, ":ship_array_slot", slot_ship_array_begin, ":ship_array_end"), # check for collision with all ships
  12509. (troop_get_slot, ":other_hull_instance_id", "trp_ship_array", ":ship_array_slot"),
  12510. (scene_prop_get_slot, ":other_cd_scene_prop_id", ":other_hull_instance_id", slot_scene_prop_collision_kind),
  12511. (scene_prop_get_instance, ":other_cd_instance_id", ":other_cd_scene_prop_id", 1),
  12512. (prop_instance_get_position, pos2, ":other_hull_instance_id"),
  12513. (prop_instance_set_position, ":other_cd_instance_id", pos2, 1),
  12514. (try_begin),
  12515. (prop_instance_intersects_with_prop_instance, ":ferry_instance_id", ":other_cd_instance_id"),
  12516. (assign, ":crashed", 1),
  12517. (assign, ":ship_array_end", -1),
  12518. (call_script, "script_scene_prop_play_sound", ":ferry_instance_id", "snd_cut_wood_break"),
  12519. (try_end),
  12520. (prop_instance_set_position, ":other_cd_instance_id", pos4, 1),
  12521. (try_end),
  12522. (prop_instance_set_position, ":ferry_instance_id", pos5, 1),
  12523. (eq, ":crashed", 0),
  12524. (scene_prop_set_slot, ":ferry_instance_id", slot_scene_prop_target_position, ":current_target"),
  12525. (prop_instance_animate_to_position, ":ferry_instance_id", pos1, 200),
  12526. (scene_prop_get_slot, ":winch_height", ":ferry_instance_id", slot_scene_prop_height),
  12527. (position_move_z, pos1, ":winch_height"),
  12528. (try_begin),
  12529. (gt, ":direction", 0),
  12530. (assign, ":winch_rotation", -72000),
  12531. (else_try),
  12532. (assign, ":winch_rotation", 72000),
  12533. (try_end),
  12534. (prop_instance_stop_animating, ":winch_instance_id"),
  12535. (prop_instance_rotate_to_position, ":winch_instance_id", pos1, 200, ":winch_rotation"),
  12536. ]),
  12537.  
  12538. ("cf_turn_windmill_fans", # clients: make windmill fans rotate, only visually
  12539. [(store_script_param_1, ":fan_no"),
  12540.  
  12541. (scene_prop_get_instance, ":instance_id", "spr_windmill_fan_turning", ":fan_no"),
  12542. (prop_instance_get_position, pos1, ":instance_id"),
  12543. (position_rotate_y, pos1, 45),
  12544. (prop_instance_animate_to_position, ":instance_id", pos1, 450),
  12545. (val_add, ":fan_no", 1),
  12546. (call_script, "script_cf_turn_windmill_fans", ":fan_no"),
  12547. ]),
  12548.  
  12549. ("scene_set_day_time", # clients: at mission start, set the time of day, skybox, and haze from scene prop values
  12550. [
  12551. (try_begin),
  12552. (scene_prop_get_instance, ":instance_id", "spr_pw_scene_day_time", 0),
  12553. (prop_instance_get_variation_id, ":day_time", ":instance_id"),
  12554. (val_min, ":day_time", 23),
  12555. (else_try),
  12556. (assign, ":day_time", 12),
  12557. (try_end),
  12558. (scene_set_day_time, ":day_time"),
  12559. (try_begin),
  12560. (scene_prop_get_instance, ":instance_id", "spr_pw_scene_cloud_haze", 0),
  12561. (prop_instance_get_variation_id, ":cloud", ":instance_id"),
  12562. (val_min, ":cloud", 100),
  12563. (set_global_cloud_amount, ":cloud"),
  12564. (prop_instance_get_variation_id_2, ":haze", ":instance_id"),
  12565. (val_min, ":haze", 100),
  12566. (set_global_haze_amount, ":haze"),
  12567. (try_end),
  12568. ]),
  12569.  
  12570. ("scene_adjust_weather_situation", # server: periodically adjust the position and intensity of weather systems in the scene
  12571. [
  12572. (set_fixed_point_multiplier, 100),
  12573. (store_random_in_range, ":squall", "$g_weather_volatility", 100),
  12574. (try_begin), # adjust wind direction and strength, if it exists in the scene
  12575. (scene_prop_get_instance, ":wind_instance_id", "spr_pw_scene_wind_direction", 0),
  12576. (prop_instance_get_position, pos1, ":wind_instance_id"),
  12577. (position_get_z, ":wind_strength", pos1),
  12578. (store_random_in_range, ":strength_change", -2000, 2000),
  12579. (store_random_in_range, ":angle_change", -30, 30),
  12580. (store_random_in_range, ":change_duration", loop_weather_adjust_interval * 200, loop_weather_adjust_interval * 800),
  12581. (try_begin),
  12582. (ge, ":squall", 90),
  12583. (val_mul, ":strength_change", 3),
  12584. (val_mul, ":angle_change", 3),
  12585. (val_div, ":change_duration", 3),
  12586. (try_end),
  12587. (store_add, ":next_wind_strength", ":strength_change"),
  12588. (prop_instance_get_variation_id, ":min_wind_strength", ":wind_instance_id"),
  12589. (val_mul, ":min_wind_strength", 100),
  12590. (val_max, ":next_wind_strength", ":min_wind_strength"),
  12591. (prop_instance_get_variation_id_2, ":max_wind_strength", ":wind_instance_id"),
  12592. (val_mul, ":max_wind_strength", 100),
  12593. (val_min, ":next_wind_strength", ":max_wind_strength"),
  12594. (copy_position, pos2, pos1),
  12595. (position_rotate_z, pos2, ":angle_change"),
  12596. (position_set_z, pos2, ":next_wind_strength"),
  12597. (prop_instance_stop_animating, ":wind_instance_id"),
  12598. (prop_instance_animate_to_position, ":wind_instance_id", pos2, ":change_duration"),
  12599. (else_try),
  12600. (assign, ":wind_strength", 0),
  12601. (init_position, pos1),
  12602. (try_end),
  12603. (get_scene_boundaries, pos8, pos9),
  12604. (position_get_x, ":scene_min_x", pos8),
  12605. (position_get_x, ":scene_max_x", pos9),
  12606. (position_get_y, ":scene_min_y", pos8),
  12607. (position_get_y, ":scene_max_y", pos9),
  12608. (scene_prop_get_num_instances, ":num_instances", "spr_pw_scene_precipitation"),
  12609. (try_for_range, ":instance_no", 0, ":num_instances"),
  12610. (scene_prop_get_instance, ":precipitation_instance_id", "spr_pw_scene_precipitation", ":instance_no"),
  12611. (prop_instance_get_position, pos2, ":precipitation_instance_id"),
  12612. (try_begin), # move precipitation with the current wind
  12613. (gt, ":wind_strength", 0),
  12614. (position_copy_rotation, pos2, pos1),
  12615. (position_get_x, ":current_x", pos2),
  12616. (position_get_y, ":current_y", pos2),
  12617. (try_begin), # check for precipitation areas moving off the scene edge
  12618. (is_between, ":current_x", ":scene_min_x", ":scene_max_x"),
  12619. (is_between, ":current_y", ":scene_min_y", ":scene_max_y"),
  12620. (position_move_y, pos2, ":wind_strength"),
  12621. (position_get_x, ":target_x", pos2),
  12622. (position_get_y, ":target_y", pos2),
  12623. (try_begin), # when targeting to move off the edge, stop at the edge and fade out
  12624. (lt, ":target_x", ":scene_min_x"),
  12625. (store_sub, ":target_x", ":scene_min_x", 2),
  12626. (position_set_z, pos2, 0),
  12627. (else_try),
  12628. (ge, ":target_x", ":scene_max_x"),
  12629. (store_add, ":target_x", ":scene_max_x", 2),
  12630. (position_set_z, pos2, 0),
  12631. (try_end),
  12632. (try_begin),
  12633. (lt, ":target_y", ":scene_min_y"),
  12634. (store_sub, ":target_y", ":scene_min_y", 2),
  12635. (position_set_z, pos2, 0),
  12636. (else_try),
  12637. (ge, ":target_y", ":scene_max_y"),
  12638. (store_add, ":target_y", ":scene_max_y", 2),
  12639. (position_set_z, pos2, 0),
  12640. (try_end),
  12641. (position_set_x, pos2, ":target_x"),
  12642. (position_set_y, pos2, ":target_y"),
  12643. (else_try), # when already at the edge, wrap around to the opposite side and fade in
  12644. (position_set_z, pos2, 0),
  12645. (try_begin),
  12646. (lt, ":current_x", ":scene_min_x"),
  12647. (val_sub, ":scene_max_x", 1), # bring inside scene for next check
  12648. (position_set_x, pos2, ":scene_max_x"),
  12649. (else_try),
  12650. (ge, ":current_x", ":scene_max_x"),
  12651. (position_set_x, pos2, ":scene_min_x"),
  12652. (try_end),
  12653. (try_begin),
  12654. (lt, ":current_y", ":scene_min_y"),
  12655. (val_sub, ":scene_max_y", 1), # bring inside scene for next check
  12656. (position_set_y, pos2, ":scene_max_y"),
  12657. (else_try),
  12658. (ge, ":current_y", ":scene_max_y"),
  12659. (position_set_y, pos2, ":scene_min_y"),
  12660. (try_end),
  12661. (prop_instance_stop_animating, ":precipitation_instance_id"),
  12662. (prop_instance_set_position, ":precipitation_instance_id", pos2),
  12663. (try_end),
  12664. (try_end),
  12665. (position_get_z, ":precipitation_intensity", pos2),
  12666. (prop_instance_get_variation_id, ":min_precipitation_intensity", ":precipitation_instance_id"),
  12667. (val_mul, ":min_precipitation_intensity", 100),
  12668. (prop_instance_get_variation_id_2, ":max_precipitation_intensity", ":precipitation_instance_id"),
  12669. (val_mul, ":max_precipitation_intensity", 100),
  12670. (scene_prop_get_slot, ":intensity_acceleration", ":precipitation_instance_id", slot_scene_prop_target_rotation),
  12671. (try_begin), # if the weather is controlled by an administrator, force it to be fine or precipitating
  12672. (eq, "$g_force_weather", 0),
  12673. (assign, ":precipitation_intensity", 0),
  12674. (else_try),
  12675. (eq, "$g_force_weather", 1),
  12676. (assign, ":precipitation_intensity", 10000),
  12677. (else_try), # or if dynamic, change the acceleration of the precipitation intensity so it doesn't just fluctuate over a small range
  12678. (try_begin),
  12679. (this_or_next|ge, ":precipitation_intensity", ":max_precipitation_intensity"),
  12680. (gt, ":intensity_acceleration", 1000),
  12681. (store_random_in_range, ":intensity_acceleration_change", -200, 0),
  12682. (else_try),
  12683. (this_or_next|le, ":precipitation_intensity", ":min_precipitation_intensity"),
  12684. (lt, ":intensity_acceleration", -1500),
  12685. (store_random_in_range, ":intensity_acceleration_change", 0, 201),
  12686. (else_try),
  12687. (store_random_in_range, ":intensity_acceleration_change", -200, 201),
  12688. (try_end),
  12689. (try_begin),
  12690. (gt, ":squall", 90),
  12691. (val_mul, ":intensity_acceleration_change", 3),
  12692. (try_end),
  12693. (val_add, ":intensity_acceleration", ":intensity_acceleration_change"),
  12694. (scene_prop_set_slot, ":precipitation_instance_id", slot_scene_prop_target_rotation, ":intensity_acceleration"),
  12695. (val_add, ":precipitation_intensity", ":intensity_acceleration"),
  12696. (val_max, ":precipitation_intensity", ":min_precipitation_intensity"),
  12697. (val_min, ":precipitation_intensity", ":max_precipitation_intensity"),
  12698. (try_end),
  12699. (position_set_z, pos2, ":precipitation_intensity"),
  12700. (prop_instance_stop_animating, ":precipitation_instance_id"),
  12701. (prop_instance_animate_to_position, ":precipitation_instance_id", pos2, loop_weather_adjust_interval * 100),
  12702. (try_end),
  12703. ]),
  12704.  
  12705. ("cf_adjust_weather_effects", # clients: recalculate the weather effects that should be currently happening, based on view position
  12706. [
  12707. (set_fixed_point_multiplier, 100),
  12708. (assign, "$g_current_precipitation_intensity", 0),
  12709. (mission_cam_get_position, pos1),
  12710. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  12711. (gt, ":terrain_distance", -100), # if underground, don't display precipitation
  12712. (scene_prop_get_num_instances, ":num_instances", "spr_pw_scene_precipitation"),
  12713. (try_for_range, ":instance_no", 0, ":num_instances"), # calculate overall intensity from all nearby precipitation systems
  12714. (scene_prop_get_instance, ":instance_id", "spr_pw_scene_precipitation", ":instance_no"),
  12715. (prop_instance_get_position, pos2, ":instance_id"),
  12716. (position_get_z, ":intensity", pos2),
  12717. (gt, ":intensity", 0),
  12718. (position_get_z, ":view_height", pos1),
  12719. (position_set_z, pos2, ":view_height"),
  12720. (get_distance_between_positions, ":distance", pos1, pos2),
  12721. (prop_instance_get_scale, pos3, ":instance_id"),
  12722. (position_get_scale_x, ":precipitation_width", pos3),
  12723. (val_mul, ":precipitation_width", 100),
  12724. (lt, ":distance", ":precipitation_width"),
  12725. (store_sub, ":intensity_reduction", ":precipitation_width", ":distance"),
  12726. (val_mul, ":intensity_reduction", 200),
  12727. (val_div, ":intensity_reduction", ":precipitation_width"),
  12728. (try_begin),
  12729. (lt, ":intensity_reduction", 100),
  12730. (val_mul, ":intensity", ":intensity_reduction"),
  12731. (val_div, ":intensity", 100),
  12732. (try_end),
  12733. (val_div, ":intensity", 100),
  12734. (val_max, "$g_current_precipitation_intensity", ":intensity"),
  12735. (try_end),
  12736. (try_begin), # change from rain to snow when above the set level
  12737. (scene_prop_get_instance, ":snow_level_instance_id", "spr_pw_scene_snow_level", 0),
  12738. (prop_instance_get_position, pos2, ":snow_level_instance_id"),
  12739. (position_get_z, ":camera_height", pos1),
  12740. (position_get_z, ":snow_level_height", pos2),
  12741. (ge, ":camera_height", ":snow_level_height"),
  12742. (assign, "$g_current_precipitation_particles", "psys_dynamic_snow"),
  12743. (else_try),
  12744. (assign, "$g_current_precipitation_particles", "psys_dynamic_rain"),
  12745. (try_end),
  12746. (try_begin), # play rain sound if heavy enough (volume flags do not seem to work in the play_sound operation)
  12747. (eq, "$g_current_precipitation_particles", "psys_dynamic_rain"),
  12748. (ge, "$g_current_precipitation_intensity", 50),
  12749. (try_begin),
  12750. (eq, "$g_rain_sound_channel", -1),
  12751. (play_sound, "snd_rain"),
  12752. (store_last_sound_channel, "$g_rain_sound_channel"),
  12753. (try_end),
  12754. (else_try), # otherwise stop rain sound
  12755. (this_or_next|lt, "$g_current_precipitation_intensity", 50),
  12756. (eq, "$g_current_precipitation_particles", "psys_dynamic_snow"),
  12757. (neq, "$g_rain_sound_channel", -1),
  12758. (stop_sound_channel, "$g_rain_sound_channel"),
  12759. (assign, "$g_rain_sound_channel", -1),
  12760. (try_end),
  12761. (try_begin), # get scene fog color and distance
  12762. (scene_prop_get_instance, ":fog_instance_id", "spr_pw_scene_fog", 0),
  12763. (set_fixed_point_multiplier, 10),
  12764. (prop_instance_get_position, pos2, ":fog_instance_id"),
  12765. (position_get_z, "$g_target_fog_distance", pos2),
  12766. (val_max, "$g_target_fog_distance", 1),
  12767. (set_fixed_point_multiplier, 0xFF * 200),
  12768. (prop_instance_get_scale, pos3, ":fog_instance_id"),
  12769. (position_get_scale_x, "$g_target_fog_red", pos3),
  12770. (position_get_scale_y, "$g_target_fog_green", pos3),
  12771. (position_get_scale_z, "$g_target_fog_blue", pos3),
  12772. (else_try),
  12773. (assign, "$g_target_fog_distance", 10000),
  12774. (assign, "$g_target_fog_red", 140 * 200),
  12775. (assign, "$g_target_fog_green", 162 * 200),
  12776. (assign, "$g_target_fog_blue", 173 * 200),
  12777. (try_end), # darken fog in heavy precipitation
  12778. (set_fixed_point_multiplier, 100),
  12779. (store_add, ":intensity_darken", "$g_current_precipitation_intensity", 200),
  12780. (val_clamp, ":intensity_darken", 200, 301),
  12781. (val_div, "$g_target_fog_red", ":intensity_darken"),
  12782. (val_div, "$g_target_fog_green", ":intensity_darken"),
  12783. (val_div, "$g_target_fog_blue", ":intensity_darken"),
  12784. (store_sub, ":precipitation_fog_distance", 100, "$g_current_precipitation_intensity"),
  12785. (convert_to_fixed_point, ":precipitation_fog_distance"),
  12786. (store_pow, ":precipitation_fog_distance", ":precipitation_fog_distance", 400),
  12787. (val_div, ":precipitation_fog_distance", 5000000),
  12788. (val_add, ":precipitation_fog_distance", 20),
  12789. (val_min, "$g_target_fog_distance", ":precipitation_fog_distance"),
  12790. ]),
  12791.  
  12792. ("cf_render_weather_effects", # clients: emit weather particle systems and set fog
  12793. [
  12794. (set_fixed_point_multiplier, 100),
  12795. (try_begin), # emit precipitation blocks which are not under cover
  12796. (eq, "$g_disable_rain_snow_particles", 0),
  12797. (ge, "$g_current_precipitation_intensity", 20),
  12798. (gt, "$g_current_precipitation_particles", 0),
  12799. (mission_cam_get_position, pos1),
  12800. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  12801. (gt, ":terrain_distance", -100),
  12802. (position_get_z, ":height", pos1),
  12803. (gt, ":height", z_position_water_level - 100),
  12804. (init_position, pos2),
  12805. (position_copy_origin, pos2, pos1),
  12806. (position_get_rotation_around_z, ":z_rotation", pos1),
  12807. (position_rotate_z, pos2, ":z_rotation"),
  12808. (position_move_x, pos2, -1600),
  12809. (position_move_y, pos2, 2000),
  12810. (try_for_range, reg1, -4, 5),
  12811. (try_for_range, reg2, -4, 5),
  12812. (copy_position, pos3, pos2),
  12813. (position_set_z, pos3, 100000),
  12814. (copy_position, pos4, pos2),
  12815. (try_begin),
  12816. (position_set_z_to_ground_level, pos4),
  12817. (position_move_z, pos4, 100, 1),
  12818. (position_has_line_of_sight_to_position, pos4, pos3),
  12819. (position_get_z, ":above_ground_height", pos4),
  12820. (position_get_z, ":view_height", pos2),
  12821. (try_begin),
  12822. (gt, ":above_ground_height", ":view_height"),
  12823. (position_move_z, pos4, 1000, 1),
  12824. (else_try),
  12825. (val_add, ":view_height", 1000),
  12826. (position_set_z, pos4, ":view_height"),
  12827. (try_end),
  12828. (particle_system_burst, "$g_current_precipitation_particles", pos4, "$g_current_precipitation_intensity"),
  12829. (else_try),
  12830. (try_end),
  12831. (position_move_x, pos2, 400),
  12832. (try_end),
  12833. (position_move_x, pos2, -3600),
  12834. (position_move_y, pos2, -400),
  12835. (try_end),
  12836. (try_end),
  12837. (try_begin),
  12838. (gt, "$g_target_fog_distance", 0),
  12839. (try_begin), # reset the color immediately when fog is cleared
  12840. (ge, "$g_current_fog_distance", 2000),
  12841. (assign, "$g_current_fog_red", 0),
  12842. (assign, "$g_current_fog_green", 0),
  12843. (assign, "$g_current_fog_blue", 0),
  12844. (try_end),
  12845. (try_begin), # for long distances, clear the fog
  12846. (ge, "$g_target_fog_distance", 2000),
  12847. (ge, "$g_current_fog_distance", 2000),
  12848. (set_fog_distance, 0, 0),
  12849. (else_try),
  12850. (le, "$g_current_fog_distance", 0),
  12851. (assign, "$g_current_fog_distance", "$g_target_fog_distance"),
  12852. (else_try), # otherwise smoothly interpolate fog color and distance
  12853. (neq, "$g_current_fog_distance", "$g_target_fog_distance"),
  12854. (store_sub, ":merge_amount", "$g_current_fog_distance", "$g_target_fog_distance"),
  12855. (val_abs, ":merge_amount"),
  12856. (val_div, ":merge_amount", 10),
  12857. (val_clamp, ":merge_amount", 1, 51),
  12858. (try_begin),
  12859. (gt, "$g_current_fog_distance", "$g_target_fog_distance"),
  12860. (val_sub, "$g_current_fog_distance", ":merge_amount"),
  12861. (val_max, "$g_current_fog_distance", "$g_target_fog_distance"),
  12862. (else_try),
  12863. (lt, "$g_current_fog_distance", "$g_target_fog_distance"),
  12864. (val_add, "$g_current_fog_distance", ":merge_amount"),
  12865. (val_min, "$g_current_fog_distance", "$g_target_fog_distance"),
  12866. (try_end),
  12867. (try_end),
  12868. (try_begin),
  12869. (eq, "$g_current_fog_red", 0),
  12870. (assign, "$g_current_fog_red", "$g_target_fog_red"),
  12871. (else_try),
  12872. (gt, "$g_current_fog_red", "$g_target_fog_red"),
  12873. (val_sub, "$g_current_fog_red", 1),
  12874. (else_try),
  12875. (lt, "$g_current_fog_red", "$g_target_fog_red"),
  12876. (val_add, "$g_current_fog_red", 1),
  12877. (try_end),
  12878. (try_begin),
  12879. (eq, "$g_current_fog_green", 0),
  12880. (assign, "$g_current_fog_green", "$g_target_fog_green"),
  12881. (else_try),
  12882. (gt, "$g_current_fog_green", "$g_target_fog_green"),
  12883. (val_sub, "$g_current_fog_green", 1),
  12884. (else_try),
  12885. (lt, "$g_current_fog_green", "$g_target_fog_green"),
  12886. (val_add, "$g_current_fog_green", 1),
  12887. (try_end),
  12888. (try_begin),
  12889. (eq, "$g_current_fog_blue", 0),
  12890. (assign, "$g_current_fog_blue", "$g_target_fog_blue"),
  12891. (else_try),
  12892. (gt, "$g_current_fog_blue", "$g_target_fog_blue"),
  12893. (val_sub, "$g_current_fog_blue", 1),
  12894. (else_try),
  12895. (lt, "$g_current_fog_blue", "$g_target_fog_blue"),
  12896. (val_add, "$g_current_fog_blue", 1),
  12897. (try_end),
  12898. (store_mul, ":red", "$g_current_fog_red", 0x10000),
  12899. (store_mul, ":green", "$g_current_fog_green", 0x100),
  12900. (store_or, ":fog_color", ":red", ":green"),
  12901. (val_or, ":fog_color", "$g_current_fog_blue"),
  12902. (set_fog_distance, "$g_current_fog_distance", ":fog_color"),
  12903. (try_end),
  12904. ]),
  12905.  
  12906. ("cf_play_scene_ambient_sound", # clients: check if an ambient sound emitter scene prop should be played
  12907. [(store_script_param, ":instance_id", 1), # must be valid
  12908.  
  12909. (prop_instance_get_variation_id_2, ":probability", ":instance_id"),
  12910. (le, ":probability", 100),
  12911. (prop_instance_get_variation_id, ":sound_id", ":instance_id"),
  12912. (val_add, ":sound_id", ambient_sounds_begin),
  12913. (is_between, ":sound_id", ambient_sounds_begin, ambient_sounds_end),
  12914. (store_random_in_range, ":random", 0, 100),
  12915. (lt, ":random", ":probability"),
  12916. (mission_cam_get_position, pos1),
  12917. (prop_instance_get_position, pos2, ":instance_id"),
  12918. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  12919. (lt, ":sq_distance", sq(max_distance_to_play_sound)),
  12920. (play_sound_at_position, ":sound_id", pos2, sf_vol_15|sf_priority_7),
  12921. ]),
  12922.  
  12923. ("music_set_situation", # clients: check if the music type should be changed for a different situation
  12924. [
  12925. (multiplayer_get_my_player, ":player_id"),
  12926. (try_begin),
  12927. (player_is_active, ":player_id"),
  12928. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  12929. (else_try),
  12930. (assign, ":faction_id", "fac_commoners"),
  12931. (try_end),
  12932. (assign, ":situation", mtf_sit_travel),
  12933. (try_begin),
  12934. (gt, "$g_recent_nearby_deaths_factor", 100),
  12935. (assign, ":situation", mtf_sit_fight),
  12936. (else_try),
  12937. (mission_cam_get_position, pos1),
  12938. (ge, ":faction_id", castle_factions_begin),
  12939. (call_script, "script_cf_find_closest_scene_prop", "spr_pw_castle_capture_point", sq(10000)),
  12940. (call_script, "script_scene_prop_get_owning_faction", reg0),
  12941. (gt, reg1, -1),
  12942. (assign, ":nearby_castle_faction_id", reg0),
  12943. (try_begin),
  12944. (eq, ":nearby_castle_faction_id", ":faction_id"), # nearest to one of the player faction's castles
  12945. (assign, ":peaceful_loop_end", factions_end),
  12946. (try_for_range, ":other_faction_id", castle_factions_begin, ":peaceful_loop_end"),
  12947. (neq, ":other_faction_id", ":faction_id"),
  12948. (faction_slot_eq, ":other_faction_id", slot_faction_is_active, 1),
  12949. (call_script, "script_cf_factions_are_hostile", ":faction_id", ":other_faction_id"),
  12950. (get_max_players, ":max_players"),
  12951. (try_for_range, ":other_player_id", 1, ":max_players"),
  12952. (player_is_active, ":other_player_id"),
  12953. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":other_faction_id"),
  12954. (assign, ":max_players", -1),
  12955. (try_end),
  12956. (eq, ":max_players", -1),
  12957. (assign, ":peaceful_loop_end", 0),
  12958. (try_end),
  12959. (try_begin),
  12960. (eq, ":peaceful_loop_end", 0), # the player's faction is hostile to another occupied faction, not at peace
  12961. (assign, ":situation", mtf_sit_ambushed),
  12962. (else_try),
  12963. (assign, ":situation", mtf_sit_tavern),
  12964. (try_end),
  12965. (else_try),
  12966. (faction_slot_eq, ":nearby_castle_faction_id", slot_faction_is_active, 1),
  12967. (call_script, "script_cf_factions_are_hostile", ":faction_id", ":nearby_castle_faction_id"),
  12968. (get_max_players, ":max_players"),
  12969. (try_for_range, ":other_player_id", 1, ":max_players"),
  12970. (player_is_active, ":other_player_id"),
  12971. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":nearby_castle_faction_id"),
  12972. (assign, ":max_players", -1),
  12973. (try_end),
  12974. (eq, ":max_players", -1), # nearest to a castle occupied by a hostile faction
  12975. (assign, ":situation", mtf_sit_siege),
  12976. (else_try),
  12977. (assign, ":situation", mtf_sit_town),
  12978. (try_end),
  12979. (else_try),
  12980. (set_fixed_point_multiplier, 100),
  12981. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  12982. (position_get_distance_to_ground_level, ":ground_distance", pos1),
  12983. (store_sub, ":difference", ":terrain_distance", ":ground_distance"),
  12984. (val_abs, ":difference"),
  12985. (gt, ":difference", 50), # mission camera is not directly above terrain, probably in a town or building
  12986. (try_begin),
  12987. (player_is_active, ":player_id"),
  12988. (player_get_agent_id, ":agent_id", ":player_id"),
  12989. (agent_is_active, ":agent_id"),
  12990. (agent_is_alive, ":agent_id"),
  12991. (this_or_next|agent_has_item_equipped, ":agent_id", "itm_lock_pick"),
  12992. (agent_has_item_equipped, ":agent_id", "itm_poisoned_dagger"),
  12993. (assign, ":situation", mtf_sit_town_infiltrate),
  12994. (else_try),
  12995. (call_script, "script_cf_find_closest_scene_prop", "spr_pw_process_tavern", sq(1000)),
  12996. (assign, ":situation", mtf_sit_tavern),
  12997. (else_try),
  12998. (assign, ":situation", mtf_sit_town),
  12999. (try_end),
  13000. (try_end),
  13001. (music_set_situation, ":situation"),
  13002. (val_div, "$g_recent_nearby_deaths_factor", 3),
  13003. (val_mul, "$g_recent_nearby_deaths_factor", 2),
  13004. ]),
  13005.  
  13006. ("check_spawn_bots", # server: check if more testing bots should be spawned
  13007. [(store_script_param, ":dead_agent_id", 1),
  13008.  
  13009. (try_begin),
  13010. (multiplayer_is_server),
  13011. (try_begin),
  13012. (le, ":dead_agent_id", -1),
  13013. (store_sub, ":bots_to_spawn", "$g_bot_count", "$g_spawned_bot_count"),
  13014. (val_max, "$g_spawned_bot_count", "$g_bot_count"),
  13015. (else_try),
  13016. (assign, ":bots_to_spawn", 0),
  13017. (agent_is_human, ":dead_agent_id"),
  13018. (agent_get_player_id, ":player_id", ":dead_agent_id"),
  13019. (neg|player_is_active, ":player_id"),
  13020. (try_begin),
  13021. (le, "$g_spawned_bot_count", "$g_bot_count"),
  13022. (assign, ":bots_to_spawn", 1),
  13023. (else_try),
  13024. (val_sub, "$g_spawned_bot_count", 1),
  13025. (try_end),
  13026. (try_end),
  13027. (ge, ":bots_to_spawn", 1),
  13028. (store_current_scene, ":current_scene"),
  13029. (modify_visitors_at_site, ":current_scene"),
  13030. (try_for_range, ":unused", 0, ":bots_to_spawn"),
  13031. (store_random_in_range, ":entry_point", 0, 5),
  13032. (store_random_in_range, ":troop_id", playable_troops_begin, "trp_godlike_hero"),
  13033. (add_visitors_to_current_scene, ":entry_point", ":troop_id", 1, 0, -1),
  13034. (try_end),
  13035. (try_end),
  13036. ]),
  13037.  
  13038. ("cf_client_agent_is_inactive", # clients: try to check that the agent is not moving or fighting
  13039. [
  13040. (assign, ":action", 0),
  13041. (multiplayer_get_my_player, ":player_id"),
  13042. (try_begin),
  13043. (player_is_active, ":player_id"),
  13044. (player_get_agent_id, ":agent_id", ":player_id"),
  13045. (agent_is_active, ":agent_id"),
  13046. (agent_is_alive, ":agent_id"),
  13047. (agent_get_speed, pos1, ":agent_id"),
  13048. (position_get_x, ":action", pos1),
  13049. (eq, ":action", 0),
  13050. (position_get_y, ":action", pos1),
  13051. (eq, ":action", 0),
  13052. (agent_get_defend_action, ":action", ":agent_id"),
  13053. (try_end),
  13054. (eq, ":action", 0),
  13055. ]),
  13056.  
  13057. ("show_welcome_message", # clients: display the server welcome and game information messages
  13058. [
  13059. (str_store_welcome_message, s10),
  13060. (store_add, ":name_string_id", lazy.sub(game_type_names_begin, game_type_mission_templates_begin), "$g_game_type"),
  13061. (str_store_string, s11, ":name_string_id"),
  13062. (store_add, ":info_string_id", lazy.sub(game_type_info_strings_begin, game_type_mission_templates_begin), "$g_game_type"),
  13063. (str_store_string, s12, ":info_string_id"),
  13064. (call_script, "script_preset_message", "str_pw_welcome", preset_message_read_object, "str_join_game", 0),
  13065. ]),
  13066.  
  13067. ("request_poll", # server: handle requests for polls from players
  13068. [(store_script_param, ":poll_type", 1), # constants starting with poll_type_
  13069. (store_script_param, ":requester_player_id", 2),
  13070. (store_script_param, ":value_1", 3),
  13071.  
  13072. (try_begin),
  13073. (player_is_active, ":requester_player_id"),
  13074. (assign, ":value_2", -1),
  13075. (assign, ":gold_cost", 0),
  13076. (assign, ":poll_faction_id", factions_end),
  13077. (assign, ":poll_error", 0),
  13078. (try_begin), # ensure a global poll is not running
  13079. (neg|faction_slot_eq, factions_end, slot_faction_poll_end_time, 0),
  13080. (assign, ":poll_error", poll_result_existing),
  13081. (else_try), # for a new global poll, ensure that a faction poll is not running
  13082. (neq, ":poll_type", poll_type_faction_lord),
  13083. (try_for_range, ":other_faction_id", factions_begin, factions_end),
  13084. (neg|faction_slot_eq, ":other_faction_id", slot_faction_poll_end_time, 0),
  13085. (assign, ":poll_error", poll_result_existing),
  13086. (try_end),
  13087. (eq, ":poll_error", poll_result_existing),
  13088. (else_try),
  13089. (eq, ":poll_type", poll_type_change_scene),
  13090. (eq, "$g_scenes_voteable", 1),
  13091. (is_between, ":value_1", scenes_begin, scenes_end),
  13092. (assign, ":gold_cost", poll_cost_change_scene),
  13093. (store_sub, ":scene_name_id", ":value_1", scenes_begin),
  13094. (val_add, ":scene_name_id", scene_names_begin),
  13095. (str_store_string, s1, ":scene_name_id"),
  13096. (str_store_string, s0, "str_poll_change_scene"),
  13097. (else_try),
  13098. (this_or_next|eq, ":poll_type", poll_type_kick_player),
  13099. (eq, ":poll_type", poll_type_ban_player),
  13100. (neq, ":value_1", ":requester_player_id"),
  13101. (player_is_active, ":value_1"),
  13102. (neg|player_is_admin, ":value_1"),
  13103. (assign, ":log_string_id", -1),
  13104. (try_begin),
  13105. (eq, ":poll_type", poll_type_kick_player),
  13106. (eq, "$g_kick_voteable", 1),
  13107. (assign, ":gold_cost", poll_cost_kick_player),
  13108. (assign, ":log_string_id", "str_poll_kick_player"),
  13109. (else_try),
  13110. (eq, "$g_ban_voteable", 1),
  13111. (assign, ":gold_cost", poll_cost_ban_player),
  13112. (assign, ":log_string_id", "str_poll_ban_player"),
  13113. (try_end),
  13114. (gt, ":log_string_id", -1),
  13115. (str_store_player_username, s1, ":value_1"),
  13116. #(store_script_param, ":value_2", 4),
  13117. (str_store_string, s0, ":log_string_id"),
  13118. (else_try),
  13119. (eq, ":poll_type", poll_type_faction_lord),
  13120. (player_is_active, ":value_1"),
  13121. (player_get_slot, ":poll_faction_id", ":requester_player_id", slot_player_faction_id),
  13122. (try_begin), # ensure that the player is not voting for themself and the faction is not locked
  13123. (neq, ":value_1", ":requester_player_id"),
  13124. (faction_slot_eq, ":poll_faction_id", slot_faction_is_locked, 0),
  13125. (else_try), # but allow admins to override the last conditions
  13126. (player_is_admin, ":requester_player_id"),
  13127. (player_slot_eq, ":requester_player_id", slot_player_admin_no_factions, 0),
  13128. (else_try),
  13129. (assign, ":poll_error", poll_result_invalid),
  13130. (try_end),
  13131. (eq, ":poll_error", 0),
  13132. (assign, ":poll_error", poll_result_existing),
  13133. (faction_slot_eq, ":poll_faction_id", slot_faction_poll_end_time, 0),
  13134. (assign, ":poll_error", 0),
  13135. (is_between, ":poll_faction_id", castle_factions_begin, factions_end),
  13136. (player_slot_eq, ":value_1", slot_player_faction_id, ":poll_faction_id"),
  13137. (assign, ":gold_cost", poll_cost_faction_lord),
  13138. (str_store_player_username, s1, ":value_1"),
  13139. (str_store_faction_name, s2, ":poll_faction_id"),
  13140. (str_store_string, s0, "str_poll_faction_lord"),
  13141. (else_try),
  13142. (eq, ":poll_error", 0),
  13143. (assign, ":poll_error", poll_result_invalid),
  13144. (try_end),
  13145. (try_begin),
  13146. (neq, ":poll_error", 0),
  13147. (multiplayer_send_int_to_player, ":requester_player_id", server_event_show_poll, ":poll_error"),
  13148. (try_end),
  13149. (eq, ":poll_error", 0),
  13150. (call_script, "script_cf_check_enough_gold", ":requester_player_id", ":gold_cost"),
  13151. (call_script, "script_player_adjust_gold", ":requester_player_id", ":gold_cost", -1),
  13152. (assign, ":voter_count", 0),
  13153. (get_max_players, ":max_players"),
  13154. (try_for_range, ":player_id", 1, ":max_players"),
  13155. (player_is_active, ":player_id"),
  13156. (this_or_next|eq, ":poll_faction_id", factions_end),
  13157. (player_slot_eq, ":player_id", slot_player_faction_id, ":poll_faction_id"),
  13158. (player_slot_eq, ":player_id", slot_player_poll_faction_id, 0),
  13159. (player_set_slot, ":player_id", slot_player_poll_faction_id, ":poll_faction_id"),
  13160. (try_begin),
  13161. (eq, ":value_2", -1),
  13162. (multiplayer_send_3_int_to_player, ":player_id", server_event_show_poll, ":poll_type", ":requester_player_id", ":value_1"),
  13163. (else_try),
  13164. (multiplayer_send_4_int_to_player, ":player_id", server_event_show_poll, ":poll_type", ":requester_player_id", ":value_1", ":value_2"),
  13165. (try_end),
  13166. (val_add, ":voter_count", 1),
  13167. (try_end),
  13168. (gt, ":voter_count", 0),
  13169. (str_store_player_username, s3, ":requester_player_id"),
  13170. (server_add_message_to_log, "str_poll_log"),
  13171. (store_mission_timer_a, ":end_time"),
  13172. (val_add, ":end_time", poll_time_duration),
  13173. (faction_set_slot, ":poll_faction_id", slot_faction_poll_end_time, ":end_time"),
  13174. (faction_set_slot, ":poll_faction_id", slot_faction_poll_voter_count, ":voter_count"),
  13175. (faction_set_slot, ":poll_faction_id", slot_faction_poll_yes_votes, 0),
  13176. (faction_set_slot, ":poll_faction_id", slot_faction_poll_no_votes, 0),
  13177. (faction_set_slot, ":poll_faction_id", slot_faction_poll_type, ":poll_type"),
  13178. (faction_set_slot, ":poll_faction_id", slot_faction_poll_value_1, ":value_1"),
  13179. (faction_set_slot, ":poll_faction_id", slot_faction_poll_value_2, ":value_2"),
  13180. (try_begin), # save target player information in case they disconnect before the poll ends
  13181. (this_or_next|eq, ":poll_type", poll_type_kick_player),
  13182. (eq, ":poll_type", poll_type_faction_lord),
  13183. (player_get_unique_id, ":unique_id", ":value_1"),
  13184. (faction_set_slot, ":poll_faction_id", slot_faction_poll_target_unique_id, ":unique_id"),
  13185. (else_try),
  13186. (eq, ":poll_type", poll_type_ban_player),
  13187. (save_ban_info_of_player, ":value_1"),
  13188. (try_end),
  13189. (try_end),
  13190. ]),
  13191.  
  13192. ("show_poll", # clients: handle showing polls or poll results
  13193. [(store_script_param, ":poll_type", 1), # constants starting with poll_type_ and poll_result_
  13194.  
  13195. (try_begin),
  13196. (ge, ":poll_type", 0),
  13197. (assign, "$g_poll_type", ":poll_type"),
  13198. (store_script_param, "$g_poll_requester_player_id", 2),
  13199. (store_script_param, "$g_poll_value_1", 3),
  13200. (store_mission_timer_a, "$g_poll_end_time"),
  13201. (val_add, "$g_poll_end_time", poll_time_duration),
  13202. (start_presentation, "prsnt_show_poll"),
  13203. (else_try),
  13204. (eq, ":poll_type", poll_result_existing),
  13205. (display_message, "str_poll_existing", poll_result_color),
  13206. (else_try),
  13207. (eq, ":poll_type", poll_result_invalid),
  13208. (display_message, "str_poll_invalid", poll_result_color),
  13209. (else_try),
  13210. (try_begin),
  13211. (is_presentation_active, "prsnt_show_poll"),
  13212. (assign, "$g_hide_poll", 1),
  13213. (try_end),
  13214. (eq, ":poll_type", poll_result_no),
  13215. (display_message, "str_poll_result_no", poll_result_color),
  13216. (else_try),
  13217. (eq, ":poll_type", poll_result_yes),
  13218. (display_message, "str_poll_result_yes", poll_result_color),
  13219. (else_try),
  13220. (eq, ":poll_type", poll_result_admin_no),
  13221. (display_message, "str_poll_result_admin_no", poll_result_color),
  13222. (else_try),
  13223. (eq, ":poll_type", poll_result_admin_yes),
  13224. (display_message, "str_poll_result_admin_yes", poll_result_color),
  13225. (try_end),
  13226. ]),
  13227.  
  13228. ("poll_vote", # server: handle player votes for polls
  13229. [(store_script_param, ":player_id", 1), # must be valid
  13230. (store_script_param, ":vote", 2),
  13231.  
  13232. (try_begin),
  13233. (player_get_slot, ":poll_faction_id", ":player_id", slot_player_poll_faction_id),
  13234. (gt, ":poll_faction_id", 0),
  13235. (player_set_slot, ":player_id", slot_player_poll_faction_id, 0), # prevent the player voting again
  13236. (ge, ":poll_faction_id", castle_factions_begin),
  13237. (le, ":poll_faction_id", factions_end),
  13238. (faction_slot_ge, ":poll_faction_id", slot_faction_poll_end_time, 1),
  13239. (assign, ":remove_vote", 0),
  13240. (try_begin),
  13241. (neq, ":poll_faction_id", factions_end),
  13242. (neg|player_slot_eq, ":player_id", slot_player_faction_id, ":poll_faction_id"),
  13243. (assign, ":remove_vote", 1), # remove vote if the player was not in the faction at the start of the poll
  13244. (else_try),
  13245. (eq, ":vote", poll_vote_abstain),
  13246. (assign, ":remove_vote", 1),
  13247. (try_end),
  13248. (try_begin),
  13249. (eq, ":remove_vote", 1),
  13250. (faction_get_slot, ":voter_count", ":poll_faction_id", slot_faction_poll_voter_count),
  13251. (val_sub, ":voter_count", 1),
  13252. (faction_set_slot, ":poll_faction_id", slot_faction_poll_voter_count, ":voter_count"),
  13253. (try_end),
  13254. (eq, ":remove_vote", 0),
  13255. (try_begin),
  13256. (eq, ":vote", poll_vote_no),
  13257. (faction_get_slot, ":no_votes", ":poll_faction_id", slot_faction_poll_no_votes),
  13258. (val_add, ":no_votes", 1),
  13259. (faction_set_slot, ":poll_faction_id", slot_faction_poll_no_votes, ":no_votes"),
  13260. (else_try),
  13261. (eq, ":vote", poll_vote_yes),
  13262. (faction_get_slot, ":yes_votes", ":poll_faction_id", slot_faction_poll_yes_votes),
  13263. (val_add, ":yes_votes", 1),
  13264. (faction_set_slot, ":poll_faction_id", slot_faction_poll_yes_votes, ":yes_votes"),
  13265. (else_try),
  13266. (assign, ":poll_result", 0),
  13267. (try_begin),
  13268. (eq, ":vote", poll_vote_admin_no),
  13269. (assign, ":poll_result", poll_result_admin_no),
  13270. (else_try),
  13271. (eq, ":vote", poll_vote_admin_yes),
  13272. (assign, ":poll_result", poll_result_admin_yes),
  13273. (try_end),
  13274. (neq, ":poll_result", 0),
  13275. (player_is_admin, ":player_id"),
  13276. (player_slot_eq, ":player_id", slot_player_admin_no_override_poll, 0),
  13277. (faction_set_slot, ":poll_faction_id", slot_faction_poll_end_time, 0),
  13278. (call_script, "script_apply_poll_consequences", ":poll_faction_id", ":poll_result"),
  13279. (try_end),
  13280. (try_end),
  13281. ]),
  13282.  
  13283. ("check_polls_ended", # server: check all factions for polls that have ended
  13284. [
  13285. (store_mission_timer_a, ":current_time"),
  13286. (store_add, ":factions_end", factions_end, 1),
  13287. (try_for_range, ":poll_faction_id", castle_factions_begin, ":factions_end"),
  13288. (faction_get_slot, ":end_time", ":poll_faction_id", slot_faction_poll_end_time),
  13289. (ge, ":end_time", 1),
  13290. (faction_get_slot, ":voter_count", ":poll_faction_id", slot_faction_poll_voter_count),
  13291. (faction_get_slot, ":yes_votes", ":poll_faction_id", slot_faction_poll_yes_votes),
  13292. (faction_get_slot, ":no_votes", ":poll_faction_id", slot_faction_poll_no_votes),
  13293. (store_add, ":received_votes", ":yes_votes", ":no_votes"),
  13294. (this_or_next|ge, ":received_votes", ":voter_count"),
  13295. (ge, ":current_time", ":end_time"),
  13296. (faction_set_slot, ":poll_faction_id", slot_faction_poll_end_time, 0),
  13297. (store_sub, ":abstain_votes", ":voter_count", ":received_votes"),
  13298. (val_mul, ":abstain_votes", 3),
  13299. (val_div, ":abstain_votes", 10),
  13300. (store_add, ":total_votes", ":received_votes", ":abstain_votes"),
  13301. (val_max, ":total_votes", 1),
  13302. (store_mul, ":vote_ratio", ":yes_votes", 100),
  13303. (val_div, ":vote_ratio", ":total_votes"),
  13304. (try_begin),
  13305. (ge, ":vote_ratio", "$g_valid_vote_ratio"),
  13306. (assign, ":poll_result", poll_result_yes),
  13307. (else_try),
  13308. (assign, ":poll_result", poll_result_no),
  13309. (try_end),
  13310. (call_script, "script_apply_poll_consequences", ":poll_faction_id", ":poll_result"),
  13311. (try_end),
  13312. ]),
  13313.  
  13314. ("apply_poll_consequences", # server: try to apply the poll consequences, displaying the result to voters
  13315. [(store_script_param, ":poll_faction_id", 1),
  13316. (store_script_param, ":poll_result", 2), # constants starting with poll_result_
  13317.  
  13318. (faction_get_slot, ":poll_type", ":poll_faction_id", slot_faction_poll_type),
  13319. (faction_get_slot, ":value_1", ":poll_faction_id", slot_faction_poll_value_1),
  13320. (try_begin),
  13321. (this_or_next|eq, ":poll_result", poll_result_yes),
  13322. (eq, ":poll_result", poll_result_admin_yes),
  13323. (this_or_next|eq, ":poll_type", poll_type_kick_player),
  13324. (eq, ":poll_type", poll_type_faction_lord),
  13325. (player_is_active, ":value_1"),
  13326. (player_get_unique_id, ":check_unique_id", ":value_1"),
  13327. (faction_get_slot, ":target_unique_id", ":poll_faction_id", slot_faction_poll_target_unique_id),
  13328. (else_try),
  13329. (assign, ":check_unique_id", -1),
  13330. (assign, ":target_unique_id", -1),
  13331. (try_end),
  13332. (get_max_players, ":max_players"),
  13333. (try_for_range, ":player_id", 1, ":max_players"),
  13334. (player_is_active, ":player_id"),
  13335. (this_or_next|eq, ":poll_faction_id", factions_end),
  13336. (player_slot_eq, ":player_id", slot_player_faction_id, ":poll_faction_id"),
  13337. (player_set_slot, ":player_id", slot_player_poll_faction_id, 0),
  13338. (multiplayer_send_int_to_player, ":player_id", server_event_show_poll, ":poll_result"),
  13339. (neq, ":check_unique_id", ":target_unique_id"),
  13340. (player_get_unique_id, ":check_unique_id", ":value_1"),
  13341. (eq, ":check_unique_id", ":target_unique_id"),
  13342. (assign, ":value_1", ":player_id"),
  13343. (try_end),
  13344. (try_begin),
  13345. (neq, ":poll_result", poll_result_yes),
  13346. (neq, ":poll_result", poll_result_admin_yes),
  13347. (else_try),
  13348. (eq, ":poll_type", poll_type_change_scene),
  13349. (assign, "$g_next_scene", ":value_1"),
  13350. (else_try),
  13351. (eq, ":poll_type", poll_type_kick_player),
  13352. (player_is_active, ":value_1"),
  13353. (eq, ":check_unique_id", ":target_unique_id"),
  13354. (kick_player, ":value_1"),
  13355. (else_try),
  13356. (eq, ":poll_type", poll_type_ban_player),
  13357. (ban_player_using_saved_ban_info),
  13358. (else_try),
  13359. (eq, ":poll_type", poll_type_faction_lord),
  13360. (this_or_next|neg|player_is_active, ":value_1"),
  13361. (eq, ":check_unique_id", ":target_unique_id"),
  13362. (call_script, "script_cf_faction_set_lord", ":value_1", ":target_unique_id", ":poll_faction_id"),
  13363. (try_end),
  13364. ]),
  13365.  
  13366. ("select_target_agent", # clients: find the agent projected closest to the center of the view, highlighting them and storing in $g_target_agent_id and $g_target_player_id
  13367. [
  13368. (set_fixed_point_multiplier, 1000),
  13369. (multiplayer_get_my_player, ":my_player_id"),
  13370. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  13371. (assign, ":closest_score", int(math.sqrt(select_agent_max_x * select_agent_max_x + select_agent_max_y * select_agent_max_y))),
  13372. (convert_to_fixed_point, ":closest_score"),
  13373. (assign, "$g_target_agent_id", -1),
  13374. (mission_cam_get_position, pos1),
  13375. (try_for_agents, ":agent_id"),
  13376. (agent_is_human, ":agent_id"),
  13377. (agent_set_slot, ":agent_id", slot_agent_is_targeted, 0),
  13378. (neq, ":agent_id", ":my_agent_id"),
  13379. (agent_get_item_slot, ":body_item_id", ":agent_id", ek_body),
  13380. (neq, ":body_item_id", "itm_invisible_body"),
  13381. (agent_get_position, pos2, ":agent_id"),
  13382. (position_move_z, pos2, 160),
  13383. (agent_get_horse, ":horse", ":agent_id"),
  13384. (try_begin),
  13385. (ge, ":horse", 0),
  13386. (position_move_z, pos2, 80),
  13387. (try_end),
  13388. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  13389. (le, ":sq_distance", sq(max_distance_to_see_labels)),
  13390. (position_has_line_of_sight_to_position, pos1, pos2),
  13391. (position_get_screen_projection, pos3, pos2),
  13392. (position_get_x, ":x_pos", pos3),
  13393. (val_sub, ":x_pos", presentation_max_x / 2),
  13394. (val_abs, ":x_pos"),
  13395. (lt, ":x_pos", select_agent_max_x),
  13396. (position_get_y, ":y_pos", pos3),
  13397. (val_sub, ":y_pos", presentation_max_y / 2),
  13398. (val_abs, ":y_pos"),
  13399. (lt, ":y_pos", select_agent_max_y),
  13400. (val_mul, ":x_pos", ":x_pos"),
  13401. (val_mul, ":y_pos", ":y_pos"),
  13402. (store_add, ":score", ":x_pos", ":y_pos"),
  13403. (convert_to_fixed_point, ":score"),
  13404. (store_sqrt, ":score", ":score"),
  13405. (lt, ":score", ":closest_score"),
  13406. (assign, ":closest_score", ":score"),
  13407. (assign, "$g_target_agent_id", ":agent_id"),
  13408. (try_end),
  13409. (try_begin),
  13410. (gt, "$g_target_agent_id", -1),
  13411. (agent_get_position, pos2, "$g_target_agent_id"),
  13412. (particle_system_burst, "psys_target_agent", pos2, 1),
  13413. (agent_set_slot, "$g_target_agent_id", slot_agent_is_targeted, 1), # set an agent slot for verification if that agent dies before the usage
  13414. (agent_get_player_id, ":target_player_id", "$g_target_agent_id"),
  13415. (try_begin),
  13416. (player_is_active, ":target_player_id"),
  13417. (assign, "$g_target_player_id", ":target_player_id"),
  13418. (assign, "$g_target_player_overlay_id", -1),
  13419. (player_set_slot, "$g_target_player_id", slot_player_list_button_id, -1),
  13420. (try_end),
  13421. (try_begin),
  13422. (neg|is_presentation_active, "prsnt_target_agent_name"),
  13423. (start_presentation, "prsnt_target_agent_name"),
  13424. (try_end),
  13425. (else_try),
  13426. (player_is_active, "$g_target_player_id"),
  13427. (player_slot_eq, "$g_target_player_id", slot_player_list_button_id, -1),
  13428. (assign, "$g_target_player_id", -1),
  13429. (try_end),
  13430. (set_fixed_point_multiplier, 100),
  13431. ]),
  13432.  
  13433. ("select_target_corpse", # clients: find the nearby corpse projected closest to the center of the view, highlighing them and storing in $g_target_corpse_instance_id
  13434. [
  13435. (set_fixed_point_multiplier, 1000),
  13436. (multiplayer_get_my_player, ":player_id"),
  13437. (try_begin),
  13438. (player_is_active, ":player_id"),
  13439. (player_get_agent_id, ":agent_id", ":player_id"),
  13440. (agent_is_active, ":agent_id"),
  13441. (agent_is_alive, ":agent_id"),
  13442. (assign, ":closest_score", int(math.sqrt(select_agent_max_x * select_agent_max_x + select_agent_max_y * select_agent_max_y))),
  13443. (convert_to_fixed_point, ":closest_score"),
  13444. (assign, "$g_target_corpse_instance_id", -1),
  13445. (mission_cam_get_position, pos1),
  13446. (scene_spawned_item_get_num_instances, ":corpse_count", "itm_agent_corpse"),
  13447. (try_for_range, ":corpse_no", 0, ":corpse_count"),
  13448. (scene_spawned_item_get_instance, ":corpse_instance_id", "itm_agent_corpse", ":corpse_no"),
  13449. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_targeted, 0),
  13450. (prop_instance_get_position, pos2, ":corpse_instance_id"),
  13451. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  13452. (le, ":sq_distance", sq(max_distance_to_see_labels)),
  13453. (position_get_screen_projection, pos3, pos2),
  13454. (position_get_x, ":x_pos", pos3),
  13455. (val_sub, ":x_pos", presentation_max_x / 2),
  13456. (val_abs, ":x_pos"),
  13457. (lt, ":x_pos", select_agent_max_x),
  13458. (position_get_y, ":y_pos", pos3),
  13459. (val_sub, ":y_pos", presentation_max_y / 2),
  13460. (val_abs, ":y_pos"),
  13461. (lt, ":y_pos", select_agent_max_y),
  13462. (val_mul, ":x_pos", ":x_pos"),
  13463. (val_mul, ":y_pos", ":y_pos"),
  13464. (store_add, ":score", ":x_pos", ":y_pos"),
  13465. (convert_to_fixed_point, ":score"),
  13466. (store_sqrt, ":score", ":score"),
  13467. (lt, ":score", ":closest_score"),
  13468. (assign, ":closest_score", ":score"),
  13469. (assign, "$g_target_corpse_instance_id", ":corpse_instance_id"),
  13470. (try_end),
  13471. (try_begin),
  13472. (gt, "$g_target_corpse_instance_id", -1),
  13473. (prop_instance_get_position, pos2, "$g_target_corpse_instance_id"),
  13474. (particle_system_burst, "psys_target_agent", pos2, 1),
  13475. (scene_prop_set_slot, "$g_target_corpse_instance_id", slot_scene_prop_inventory_targeted, 1),
  13476. (try_end),
  13477. (try_end),
  13478. (set_fixed_point_multiplier, 100),
  13479. ]),
  13480.  
  13481. ("loot_target_corpse", # clients: request to loot the currently targeted corpse
  13482. [
  13483. (try_begin),
  13484. (prop_instance_is_valid, "$g_target_corpse_instance_id"),
  13485. (scene_prop_slot_eq, "$g_target_corpse_instance_id", slot_scene_prop_inventory_targeted, 1),
  13486. (multiplayer_get_my_player, ":player_id"),
  13487. (player_is_active, ":player_id"),
  13488. (player_get_agent_id, ":agent_id", ":player_id"),
  13489. (agent_is_active, ":agent_id"),
  13490. (agent_is_alive, ":agent_id"),
  13491. (agent_get_position, pos1, ":agent_id"),
  13492. (prop_instance_get_position, pos2, "$g_target_corpse_instance_id"),
  13493. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  13494. (try_begin),
  13495. (le, ":sq_distance", sq(max_distance_to_loot)),
  13496. (scene_prop_set_slot, "$g_target_corpse_instance_id", slot_scene_prop_inventory_count, corpse_inventory_slots),
  13497. (scene_prop_set_slot, "$g_target_corpse_instance_id", slot_scene_prop_inventory_max_length, corpse_inventory_max_length),
  13498. (multiplayer_send_2_int_to_server, client_event_agent_loot_armor, "$g_target_corpse_instance_id"),
  13499. (else_try),
  13500. (call_script, "script_preset_message", "str_too_far_away_loot", preset_message_error, 0, 0),
  13501. (try_end),
  13502. (try_end),
  13503. ]),
  13504.  
  13505. ("cf_admin_action", # server: check player requests to use admin tools, applying if successful
  13506. [(store_script_param, ":admin_action", 1), # constants starting with admin_action_
  13507. (store_script_param, ":admin_player_id", 2), # must be valid
  13508. (store_script_param, ":target_player_id", 3), # either the target player id or 0 for no target
  13509.  
  13510. (player_is_admin, ":admin_player_id"),
  13511. (this_or_next|eq, ":target_player_id", 0),
  13512. (player_is_active, ":target_player_id"),
  13513. (try_begin),
  13514. (eq, ":admin_action", admin_action_kick_player),
  13515. (player_slot_eq, ":admin_player_id", slot_player_admin_no_kick, 0),
  13516. (kick_player, ":target_player_id"),
  13517. (else_try),
  13518. (eq, ":admin_action", admin_action_ban_player_temp),
  13519. (player_slot_eq, ":admin_player_id", slot_player_admin_no_temporary_ban, 0),
  13520. (ban_player, ":target_player_id", 1, ":admin_player_id"),
  13521. (else_try),
  13522. (eq, ":admin_action", admin_action_ban_player_perm),
  13523. (player_slot_eq, ":admin_player_id", slot_player_admin_no_permanent_ban, 0),
  13524. (ban_player, ":target_player_id", 0, ":admin_player_id"),
  13525. (else_try),
  13526. (eq, ":admin_action", admin_action_mute_player),
  13527. (player_slot_eq, ":admin_player_id", slot_player_admin_no_mute, 0),
  13528. (player_get_is_muted, ":is_muted", ":target_player_id"),
  13529. (try_begin),
  13530. (eq, ":is_muted", 0),
  13531. (assign, ":is_muted", 1),
  13532. (else_try),
  13533. (assign, ":is_muted", 0),
  13534. (try_end),
  13535. (player_set_is_muted, ":target_player_id", ":is_muted", 1),
  13536. (else_try),
  13537. (player_get_agent_id, ":admin_agent_id", ":admin_player_id"),
  13538. (neq, ":target_player_id", 0),
  13539. (player_get_agent_id, ":target_agent_id", ":target_player_id"),
  13540. (agent_is_active, ":target_agent_id"),
  13541. (try_begin), # beginning of tools that target another agent
  13542. (eq, ":admin_action", admin_action_kill_player),
  13543. (player_slot_eq, ":admin_player_id", slot_player_admin_no_kill_fade, 0),
  13544. (agent_deliver_damage_to_agent, ":target_agent_id", ":target_agent_id", 500),
  13545. (else_try),
  13546. (eq, ":admin_action", admin_action_fade_player_out),
  13547. (player_slot_eq, ":admin_player_id", slot_player_admin_no_kill_fade, 0),
  13548. (agent_fade_out, ":target_agent_id"),
  13549. (try_for_range, ":player_equip_slot", slot_player_equip_item_0, slot_player_equip_end),
  13550. (player_set_slot, ":target_player_id", ":player_equip_slot", 0),
  13551. (try_end),
  13552. (agent_get_slot, ":freeze_instance_id", ":target_agent_id", slot_agent_freeze_instance_id),
  13553. (try_begin),
  13554. (gt, ":freeze_instance_id", -1),
  13555. (call_script, "script_remove_scene_prop", ":freeze_instance_id"),
  13556. (agent_set_slot, ":target_agent_id", slot_agent_freeze_instance_id, -1),
  13557. (try_end),
  13558. (player_set_slot, ":target_player_id", slot_player_spawn_state, player_spawn_state_dead),
  13559. (else_try),
  13560. (eq, ":admin_action", admin_action_freeze_player),
  13561. (player_slot_eq, ":admin_player_id", slot_player_admin_no_freeze, 0),
  13562. (agent_get_horse, ":horse_agent_id", ":target_agent_id"),
  13563. (agent_get_slot, ":freeze_instance_id", ":target_agent_id", slot_agent_freeze_instance_id),
  13564. (try_begin),
  13565. (gt, ":freeze_instance_id", -1),
  13566. (call_script, "script_remove_scene_prop", ":freeze_instance_id"),
  13567. (agent_set_slot, ":target_agent_id", slot_agent_freeze_instance_id, -1),
  13568. (agent_set_speed_modifier, ":target_agent_id", 100),
  13569. (try_begin),
  13570. (gt, ":horse_agent_id", -1),
  13571. (agent_set_speed_modifier, ":horse_agent_id", 100),
  13572. (try_end),
  13573. (else_try),
  13574. (try_begin),
  13575. (gt, ":horse_agent_id", -1),
  13576. (assign, ":freeze_scene_prop_id", "spr_code_freeze_horse_agent"),
  13577. (agent_set_speed_modifier, ":horse_agent_id", 0),
  13578. (else_try),
  13579. (assign, ":freeze_scene_prop_id", "spr_code_freeze_agent"),
  13580. (try_end),
  13581. (agent_get_position, pos1, ":target_agent_id"),
  13582. (call_script, "script_reuse_or_spawn_scene_prop", ":freeze_scene_prop_id"),
  13583. (prop_instance_set_position, reg0, pos1),
  13584. (agent_set_slot, ":target_agent_id", slot_agent_freeze_instance_id, reg0),
  13585. (agent_set_speed_modifier, ":target_agent_id", 0),
  13586. (try_end),
  13587. (else_try),
  13588. (player_slot_eq, ":admin_player_id", slot_player_admin_no_teleport_self, 0),
  13589. (this_or_next|eq, ":admin_action", admin_action_teleport_to_player),
  13590. (eq, ":admin_action", admin_action_teleport_behind_player),
  13591. (agent_is_active, ":admin_agent_id"),
  13592. (try_begin),
  13593. (eq, ":admin_action", admin_action_teleport_to_player),
  13594. (agent_get_position, pos1, ":target_agent_id"),
  13595. (position_move_y, pos1, 100),
  13596. (else_try),
  13597. (eq, ":admin_action", admin_action_teleport_behind_player),
  13598. (agent_get_position, pos1, ":target_agent_id"),
  13599. (position_move_y, pos1, -200),
  13600. (try_end),
  13601. (agent_set_position, ":admin_agent_id", pos1),
  13602. (else_try),
  13603. (assign, ":admin_action", -1),
  13604. (try_end), # end of tools that target another agent
  13605. (else_try),
  13606. (player_slot_eq, ":admin_player_id", slot_player_admin_no_teleport_self, 0),
  13607. (eq, ":admin_action", admin_action_teleport_forwards),
  13608. (agent_is_active, ":admin_agent_id"),
  13609. (agent_get_position, pos1, ":admin_agent_id"),
  13610. (position_move_y, pos1, 300),
  13611. (position_move_z, pos1, 100),
  13612. (agent_set_position, ":admin_agent_id", pos1),
  13613. (else_try),
  13614. (player_slot_eq, ":admin_player_id", slot_player_admin_no_admin_items, 0),
  13615. (try_begin),
  13616. (eq, ":admin_action", admin_action_get_armor),
  13617. (troop_set_slot, "trp_temp_array", slot_player_equip_head, "itm_black_helmet"),
  13618. (troop_set_slot, "trp_temp_array", slot_player_equip_body, "itm_black_armor"),
  13619. (troop_set_slot, "trp_temp_array", slot_player_equip_foot, "itm_black_greaves"),
  13620. (troop_set_slot, "trp_temp_array", slot_player_equip_gloves, "itm_gauntlets"),
  13621. (else_try),
  13622. (eq, ":admin_action", admin_action_get_invisible),
  13623. (troop_set_slot, "trp_temp_array", slot_player_equip_head, "itm_invisible_head"),
  13624. (troop_set_slot, "trp_temp_array", slot_player_equip_body, "itm_invisible_body"),
  13625. (troop_set_slot, "trp_temp_array", slot_player_equip_foot, "itm_invisible_foot"),
  13626. (troop_set_slot, "trp_temp_array", slot_player_equip_gloves, "itm_invisible_hand"),
  13627. (else_try),
  13628. (troop_set_slot, "trp_temp_array", slot_player_equip_body, 0),
  13629. (try_end),
  13630. (neg|troop_slot_eq, "trp_temp_array", slot_player_equip_body, 0),
  13631. (agent_is_active, ":admin_agent_id"),
  13632. (agent_get_item_slot, ":equipped_item_id", ":admin_agent_id", ek_body),
  13633. (try_begin), # if the admin body armor selected is already equipped, return the previous armor
  13634. (troop_slot_eq, "trp_temp_array", slot_player_equip_body, ":equipped_item_id"),
  13635. (try_for_range, ":slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  13636. (player_get_slot, ":item_id", ":target_player_id", ":slot"),
  13637. (try_begin),
  13638. (neq, ":item_id", -1),
  13639. (val_abs, ":item_id"),
  13640. (ge, ":item_id", all_items_begin),
  13641. (else_try),
  13642. (store_sub, ":item_id", ":slot", slot_player_equip_head),
  13643. (val_add, ":item_id", "itm_no_head"),
  13644. (try_end),
  13645. (troop_set_slot, "trp_temp_array", ":slot", ":item_id"),
  13646. (try_end),
  13647. (else_try),
  13648. (eq, ":admin_action", admin_action_get_invisible),
  13649. (agent_equip_item, ":admin_agent_id", "itm_invisible_sword"),
  13650. (try_end),
  13651. (try_for_range, ":slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  13652. (troop_get_slot, ":item_id", "trp_temp_array", ":slot"),
  13653. (call_script, "script_change_armor", ":admin_agent_id", ":item_id"),
  13654. (try_end),
  13655. (else_try),
  13656. (eq, ":admin_action", admin_action_refill_health),
  13657. (player_slot_eq, ":admin_player_id", slot_player_admin_no_heal_self, 0),
  13658. (agent_is_active, ":admin_agent_id"),
  13659. (agent_set_hit_points, ":admin_agent_id", 100, 0),
  13660. (call_script, "script_cf_clean_blood", ":admin_agent_id"),
  13661. (else_try),
  13662. (eq, ":admin_action", admin_action_become_godlike),
  13663. (player_slot_eq, ":admin_player_id", slot_player_admin_no_godlike_troop, 0),
  13664. (agent_is_active, ":admin_agent_id"),
  13665. (player_get_troop_id, ":troop_id", ":admin_player_id"),
  13666. (try_begin), # if the admin is already using the godlike hero, return to the previous troop
  13667. (eq, ":troop_id", "trp_godlike_hero"),
  13668. (player_get_slot, ":new_troop_id", ":admin_player_id", slot_player_non_lord_troop_id),
  13669. (try_begin),
  13670. (neg|is_between, ":new_troop_id", playable_troops_begin, playable_troops_end),
  13671. (assign, ":new_troop_id", playable_troops_begin),
  13672. (player_set_slot, ":admin_player_id", slot_player_non_lord_troop_id, playable_troops_begin),
  13673. (try_end),
  13674. (else_try),
  13675. (player_set_slot, ":admin_player_id", slot_player_non_lord_troop_id, ":troop_id"),
  13676. (assign, ":new_troop_id", "trp_godlike_hero"),
  13677. (try_end),
  13678. (player_set_troop_id, ":admin_player_id", ":new_troop_id"),
  13679. (agent_set_hit_points, ":admin_agent_id", 100, 0),
  13680. (call_script, "script_player_add_equipped_items", ":admin_player_id", ":new_troop_id"),
  13681. (call_script, "script_player_add_spawn_items", ":admin_player_id", 1),
  13682. (call_script, "script_player_respawn_in_place", ":admin_player_id"),
  13683. (else_try),
  13684. (eq, ":admin_action", admin_action_get_horse),
  13685. (player_slot_eq, ":admin_player_id", slot_player_admin_no_admin_items, 0),
  13686. (agent_is_active, ":admin_agent_id"),
  13687. (agent_get_position, pos1, ":admin_agent_id"),
  13688. (position_move_x, pos1, 50),
  13689. (position_set_z_to_ground_level, pos1),
  13690. (set_spawn_position, pos1),
  13691. (spawn_horse, "itm_admin_horse"),
  13692. (else_try),
  13693. (eq, ":admin_action", admin_action_remove_horses),
  13694. (player_slot_eq, ":admin_player_id", slot_player_admin_no_admin_items, 0),
  13695. (try_for_agents, ":horse_agent_id"),
  13696. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  13697. (eq, ":horse_item_id", "itm_admin_horse"),
  13698. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  13699. (try_begin),
  13700. (neg|agent_is_active, ":rider_agent_id"),
  13701. (agent_fade_out, ":horse_agent_id"),
  13702. (else_try),
  13703. (agent_get_player_id, ":rider_player_id", ":rider_agent_id"),
  13704. (player_is_active, ":rider_player_id", ":rider_agent_id"),
  13705. (player_is_admin, ":rider_player_id"),
  13706. (else_try),
  13707. (try_begin),
  13708. (agent_is_active, ":admin_agent_id"),
  13709. (assign, ":killer_agent_id", ":admin_agent_id"),
  13710. (else_try),
  13711. (assign, ":killer_agent_id", ":horse_agent_id"),
  13712. (try_end),
  13713. (agent_deliver_damage_to_agent, ":killer_agent_id", ":horse_agent_id", 1000),
  13714. (agent_fade_out, ":horse_agent_id"),
  13715. (try_end),
  13716. (try_end),
  13717. (else_try),
  13718. (eq, ":admin_action", admin_action_remove_stray_horses),
  13719. (player_slot_eq, ":admin_player_id", slot_player_admin_no_animals, 0),
  13720. (try_for_agents, ":horse_agent_id"),
  13721. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  13722. (gt, ":horse_item_id", -1),
  13723. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  13724. (neg|agent_is_active, ":rider_agent_id"),
  13725. (neg|agent_slot_ge, ":horse_agent_id", slot_agent_horse_last_rider, 0),
  13726. (agent_slot_eq, ":horse_agent_id", slot_agent_animal_herd_manager, -1),
  13727. (agent_get_attached_scene_prop, ":attached_instance_id", ":horse_agent_id"),
  13728. (neg|prop_instance_is_valid, ":attached_instance_id"),
  13729. (agent_fade_out, ":horse_agent_id"),
  13730. (try_end),
  13731. (else_try),
  13732. (eq, ":admin_action", admin_action_teleport_to_ships),
  13733. (player_slot_eq, ":admin_player_id", slot_player_admin_no_ships, 0),
  13734. (agent_is_active, ":admin_agent_id"),
  13735. (troop_get_slot, ":loop_end", "trp_ship_array", slot_ship_array_count),
  13736. (gt, ":loop_end", 0),
  13737. (val_add, ":loop_end", slot_ship_array_begin),
  13738. (player_get_slot, ":target_ship_slot", ":admin_player_id", slot_player_teleport_to_ship_no),
  13739. (try_for_range, ":unused", slot_ship_array_begin, ":loop_end"),
  13740. (val_add, ":target_ship_slot", 1),
  13741. (try_begin),
  13742. (neg|is_between, ":target_ship_slot", slot_ship_array_begin, ":loop_end"),
  13743. (assign, ":target_ship_slot", slot_ship_array_begin),
  13744. (try_end),
  13745. (troop_get_slot, ":instance_id", "trp_ship_array", ":target_ship_slot"),
  13746. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  13747. (assign, ":loop_end", -1),
  13748. (try_end),
  13749. (try_begin),
  13750. (eq, ":loop_end", -1),
  13751. (prop_instance_get_position, pos1, ":instance_id"),
  13752. (position_move_z, pos1, 500, 1),
  13753. (agent_set_position, ":admin_agent_id", pos1),
  13754. (player_set_slot, ":admin_player_id", slot_player_teleport_to_ship_no, ":target_ship_slot"),
  13755. (try_end),
  13756. (else_try),
  13757. (eq, ":admin_action", admin_action_reset_ships),
  13758. (player_slot_eq, ":admin_player_id", slot_player_admin_no_ships, 0),
  13759. (troop_get_slot, ":ship_array_count", "trp_ship_array", slot_ship_array_count),
  13760. (gt, ":ship_array_count", 0),
  13761. (store_add, ":loop_end", slot_ship_array_begin, ":ship_array_count"),
  13762. (try_for_range, ":ship_slot", slot_ship_array_begin, ":loop_end"),
  13763. (troop_get_slot, ":hull_instance_id", "trp_ship_array", ":ship_slot"),
  13764. (assign, ":reset", 0),
  13765. (try_begin), # reset all destroyed ships
  13766. (scene_prop_slot_eq, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  13767. (assign, ":reset", 1),
  13768. (else_try), # and also any that the admin is standing on
  13769. (agent_is_active, ":admin_agent_id"),
  13770. (scene_prop_has_agent_on_it, ":hull_instance_id", ":admin_agent_id"),
  13771. (assign, ":reset", 2),
  13772. (try_end),
  13773. (gt, ":reset", 0),
  13774. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_active),
  13775. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_position, 0),
  13776. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_position, 0),
  13777. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_rotation, 0),
  13778. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_rotation, 0),
  13779. (scene_prop_get_slot, ":hit_points", ":hull_instance_id", slot_scene_prop_full_hit_points),
  13780. (scene_prop_set_hit_points, ":hull_instance_id", ":hit_points"),
  13781. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_next_resource_hp, ":hit_points"),
  13782. (prop_instance_get_starting_position, pos1, ":hull_instance_id"),
  13783. (prop_instance_stop_animating, ":hull_instance_id"),
  13784. (prop_instance_set_position, ":hull_instance_id", pos1),
  13785. (scene_prop_get_slot, ":sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail),
  13786. (try_begin),
  13787. (gt, ":sail_instance_id", -1),
  13788. (prop_instance_stop_animating, ":sail_instance_id"),
  13789. (set_fixed_point_multiplier, 100),
  13790. (init_position, pos2),
  13791. (position_set_z, pos2, z_position_to_hide_object),
  13792. (prop_instance_set_position, ":sail_instance_id", pos2),
  13793. (try_end),
  13794. (scene_prop_get_slot, ":sail_off_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail_off),
  13795. (try_begin),
  13796. (gt, ":sail_off_instance_id", -1),
  13797. (prop_instance_stop_animating, ":sail_off_instance_id"),
  13798. (prop_instance_set_position, ":sail_off_instance_id", pos1),
  13799. (try_end),
  13800. (scene_prop_get_slot, ":ramp_instance_id", ":hull_instance_id", slot_scene_prop_linked_ramp),
  13801. (try_begin),
  13802. (gt, ":ramp_instance_id", -1),
  13803. (prop_instance_stop_animating, ":ramp_instance_id"),
  13804. (prop_instance_get_variation_id, ":ramp_start_position", ":hull_instance_id"),
  13805. (try_begin),
  13806. (gt, ":ramp_start_position", 1),
  13807. (assign, ":ramp_start_position", -1),
  13808. (try_end),
  13809. (call_script, "script_ship_get_ramp_relative_position", ":ramp_start_position", 1),
  13810. (position_transform_position_to_parent, pos2, pos1, pos30),
  13811. (prop_instance_set_position, ":ramp_instance_id", pos2),
  13812. (try_end),
  13813. (try_begin),
  13814. (scene_prop_get_slot, ":hold_instance_id", ":hull_instance_id", slot_scene_prop_linked_hold),
  13815. (gt, ":hold_instance_id", -1),
  13816. (prop_instance_stop_animating, ":hold_instance_id"),
  13817. (prop_instance_set_position, ":hold_instance_id", pos1),
  13818. (eq, ":reset", 1),
  13819. (scene_prop_get_slot, ":inventory_slot_end", ":hold_instance_id", slot_scene_prop_inventory_count),
  13820. (gt, ":inventory_slot_end", 0),
  13821. (val_add, ":inventory_slot_end", slot_scene_prop_inventory_begin),
  13822. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_slot_end"),
  13823. (scene_prop_set_slot, ":hold_instance_id", ":inventory_slot", 0),
  13824. (try_end),
  13825. (try_end),
  13826. (try_begin),
  13827. (eq, ":reset", 2),
  13828. (entry_point_get_position, pos2, 0),
  13829. (agent_set_position, ":admin_agent_id", pos2),
  13830. (try_end),
  13831. (try_end),
  13832. (else_try),
  13833. (eq, ":admin_action", admin_action_lock_faction),
  13834. (player_slot_eq, ":admin_player_id", slot_player_admin_no_factions, 0),
  13835. (player_get_slot, ":faction_id", ":admin_player_id", slot_player_faction_id),
  13836. (is_between, ":faction_id", castle_factions_begin, factions_end),
  13837. (faction_get_slot, ":locked", ":faction_id", slot_faction_is_locked),
  13838. (try_begin),
  13839. (eq, ":locked", 0),
  13840. (assign, ":locked", 1),
  13841. (str_clear, s4),
  13842. (else_try),
  13843. (assign, ":locked", 0),
  13844. (str_store_string, s4, "str_un"),
  13845. (try_end),
  13846. (faction_set_slot, ":faction_id", slot_faction_is_locked, ":locked"),
  13847. (get_max_players, ":max_players"),
  13848. (try_for_range, ":other_player_id", 1, ":max_players"),
  13849. (player_is_active, ":other_player_id"),
  13850. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_faction_set_slot, ":faction_id", slot_faction_is_locked, ":locked"),
  13851. (try_end),
  13852. (str_store_faction_name, s5, ":faction_id"),
  13853. (else_try),
  13854. (assign, ":admin_action", -1),
  13855. (try_end),
  13856. (gt, ":admin_action", -1),
  13857. (store_add, ":log_string_id", admin_action_log_strings_begin, ":admin_action"),
  13858. (str_store_string, s3, ":log_string_id"),
  13859. (player_get_unique_id, reg0, ":admin_player_id"),
  13860. (str_store_player_username, s0, ":admin_player_id"),
  13861. (try_begin),
  13862. (neq, ":target_player_id", 0),
  13863. (neq, ":target_player_id", ":admin_player_id"),
  13864. (player_get_unique_id, reg1, ":target_player_id"),
  13865. (str_store_player_username, s1, ":target_player_id"),
  13866. (assign, ":log_string_id", "str_log_admin_target_player"),
  13867. (else_try),
  13868. (assign, ":log_string_id", "str_log_admin_target_self"),
  13869. (try_end),
  13870. (server_add_message_to_log, ":log_string_id"),
  13871. ]),
  13872.  
  13873. ("cf_faction_admin_action", # server: check player requests to use faction lord tools, applying if successful
  13874. [(store_script_param, ":action", 1), # constants starting with faction_admin_action_
  13875. (store_script_param, ":sender_player_id", 2), # must be valid
  13876. (store_script_param, ":value_1", 3),
  13877.  
  13878. (player_get_slot, ":faction_id", ":sender_player_id", slot_player_faction_id),
  13879. (player_get_unique_id, ":unique_id", ":sender_player_id"),
  13880. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  13881. (assign, ":fail", 0),
  13882. (try_begin),
  13883. (eq, ":action", faction_admin_action_change_banner),
  13884. (is_between, ":value_1", banner_meshes_begin, banner_meshes_end),
  13885. (assign, ":loop_end", factions_end),
  13886. (try_for_range, ":other_faction_id", factions_begin, ":loop_end"), # ensure that the banner is not currently in use by another faction
  13887. (faction_slot_eq, ":other_faction_id", slot_faction_banner_mesh, ":value_1"),
  13888. (faction_slot_eq, ":other_faction_id", slot_faction_is_active, 1),
  13889. (assign, ":loop_end", -1),
  13890. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_preset_message, "str_banner_used_by_s1", preset_message_faction|preset_message_fail_sound, ":other_faction_id"),
  13891. (try_end),
  13892. (neq, ":loop_end", -1),
  13893. (call_script, "script_cf_check_enough_gold", ":sender_player_id", faction_cost_change_banner),
  13894. (call_script, "script_player_adjust_gold", ":sender_player_id", faction_cost_change_banner, -1),
  13895. (faction_set_slot, ":faction_id", slot_faction_banner_mesh, ":value_1"),
  13896. (get_max_players, ":max_players"),
  13897. (try_for_range, ":player_id", 1, ":max_players"),
  13898. (player_is_active, ":player_id"),
  13899. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", slot_faction_banner_mesh, ":value_1"),
  13900. (try_end),
  13901. (call_script, "script_redraw_castle_banners", redraw_faction_banners, ":faction_id"),
  13902. (else_try),
  13903. (this_or_next|eq, ":action", faction_admin_action_kick_player),
  13904. (eq, ":action", faction_admin_action_outlaw_player),
  13905. (player_is_active, ":value_1"),
  13906. (player_slot_eq, ":value_1", slot_player_faction_id, ":faction_id"),
  13907. (neq, ":value_1", ":sender_player_id"),
  13908. (faction_slot_eq, ":faction_id", slot_faction_poll_end_time, 0),
  13909. (assign, ":continue", 1),
  13910. (try_begin),
  13911. (eq, ":action", faction_admin_action_kick_player),
  13912. (assign, ":cost", faction_cost_kick_player),
  13913. (else_try),
  13914. (assign, ":cost", faction_cost_outlaw_player),
  13915. (player_get_slot, ":outlaw_rating", ":value_1", slot_player_outlaw_rating),
  13916. (le, ":outlaw_rating", 0),
  13917. (assign, ":continue", 0),
  13918. (try_end),
  13919. (eq, ":continue", 1),
  13920. (try_begin),
  13921. (player_slot_eq, ":value_1", slot_player_last_faction_kicked_from, ":faction_id"),
  13922. (else_try),
  13923. (call_script, "script_cf_check_enough_gold", ":sender_player_id", ":cost"),
  13924. (call_script, "script_player_adjust_gold", ":sender_player_id", ":cost", -1),
  13925. (else_try),
  13926. (assign, ":continue", 0),
  13927. (try_end),
  13928. (eq, ":continue", 1),
  13929. (player_set_troop_id, ":value_1", "trp_peasant"),
  13930. (try_begin),
  13931. (eq, ":action", faction_admin_action_kick_player),
  13932. (call_script, "script_change_faction", ":value_1", "fac_commoners", change_faction_type_no_respawn),
  13933. (else_try),
  13934. (call_script, "script_player_change_check_outlaw_rating", ":value_1", outlaw_rating_for_lord_outlawed, 1),
  13935. (try_end),
  13936. (player_set_slot, ":value_1", slot_player_last_faction_kicked_from, ":faction_id"),
  13937. (else_try),
  13938. (eq, ":action", faction_admin_action_mute_player),
  13939. (player_is_active, ":value_1"),
  13940. (player_slot_eq, ":value_1", slot_player_faction_id, ":faction_id"),
  13941. (try_begin),
  13942. (player_slot_eq, ":value_1", slot_player_faction_chat_muted, 0),
  13943. (faction_slot_eq, ":faction_id", slot_faction_poll_end_time, 0),
  13944. (assign, ":is_muted", 1),
  13945. (else_try),
  13946. (assign, ":is_muted", 0),
  13947. (try_end),
  13948. (player_set_slot, ":value_1", slot_player_faction_chat_muted, ":is_muted"),
  13949. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_player_set_slot, ":value_1", slot_player_faction_chat_muted, ":is_muted"),
  13950. (else_try),
  13951. (assign, ":key_slot", -1),
  13952. (try_begin),
  13953. (eq, ":action", faction_admin_action_toggle_player_door_key),
  13954. (assign, ":key_slot", slot_player_has_faction_door_key),
  13955. (else_try),
  13956. (eq, ":action", faction_admin_action_toggle_player_money_key),
  13957. (assign, ":key_slot", slot_player_has_faction_money_key),
  13958. (else_try),
  13959. (eq, ":action", faction_admin_action_toggle_player_item_key),
  13960. (assign, ":key_slot", slot_player_has_faction_item_key),
  13961. (else_try),
  13962. (eq, ":action", faction_admin_action_toggle_player_announce),
  13963. (assign, ":key_slot", slot_player_can_faction_announce),
  13964. (try_end),
  13965. (gt, ":key_slot", -1),
  13966. (player_is_active, ":value_1"),
  13967. (player_slot_eq, ":value_1", slot_player_faction_id, ":faction_id"),
  13968. (try_begin),
  13969. (player_slot_eq, ":value_1", ":key_slot", 0),
  13970. (assign, ":has_key", 1),
  13971. (else_try),
  13972. (assign, ":has_key", 0),
  13973. (try_end),
  13974. (player_set_slot, ":value_1", ":key_slot", ":has_key"),
  13975. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_player_set_slot, ":value_1", ":key_slot", ":has_key"),
  13976. (else_try),
  13977. (assign, ":new_relation", -1),
  13978. (try_begin),
  13979. (eq, ":action", faction_admin_action_set_relation_hostile),
  13980. (assign, ":new_relation", 0),
  13981. (else_try),
  13982. (eq, ":action", faction_admin_action_set_relation_peaceful),
  13983. (assign, ":new_relation", 1),
  13984. (try_end),
  13985. (gt, ":new_relation", -1),
  13986. (is_between, ":value_1", castle_factions_begin, factions_end),
  13987. (faction_slot_eq, ":value_1", slot_faction_is_active, 1),
  13988. (store_add, ":relation_slot", slot_faction_relations_begin, ":value_1"),
  13989. (faction_get_slot, ":previous_relation", ":faction_id", ":relation_slot"),
  13990. (faction_set_slot, ":faction_id", ":relation_slot", ":new_relation"),
  13991. (call_script, "script_display_faction_relation_change", ":faction_id", ":value_1", ":previous_relation", ":new_relation"),
  13992. (get_max_players, ":max_players"),
  13993. (try_for_range, ":player_id", 1, ":max_players"),
  13994. (player_is_active, ":player_id"),
  13995. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", ":relation_slot", ":new_relation"),
  13996. (try_end),
  13997. (else_try),
  13998. (assign, ":fail", 1),
  13999. (try_end),
  14000. (eq, ":fail", 0),
  14001. ]),
  14002.  
  14003. ("initialize_animation_menu_strings", # set up the starting and ending string ids for the animation menu
  14004. [
  14005. (troop_set_slot, "trp_animation_menu_strings", 0, "str_menu_guestures"), # offset 0 is for the main menu to select sub menus
  14006. (troop_set_slot, "trp_animation_menu_strings", 0 + animation_menu_end_offset, "str_anim_cheer"),
  14007. (troop_set_slot, "trp_animation_menu_strings", 1, "str_anim_cheer"),
  14008. (troop_set_slot, "trp_animation_menu_strings", 1 + animation_menu_end_offset, "str_anim_away_vile_beggar"),
  14009. (troop_set_slot, "trp_animation_menu_strings", 2, "str_anim_away_vile_beggar"),
  14010. (troop_set_slot, "trp_animation_menu_strings", 2 + animation_menu_end_offset, "str_anim_war_cry"),
  14011. (troop_set_slot, "trp_animation_menu_strings", 3, "str_anim_war_cry"),
  14012. (troop_set_slot, "trp_animation_menu_strings", 3 + animation_menu_end_offset, "str_anim_stand_and_deliver"),
  14013. (troop_set_slot, "trp_animation_menu_strings", 4, "str_anim_stand_and_deliver"),
  14014. (troop_set_slot, "trp_animation_menu_strings", 4 + animation_menu_end_offset, "str_log_animation"),
  14015. ]),
  14016.  
  14017. ("initialize_animation_durations", []), # copies animation durations in milliseconds from module_animations.py to slots of trp_animation_durations
  14018.  
  14019. ])
  14020.  
  14021. first_animation_menu_entry = True
  14022. # Define an animation and / or sound for triggering from the animation menu. See the recognized parameters in the script below.
  14023. def animation_menu_entry(string_id, **kwargs):
  14024. result = [(else_try), (eq, ":string_id", string_id)]
  14025. global first_animation_menu_entry
  14026. if first_animation_menu_entry:
  14027. result = result[1:]
  14028. first_animation_menu_entry = False
  14029. for name in kwargs:
  14030. value = kwargs[name]
  14031. if not isinstance(value, basestring):
  14032. value = int(value)
  14033. result.append((assign, ":" + name, value))
  14034. return lazy.block(result)
  14035.  
  14036. scripts.extend([
  14037.  
  14038. ("cf_try_execute_animation", # clients, server: check if an agent can play an animation; if successful, on clients return test result in reg0 or send a message, execute if the server
  14039. [(store_script_param, ":player_id", 1), # must be valid
  14040. (store_script_param, ":string_id", 2),
  14041. (store_script_param, ":only_test", 3), # if 1, the level of tests passed is returned in reg0
  14042.  
  14043. (assign, ":test_passed", 0),
  14044. (try_begin),
  14045. (player_get_is_muted, ":is_muted", ":player_id"),
  14046. (this_or_next|eq, ":is_muted", 0),
  14047. (neg|multiplayer_is_server),
  14048. (player_get_agent_id, ":agent_id", ":player_id"),
  14049. (agent_is_active, ":agent_id"),
  14050. (agent_is_alive, ":agent_id"),
  14051. (store_mission_timer_a_msec, ":time_ms"),
  14052. (agent_get_slot, ":end_time_ms", ":agent_id", slot_agent_animation_end_time_ms),
  14053. (gt, ":time_ms", ":end_time_ms"),
  14054. (agent_get_slot, ":recent_animations_delay_ms", ":agent_id", slot_agent_recent_animations_delay_ms),
  14055. (try_begin),
  14056. (is_between, ":string_id", animation_strings_begin, animation_strings_end),
  14057. (agent_slot_eq, ":agent_id", slot_agent_last_animation_string_id, ":string_id"),
  14058. (else_try),
  14059. (val_sub, ":recent_animations_delay_ms", 5000),
  14060. (try_end),
  14061. (store_add, ":delayed_time_ms", ":recent_animations_delay_ms", ":end_time_ms"),
  14062. (gt, ":time_ms", ":delayed_time_ms"),
  14063. (assign, ":test_passed", 1),
  14064.  
  14065. (assign, ":animation", -1), # optional agent animation played
  14066. (assign, ":woman_alt_animation", -1), # optional alternate animation played if the agent is a woman.
  14067. (assign, ":upper_body_only", 1), # 0 = override the full body movement animations, 1 = override the upper body parts only
  14068. (assign, ":sound", -1), # optional sound to play for men or women
  14069. (assign, ":man_sound", -1), # optional sound to play only for men
  14070. (assign, ":woman_sound", -1), # optional sound to play only for women
  14071. (assign, ":duration_ms", 0), # duration in milliseconds: animations are set automatically, but this should be set when only playing a sound
  14072. (assign, ":prevent_if_wielding", 0), # 1 = prevent this animation from being triggered if the agent is wielding any items
  14073. (assign, ":prevent_if_moving", 0), # 1 = prevent this animation from being triggered if the agent is moving
  14074. (assign, ":add_to_chat", 0), # display the animation string in the local chat for near the player
  14075. (try_begin), # the first script parameter is the name string id, which must be in the appropriate section of module_strings.py
  14076. animation_menu_entry("str_anim_cheer", animation="anim_cheer", man_sound="snd_man_victory"),
  14077. animation_menu_entry("str_anim_clap", animation="anim_man_clap", woman_alt_animation="anim_woman_clap", prevent_if_wielding=1),
  14078. animation_menu_entry("str_anim_raise_sword", animation="anim_pose_raise_sword"),
  14079. animation_menu_entry("str_anim_hands_on_hips", animation="anim_pose_hands_on_hips", prevent_if_wielding=1, prevent_if_moving=1),
  14080. animation_menu_entry("str_anim_arms_crossed", animation="anim_pose_arms_crossed", prevent_if_wielding=1, prevent_if_moving=1),
  14081. animation_menu_entry("str_anim_stand_still", animation="anim_stand_lord", woman_alt_animation="anim_stand_lady", prevent_if_moving=1),
  14082. animation_menu_entry("str_anim_away_vile_beggar", man_sound="snd_away_vile_beggar", duration_ms=2100, add_to_chat=1),
  14083. animation_menu_entry("str_anim_my_lord", man_sound="snd_my_lord", duration_ms=700, add_to_chat=1),
  14084. animation_menu_entry("str_anim_almost_harvesting_season", man_sound="snd_almost_harvesting_season", duration_ms=1900, add_to_chat=1),
  14085. animation_menu_entry("str_anim_whats_this_then", man_sound="snd_whats_this_then", duration_ms=1300, add_to_chat=1),
  14086. animation_menu_entry("str_anim_out_for_a_stroll_are_we", man_sound="snd_out_for_a_stroll_are_we", duration_ms=1900, add_to_chat=1),
  14087. animation_menu_entry("str_anim_we_ride_to_war", man_sound="snd_we_ride_to_war", duration_ms=2600, add_to_chat=1),
  14088. animation_menu_entry("str_anim_less_talking_more_raiding", man_sound="snd_less_talking_more_raiding", duration_ms=1900, add_to_chat=1),
  14089. animation_menu_entry("str_anim_you_there_stop", man_sound="snd_you_there_stop", duration_ms=1700, add_to_chat=1),
  14090. animation_menu_entry("str_anim_war_cry", man_sound="snd_man_warcry", woman_sound="snd_woman_yell", duration_ms=2100),
  14091. animation_menu_entry("str_anim_tear_you_limb_from_limb", man_sound="snd_tear_you_limb_from_limb", duration_ms=3100, add_to_chat=1),
  14092. animation_menu_entry("str_anim_better_not_be_a_manhunter", man_sound="snd_better_not_be_a_manhunter", duration_ms=2300, add_to_chat=1),
  14093. animation_menu_entry("str_anim_drink_from_your_skull", man_sound="snd_drink_from_your_skull", duration_ms=1800, add_to_chat=1),
  14094. animation_menu_entry("str_anim_gods_will_decide_your_fate", man_sound="snd_gods_will_decide_your_fate", duration_ms=2100, add_to_chat=1),
  14095. animation_menu_entry("str_anim_nice_head_on_shoulders", man_sound="snd_nice_head_on_shoulders", duration_ms=2400, add_to_chat=1),
  14096. animation_menu_entry("str_anim_hunt_you_down", man_sound="snd_hunt_you_down", duration_ms=2100, add_to_chat=1),
  14097. animation_menu_entry("str_anim_dead_men_tell_no_tales", man_sound="snd_dead_men_tell_no_tales", duration_ms=1800, add_to_chat=1),
  14098. animation_menu_entry("str_anim_stand_and_deliver", man_sound="snd_stand_and_deliver", duration_ms=1500, add_to_chat=1),
  14099. animation_menu_entry("str_anim_your_money_or_your_life", man_sound="snd_your_money_or_your_life", duration_ms=2100, add_to_chat=1),
  14100. animation_menu_entry("str_anim_have_our_pay_or_fun", man_sound="snd_have_our_pay_or_fun", duration_ms=3200, add_to_chat=1),
  14101. animation_menu_entry("str_anim_word_about_purse_belongings", man_sound="snd_word_about_purse_belongings", duration_ms=3800, add_to_chat=1),
  14102. animation_menu_entry("str_anim_easy_way_or_hard_way", man_sound="snd_easy_way_or_hard_way", duration_ms=3400, add_to_chat=1),
  14103. animation_menu_entry("str_anim_everything_has_a_price", man_sound="snd_everything_has_a_price", duration_ms=3100, add_to_chat=1),
  14104. animation_menu_entry("str_anim_slit_your_throat", man_sound="snd_slit_your_throat", duration_ms=2400, add_to_chat=1),
  14105. (else_try),
  14106. (assign, ":string_id", -1),
  14107. (try_end),
  14108. (gt, ":string_id", -1),
  14109.  
  14110. (player_get_gender, ":gender", ":player_id"),
  14111. (try_begin),
  14112. (eq, ":gender", tf_female),
  14113. (gt, ":woman_alt_animation", -1),
  14114. (assign, ":animation", ":woman_alt_animation"),
  14115. (try_end),
  14116. (player_get_agent_id, ":agent_id", ":player_id"),
  14117. (try_begin),
  14118. (eq, ":prevent_if_wielding", 1),
  14119. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  14120. (agent_get_wielded_item, ":shield", ":agent_id", 0),
  14121. (this_or_next|neq, ":weapon", -1),
  14122. (neq, ":shield", -1),
  14123. (assign, ":animation", -1),
  14124. (try_end),
  14125. (try_begin),
  14126. (eq, ":prevent_if_moving", 1),
  14127. (set_fixed_point_multiplier, 100),
  14128. (agent_get_speed, pos0, ":agent_id"),
  14129. (position_get_y, ":forwards_speed", pos0),
  14130. (position_get_x, ":sideways_speed", pos0),
  14131. (this_or_next|gt, ":forwards_speed", 10),
  14132. (gt, ":sideways_speed", 10),
  14133. (assign, ":animation", -1),
  14134. (try_end),
  14135. (try_begin),
  14136. (eq, ":gender", tf_male),
  14137. (gt, ":man_sound", -1),
  14138. (assign, ":sound", ":man_sound"),
  14139. (else_try),
  14140. (eq, ":gender", tf_female),
  14141. (gt, ":woman_sound", -1),
  14142. (assign, ":sound", ":woman_sound"),
  14143. (try_end),
  14144. (this_or_next|gt, ":animation", -1),
  14145. (this_or_next|gt, ":sound", -1),
  14146. (eq, ":add_to_chat", 1),
  14147. (assign, ":test_passed", 2),
  14148. (eq, ":only_test", 0),
  14149. (try_begin),
  14150. (multiplayer_is_server),
  14151. (str_store_player_username, s1, ":player_id"),
  14152. (str_store_string, s0, ":string_id"),
  14153. (server_add_message_to_log, "str_log_animation"),
  14154. (try_begin),
  14155. (eq, ":add_to_chat", 1),
  14156. (get_max_players, ":max_players"),
  14157. (agent_get_position, pos0, ":agent_id"),
  14158. (try_for_range, ":other_player_id", 1, ":max_players"),
  14159. (player_is_active, ":other_player_id"),
  14160. (try_begin),
  14161. (eq, ":player_id", ":other_player_id"),
  14162. (else_try),
  14163. (player_get_agent_id, ":other_agent_id", ":other_player_id"),
  14164. (agent_is_active, ":other_agent_id"),
  14165. (agent_is_alive, ":other_agent_id"),
  14166. (agent_get_position, pos1, ":other_agent_id"),
  14167. (get_sq_distance_between_positions, ":distance", pos0, pos1),
  14168. (le, ":distance", sq(max_distance_local_animation)),
  14169. (else_try),
  14170. (assign, ":other_player_id", -1),
  14171. (try_end),
  14172. (neq, ":other_player_id", -1),
  14173. (multiplayer_send_2_int_to_player, ":other_player_id", server_event_local_animation, ":player_id", ":string_id"),
  14174. (try_end),
  14175. (try_end),
  14176. (try_begin),
  14177. (gt, ":animation", -1),
  14178. (agent_set_animation, ":agent_id", ":animation", ":upper_body_only"),
  14179. (try_end),
  14180. (try_begin),
  14181. (gt, ":sound", -1),
  14182. (agent_play_sound, ":agent_id", ":sound"),
  14183. (try_end),
  14184. (try_end),
  14185. (try_begin),
  14186. (gt, ":animation", -1),
  14187. (eq, ":duration_ms", 0),
  14188. (troop_get_slot, ":duration_ms", "trp_animation_durations", ":animation"),
  14189. (try_end),
  14190. (store_add, ":next_end_time_ms", ":time_ms", ":duration_ms"),
  14191. (store_sub, ":next_animation_delay_ms", ":time_ms", ":end_time_ms"),
  14192. (try_begin),
  14193. (lt, ":next_animation_delay_ms", 40000),
  14194. (store_sub, ":next_animation_delay_ms", 10000, ":next_animation_delay_ms"),
  14195. (val_div, ":next_animation_delay_ms", 2),
  14196. (agent_get_slot, ":last_animation_delay_ms", ":agent_id", slot_agent_recent_animations_delay_ms),
  14197. (val_add, ":next_animation_delay_ms", ":last_animation_delay_ms"),
  14198. (val_max, ":next_animation_delay_ms", 0),
  14199. (else_try),
  14200. (assign, ":next_animation_delay_ms", 0),
  14201. (try_end),
  14202. (agent_set_slot, ":agent_id", slot_agent_animation_end_time_ms, ":next_end_time_ms"),
  14203. (agent_set_slot, ":agent_id", slot_agent_last_animation_string_id, ":string_id"),
  14204. (agent_set_slot, ":agent_id", slot_agent_recent_animations_delay_ms, ":next_animation_delay_ms"),
  14205. (try_begin),
  14206. (neg|multiplayer_is_server),
  14207. (multiplayer_send_int_to_server, client_event_request_animation, ":string_id"),
  14208. (else_try),
  14209. (store_sub, ":excessive_repetition_damage", ":next_animation_delay_ms", 12000),
  14210. (gt, ":excessive_repetition_damage", 0),
  14211. (store_agent_hit_points, ":hit_points", ":agent_id", 0),
  14212. (gt, ":hit_points", 0),
  14213. (val_div, ":excessive_repetition_damage", 1000),
  14214. (val_sub, ":hit_points", ":excessive_repetition_damage"),
  14215. (agent_set_hit_points, ":agent_id", ":hit_points", 0),
  14216. (try_end),
  14217. (assign, ":test_passed", 3),
  14218. (try_end),
  14219. (assign, reg0, ":test_passed"),
  14220. (this_or_next|ge, ":test_passed", 3),
  14221. (neq, ":only_test", 0),
  14222. ]),
  14223.  
  14224. ])
  14225.  
  14226. # Fill a chest's inventory slot with a set load out of items at mission start.
  14227. # 'load_out_id' is the value 2 of the scene prop set in the scene editor.
  14228. # 'item_lists' is the rest of the parameters passed as lists: multiple lists passed are treated as alternate load outs to be randomly selected.
  14229. def chest_load_out(load_out_id, *item_lists):
  14230. result = [(eq, ":load_out_id", load_out_id)]
  14231. if len(item_lists) > 1:
  14232. result.extend([(store_random_in_range, ":random", 0, len(item_lists)),
  14233. (try_begin)])
  14234. for i, item_list in enumerate(item_lists):
  14235. result.append((eq, ":random", i))
  14236. result.extend((scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_begin + j, item_id)
  14237. for j, item_id in enumerate(item_list))
  14238. result.append((else_try))
  14239. result[-1] = (try_end)
  14240. else:
  14241. result.extend((scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_begin + i, item_id)
  14242. for i, item_id in enumerate(item_lists[0]))
  14243. result.append((else_try))
  14244. return lazy.block(result)
  14245.  
  14246. scripts.extend([
  14247.  
  14248. ("scene_fill_chests_starting_inventory",
  14249. [
  14250. (call_script, "script_chests_fill_starting_inventory", "spr_pw_item_chest_a"),
  14251. (call_script, "script_chests_fill_starting_inventory", "spr_pw_item_chest_b"),
  14252. (call_script, "script_chests_fill_starting_inventory", "spr_pw_item_chest_invisible"),
  14253. ]),
  14254.  
  14255. ("chests_fill_starting_inventory",
  14256. [(store_script_param, ":scene_prop_id", 1),
  14257.  
  14258. (scene_prop_get_num_instances, ":num_instances", ":scene_prop_id"),
  14259. (try_for_range, ":instance_no", 0, ":num_instances"),
  14260. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  14261. (prop_instance_get_variation_id_2, ":load_out_id", ":instance_id"),
  14262. (gt, ":load_out_id", 0),
  14263. (try_begin),
  14264.  
  14265. chest_load_out(1, ["itm_bread"] * 3, ["itm_bread"] * 5, ["itm_cooked_fish"] * 4, ["itm_cooked_meat"] * 2),
  14266. chest_load_out(2, ["itm_bread"] * 10, ["itm_bread"] * 16, ["itm_cooked_fish"] * 7, ["itm_cooked_meat"] * 6, ["itm_carrot"] * 3),
  14267. chest_load_out(3, ["itm_bread"] * 5 + ["itm_cooked_fish"] * 5 + ["itm_cooked_meat"] * 5 + ["itm_meat_pie"] * 3,
  14268. ["itm_meat_pie"] * 4 + ["itm_cooked_fish"] * 6 + ["itm_cooked_meat"] * 2 + ["itm_bread"] * 10,
  14269. ["itm_grapes"] * 10 + ["itm_salted_fish"] * 3 + ["itm_salted_meat"] * 4 + ["itm_bread"] * 7),
  14270. chest_load_out(4, ["itm_beer_cask"] + ["itm_cooked_meat"] * 5, ["itm_bread"] * 23,
  14271. ["itm_beer_cask"] + ["itm_cooked_meat"] * 7, ["itm_bread"] * 15,
  14272. ["itm_beer_cask"] * 2 + ["itm_cooked_meat"] * 8, ["itm_bread"] * 17),
  14273. chest_load_out(5, ["itm_wine_barrel"] * 2 + ["itm_cooked_fish"] * 7, ["itm_bread"] * 12,
  14274. ["itm_wine_barrel"] + ["itm_cooked_meat"] * 4, ["itm_bread"] * 13,
  14275. ["itm_wine_barrel"] * 2 + ["itm_cooked_meat"] * 4 + ["itm_cooked_fish"] * 5 + ["itm_bread"] * 8),
  14276.  
  14277. chest_load_out(10, ["itm_straw_hat", "itm_sickle", "itm_carrot"], ["itm_hood_c", "itm_knife", "itm_fish"], ["itm_wrapping_boots", "itm_club", "itm_grapes"]),
  14278. chest_load_out(11, ["itm_linen_tunic", "itm_hide_boots"], ["itm_red_shirt", "itm_woolen_hose"], ["itm_rough_tunic", "itm_wrapping_boots"], ["itm_tunic_with_green_cape"]),
  14279. chest_load_out(12, ["itm_tabard", "itm_hide_boots"] * 3, ["itm_black_robe", "itm_wrapping_boots"] * 5, ["itm_rough_tunic", "itm_wrapping_boots"] * 4),
  14280. chest_load_out(13, ["itm_tabard", "itm_ankle_boots", "itm_pelt_coat", "itm_hide_boots", "itm_rawhide_coat", "itm_fur_coat", "itm_butchering_knife"],
  14281. ["itm_black_robe", "itm_friar_robe", "itm_friar_sandals", "itm_fur_coat", "itm_wrapping_boots", "itm_hunter_boots", "itm_fishing_spear"],
  14282. ["itm_rough_tunic", "itm_wrapping_boots", "itm_leather_apron", "itm_hide_boots", "itm_coarse_tunic", "itm_coarse_tunic", "itm_cleaver"]),
  14283. chest_load_out(14, ["itm_rich_outfit", "itm_hide_boots", "itm_fur_coat", "itm_nomad_boots", "itm_lyre"], ["itm_priest_robe", "itm_priest_leggings"],
  14284. ["itm_friar_robe", "itm_friar_sandals"] * 3, ["itm_courtly_outfit", "itm_ankle_boots", "itm_lute"], ["itm_nobleman_outfit", "itm_khergit_leather_boots", "itm_die"]),
  14285. chest_load_out(15, ["itm_fur_hat", "itm_fur_coat", "itm_nomad_boots"] * 3, ["itm_priest_coif", "itm_priest_robe", "itm_priest_leggings"] * 2,
  14286. ["itm_friar_robe", "itm_friar_sandals"] * 7, ["itm_nobleman_outfit", "itm_khergit_leather_boots", "itm_courtly_outfit", "itm_ankle_boots", "itm_leather_gloves"],
  14287. ["itm_surgeon_coif", "itm_surgeon_coat", "itm_blue_hose"] * 2, ["itm_leather_jacket", "itm_khergit_leather_boots", "itm_leather_gloves"] * 2),
  14288. chest_load_out(16, ["itm_fur_hat", "itm_fur_coat", "itm_nomad_boots", "itm_bucket"], ["itm_common_hood", "itm_rough_tunic", "itm_hunter_boots", "itm_butchering_knife"],
  14289. ["itm_tunic_with_green_cape", "itm_nomad_boots", "itm_woodcutter_axe"] * 2, ["itm_woolen_cap", "itm_pelt_coat", "itm_ankle_boots", "itm_hunting_bow", "itm_arrows"],
  14290. ["itm_surgeon_coif", "itm_surgeon_coat", "itm_blue_hose", "itm_surgeon_scalpel"], ["itm_leather_jacket", "itm_khergit_leather_boots", "itm_herding_crook"] * 3),
  14291. chest_load_out(17, ["itm_leather_apron", "itm_nomad_boots"] * 5 + ["itm_bucket", "itm_scythe", "itm_woodcutter_axe", "itm_butchering_knife", "itm_broom"],
  14292. ["itm_coarse_tunic", "itm_wrapping_boots"] * 6 + ["itm_sickle", "itm_bucket", "itm_mining_pick", "itm_fishing_net", "itm_cleaver", "itm_knife"],
  14293. ["itm_tunic_with_green_cape", "itm_nomad_boots"] * 4 + ["itm_small_mining_pick", "itm_herding_crook", "itm_butchering_knife", "itm_sickle"]),
  14294. chest_load_out(18, ["itm_coarse_tunic", "itm_nomad_boots", "itm_knife"], ["itm_leather_jacket", "itm_khergit_leather_boots", "itm_lock_pick"],
  14295. ["itm_coarse_tunic", "itm_wrapping_boots", "itm_club"] + ["itm_broom"] * 6, ["itm_pilgrim_hood", "itm_pilgrim_disguise", "itm_wrapping_boots", "itm_quarter_staff"],
  14296. ["itm_gold_bar"], ["itm_silver_bar"], ["itm_coarse_tunic", "itm_hunter_boots", "itm_poisoned_dagger"], ["itm_tunic_with_green_cape", "itm_nomad_boots", "itm_dagger"]),
  14297.  
  14298. chest_load_out(20, ["itm_nordic_veteran_archer_helmet", "itm_leather_jerkin", "itm_hide_boots", "itm_sword_viking_b_small",
  14299. "itm_nordic_footman_helmet", "itm_byrnie", "itm_leather_boots", "itm_one_handed_battle_axe_a",
  14300. "itm_nordic_fighter_helmet", "itm_mail_hauberk", "itm_leather_boots", "itm_leather_gloves", "itm_sword_viking_a_long",
  14301. "itm_nordic_warlord_helmet", "itm_banded_armor", "itm_mail_boots", "itm_scale_gauntlets", "itm_shortened_voulge"],
  14302. ["itm_nordic_footman_helmet", "itm_leather_jerkin", "itm_leather_boots", "itm_leather_gloves", "itm_sword_viking_c"] * 3,
  14303. ["itm_nordic_archer_helmet", "itm_leather_armor", "itm_hunter_boots", "itm_one_handed_war_axe_b"] * 2 +
  14304. ["itm_nordic_fighter_helmet", "itm_byrnie", "itm_splinted_leather_greaves", "itm_leather_gloves",] * 2 + ["itm_one_handed_battle_axe_b", "itm_two_handed_axe"]),
  14305. chest_load_out(21, ["itm_vaegir_fur_helmet", "itm_leather_vest_plain", "itm_hide_boots", "itm_scimitar",
  14306. "itm_vaegir_spiked_helmet", "itm_lamellar_vest", "itm_mail_chausses", "itm_leather_gloves", "itm_scimitar_b",
  14307. "itm_vaegir_noble_helmet", "itm_lamellar_armor", "itm_mail_boots", "itm_scale_gauntlets", "itm_bardiche"],
  14308. ["itm_vaegir_lamellar_helmet", "itm_studded_leather_coat", "itm_leather_boots", "itm_leather_gloves", "itm_khergit_sword_d"] * 3,
  14309. ["itm_khergit_war_helmet", "itm_arabian_armor_b", "itm_mail_chausses", "itm_mail_mittens"] * 3 + ["itm_khergit_sword_c", "itm_sarranid_axe_a", "itm_awlpike"]),
  14310. chest_load_out(22, ["itm_mail_coif", "itm_arena_armor", "itm_mail_chausses", "itm_mail_mittens", "itm_sword_medieval_c_long"] * 4,
  14311. ["itm_skullcap", "itm_red_gambeson", "itm_splinted_greaves", "itm_winged_mace"] * 4,
  14312. ["itm_segmented_helmet", "itm_padded_leather", "itm_leather_boots", "itm_leather_gloves"] * 4 + ["itm_club_with_spike_head", "itm_long_hafted_spiked_mace"] * 2,
  14313. ["itm_flat_topped_helmet", "itm_haubergeon", "itm_mail_chausses", "itm_mail_mittens", "itm_military_cleaver_c"] * 4),
  14314. chest_load_out(23, ["itm_leather_cap", "itm_leather_vest_plain", "itm_nomad_boots", "itm_sword_medieval_a"] * 3,
  14315. ["itm_leather_steppe_cap_a", "itm_khergit_armor", "itm_khergit_leather_boots", "itm_mace_4"] * 3,
  14316. ["itm_skullcap", "itm_red_gambeson", "itm_leather_boots"] * 3 + ["itm_military_pick", "itm_military_hammer", "itm_military_sickle"]),
  14317.  
  14318. chest_load_out(30, ["itm_khergit_lady_hat_b", "itm_khergit_lady_dress_b", "itm_khergit_leather_boots", "itm_knife", "itm_bread"],
  14319. ["itm_khergit_lady_hat", "itm_khergit_lady_dress", "itm_khergit_leather_boots", "itm_knife", "itm_cooked_fish"]),
  14320. chest_load_out(31, ["itm_sarranid_head_cloth", "itm_sarranid_lady_dress", "itm_woolen_hose", "itm_sickle", "itm_bread"],
  14321. ["itm_sarranid_head_cloth_b", "itm_sarranid_lady_dress_b", "itm_woolen_hose", "itm_bucket", "itm_grapes"]),
  14322. chest_load_out(32, ["itm_bride_crown", "itm_bride_dress", "itm_bride_shoes"]),
  14323. chest_load_out(33, ["itm_lady_dress_ruby", "itm_lady_dress_green", "itm_lady_dress_blue", "itm_wimple_a", "itm_wimple_b", "itm_barbette"],
  14324. ["itm_dress", "itm_blue_dress", "itm_peasant_dress", "itm_woolen_dress", "itm_ladys_hood"],
  14325. ["itm_sarranid_common_dress", "itm_sarranid_felt_head_cloth", "itm_sarranid_common_dress_b", "itm_sarranid_felt_head_cloth_b"]),
  14326.  
  14327. chest_load_out(99, ["itm_great_helmet", "itm_plate_armor", "itm_plate_boots", "itm_gauntlets", "itm_steel_shield", "itm_morningstar"],
  14328. ["itm_winged_great_helmet", "itm_cuir_bouilli", "itm_iron_greaves", "itm_lamellar_gauntlets", "itm_bec_de_corbin_a"],
  14329. ["itm_full_helm", "itm_scale_armor", "itm_iron_greaves", "itm_scale_gauntlets", "itm_two_handed_cleaver"],
  14330. ["itm_vaegir_mask", "itm_vaegir_elite_armor", "itm_mail_boots", "itm_scale_gauntlets", "itm_two_handed_battle_axe"],
  14331. ["itm_bishop_helm", "itm_bishop_armor", "itm_bishop_chausses", "itm_bishop_gloves", "itm_bishop_mitre", "itm_bishop_crosier"]),
  14332.  
  14333. (assign, reg0, ":load_out_id"),
  14334. (display_message, "str_error_load_out_id_reg0_not_defined"),
  14335. (try_end),
  14336. (try_end),
  14337. ]),
  14338.  
  14339. ])
Add Comment
Please, Sign In to add comment