Ramaraunt1

Untitled

Apr 3rd, 2017
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 697.45 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. (str_store_string, s0, "str_interest_ledger_string"),
  267.  
  268.  
  269.  
  270. (else_try), # -1 clears the use string
  271. (eq, ":use_string", -1),
  272. (str_clear, s0),
  273. (else_try), # otherwise fall back to the default string
  274. (str_store_string, s0, "str_use"),
  275. (try_end),
  276.  
  277. (try_begin), # find the base scene prop a linked prop is targeted
  278. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_show_linked_hit_points, 1),
  279. (scene_prop_get_slot, "$g_show_hit_points_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  280. (prop_instance_is_valid, "$g_show_hit_points_instance_id"),
  281. (else_try),
  282. (assign, "$g_show_hit_points_instance_id", ":instance_id"),
  283. (try_end),
  284. (scene_prop_get_slot, "$g_scene_prop_full_hit_points", "$g_show_hit_points_instance_id", slot_scene_prop_full_hit_points),
  285. (try_begin), # set values to display the hit points bar presentation
  286. (gt, "$g_scene_prop_full_hit_points", 0),
  287. (scene_prop_get_hit_points, "$g_scene_prop_hit_points", "$g_show_hit_points_instance_id"),
  288. (gt, "$g_scene_prop_hit_points", "$g_scene_prop_full_hit_points"),
  289. (assign, "$g_scene_prop_full_hit_points", "$g_scene_prop_hit_points"),
  290. (scene_prop_set_slot, "$g_show_hit_points_instance_id", slot_scene_prop_full_hit_points, "$g_scene_prop_hit_points"),
  291. (try_end),
  292. ]),
  293.  
  294. ("store_troop_skills_description", []), # dynamically generate a string listing a troop's skills
  295. ("initialize_item_slots", []), # save or calculate item attributes into item slots, for use in calculations in scripts while the game is running
  296.  
  297. ("game_quick_start", # called by the game when starting multiplayer mode, before connecting to a server; used to setup static module data
  298. [
  299. (call_script, "script_initialize_troop_equipment_slots"),
  300. (call_script, "script_initialize_item_slots"),
  301. (call_script, "script_initialize_banner_info"),
  302. (call_script, "script_initialize_game_rules"),
  303. (call_script, "script_initialize_animation_menu_strings"),
  304. (call_script, "script_initialize_animation_durations"),
  305. (call_script, "script_store_profile_troop_equipment"),
  306. ]),
  307.  
  308. ("game_set_multiplayer_mission_end", # called when the mission ends
  309. [
  310. (assign, "$g_game_ended", 1),
  311. (assign, "$g_stats_chart_opened_manually", 0),
  312. (try_begin),
  313. (neg|is_presentation_active, "prsnt_tabbed_stats_chart"),
  314. (start_presentation, "prsnt_tabbed_stats_chart"),
  315. (try_end),
  316. ]),
  317.  
  318. ("game_enable_cheat_menu", []),
  319.  
  320. ("game_get_console_command", # server: called when console commands are entered (other than hard coded ones)
  321. [(store_script_param, ":command", 1),
  322. (store_script_param, ":value", 2),
  323.  
  324. (try_begin),
  325. (call_script, "script_cf_execute_command", ":command", ":value"),
  326. (call_script, "script_store_command_string", ":command", reg1),
  327. (else_try),
  328. (str_store_string, s0, reg0),
  329. (try_end),
  330. ]),
  331.  
  332. ("game_event_party_encounter", []),
  333. ("game_event_simulate_battle", []),
  334. ("game_event_battle_end", []),
  335. ("game_get_item_buy_price_factor", []),
  336. ("game_get_item_sell_price_factor", []),
  337. ("game_event_buy_item", []),
  338. ("game_event_sell_item", []),
  339. ("game_get_troop_wage", []),
  340. ("game_get_total_wage", []),
  341. ("game_get_join_cost", []),
  342. ("game_get_upgrade_xp", []),
  343. ("game_get_upgrade_cost", []),
  344. ("game_get_prisoner_price", []),
  345. ("game_check_prisoner_can_be_sold", []),
  346. ("game_get_morale_of_troops_from_faction", []),
  347. ("game_event_detect_party", []),
  348. ("game_event_undetect_party", []),
  349. ("game_get_statistics_line", []),
  350. ("game_get_date_text", []),
  351. ("game_get_money_text", []),
  352. ("game_get_party_companion_limit", []),
  353. ("game_reset_player_party_name", []),
  354. ("game_get_troop_note", []),
  355. ("game_get_center_note", []),
  356. ("game_get_faction_note", []),
  357. ("game_get_quest_note", []),
  358. ("game_get_info_page_note", []),
  359.  
  360. ("game_get_scene_name", # return scene names for display in the server list
  361. [(store_script_param, ":scene_no", 1),
  362. (try_begin),
  363. (multiplayer_is_dedicated_server), # on clients return nothing, so the server will always be asked in case of custom names
  364. (is_between, ":scene_no", scenes_begin, scenes_end),
  365. (store_sub, ":string_id", ":scene_no", scenes_begin),
  366. (val_add, ":string_id", scene_names_begin),
  367. (str_store_string, s0, ":string_id"),
  368. (try_end),
  369. ]),
  370.  
  371. ("game_get_mission_template_name",
  372. [(store_script_param, ":mission_template_no", 1),
  373. (try_begin),
  374. (is_between, ":mission_template_no", game_type_mission_templates_begin, game_type_mission_templates_end),
  375. (store_add, ":string_id", ":mission_template_no", game_type_names_begin),
  376. (str_store_string, s0, ":string_id"),
  377. (try_end),
  378. ]),
  379.  
  380. ("game_receive_url_response", # called by the game when a response is received from a web server, if used
  381. [(store_script_param, ":integer_count", 1),
  382. (store_script_param, ":string_count", 2),
  383.  
  384. (try_begin),
  385. (ge, ":integer_count", 1),
  386. (assign, "$g_name_server_enabled", 1),
  387. (assign, ":return_code", reg0),
  388. (try_begin), # negative return codes are internal or configuration errors, not requiring action
  389. (lt, ":return_code", 0),
  390. (try_begin),
  391. (eq, ":return_code", -1),
  392. (ge, ":string_count", 1),
  393. (server_add_message_to_log, "str_name_server_input_error_parameter_s0"),
  394. (else_try),
  395. (server_add_message_to_log, "str_name_server_error_code_reg0"),
  396. (try_end),
  397. (else_try),
  398. (ge, ":integer_count", 3),
  399. (assign, ":player_id", reg1),
  400. (assign, ":unique_id", reg2),
  401. (player_is_active, ":player_id"),
  402. (player_get_unique_id, ":player_unique_id", ":player_id"),
  403. (eq, ":player_unique_id", ":unique_id"),
  404. (try_begin), # normal name server responses
  405. (ge, ":return_code", 0),
  406. (try_begin), # admin permissions were received
  407. (ge, ":integer_count", 4),
  408. (player_is_admin, ":player_id"),
  409. (assign, ":admin_permissions", reg3),
  410. (val_max, ":admin_permissions", 0),
  411. (call_script, "script_player_set_admin_permissions", ":player_id", ":admin_permissions"),
  412. (multiplayer_send_int_to_player, ":player_id", server_event_admin_set_permissions, ":admin_permissions"),
  413. (try_end),
  414. (neq, ":return_code", 0),
  415. (assign, ":rejection_string_id", -1),
  416. (try_begin), # deal with kicking a player for various reasons
  417. (eq, ":return_code", 4),
  418. (assign, ":rejection_string_id", "str_kicked_not_registered"),
  419. (else_try),
  420. (eq, ":return_code", 3),
  421. (assign, ":rejection_string_id", "str_kicked_using_invalid_name"),
  422. (else_try),
  423. (eq, ":return_code", 2),
  424. (assign, ":rejection_string_id", "str_kicked_using_other_clan_tag"),
  425. (else_try),
  426. (eq, ":return_code", 1),
  427. (assign, ":rejection_string_id", "str_kicked_using_other_players_name"),
  428. (try_end),
  429. (neq, ":rejection_string_id", -1),
  430. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":rejection_string_id", preset_message_error|preset_message_log),
  431. (store_mission_timer_a, ":time"), # kick the player after a short delay to try ensure they see the rejection message
  432. (val_add, ":time", name_server_kick_delay_interval),
  433. (player_set_slot, ":player_id", slot_player_kick_at_time, ":time"),
  434. (str_store_string, s10, ":rejection_string_id"),
  435. (try_begin),
  436. (lt, ":string_count", 1),
  437. (str_store_string, s0, "str_empty_string"),
  438. (try_end),
  439. (server_add_message_to_log, "str_name_server_log_s10"),
  440. (try_end),
  441. (else_try),
  442. (eq, ":return_code", 0), # reply from server startup check
  443. (else_try),
  444. (server_add_message_to_log, "str_name_server_invalid_response"),
  445. (try_end),
  446. (try_end),
  447. ]),
  448.  
  449. ("game_get_cheat_mode", []),
  450.  
  451. ("game_receive_network_message", # called by the game whenever a custom network message is received, both clients and servers
  452. [(store_script_param, ":sender_player_id", 1),
  453. (store_script_param, ":event_type", 2),
  454.  
  455. (try_begin), # section of events received by clients from the server
  456. (neg|multiplayer_is_server),
  457. (try_begin), # displays preset messages sent from the server as a module string id, rather than the actual text
  458. (eq, ":event_type", server_event_preset_message),
  459. (store_script_param, ":string_id", 3),
  460. (store_script_param, ":flags", 4),
  461. (store_script_param, ":value_1", 5),
  462. (store_script_param, ":value_2", 6),
  463. (call_script, "script_preset_message", ":string_id", ":flags", ":value_1", ":value_2"),
  464. (else_try), # play a non 3D interface sound
  465. (eq, ":event_type", server_event_play_sound),
  466. (store_script_param, ":sound_id", 3),
  467. (try_begin),
  468. (is_between, ":sound_id", 0, "snd_sounds_end"),
  469. (play_sound, ":sound_id"),
  470. (try_end),
  471. (else_try), # play a sound at the location of a scene prop
  472. (eq, ":event_type", server_event_scene_prop_play_sound),
  473. (store_script_param, ":instance_id", 3),
  474. (assign, ":sound_id", ":instance_id"),
  475. (val_rshift, ":sound_id", net_sound_shift), # sound id is the higher bits
  476. (val_and, ":instance_id", net_sound_mask), # instance id is lower bits
  477. (try_begin),
  478. (is_between, ":sound_id", 0, "snd_sounds_end"),
  479. (prop_instance_is_valid, ":instance_id"),
  480. (prop_instance_get_position, pos1, ":instance_id"),
  481. (play_sound_at_position, ":sound_id", pos1),
  482. (try_end),
  483. (else_try), # play a sound at a position, the coordinate values packed into one integer for a smaller network message
  484. (eq, ":event_type", server_event_play_sound_at_position),
  485. (store_script_param, ":sound_id", 3),
  486. (store_script_param, ":packed_position", 4),
  487. (try_begin), # extract sound id and position x,y,z from one number
  488. (is_between, ":sound_id", 0, "snd_sounds_end"),
  489. (assign, ":pos_x", ":packed_position"),
  490. (val_and, ":pos_x", net_pack_3_mask_1),
  491. (assign, ":pos_y", ":packed_position"),
  492. (val_and, ":pos_y", net_pack_3_mask_2),
  493. (val_rshift, ":pos_y", net_pack_3_shift_2),
  494. (assign, ":pos_z", ":packed_position"),
  495. (val_and, ":pos_z", net_pack_3_mask_3),
  496. (val_rshift, ":pos_z", net_pack_3_shift_3),
  497. (val_sub, ":pos_z", net_pack_3_value_upper_bound / 2),
  498. (set_fixed_point_multiplier, 1),
  499. (position_set_x, pos1, ":pos_x"),
  500. (position_set_y, pos1, ":pos_y"),
  501. (position_set_z, pos1, ":pos_z"),
  502. (set_fixed_point_multiplier, 100),
  503. (play_sound_at_position, ":sound_id", pos1),
  504. (try_end),
  505. (else_try), # equip the visual armor mesh on an agent
  506. (eq, ":event_type", server_event_agent_equip_armor),
  507. (store_script_param, ":agent_id", 3),
  508. (store_script_param, ":item_id", 4),
  509. (try_begin),
  510. (agent_is_active, ":agent_id"),
  511. (agent_is_alive, ":agent_id"),
  512. (try_begin),
  513. (gt, ":item_id", -1),
  514. (call_script, "script_agent_equip_armor", ":agent_id", ":item_id"),
  515. (else_try),
  516. (call_script, "script_agent_clean_blood", ":agent_id"),
  517. (try_end),
  518. (try_end),
  519. (else_try), # set a player slot on the client, from the server
  520. (eq, ":event_type", server_event_player_set_slot),
  521. (store_script_param, ":player_id", 3),
  522. (store_script_param, ":slot_no", 4),
  523. (store_script_param, ":value", 5),
  524. (try_begin),
  525. (player_is_active, ":player_id"),
  526. (player_set_slot, ":player_id", ":slot_no", ":value"),
  527. (multiplayer_get_my_player, ":my_player_id"),
  528. (try_begin), # if the player's faction is changed, reset other related slots
  529. (eq, ":slot_no", slot_player_faction_id),
  530. (player_set_slot, ":player_id", slot_player_is_lord, 0),
  531. (player_set_slot, ":player_id", slot_player_has_faction_door_key, 0),
  532. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 0),
  533. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 0),
  534. (player_set_slot, ":player_id", slot_player_can_faction_announce, 0),
  535. (store_script_param, ":change_faction_type", 6),
  536. (try_begin),
  537. (eq, ":change_faction_type", change_faction_type_outlawed),
  538. (try_begin),
  539. (eq, ":player_id", ":my_player_id"),
  540. (call_script, "script_preset_message", "str_you_have_been_outlawed", preset_message_faction|preset_message_log, ":value", 0),
  541. (music_set_situation, mtf_sit_town_infiltrate),
  542. (else_try),
  543. (str_store_player_username, s0, ":player_id"),
  544. (faction_get_color, ":color", "fac_outlaws"),
  545. (display_message, "str_s0_has_been_outlawed", ":color"),
  546. (try_end),
  547. (else_try),
  548. (eq, ":player_id", ":my_player_id"),
  549. (call_script, "script_preset_message", "str_joined_the_s1", preset_message_faction|preset_message_log, ":value", 0),
  550. (try_end),
  551. (try_begin), # if changing faction without changing troop (respawning), re-equip armor to trigger redrawing heraldry
  552. (eq, ":change_faction_type", change_faction_type_no_respawn),
  553. (call_script, "script_player_redraw_heraldic_items", ":player_id"),
  554. (try_end),
  555. (try_begin), # adjust the music style for commoners, outlaws, factions
  556. (eq, ":player_id", ":my_player_id"),
  557. (try_begin),
  558. (ge, ":value", castle_factions_begin),
  559. (music_set_culture, mtf_culture_3),
  560. (else_try),
  561. (eq, ":value", "fac_outlaws"),
  562. (music_set_culture, mtf_culture_2),
  563. (else_try),
  564. (music_set_culture, mtf_culture_1),
  565. (try_end),
  566. (try_end),
  567. (else_try),
  568. (eq, ":slot_no", slot_player_outlaw_rating),
  569. (eq, ":player_id", ":my_player_id"),
  570. (faction_get_color, ":color", "fac_outlaws"),
  571. (assign, reg1, ":value"),
  572. (display_message, "str_your_outlaw_rating_now_reg1", ":color"),
  573. (else_try),
  574. (eq, ":slot_no", slot_player_is_lord),
  575. (eq, ":value", 1),
  576. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  577. (get_max_players, ":max_players"),
  578. (try_for_range, ":other_player_id", 1, ":max_players"), # remove the status of any previous lord of the faction
  579. (neq, ":other_player_id", ":player_id"),
  580. (player_is_active, ":other_player_id"),
  581. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":faction_id"),
  582. (player_set_slot, ":other_player_id", slot_player_is_lord, 0),
  583. (try_end),
  584. (try_begin), # if the local player is now lord of their faction, set various slots that have already been set on the server
  585. (eq, ":player_id", ":my_player_id"),
  586. (call_script, "script_preset_message", "str_you_are_now_lord_of_s1", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  587. (player_set_slot, ":my_player_id", slot_player_has_faction_door_key, 1),
  588. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 1),
  589. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 1),
  590. (player_set_slot, ":player_id", slot_player_can_faction_announce, 1),
  591. (player_set_slot, ":player_id", slot_player_faction_chat_muted, 0),
  592. (else_try), # for other players, just display an announcement
  593. (eq, "$g_preset_message_display_enabled", 1),
  594. (str_store_player_username, s10, ":player_id"),
  595. (call_script, "script_preset_message", "str_s10_now_lord_of_s1", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  596. (try_end),
  597. (try_end),
  598. (try_end),
  599. (else_try), # set a troop slot on the client, from the server
  600. (eq, ":event_type", server_event_troop_set_slot),
  601. (store_script_param, ":troop_id", 3),
  602. (store_script_param, ":slot_no", 4),
  603. (store_script_param, ":value", 5),
  604. (troop_get_slot, ":old_value", ":troop_id", ":slot_no"),
  605. (troop_set_slot, ":troop_id", ":slot_no", ":value"),
  606. (try_begin),
  607. (eq, ":troop_id", "trp_mission_data"),
  608. (eq, "$g_preset_message_display_enabled", 1),
  609. (is_between, ":slot_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  610. (call_script, "script_preset_message", "str_s1_captured_s2", preset_message_faction_castle|preset_message_big|preset_message_log, ":value", ":slot_no"),
  611. (multiplayer_get_my_player, ":my_player_id"),
  612. (player_is_active, ":my_player_id"),
  613. (player_get_slot, ":my_faction_id", ":my_player_id", slot_player_faction_id),
  614. (try_begin),
  615. (eq, ":value", ":my_faction_id"),
  616. (music_set_situation, mtf_sit_victorious),
  617. (else_try),
  618. (eq, ":old_value", ":my_faction_id"),
  619. (music_set_situation, mtf_sit_encounter_hostile),
  620. (try_end),
  621. (try_end),
  622. (else_try), # set a scene prop slot on the client, from the server
  623. (eq, ":event_type", server_event_scene_prop_set_slot),
  624. (store_script_param, ":instance_id", 3),
  625. (store_script_param, ":slot_no", 4),
  626. (store_script_param, ":value", 5),
  627. (store_script_param, ":slot_range_end", 6),
  628. (try_begin),
  629. (prop_instance_is_valid, ":instance_id"),
  630. (try_begin),
  631. (ge, ":slot_no", 0),
  632. (scene_prop_set_slot, ":instance_id", ":slot_no", ":value"),
  633. (is_between, ":slot_range_end", slot_scene_prop_inventory_begin, slot_scene_prop_inventory_end),
  634. (store_add, ":slot_range_begin", ":slot_no", 1), # messages to change inventory slots can be ranges of repeated values, for efficiency
  635. (ge, ":slot_range_begin", slot_scene_prop_inventory_begin),
  636. (try_for_range, ":current_slot_no", ":slot_range_begin", ":slot_range_end"),
  637. (scene_prop_set_slot, ":instance_id", ":current_slot_no", ":value"),
  638. (try_end),
  639. (try_end), # if the scene prop updated is the inventory currently being accessed, store the changed slots for refreshing the presentation
  640. (eq, ":instance_id", "$g_show_inventory_instance_id"),
  641. (try_begin), # negative numbers mark removed items
  642. (le, ":slot_range_end", -1),
  643. (store_mul, ":slot_moved_from", ":slot_range_end", -1),
  644. (is_between, ":slot_moved_from", slot_scene_prop_inventory_mod_begin, slot_scene_prop_inventory_mod_end),
  645. (scene_prop_set_slot, ":instance_id", ":slot_moved_from", -1),
  646. (assign, "$g_show_inventory_update_needed", 1),
  647. (else_try), # otherwise the item was added to the inventory
  648. (is_between, ":slot_no", slot_scene_prop_inventory_mod_begin, slot_scene_prop_inventory_mod_end),
  649. (assign, "$g_show_inventory_update_needed", 1),
  650. (try_end),
  651. (try_end),
  652. (else_try), # set a faction slot on the client, from the server
  653. (eq, ":event_type", server_event_faction_set_slot),
  654. (store_script_param, ":faction_id", 3),
  655. (store_script_param, ":slot_no", 4),
  656. (store_script_param, ":value", 5),
  657. (try_begin),
  658. (is_between, ":faction_id", factions_begin, factions_end),
  659. (faction_get_slot, ":previous_value", ":faction_id", ":slot_no"),
  660. (faction_set_slot, ":faction_id", ":slot_no", ":value"),
  661. (try_begin),
  662. (eq, ":slot_no", slot_faction_banner_mesh),
  663. (call_script, "script_faction_set_color_from_banner", ":faction_id", ":value"),
  664. (call_script, "script_faction_redraw_heraldic_items", ":faction_id"),
  665. (else_try),
  666. (ge, ":slot_no", slot_faction_relations_begin),
  667. (eq, "$g_preset_message_display_enabled", 1),
  668. (store_sub, ":other_faction_id", ":slot_no", slot_faction_relations_begin),
  669. (lt, ":other_faction_id", factions_end),
  670. (call_script, "script_display_faction_relation_change", ":faction_id", ":other_faction_id", ":previous_value", ":value"),
  671. (try_end),
  672. (try_end),
  673. (else_try), # set an agent slot on the client, from the server
  674. (eq, ":event_type", server_event_agent_set_slot),
  675. (store_script_param, ":agent_id", 3),
  676. (store_script_param, ":slot_no", 4),
  677. (store_script_param, ":value", 5),
  678. (try_begin),
  679. (agent_is_active, ":agent_id"),
  680. (agent_set_slot, ":agent_id", ":slot_no", ":value"),
  681. (try_end),
  682. (else_try), # attach or detach a scene prop to or from an agent (used for carts)
  683. (eq, ":event_type", server_event_set_attached_scene_prop),
  684. (store_script_param, ":agent_id", 3),
  685. (store_script_param, ":instance_id", 4),
  686. (try_begin),
  687. (agent_is_active, ":agent_id"),
  688. (agent_get_attached_scene_prop, ":previous_instance_id", ":agent_id"),
  689. (try_begin),
  690. (prop_instance_is_valid, ":previous_instance_id"),
  691. (scene_prop_set_slot, ":previous_instance_id", slot_scene_prop_attached_to_agent, -1),
  692. (try_end),
  693. (agent_set_attached_scene_prop, ":agent_id", ":instance_id"),
  694. (prop_instance_is_valid, ":instance_id"),
  695. (scene_prop_set_slot, ":instance_id", slot_scene_prop_attached_to_agent, ":agent_id"),
  696. (try_end),
  697. (else_try), # showing the presentation for accessing the inventory of a scene prop
  698. (eq, ":event_type", server_event_show_inventory),
  699. (store_script_param, ":instance_id", 3),
  700. (try_begin), # showing
  701. (gt, ":instance_id", 0),
  702. (prop_instance_is_valid, ":instance_id"),
  703. (assign, "$g_show_inventory_instance_id", ":instance_id"),
  704. (try_for_range, ":mod_slot", slot_scene_prop_inventory_mod_begin, slot_scene_prop_inventory_obj_begin),
  705. (scene_prop_set_slot, ":instance_id", ":mod_slot", 0), # clear slots that notify modifications
  706. (try_end),
  707. (val_add, "$g_last_inventory_unique_id", 1), # this value can be different between server and clients, but is only used locally
  708. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_unique_id, "$g_last_inventory_unique_id"),
  709. (start_presentation, "prsnt_show_inventory"),
  710. (else_try), # hiding, when now out of range or similar
  711. (eq, ":instance_id", -1),
  712. (is_presentation_active, "prsnt_show_inventory"),
  713. (assign, "$g_show_inventory_update_needed", -1),
  714. (try_end),
  715. (else_try), # the server replied that a chat message was received, so if matching the latest message, mark as not requring resending
  716. (eq, ":event_type", server_event_chat_message_recieved),
  717. (store_script_param, ":chat_event_type", 3),
  718. (try_begin),
  719. (troop_get_slot, ":last_chat_event_type", "trp_last_chat_message", slot_last_chat_message_event_type),
  720. (val_and, ":last_chat_event_type", net_chat_event_mask),
  721. (val_and, ":chat_event_type", net_chat_event_mask),
  722. (eq, ":chat_event_type", ":last_chat_event_type"),
  723. (troop_set_slot, "trp_last_chat_message", slot_last_chat_message_not_recieved, 0),
  724. (try_end),
  725. (else_try), # display normal local chat
  726. (eq, ":event_type", server_event_local_chat),
  727. (neg|str_is_empty, s0),
  728. (display_message, s0, local_chat_color),
  729. (call_script, "script_chat_overlay_add_to_local_buffer", local_chat_color),
  730. (else_try), # display shouting in local chat
  731. (eq, ":event_type", server_event_local_chat_shout),
  732. (neg|str_is_empty, s0),
  733. (display_message, s0, local_chat_shout_color),
  734. (call_script, "script_chat_overlay_add_to_local_buffer", local_chat_shout_color),
  735. (else_try), # change the name of the faction which has been previously marked
  736. (eq, ":event_type", server_event_faction_set_name),
  737. (try_begin),
  738. (neg|str_is_empty, s0),
  739. (troop_get_slot, ":faction_id", "trp_mission_data", slot_mission_data_faction_to_change_name_of),
  740. (troop_set_slot, "trp_mission_data", slot_mission_data_faction_to_change_name_of, 0),
  741. (is_between, ":faction_id", castle_factions_begin, factions_end),
  742. (str_store_faction_name, s10, ":faction_id"),
  743. (faction_set_name, ":faction_id", s0),
  744. (eq, "$g_preset_message_display_enabled", 1),
  745. (call_script, "script_preset_message", "str_s10_now_known_as_s1", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  746. (try_end),
  747. (else_try), # update the global variables for server settings on the client
  748. (eq, ":event_type", server_event_return_game_rules),
  749. (store_script_param, ":command", 3),
  750. (store_script_param, ":value", 4),
  751. (try_begin),
  752. (call_script, "script_cf_execute_command", ":command", ":value"),
  753. (try_end),
  754. (else_try), # store the server name
  755. (eq, ":event_type", server_event_return_server_name),
  756. (server_set_name, s0),
  757. (else_try), # store the server password
  758. (eq, ":event_type", server_event_return_password),
  759. (server_set_password, s0),
  760. (else_try), # set the stats of existing players when connecting to a server
  761. (eq, ":event_type", server_event_set_player_score_kill_death),
  762. (store_script_param, ":player_id", 3),
  763. (store_script_param, ":score", 4),
  764. (store_script_param, ":kills", 5),
  765. (store_script_param, ":deaths", 6),
  766. (try_begin),
  767. (player_is_active, ":player_id"),
  768. (player_set_score, ":player_id", ":score"),
  769. (player_set_kill_count, ":player_id", ":kills"),
  770. (player_set_death_count, ":player_id", ":deaths"),
  771. (try_end),
  772. (else_try), # show the poll presentation
  773. (eq, ":event_type", server_event_show_poll),
  774. (store_script_param, ":poll_type", 3),
  775. (store_script_param, ":requester_player_id", 4),
  776. (store_script_param, ":value_1", 5),
  777. (store_script_param, ":value_2", 6),
  778. (call_script, "script_show_poll", ":poll_type", ":requester_player_id", ":value_1", ":value_2"),
  779. (else_try), # update the local player's gold amount manually when greater than the game engine limit (13171)
  780. (eq, ":event_type", server_event_set_overflow_gold),
  781. (store_script_param, ":gold_value", 3),
  782. (try_begin),
  783. (neq, "$g_game_type", "mt_no_money"),
  784. (is_between, ":gold_value", max_correctly_displayed_gold + 1, max_possible_gold),
  785. (assign, "$g_overflow_gold_value", ":gold_value"),
  786. (multiplayer_get_my_player, ":my_player_id"),
  787. (player_set_gold, ":my_player_id", ":gold_value"),
  788. (else_try),
  789. (assign, "$g_overflow_gold_value", 0),
  790. (try_end),
  791. (else_try), # display faction chat and announcements
  792. (is_between, ":event_type", server_event_faction_chat, server_event_faction_chat_announce + 1),
  793. (try_begin),
  794. (neg|str_is_empty, s0),
  795. (multiplayer_get_my_player, ":player_id"),
  796. (player_is_active, ":player_id"),
  797. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  798. (is_between, ":faction_id", castle_factions_begin, factions_end),
  799. (faction_get_color, ":color", ":faction_id"),
  800. (display_message, s0, ":color"),
  801. (try_begin),
  802. (eq, ":event_type", server_event_faction_chat_announce),
  803. (str_store_string_reg, s11, s0),
  804. (start_presentation, "prsnt_faction_lord_message"),
  805. (try_end),
  806. (val_add, "$g_chat_overlay_faction_buffer_stored", 1),
  807. (try_begin),
  808. (neg|is_between, "$g_chat_overlay_faction_buffer_stored", chat_overlay_ring_buffer_begin, chat_overlay_ring_buffer_end),
  809. (assign, "$g_chat_overlay_faction_buffer_stored", chat_overlay_ring_buffer_begin),
  810. (try_end),
  811. (troop_set_plural_name, "$g_chat_overlay_faction_buffer_stored", s0),
  812. (troop_set_slot, "$g_chat_overlay_faction_buffer_stored", slot_chat_overlay_faction_color, ":color"),
  813. (try_end),
  814. (else_try), # display admin chat and announcemnts
  815. (is_between, ":event_type", server_event_admin_chat, server_event_admin_chat_announce + 1),
  816. (neg|str_is_empty, s0),
  817. (display_message, s0, admin_chat_color),
  818. (try_begin),
  819. (eq, ":event_type", server_event_admin_chat_announce),
  820. (str_store_string_reg, s12, s0),
  821. (start_presentation, "prsnt_admin_message"),
  822. (try_end),
  823. (else_try), # convert the packed permissions value into player slots, to limit menu items displayed and similar
  824. (eq, ":event_type", server_event_admin_set_permissions),
  825. (store_script_param, ":permissions", 3),
  826. (multiplayer_get_my_player, ":player_id"),
  827. (player_is_active, ":player_id"),
  828. (call_script, "script_player_set_admin_permissions", ":player_id", ":permissions"),
  829. (else_try), # play a local animation and / or sound
  830. (eq, ":event_type", server_event_local_animation),
  831. (store_script_param, ":player_id", 3),
  832. (store_script_param, ":string_id", 4),
  833. (try_begin),
  834. (player_is_active, ":player_id"),
  835. (is_between, ":string_id", animation_strings_begin, animation_strings_end),
  836. (str_store_player_username, s1, ":player_id"),
  837. (str_store_string, s0, ":string_id"),
  838. (display_message, "str_log_animation", local_animation_color),
  839. (try_end),
  840. (else_try), # update the client side hit points bar when looking at the scene prop; values less than 0 clear attached missiles
  841. (eq, ":event_type", server_event_update_scene_prop_hit_points),
  842. (store_script_param, ":instance_id", 3),
  843. (store_script_param, ":hit_points", 4),
  844. (try_begin),
  845. (prop_instance_is_valid, ":instance_id"),
  846. (try_begin),
  847. (ge, ":hit_points", 0),
  848. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  849. (else_try),
  850. (prop_instance_clear_attached_missiles, ":instance_id"),
  851. (scene_prop_get_slot, ":linked_instance_id_1", ":instance_id", slot_scene_prop_linked_scene_prop_1),
  852. (prop_instance_is_valid, ":linked_instance_id_1"),
  853. (prop_instance_clear_attached_missiles, ":linked_instance_id_1"),
  854. (scene_prop_get_slot, ":linked_instance_id_2", ":instance_id", slot_scene_prop_linked_scene_prop_2),
  855. (prop_instance_is_valid, ":linked_instance_id_2"),
  856. (prop_instance_clear_attached_missiles, ":linked_instance_id_2"),
  857. (try_end),
  858. (try_end),
  859. (try_end),
  860.  
  861. (else_try), # section of events received by server from the clients
  862. (multiplayer_is_server),
  863. (try_begin), # handle players requesting to attach a cart to themselves or a horse
  864. (eq, ":event_type", client_event_attach_scene_prop),
  865. (store_script_param, ":instance_id", 3),
  866. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  867. (try_begin),
  868. (agent_is_active, ":agent_id"),
  869. (agent_is_alive, ":agent_id"),
  870. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  871. (eq, ":weapon", -1),
  872. (agent_get_wielded_item, ":shield", ":agent_id", 1),
  873. (eq, ":shield", -1),
  874. (try_begin), # detach the currently attached scene prop
  875. (eq, ":instance_id", 0),
  876. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  877. (try_begin),
  878. (eq, ":horse_agent_id", -1),
  879. (assign, ":attach_agent_id", ":agent_id"),
  880. (else_try),
  881. (assign, ":attach_agent_id", ":horse_agent_id"),
  882. (try_end),
  883. (call_script, "script_cf_attach_cart", ":attach_agent_id", -1, ":agent_id"),
  884. (else_try), # try attach
  885. (prop_instance_is_valid, ":instance_id"),
  886. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_required_horse, 0),
  887. (call_script, "script_cart_choose_action", ":agent_id", ":instance_id"),
  888. (try_begin), # cart is in range
  889. (neq, reg0, 0),
  890. (else_try), # if admin wearing special armor, allow attaching from a greater range
  891. (player_is_admin, ":sender_player_id"),
  892. (agent_get_item_slot, ":body_item_id", ":agent_id", ek_body),
  893. (this_or_next|eq, ":body_item_id", "itm_invisible_body"),
  894. (eq, ":body_item_id", "itm_black_armor"),
  895. (agent_get_position, pos1, ":agent_id"),
  896. (prop_instance_get_position, pos2, ":instance_id"),
  897. (position_get_z, ":agent_z", pos1),
  898. (position_set_z, pos2, ":agent_z"),
  899. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  900. (le, ":sq_distance", sq(max_distance_admin_cart)),
  901. (else_try),
  902. (assign, ":instance_id", -1),
  903. (try_end),
  904. (neq, ":instance_id", -1),
  905. (call_script, "script_cf_use_cart", ":agent_id", ":instance_id", -1),
  906. (try_end),
  907. (try_end),
  908. (else_try), # handle players sending control messages for scene props (only ships)
  909. (eq, ":event_type", client_event_control_scene_prop),
  910. (store_script_param, ":instance_id", 3),
  911. (store_script_param, ":forwards", 4),
  912. (store_script_param, ":rotation", 5),
  913. (try_begin),
  914. (prop_instance_is_valid, ":instance_id"),
  915. (call_script, "script_cf_control_ship", ":sender_player_id", ":instance_id", ":forwards", ":rotation"),
  916. (try_end),
  917. (else_try), # reply with the current stock count of a scene prop
  918. (eq, ":event_type", client_event_request_stock_count),
  919. (store_script_param, ":instance_id", 3),
  920. (try_begin),
  921. (prop_instance_is_valid, ":instance_id"),
  922. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  923. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  924. (try_end),
  925. (else_try), # transfer an item within the player's equipment and the scene prop's inventory
  926. (eq, ":event_type", client_event_transfer_inventory),
  927. (store_script_param, ":instance_id", 3),
  928. (store_script_param, ":from_slot", 4),
  929. (store_script_param, ":to_slot", 5),
  930. (store_script_param, ":item_id", 6),
  931. (call_script, "script_transfer_inventory", ":sender_player_id", ":instance_id", ":from_slot", ":to_slot", ":item_id"),
  932. (else_try), # transfer money between the player and a money chest
  933. (eq, ":event_type", client_event_transfer_gold),
  934. (try_begin),
  935. (neq, "$g_game_type", "mt_no_money"),
  936. (store_script_param, ":instance_id", 3),
  937. (store_script_param, ":gold_value", 4),
  938. (call_script, "script_cf_use_castle_money_chest", ":sender_player_id", ":instance_id", ":gold_value"),
  939. (try_end),
  940. (else_try), # set the type of the next chat message to be received (since string messages can't have additional information)
  941. (eq, ":event_type", client_event_chat_message_type),
  942. (store_script_param, ":chat_event_type", 3),
  943. (try_begin),
  944. (player_is_active, ":sender_player_id"), # check to ensure the chat event number isn't outdated (from messages received out of order)
  945. (call_script, "script_cf_chat_event_is_new", ":chat_event_type", ":sender_player_id"),
  946. (player_set_slot, ":sender_player_id", slot_player_next_chat_event_type, ":chat_event_type"),
  947. (try_end),
  948. (else_try), # chat string received from a client, from a range of event numbers to keep them in order
  949. (is_between, ":event_type", client_event_chat_message_begin, client_event_chat_message_end),
  950. (try_begin),
  951. (player_is_active, ":sender_player_id"),
  952. (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
  953. (call_script, "script_cf_chat_event_is_new", ":event_type", ":sender_player_id"),
  954. (try_begin),
  955. (eq, reg0, 1),
  956. (player_get_slot, ":chat_event_type", ":sender_player_id", slot_player_next_chat_event_type),
  957. (assign, ":chat_event_param_1", ":chat_event_type"), # extract the chat event and extra parameter from on number
  958. (val_rshift, ":chat_event_param_1", net_chat_param_1_shift),
  959. (val_rshift, ":chat_event_type", net_chat_type_shift),
  960. (val_and, ":chat_event_type", net_chat_event_mask),
  961. (else_try),
  962. (assign, ":chat_event_type", chat_event_type_local),
  963. (try_end),
  964. (call_script, "script_chat_event_increment", ":event_type"), # store the next chat event number expected from the player
  965. (player_set_slot, ":sender_player_id", slot_player_next_chat_event_type, reg0),
  966. (neg|str_is_empty, s0),
  967. (try_begin),
  968. (is_between, ":chat_event_type", chat_event_type_local, chat_event_type_local_shout + 1),
  969. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  970. (gt, ":agent_id", -1),
  971. (agent_is_alive, ":agent_id"),
  972. (str_store_player_username, s1, ":sender_player_id"),
  973. (str_store_string, s0, "str_chat_format"),
  974. (server_add_message_to_log, "str_local_chat_log_format"),
  975. (try_begin),
  976. (eq, ":chat_event_type", chat_event_type_local_shout),
  977. (assign, ":max_sq_distance", sq(max_distance_local_chat_shout)),
  978. (assign, ":ambient_sq_distance", sq(ambient_distance_local_chat_shout)),
  979. (assign, ":server_event", server_event_local_chat_shout),
  980. (else_try),
  981. (assign, ":max_sq_distance", sq(max_distance_local_chat)),
  982. (assign, ":ambient_sq_distance", sq(ambient_distance_local_chat)),
  983. (assign, ":server_event", server_event_local_chat),
  984. (try_end),
  985. (set_fixed_point_multiplier, 100),
  986. (agent_get_position, pos1, ":agent_id"),
  987. (position_move_z, pos1, 160),
  988. (try_for_agents, ":other_agent_id"), # send the chat message to other players whoose agents are close enough
  989. (agent_is_alive, ":other_agent_id"),
  990. (neg|agent_is_non_player, ":other_agent_id"),
  991. (agent_get_player_id, ":other_player_id", ":other_agent_id"),
  992. (player_is_active, ":other_player_id"),
  993. (agent_get_position, pos2, ":other_agent_id"),
  994. (position_move_z, pos2, 160),
  995. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  996. (le, ":sq_distance", ":max_sq_distance"),
  997. (this_or_next|le, ":sq_distance", ":ambient_sq_distance"),
  998. (position_has_line_of_sight_to_position, pos1, pos2),
  999. (multiplayer_send_string_to_player, ":other_player_id", ":server_event", s0),
  1000. (try_end),
  1001. (else_try), # event type to change a faction's name (not really a chat message, but uses the system for more reliability)
  1002. (eq, ":chat_event_type", chat_event_type_set_faction_name),
  1003. (player_get_slot, ":faction_id", ":sender_player_id", slot_player_faction_id),
  1004. (player_get_unique_id, ":unique_id", ":sender_player_id"),
  1005. (try_begin),
  1006. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  1007. (call_script, "script_cf_check_enough_gold", ":sender_player_id", faction_cost_change_name),
  1008. (call_script, "script_player_adjust_gold", ":sender_player_id", faction_cost_change_name, -1),
  1009. (faction_set_name, ":faction_id", s0),
  1010. (faction_set_slot, ":faction_id", slot_faction_name_is_custom, 1),
  1011. (get_max_players, ":max_players"),
  1012. (try_for_range, ":player_id", 1, ":max_players"),
  1013. (player_is_active, ":player_id"),
  1014. (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"),
  1015. (multiplayer_send_string_to_player, ":player_id", server_event_faction_set_name, s0),
  1016. (try_end),
  1017. (try_end),
  1018. (else_try),
  1019. (is_between, ":chat_event_type", chat_event_type_faction, chat_event_type_faction_announce + 1),
  1020. (player_get_slot, ":faction_id", ":sender_player_id", slot_player_faction_id),
  1021. (try_begin),
  1022. (is_between, ":faction_id", castle_factions_begin, factions_end),
  1023. (player_slot_eq, ":sender_player_id", slot_player_faction_chat_muted, 0),
  1024. (str_store_player_username, s1, ":sender_player_id"),
  1025. (str_store_string, s0, "str_chat_format"),
  1026. (str_store_faction_name, s2, ":faction_id"),
  1027. (server_add_message_to_log, "str_faction_chat_log_format"),
  1028. (try_begin),
  1029. (eq, ":chat_event_type", chat_event_type_faction_announce),
  1030. (player_slot_eq, ":sender_player_id", slot_player_can_faction_announce, 1),
  1031. (assign, ":server_event", server_event_faction_chat_announce),
  1032. (else_try),
  1033. (assign, ":server_event", server_event_faction_chat),
  1034. (try_end),
  1035. (get_max_players, ":max_players"),
  1036. (try_for_range, ":other_player_id", 1, ":max_players"),
  1037. (player_is_active, ":other_player_id"),
  1038. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":faction_id"),
  1039. (multiplayer_send_string_to_player, ":other_player_id", ":server_event", s0),
  1040. (try_end),
  1041. (try_end),
  1042. (else_try),
  1043. (is_between, ":chat_event_type", chat_event_type_admin, chat_event_type_admin_announce + 1),
  1044. (assign, ":target_player_id", ":chat_event_param_1"),
  1045. (assign, ":chat_string_id", -1),
  1046. (try_begin), # admins using admin chat
  1047. (player_is_admin, ":sender_player_id"),
  1048. (try_begin),
  1049. (eq, ":target_player_id", 0),
  1050. (try_begin), # announcements, check the admin has permission
  1051. (eq, ":chat_event_type", chat_event_type_admin_announce),
  1052. (player_slot_eq, ":sender_player_id", slot_player_admin_no_announce, 0),
  1053. (assign, ":chat_string_id", "str_admin_announcement_format"),
  1054. (else_try), # admin chat between admins
  1055. (eq, ":target_player_id", 0),
  1056. (assign, ":chat_string_id", "str_admin_chat_format"),
  1057. (try_end),
  1058. (else_try), # from an admin, directly to a specific player
  1059. (player_is_active, ":target_player_id"),
  1060. (str_store_player_username, s2, ":target_player_id"),
  1061. (assign, ":chat_string_id", "str_admin_chat_to_player_format"),
  1062. (try_end),
  1063. (else_try), # for players using admin chat, don't allow targeted messages
  1064. (assign, ":chat_string_id", "str_admin_chat_player_format"),
  1065. (assign, ":target_player_id", 0),
  1066. (try_end),
  1067. (try_begin),
  1068. (gt, ":chat_string_id", -1),
  1069. (str_store_player_username, s1, ":sender_player_id"),
  1070. (str_store_string, s10, ":chat_string_id"),
  1071. (server_add_message_to_log, s10),
  1072. (get_max_players, ":max_players"),
  1073. (try_for_range, ":other_player_id", 1, ":max_players"),
  1074. (player_is_active, ":other_player_id"),
  1075. (assign, ":server_event", server_event_admin_chat), # default to normal messages
  1076. (assign, ":swapped", 0),
  1077. (try_begin),
  1078. (eq, ":chat_string_id", "str_admin_announcement_format"),
  1079. (assign, ":server_event", server_event_admin_chat_announce),
  1080. (else_try),
  1081. (eq, ":other_player_id", ":sender_player_id"),
  1082. (else_try),
  1083. (player_is_admin, ":other_player_id"),
  1084. (else_try), # if the current player is targeted, swap to a different format
  1085. (eq, ":other_player_id", ":target_player_id"),
  1086. (str_store_string_reg, s11, s10),
  1087. (assign, ":swapped", 1),
  1088. (str_store_string, s10, "str_admin_chat_format"),
  1089. (try_begin),
  1090. (eq, ":chat_event_type", chat_event_type_admin_announce),
  1091. (assign, ":server_event", server_event_admin_chat_announce),
  1092. (try_end),
  1093. (else_try),
  1094. (assign, ":server_event", -1),
  1095. (try_end),
  1096. (gt, ":server_event", -1),
  1097. (multiplayer_send_string_to_player, ":other_player_id", ":server_event", s10),
  1098. (try_begin), # if the format was swapped, swap it back for other players
  1099. (eq, ":swapped", 1),
  1100. (str_store_string_reg, s10, s11),
  1101. (try_end),
  1102. (try_end),
  1103. (try_end),
  1104. (try_end),
  1105. (try_end),
  1106. (else_try), # faction administration actions by the lord
  1107. (eq, ":event_type", client_event_faction_admin_action),
  1108. (store_script_param, ":action", 3),
  1109. (store_script_param, ":value_1", 4),
  1110. (try_begin),
  1111. (call_script, "script_cf_faction_admin_action", ":action", ":sender_player_id", ":value_1"),
  1112. (try_end),
  1113. (else_try), # client requesting to drop a money bag
  1114. (eq, ":event_type", client_event_drop_money_bag),
  1115. (try_begin),
  1116. (neq, "$g_game_type", "mt_no_money"),
  1117. (store_script_param, ":gold_amount", 3),
  1118. (try_begin), # for positive amounts, drop a money bag
  1119. (gt, ":gold_amount", 0),
  1120. (call_script, "script_cf_drop_money_bag_item", ":sender_player_id", ":gold_amount"),
  1121. (else_try), # for negative amounts, check the admin has permission then spawn them the absolute money amount
  1122. (lt, ":gold_amount", 0),
  1123. (player_is_admin, ":sender_player_id"),
  1124. (player_slot_eq, ":sender_player_id", slot_player_admin_no_gold, 0),
  1125. (val_mul, ":gold_amount", -1),
  1126. (call_script, "script_player_adjust_gold", ":sender_player_id", ":gold_amount", 1),
  1127. (assign, reg0, ":gold_amount"),
  1128. (str_store_string, s3, "str_log_admin_cheat_money"),
  1129. (str_store_player_username, s0, ":sender_player_id"),
  1130. (player_get_unique_id, reg0, ":sender_player_id"),
  1131. (server_add_message_to_log, "str_log_admin_target_self"),
  1132. (try_end),
  1133. (try_end),
  1134. (else_try), # requesting a spawn point or switching spectator status
  1135. (eq, ":event_type", client_event_request_spawn_point),
  1136. (store_script_param, ":spawn_point", 3),
  1137. (try_begin), # positive values are spawn points
  1138. (gt, ":spawn_point", 0),
  1139. (player_set_slot, ":sender_player_id", slot_player_requested_spawn_point, ":spawn_point"),
  1140. (store_script_param, ":restart_as_peasant", 4),
  1141. (try_begin),
  1142. (eq, ":restart_as_peasant", 1),
  1143. (player_set_troop_id, ":sender_player_id", "trp_peasant"),
  1144. (call_script, "script_change_faction", ":sender_player_id", "fac_commoners", change_faction_type_respawn),
  1145. (try_end),
  1146. (else_try),
  1147. (try_begin), # if the player hasn't requested to spawn after connecting to the server
  1148. (player_slot_eq, ":sender_player_id", slot_player_requested_spawn_point, -1),
  1149. (player_set_slot, ":sender_player_id", slot_player_requested_spawn_point, 0),
  1150. (else_try), # otherwise, toggle spectator status
  1151. (player_get_team_no, ":player_team", ":sender_player_id"),
  1152. (eq, ":player_team", team_spectators),
  1153. (player_set_team_no, ":sender_player_id", team_default),
  1154. (try_begin), # clean up spawn state if the player's agent was faded out without resetting it
  1155. (player_slot_eq, ":sender_player_id", slot_player_spawn_state, player_spawn_state_alive),
  1156. (player_get_agent_id, ":agent_id", ":player_id"),
  1157. (this_or_next|neg|agent_is_active, ":agent_id"),
  1158. (neg|agent_is_alive, ":agent_id"),
  1159. (player_set_slot, ":sender_player_id", slot_player_spawn_state, player_spawn_state_dead),
  1160. (try_end),
  1161. (else_try),
  1162. (player_set_team_no, ":sender_player_id", team_spectators),
  1163. (try_end),
  1164. (try_end),
  1165. (else_try), # reply with game rules
  1166. (eq, ":event_type", client_event_request_game_rules),
  1167. (store_script_param, ":admin_request", 3),
  1168. (call_script, "script_player_return_game_rules", ":sender_player_id", ":admin_request"),
  1169. (else_try), # handle admins changing game rules (server settings)
  1170. (eq, ":event_type", client_event_admin_set_game_rule),
  1171. (try_begin),
  1172. (player_is_admin, ":sender_player_id"),
  1173. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1174. (store_script_param, ":command", 3),
  1175. (store_script_param, ":value", 4),
  1176. (store_script_param, ":value_2", 5),
  1177. (call_script, "script_cf_execute_command", ":command", ":value", ":value_2"),
  1178. (try_end),
  1179. (else_try), # handle admins changing the server name
  1180. (eq, ":event_type", client_event_admin_set_server_name),
  1181. (try_begin),
  1182. (player_is_admin, ":sender_player_id"),
  1183. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1184. (server_get_renaming_server_allowed, ":renaming_allowed"),
  1185. (eq, ":renaming_allowed", 1),
  1186. (server_set_name, s0),
  1187. (try_end),
  1188. (else_try), # handle admins changing the server password
  1189. (eq, ":event_type", client_event_admin_set_password),
  1190. (try_begin),
  1191. (player_is_admin, ":sender_player_id"),
  1192. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1193. (server_set_password, s0),
  1194. (try_end),
  1195. (else_try), # handle admins changing the server welcome message (for newly connecting players)
  1196. (eq, ":event_type", client_event_admin_set_welcome_message),
  1197. (try_begin),
  1198. (player_is_admin, ":sender_player_id"),
  1199. (player_slot_eq, ":sender_player_id", slot_player_admin_no_panel, 0),
  1200. (server_set_welcome_message, s0),
  1201. (try_end),
  1202. (else_try), # handle the use of admin tools
  1203. (eq, ":event_type", client_event_admin_action),
  1204. (store_script_param, ":admin_action", 3),
  1205. (store_script_param, ":target_player_id", 4),
  1206. (try_begin),
  1207. (call_script, "script_cf_admin_action", ":admin_action", ":sender_player_id", ":target_player_id"),
  1208. (try_end),
  1209. (else_try), # handle requests for a poll
  1210. (eq, ":event_type", client_event_request_poll),
  1211. (store_script_param, ":poll_type", 3),
  1212. (store_script_param, ":value_1", 4),
  1213. (store_script_param, ":value_2", 5),
  1214. (call_script, "script_request_poll", ":poll_type", ":sender_player_id", ":value_1", ":value_2"),
  1215. (else_try), # store poll votes from players
  1216. (eq, ":event_type", client_event_poll_vote),
  1217. (store_script_param, ":vote", 3),
  1218. (call_script, "script_poll_vote", ":sender_player_id", ":vote"),
  1219. (else_try), # handle admins spawning items for themselves
  1220. (eq, ":event_type", client_event_admin_equip_item),
  1221. (store_script_param, ":item_id", 3),
  1222. (try_begin),
  1223. (player_is_admin, ":sender_player_id"),
  1224. (player_slot_eq, ":sender_player_id", slot_player_admin_no_all_items, 0),
  1225. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1226. (agent_is_active, ":agent_id"),
  1227. (agent_is_alive, ":agent_id"),
  1228. (is_between, ":item_id", all_items_begin, all_items_end),
  1229. (item_get_type, ":item_type", ":item_id"),
  1230. (try_begin), # spawn animals near the admin's position
  1231. (eq, ":item_type", itp_type_horse),
  1232. (agent_get_position, pos1, ":agent_id"),
  1233. (position_move_x, pos1, 50),
  1234. (try_begin),
  1235. (neg|item_slot_eq, ":item_id", slot_item_animal_adult_item_id, 0),
  1236. (call_script, "script_cf_spawn_herd_animal", ":item_id", -1),
  1237. (else_try),
  1238. (set_spawn_position, pos1),
  1239. (spawn_horse, ":item_id"),
  1240. (try_end),
  1241. (else_try),
  1242. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  1243. (store_sub, ":player_slot", ":item_type", itp_type_head_armor),
  1244. (val_add, ":player_slot", slot_player_equip_head),
  1245. (player_set_slot, ":sender_player_id", ":player_slot", ":item_id"),
  1246. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  1247. (else_try),
  1248. (agent_equip_item, ":agent_id", ":item_id"),
  1249. (try_end),
  1250. (str_store_item_name, s4, ":item_id"),
  1251. (str_store_string, s3, "str_log_admin_cheat_item"),
  1252. (str_store_player_username, s0, ":sender_player_id"),
  1253. (player_get_unique_id, reg0, ":sender_player_id"),
  1254. (server_add_message_to_log, "str_log_admin_target_self"),
  1255. (try_end),
  1256. (else_try), # handle players requesting to drop or toggle armor items
  1257. (eq, ":event_type", client_event_toggle_drop_armor),
  1258. (store_script_param, ":equip_slot", 3),
  1259. (try_begin),
  1260. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1261. (agent_is_active, ":agent_id"),
  1262. (agent_is_alive, ":agent_id"),
  1263. (is_between, ":equip_slot", ek_head, ek_gloves + 1),
  1264. (store_sub, ":item_id", ":equip_slot", ek_head), # calculate the dummy item for messaging clients to remove that slot
  1265. (val_add, ":item_id", "itm_no_head"),
  1266. (store_add, ":player_slot", ":equip_slot", slot_player_equip_head - ek_head),
  1267. (agent_get_item_slot, ":equipped_item_id", ":agent_id", ":equip_slot"),
  1268. (try_begin), # if nothing is equipped in the slot
  1269. (lt, ":equipped_item_id", all_items_begin),
  1270. (try_begin), # if not gloves or head armor, do nothing
  1271. (neq, ":equip_slot", ek_head),
  1272. (neq, ":equip_slot", ek_gloves),
  1273. (assign, ":item_id", -1),
  1274. (else_try), # otherwise, get the stored item id to put it back on
  1275. (player_get_slot, ":item_id", ":sender_player_id", ":player_slot"),
  1276. (val_abs, ":item_id"),
  1277. (lt, ":item_id", all_items_begin),
  1278. (assign, ":item_id", -1),
  1279. (try_end),
  1280. (else_try), # if something is equipped in the slot and it is not gloves or head armor, clear the stored item id
  1281. (neq, ":equip_slot", ek_head),
  1282. (neq, ":equip_slot", ek_gloves),
  1283. (player_set_slot, ":sender_player_id", ":player_slot", 0),
  1284. (agent_get_position, pos1, ":agent_id"),
  1285. (try_begin), # try find a previously used corpse item close enough to put the item in
  1286. (agent_get_slot, ":corpse_instance_id", ":agent_id", slot_agent_storage_corpse_instance_id),
  1287. (prop_instance_is_valid, ":corpse_instance_id"),
  1288. (neg|scene_prop_slot_eq, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, 0),
  1289. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":corpse_instance_id"),
  1290. (eq, ":scene_prop_id", "itm_agent_corpse"),
  1291. (prop_instance_get_position, pos2, ":corpse_instance_id"),
  1292. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1293. (le, ":sq_distance", sq(max_distance_to_use)),
  1294. (assign, ":loop_end", slot_scene_prop_inventory_begin + corpse_inventory_slots),
  1295. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":loop_end"),
  1296. (scene_prop_slot_eq, ":corpse_instance_id", ":inventory_slot", 0),
  1297. (assign, ":loop_end", -1),
  1298. (try_end),
  1299. (eq, ":loop_end", -1),
  1300. (else_try), # otherwise spawn a new corpse item
  1301. (set_spawn_position, pos1),
  1302. (spawn_item, "itm_agent_corpse", imod_rusty, "$g_spawn_item_prune_time"),
  1303. (assign, ":corpse_instance_id", reg0),
  1304. (agent_set_slot, ":agent_id", slot_agent_storage_corpse_instance_id, ":corpse_instance_id"),
  1305. (prop_instance_set_position, ":corpse_instance_id", pos1),
  1306. (store_mission_timer_a, ":prune_time"),
  1307. (val_add, ":prune_time", "$g_spawn_item_prune_time"),
  1308. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_prune_time, ":prune_time"),
  1309. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_count, corpse_inventory_slots),
  1310. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_max_length, corpse_inventory_max_length),
  1311. (val_add, "$g_last_inventory_unique_id", 1),
  1312. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, "$g_last_inventory_unique_id"),
  1313. (assign, ":inventory_slot", slot_scene_prop_inventory_begin),
  1314. (try_end),
  1315. (scene_prop_set_slot, ":corpse_instance_id", ":inventory_slot", ":equipped_item_id"),
  1316. (try_end),
  1317. (try_begin), # if necessary, equip or remove the armor
  1318. (gt, ":item_id", -1),
  1319. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  1320. (try_end),
  1321. (try_end),
  1322. (else_try), # handle accessing armor to loot from corpses
  1323. (eq, ":event_type", client_event_agent_loot_armor),
  1324. (store_script_param, ":corpse_instance_id", 3),
  1325. (try_begin),
  1326. (prop_instance_is_valid, ":corpse_instance_id"),
  1327. (neg|scene_prop_slot_eq, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, 0),
  1328. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":corpse_instance_id"),
  1329. (eq, ":scene_prop_id", "itm_agent_corpse"),
  1330. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1331. (agent_is_active, ":agent_id"),
  1332. (agent_is_alive, ":agent_id"),
  1333. (agent_get_position, pos1, ":agent_id"),
  1334. (prop_instance_get_position, pos2, ":corpse_instance_id"),
  1335. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1336. (le, ":sq_distance", sq(max_distance_to_loot)),
  1337. (call_script, "script_cf_use_inventory", ":agent_id", ":corpse_instance_id", 0),
  1338. (try_end),
  1339. (else_try), # handle player requests to reveal their money pouch to another player
  1340. (eq, ":event_type", client_event_reveal_money_pouch),
  1341. (try_begin),
  1342. (neq, "$g_game_type", "mt_no_money"),
  1343. (store_script_param, ":target_agent_id", 3),
  1344. (agent_is_active, ":target_agent_id"),
  1345. (agent_is_alive, ":target_agent_id"),
  1346. (agent_get_player_id, ":target_player_id", ":target_agent_id"),
  1347. (player_is_active, ":target_player_id"),
  1348. (player_get_agent_id, ":agent_id", ":sender_player_id"),
  1349. (agent_is_active, ":agent_id"),
  1350. (agent_is_alive, ":agent_id"),
  1351. (store_mission_timer_a, ":time"), # don't allow spamming pouch reveal messages
  1352. (player_get_slot, ":last_action_time", ":sender_player_id", slot_player_last_action_time),
  1353. (store_sub, ":interval", ":time", ":last_action_time"),
  1354. (ge, ":interval", repeat_action_min_interval),
  1355. (player_set_slot, ":sender_player_id", slot_player_last_action_time, ":time"),
  1356. (agent_get_position, pos1, ":agent_id"),
  1357. (agent_get_position, pos2, ":target_agent_id"),
  1358. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  1359. (lt, ":sq_distance", sq(max_distance_to_use)),
  1360. (player_get_gold, ":approximate_gold", ":sender_player_id"),
  1361. (assign, ":multiplier", 1), # repeatedly divide by 10, discarding the remainder, until only the most significant figure remains, then multiply back to the approximate value
  1362. (assign, ":loop_end", int(math.log10(max_possible_gold))),
  1363. (try_for_range, ":unused", 0, ":loop_end"),
  1364. (lt, ":approximate_gold", 10),
  1365. (assign, ":loop_end", -1),
  1366. (val_mul, ":approximate_gold", ":multiplier"),
  1367. (else_try),
  1368. (val_mul, ":multiplier", 10),
  1369. (val_div, ":approximate_gold", 10),
  1370. (try_end),
  1371. (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"),
  1372. (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"),
  1373. (str_store_player_username, s1, ":sender_player_id"),
  1374. (str_store_player_username, s2, ":target_player_id"),
  1375. (assign, reg1, ":approximate_gold"),
  1376. (server_add_message_to_log, "str_s1_revealed_money_pouch_containing_reg1_to_s2"),
  1377. (try_end),
  1378. (else_try), # handle animation requests
  1379. (eq, ":event_type", client_event_request_animation),
  1380. (store_script_param, ":string_id", 3),
  1381. (try_begin),
  1382. (call_script, "script_cf_try_execute_animation", ":sender_player_id", ":string_id", 0),
  1383. (try_end),
  1384. (try_end),
  1385. (try_end),
  1386. ]),
  1387.  
  1388. ("game_get_multiplayer_server_option_for_mission_template", # server option values in the popup over entries in the server list
  1389. [#(store_script_param, ":mission_template_id", 1),
  1390. (store_script_param, ":option_index", 2),
  1391.  
  1392. (try_begin),
  1393. (eq, ":option_index", 0),
  1394. (server_get_ghost_mode, reg0),
  1395. (set_trigger_result, 1),
  1396. (else_try),
  1397. (eq, ":option_index", 1),
  1398. (server_get_control_block_dir, reg0),
  1399. (set_trigger_result, 1),
  1400. (else_try),
  1401. (eq, ":option_index", 2),
  1402. (server_get_combat_speed, reg0),
  1403. (set_trigger_result, 1),
  1404. (else_try),
  1405. (eq, ":option_index", 3),
  1406. (assign, reg0, "$g_game_time_limit"),
  1407. (set_trigger_result, 1),
  1408. (else_try),
  1409. (eq, ":option_index", 4),
  1410. (assign, reg0, "$g_respawn_period"),
  1411. (set_trigger_result, 1),
  1412. (else_try),
  1413. (eq, ":option_index", 5),
  1414. (assign, reg0, "$g_starting_gold_multiplier"),
  1415. (set_trigger_result, 1),
  1416. (else_try),
  1417. (eq, ":option_index", 6),
  1418. (assign, reg0, "$g_combat_gold_multiplier"),
  1419. (set_trigger_result, 1),
  1420. (else_try),
  1421. (eq, ":option_index", 7),
  1422. (assign, reg0, "$g_scene_num_castle_factions"),
  1423. (set_trigger_result, 1),
  1424. (else_try),
  1425. (eq, ":option_index", 8),
  1426. (assign, reg0, "$g_victory_condition"),
  1427. (set_trigger_result, 1),
  1428. (else_try),
  1429. (eq, ":option_index", 9),
  1430. (assign, reg0, "$g_force_weather"),
  1431. (set_trigger_result, 1),
  1432. (else_try),
  1433. (eq, ":option_index", 10),
  1434. (assign, reg0, "$g_full_respawn_health"),
  1435. (set_trigger_result, 1),
  1436. (else_try),
  1437. (eq, ":option_index", 11),
  1438. (assign, reg0, "$g_max_herd_animal_count"),
  1439. (set_trigger_result, 1),
  1440. (try_end),
  1441. ]),
  1442.  
  1443. ("game_multiplayer_server_option_for_mission_template_to_string", # server option strings in the popup over entries in the server list
  1444. [#(store_script_param, ":mission_template_id", 1),
  1445. (store_script_param, ":option_index", 2),
  1446. (store_script_param, ":option_value", 3), # the corresponding value from the above script
  1447.  
  1448. (str_clear, s0),
  1449. (try_begin),
  1450. (eq, ":option_index", 0),
  1451. (str_store_string, s0, "str_ghost_mode"),
  1452. (try_begin),
  1453. (eq, ":option_value", 0),
  1454. (str_store_string, s1, "str_free"),
  1455. (else_try),
  1456. (eq, ":option_value", 1),
  1457. (str_store_string, s1, "str_stick_to_any_player"),
  1458. (else_try),
  1459. (eq, ":option_value", 2),
  1460. (str_store_string, s1, "str_stick_to_team_members"),
  1461. (else_try),
  1462. (str_store_string, s1, "str_stick_to_team_members_view"),
  1463. (try_end),
  1464. (str_store_string, s0, "str_s0_s1"),
  1465. (else_try),
  1466. (eq, ":option_index", 1),
  1467. (str_store_string, s0, "str_control_block_direction"),
  1468. (try_begin),
  1469. (eq, ":option_value", 0),
  1470. (str_store_string, s1, "str_automatic"),
  1471. (else_try),
  1472. (str_store_string, s1, "str_by_mouse_movement"),
  1473. (try_end),
  1474. (str_store_string, s0, "str_s0_s1"),
  1475. (else_try),
  1476. (eq, ":option_index", 2),
  1477. (str_store_string, s0, "str_combat_speed"),
  1478. (try_begin),
  1479. (eq, ":option_value", 0),
  1480. (str_store_string, s1, "str_combat_speed_0"),
  1481. (else_try),
  1482. (eq, ":option_value", 1),
  1483. (str_store_string, s1, "str_combat_speed_1"),
  1484. (else_try),
  1485. (eq, ":option_value", 2),
  1486. (str_store_string, s1, "str_combat_speed_2"),
  1487. (else_try),
  1488. (eq, ":option_value", 3),
  1489. (str_store_string, s1, "str_combat_speed_3"),
  1490. (else_try),
  1491. (str_store_string, s1, "str_combat_speed_4"),
  1492. (try_end),
  1493. (str_store_string, s0, "str_s0_s1"),
  1494. (else_try),
  1495. (eq, ":option_index", 3),
  1496. (str_store_string, s0, "str_game_time_limit"),
  1497. (assign, reg0, ":option_value"),
  1498. (str_store_string, s0, "str_s0_reg0"),
  1499. (else_try),
  1500. (eq, ":option_index", 4),
  1501. (str_store_string, s0, "str_respawn_period"),
  1502. (assign, reg0, ":option_value"),
  1503. (str_store_string, s0, "str_s0_reg0"),
  1504. (else_try),
  1505. (eq, ":option_index", 5),
  1506. (str_store_string, s0, "str_starting_gold"),
  1507. (assign, reg0, ":option_value"),
  1508. (str_store_string, s0, "str_s0_reg0"),
  1509. (else_try),
  1510. (eq, ":option_index", 6),
  1511. (str_store_string, s0, "str_combat_gold_bonus"),
  1512. (assign, reg0, ":option_value"),
  1513. (str_store_string, s0, "str_s0_reg0"),
  1514. (else_try),
  1515. (eq, ":option_index", 7),
  1516. (assign, reg0, ":option_value"),
  1517. (str_store_string, s0, "str_number_of_factions_reg0"),
  1518. (else_try),
  1519. (eq, ":option_index", 8),
  1520. (try_begin),
  1521. (ge, ":option_value", 1),
  1522. (assign, reg0, ":option_value"),
  1523. (str_store_string, s0, "str_victory_condition_castles"),
  1524. (else_try),
  1525. (str_store_string, s0, "str_victory_condition_none"),
  1526. (try_end),
  1527. (else_try),
  1528. (eq, ":option_index", 9),
  1529. (str_store_string, s0, "str_force_default_armor"),
  1530. (try_begin),
  1531. (eq, ":option_value", 2),
  1532. (str_store_string, s1, "str_dynamic"),
  1533. (else_try),
  1534. (eq, ":option_value", 1),
  1535. (str_store_string, s1, "str_always_raining"),
  1536. (else_try),
  1537. (str_store_string, s1, "str_always_fine"),
  1538. (try_end),
  1539. (str_store_string, s0, "str_s0_s1"),
  1540. (else_try),
  1541. (eq, ":option_index", 10),
  1542. (try_begin),
  1543. (eq, ":option_value", 0),
  1544. (str_store_string, s0, "str_respawn_with_partial_health"),
  1545. (else_try),
  1546. (str_store_string, s0, "str_respawn_with_full_health"),
  1547. (try_end),
  1548. (else_try),
  1549. (eq, ":option_index", 11),
  1550. (assign, reg0, ":option_value"),
  1551. (str_store_string, s0, "str_herd_animal_limit_reg0"),
  1552. (else_try),
  1553. (val_add, ":option_index", 1),
  1554. (try_end),
  1555. ]),
  1556.  
  1557. ("game_multiplayer_event_duel_offered", []),
  1558.  
  1559. ("game_get_multiplayer_game_type_enum",
  1560. [
  1561. (assign, reg0, game_type_mission_templates_begin),
  1562. (store_sub, reg1, game_type_mission_templates_begin, game_type_mission_templates_end),
  1563. ]),
  1564.  
  1565. ("game_multiplayer_get_game_type_mission_template",
  1566. [(store_script_param, ":game_type", 1),
  1567. (try_begin),
  1568. (is_between, ":game_type", game_type_mission_templates_begin, game_type_mission_templates_end),
  1569. (assign, reg0, ":game_type"),
  1570. (else_try),
  1571. (assign, reg0, -1),
  1572. (try_end),
  1573. ]),
  1574.  
  1575. ("game_get_party_prisoner_limit", []),
  1576.  
  1577. ("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
  1578. [(store_script_param, ":item_id", 1),
  1579. (store_script_param, ":extra_text_id", 2), # repeatedly called with this set to the numbers 0 through 7
  1580. #(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
  1581.  
  1582. (try_begin),
  1583. (eq, ":extra_text_id", 0),
  1584. (assign, "$g_extra_item_details_show_modifiers", 0),
  1585. (item_get_slot, reg1, ":item_id", slot_item_difficulty),
  1586. (try_begin),
  1587. (gt, reg1, 0), # skip showing agent modifiers if the item has no skill requirements
  1588. (multiplayer_get_my_player, ":my_player"),
  1589. (player_get_agent_id, ":agent_id", ":my_player"),
  1590. (agent_get_troop_id, ":troop_id", ":agent_id"),
  1591. (assign, "$g_extra_item_details_cannot_use", 0),
  1592. (item_get_type, ":item_type", ":item_id"),
  1593. (try_begin), # for horses, just show if the required riding skill is met
  1594. (eq, ":item_type", itp_type_horse),
  1595. (try_begin),
  1596. (le, reg1, 10),
  1597. (assign, "$g_extra_item_details_cannot_use", 1),
  1598. (set_result_string, "str_requires_riding_reg1"),
  1599. (store_skill_level, ":troop_level", "skl_riding", ":troop_id"),
  1600. (try_end),
  1601. (else_try), # for other item types, check for stat modifiers
  1602. (try_begin),
  1603. (eq, ":item_type", itp_type_bow),
  1604. (set_result_string, "str_requires_power_draw_reg1"),
  1605. (store_skill_level, ":troop_level", "skl_power_draw", ":troop_id"),
  1606. (else_try),
  1607. (eq, ":item_type", itp_type_thrown),
  1608. (set_result_string, "str_requires_power_throw_reg1"),
  1609. (store_skill_level, ":troop_level", "skl_power_throw", ":troop_id"),
  1610. (else_try),
  1611. (set_result_string, "str_requires_strength_reg1"),
  1612. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  1613. (try_end), # store modifiers for displaying on the next lines
  1614. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 1, 0),
  1615. (assign, "$g_extra_item_details_cannot_use", reg10),
  1616. (assign, "$g_extra_item_details_damage", reg11),
  1617. (assign, "$g_extra_item_details_speed", reg12),
  1618. (assign, "$g_extra_item_details_accuracy", reg13),
  1619. (assign, "$g_extra_item_details_reload", reg14),
  1620. (assign, "$g_extra_item_details_show_modifiers", 1),
  1621. (try_end),
  1622. (try_begin),
  1623. (ge, ":troop_level", reg1),
  1624. (set_trigger_result, 0xFF33DD11),
  1625. (else_try),
  1626. (eq, "$g_extra_item_details_cannot_use", 0),
  1627. (set_trigger_result, 0xFFFFBB22),
  1628. (else_try),
  1629. (set_trigger_result, 0xFFFF4422),
  1630. (try_end),
  1631. (try_end),
  1632. (else_try), # show stored damage and speed modifers
  1633. (eq, ":extra_text_id", 1),
  1634. (try_begin),
  1635. (eq, "$g_extra_item_details_show_modifiers", 1),
  1636. (this_or_next|neq, "$g_extra_item_details_damage", 100),
  1637. (neq, "$g_extra_item_details_speed", 100),
  1638. (assign, reg1, "$g_extra_item_details_damage"),
  1639. (assign, reg2, "$g_extra_item_details_speed"),
  1640. (set_result_string, "str_damage_reg1_speed_reg2"),
  1641. (try_begin),
  1642. (eq, "$g_extra_item_details_cannot_use", 0),
  1643. (set_trigger_result, 0xFFFFBB22),
  1644. (else_try),
  1645. (set_trigger_result, 0xFFFF4422),
  1646. (try_end),
  1647. (try_end),
  1648. (else_try), # show stored accuracy and reload modifiers
  1649. (eq, ":extra_text_id", 2),
  1650. (try_begin),
  1651. (eq, "$g_extra_item_details_show_modifiers", 1),
  1652. (this_or_next|neq, "$g_extra_item_details_accuracy", 100),
  1653. (neq, "$g_extra_item_details_reload", 100),
  1654. (assign, reg1, "$g_extra_item_details_accuracy"),
  1655. (assign, reg2, "$g_extra_item_details_reload"),
  1656. (set_result_string, "str_accuracy_reg1_reload_reg2"),
  1657. (try_begin),
  1658. (eq, "$g_extra_item_details_cannot_use", 0),
  1659. (set_trigger_result, 0xFFFFBB22),
  1660. (else_try),
  1661. (set_trigger_result, 0xFFFF4422),
  1662. (try_end),
  1663. (try_end),
  1664. (else_try), # display whether the item is available to females only
  1665. (eq, ":extra_text_id", 3),
  1666. (item_get_slot, ":item_gender", ":item_id", slot_item_gender),
  1667. (try_begin),
  1668. (eq, ":item_gender", tf_female),
  1669. (set_result_string, "str_womens_clothes"),
  1670. (try_begin),
  1671. (neg|multiplayer_is_server),
  1672. (multiplayer_get_my_player, ":my_player"),
  1673. (player_get_gender, ":my_gender", ":my_player"),
  1674. (eq, ":my_gender", ":item_gender"),
  1675. (set_trigger_result, 0xFF33DD11),
  1676. (else_try),
  1677. (set_trigger_result, 0xFFFF4422),
  1678. (try_end),
  1679. (try_end),
  1680. (else_try), # custom details set by targeted scene props; the variables are reset after use for the next unrelated item details displayed
  1681. (eq, ":extra_text_id", 4),
  1682. (gt, "$g_extra_item_details_1_string_id", -1),
  1683. (assign, reg0, "$g_extra_item_details_1_value"),
  1684. (set_result_string, "$g_extra_item_details_1_string_id"),
  1685. (set_trigger_result, "$g_extra_item_details_1_color"),
  1686. (assign, "$g_extra_item_details_1_string_id", -1),
  1687. (else_try),
  1688. (eq, ":extra_text_id", 5),
  1689. (gt, "$g_extra_item_details_2_string_id", -1),
  1690. (assign, reg0, "$g_extra_item_details_2_value"),
  1691. (assign, reg1, "$g_extra_item_details_2_value_2"),
  1692. (set_result_string, "$g_extra_item_details_2_string_id"),
  1693. (set_trigger_result, "$g_extra_item_details_2_color"),
  1694. (assign, "$g_extra_item_details_2_string_id", -1),
  1695. (else_try),
  1696. (eq, ":extra_text_id", 6),
  1697. (gt, "$g_extra_item_details_3_string_id", -1),
  1698. (assign, reg0, "$g_extra_item_details_3_value"),
  1699. (set_result_string, "$g_extra_item_details_3_string_id"),
  1700. (set_trigger_result, "$g_extra_item_details_3_color"),
  1701. (assign, "$g_extra_item_details_3_string_id", -1),
  1702. (try_end),
  1703. ]),
  1704.  
  1705. ("game_on_disembark", []),
  1706. ("game_context_menu_get_buttons", []),
  1707. ("game_event_context_menu_button_clicked", []),
  1708. ("game_get_skill_modifier_for_troop", []),
  1709. ("game_check_party_sees_party", []),
  1710. ("game_get_party_speed_multiplier", []),
  1711. ("game_troop_upgrades_button_clicked", []),
  1712. ("game_character_screen_requested", []),
  1713.  
  1714. ("game_missile_launch", # called by the game whenever a missile is shot or thrown
  1715. [#(store_script_param, ":agent_id", 1),
  1716. #(store_script_param, ":agent_weapon_item_id", 2),
  1717. #(store_script_param, ":missile_weapon_item_id", 3),
  1718. #(store_script_param, ":missile_item_id", 4),
  1719.  
  1720. ]),
  1721.  
  1722. ("game_missile_dives_into_water", # called by the game whenever a missle drops below water level
  1723. [#(store_script_param, ":missile_item_id", 1),
  1724. #(store_script_param, ":unknown", 2),
  1725.  
  1726. (try_begin),
  1727. (neg|multiplayer_is_server),
  1728. (init_position, pos2),
  1729. (position_copy_origin, pos2, pos1),
  1730. (particle_system_burst_no_sync, "psys_game_water_splash_2", pos2, 10),
  1731. (try_end),
  1732. ]),
  1733.  
  1734. ("get_random_equipment", # get a random item inside a range of ids, that is not women only clothing; store in reg0
  1735. [(store_script_param, ":begin_item_id", 1),
  1736. (store_script_param, ":end_item_id", 2),
  1737.  
  1738. (assign, ":end_slot", 0),
  1739. (try_for_range, ":item_id", ":begin_item_id", ":end_item_id"),
  1740. (item_slot_eq, ":item_id", slot_item_gender, 0),
  1741. (troop_set_slot, "trp_temp_array", ":end_slot", ":item_id"),
  1742. (val_add, ":end_slot", 1),
  1743. (try_end),
  1744. (store_random_in_range, ":random_slot", 0, ":end_slot"),
  1745. (troop_get_slot, reg0, "trp_temp_array", ":random_slot"),
  1746. ]),
  1747.  
  1748. ("store_profile_troop_equipment", # store random body and leg armor items for the profile selection presentation
  1749. [
  1750. (call_script, "script_get_random_equipment", "itm_linen_tunic", "itm_tribal_warrior_outfit"),
  1751. (assign, "$g_profile_troop_body_item", reg0),
  1752. (call_script, "script_get_random_equipment", "itm_sarranid_boots_a", "itm_khergit_leather_boots"),
  1753. (assign, "$g_profile_troop_foot_item", reg0),
  1754. ]),
  1755.  
  1756. ("add_troop_to_cur_tableau_for_profile", # setup the tableau for the profile selection presentation
  1757. [(store_script_param, ":troop_no",1),
  1758. (set_fixed_point_multiplier, 100),
  1759.  
  1760. (cur_tableau_clear_override_items),
  1761. (cur_tableau_set_camera_parameters, 1, 4, 6, 10, 10000),
  1762.  
  1763. (init_position, pos5),
  1764. (assign, ":cam_height", 105),
  1765. (assign, ":camera_distance", 380),
  1766. (assign, ":camera_yaw", -15),
  1767. (assign, ":camera_pitch", -18),
  1768. (assign, ":animation", "anim_stand_man"),
  1769.  
  1770. (position_set_z, pos5, ":cam_height"),
  1771. (position_rotate_x, pos5, -90),
  1772. (position_rotate_z, pos5, 180),
  1773. (position_rotate_y, pos5, ":camera_yaw"),
  1774. (position_rotate_x, pos5, ":camera_pitch"),
  1775. (position_move_z, pos5, ":camera_distance", 0),
  1776. (position_move_x, pos5, 5, 0),
  1777.  
  1778. (profile_get_banner_id, ":profile_banner"),
  1779. (assign, "$g_current_profile_banner_id", ":profile_banner"),
  1780. (try_begin),
  1781. (val_and, ":profile_banner", profile_banner_id_mask),
  1782. (val_add, ":profile_banner", banner_meshes_begin),
  1783. (is_between, ":profile_banner", banner_meshes_begin, banner_meshes_end),
  1784. (ge, ":profile_banner", 0),
  1785. (init_position, pos2),
  1786. (position_set_x, pos2, -175),
  1787. (position_set_y, pos2, -300),
  1788. (position_set_z, pos2, 180),
  1789. (position_rotate_x, pos2, 90),
  1790. (position_rotate_y, pos2, -15),
  1791. (cur_tableau_add_mesh, ":profile_banner", pos2, 0, 0),
  1792. (try_end),
  1793.  
  1794. (troop_clear_inventory, ":troop_no"),
  1795. (troop_add_item, ":troop_no", "$g_profile_troop_body_item"),
  1796. (troop_add_item, ":troop_no", "$g_profile_troop_foot_item"),
  1797. (troop_equip_items, ":troop_no"),
  1798.  
  1799. (init_position, pos2),
  1800. (try_begin),
  1801. (troop_is_hero, ":troop_no"),
  1802. (cur_tableau_add_troop, ":troop_no", pos2, ":animation", -1),
  1803. (else_try),
  1804. (store_mul, ":random_seed", ":troop_no", 126233),
  1805. (val_mod, ":random_seed", 1000),
  1806. (val_add, ":random_seed", 1),
  1807. (cur_tableau_add_troop, ":troop_no", pos2, ":animation", ":random_seed"),
  1808. (try_end),
  1809. (cur_tableau_set_camera_position, pos5),
  1810.  
  1811. (copy_position, pos8, pos5),
  1812. (position_rotate_x, pos8, -90),
  1813. (position_rotate_z, pos8, 30),
  1814. (position_rotate_x, pos8, -60),
  1815. (cur_tableau_add_sun_light, pos8, 175,150,125),
  1816. ]),
  1817.  
  1818. ("store_command_string", # store in s0 the appropriate command description and value
  1819. [(store_script_param, ":command", 1), # the command number
  1820. (store_script_param, reg1, 2), # the value to be displayed
  1821.  
  1822. (try_begin),
  1823. (is_between, ":command", commands_module_system_begin, commands_module_system_end),
  1824. (store_sub, ":command_string_id", ":command", commands_module_system_begin),
  1825. (store_mod, ":get_or_set", ":command_string_id", 2),
  1826. (val_div, ":command_string_id", 2),
  1827. (val_add, ":command_string_id", commands_module_system_names_begin),
  1828. (str_store_string, s0, ":command_string_id"),
  1829. (try_begin),
  1830. (eq, ":get_or_set", 1),
  1831. (str_store_string, s0, "str_set_s0"),
  1832. (try_end),
  1833. (str_store_string, s0, "str_s0_reg1"),
  1834. (else_try),
  1835. (is_between, ":command", commands_napoleonic_wars_begin, commands_napoleonic_wars_end),
  1836. (store_sub, ":command_string_id", ":command", commands_napoleonic_wars_begin),
  1837. (val_add, ":command_string_id", commands_napoleonic_wars_names_begin),
  1838. (str_store_string, s0, ":command_string_id"),
  1839. (str_store_string, s0, "str_set_s0"),
  1840. (str_store_string, s0, "str_s0_reg1"),
  1841. (else_try),
  1842. (str_store_string, s0, "str_no_string"),
  1843. (try_end),
  1844. ]),
  1845.  
  1846. ("cf_execute_command", # get or set a server setting, on the server or clients, ensuring the value is valid
  1847. [(store_script_param, ":command", 1),
  1848. (store_script_param, ":value", 2),
  1849.  
  1850. (assign, ":error_string_id", 0),
  1851. (try_begin),
  1852. (eq, ":command", command_get_bot_count),
  1853. (assign, ":value", "$g_bot_count"),
  1854. (else_try),
  1855. (eq, ":command", command_set_bot_count),
  1856. (val_max, ":value", 0),
  1857. (assign, "$g_bot_count", ":value"),
  1858. (call_script, "script_check_spawn_bots", -1),
  1859. (else_try),
  1860. (eq, ":command", command_get_round_max_seconds),
  1861. (assign, ":value", "$g_spawn_item_prune_time"),
  1862. (else_try),
  1863. (eq, ":command", command_set_round_max_seconds),
  1864. (val_clamp, ":value", 0, 86401),
  1865. (assign, "$g_spawn_item_prune_time", ":value"),
  1866. (else_try),
  1867. (eq, ":command", command_get_respawn_period),
  1868. (assign, ":value", "$g_respawn_period"),
  1869. (else_try),
  1870. (eq, ":command", command_set_respawn_period),
  1871. (try_begin),
  1872. (is_between, ":value", min_respawn_period, max_respawn_period),
  1873. (assign, "$g_respawn_period", ":value"),
  1874. (else_try),
  1875. (assign, ":error_string_id", "str_invalid_respawn_period"),
  1876. (try_end),
  1877. (else_try),
  1878. (eq, ":command", command_get_num_bots_voteable),
  1879. (assign, ":value", "$g_max_herd_animal_count"),
  1880. (else_try),
  1881. (eq, ":command", command_set_num_bots_voteable),
  1882. (val_max, ":value", 0),
  1883. (assign, "$g_max_herd_animal_count", ":value"),
  1884. (call_script, "script_check_kill_excess_animals"),
  1885. (else_try),
  1886. (eq, ":command", command_get_maps_voteable),
  1887. (assign, ":value", "$g_scenes_voteable"),
  1888. (else_try),
  1889. (eq, ":command", command_set_maps_voteable),
  1890. (val_clamp, ":value", 0, 2),
  1891. (assign, "$g_scenes_voteable", ":value"),
  1892. (else_try),
  1893. (eq, ":command", command_get_kick_voteable),
  1894. (assign, ":value", "$g_kick_voteable"),
  1895. (else_try),
  1896. (eq, ":command", command_set_kick_voteable),
  1897. (val_clamp, ":value", 0, 2),
  1898. (assign, "$g_kick_voteable", ":value"),
  1899. (else_try),
  1900. (eq, ":command", command_get_ban_voteable),
  1901. (assign, ":value", "$g_ban_voteable"),
  1902. (else_try),
  1903. (eq, ":command", command_set_ban_voteable),
  1904. (val_clamp, ":value", 0, 2),
  1905. (assign, "$g_ban_voteable", ":value"),
  1906. (else_try),
  1907. (eq, ":command", command_get_valid_vote_ratio),
  1908. (assign, ":value", "$g_valid_vote_ratio"),
  1909. (else_try),
  1910. (eq, ":command", command_set_valid_vote_ratio),
  1911. (val_clamp, ":value", 50, 101),
  1912. (assign, "$g_valid_vote_ratio", ":value"),
  1913. (else_try),
  1914. (eq, ":command", command_get_starting_gold),
  1915. (assign, ":value", "$g_starting_gold_multiplier"),
  1916. (else_try),
  1917. (eq, ":command", command_set_starting_gold),
  1918. (val_clamp, ":value", 0, 10001),
  1919. (assign, "$g_starting_gold_multiplier", ":value"),
  1920. (else_try),
  1921. (eq, ":command", command_get_combat_gold_bonus),
  1922. (assign, ":value", "$g_combat_gold_multiplier"),
  1923. (else_try),
  1924. (eq, ":command", command_set_combat_gold_bonus),
  1925. (val_clamp, ":value", 0, 10001),
  1926. (assign, "$g_combat_gold_multiplier", ":value"),
  1927. (else_try),
  1928. (eq, ":command", command_get_force_default_armor),
  1929. (assign, ":value", "$g_force_weather"),
  1930. (else_try),
  1931. (eq, ":command", command_set_force_default_armor),
  1932. (val_clamp, ":value", 0, 3),
  1933. (assign, "$g_force_weather", ":value"),
  1934. (else_try),
  1935. (eq, ":command", command_get_map_time_limit),
  1936. (assign, ":value", "$g_game_time_limit"),
  1937. (else_try),
  1938. (eq, ":command", command_set_map_time_limit),
  1939. (val_clamp, ":value", 5, 40321),
  1940. (assign, "$g_game_time_limit", ":value"),
  1941. (else_try),
  1942. (eq, ":command", command_get_team_point_limit),
  1943. (assign, ":value", "$g_victory_condition"),
  1944. (else_try),
  1945. (eq, ":command", command_set_team_point_limit),
  1946. (val_clamp, ":value", 0, 1441),
  1947. (assign, "$g_victory_condition", ":value"),
  1948. (else_try),
  1949. (eq, ":command", command_get_disallow_ranged_weapons),
  1950. (assign, ":value", "$g_full_respawn_health"),
  1951. (else_try),
  1952. (eq, ":command", command_set_disallow_ranged_weapons),
  1953. (val_clamp, ":value", 0, 2),
  1954. (assign, "$g_full_respawn_health", ":value"),
  1955. (else_try),
  1956. (eq, ":command", command_get_max_players),
  1957. (server_get_max_num_players, ":value"),
  1958. (else_try),
  1959. (eq, ":command", command_set_max_players),
  1960. (try_begin),
  1961. (is_between, ":value", min_num_players, max_num_players),
  1962. (server_set_max_num_players, ":value"),
  1963. (else_try),
  1964. (assign, ":error_string_id", "str_invalid_max_players"),
  1965. (try_end),
  1966. (else_try),
  1967. (eq, ":command", command_get_ghost_mode),
  1968. (server_get_ghost_mode, ":value"),
  1969. (else_try),
  1970. (eq, ":command", command_set_ghost_mode),
  1971. (val_clamp, ":value", 0, 2),
  1972. (server_set_ghost_mode, ":value"),
  1973. (else_try),
  1974. (eq, ":command", command_get_control_block_direction),
  1975. (server_get_control_block_dir, ":value"),
  1976. (else_try),
  1977. (eq, ":command", command_set_control_block_direction),
  1978. (val_clamp, ":value", 0, 2),
  1979. (server_set_control_block_dir, ":value"),
  1980. (else_try),
  1981. (eq, ":command", command_get_combat_speed),
  1982. (server_get_combat_speed, ":value"),
  1983. (else_try),
  1984. (eq, ":command", command_set_combat_speed),
  1985. (val_clamp, ":value", 0, 5),
  1986. (server_set_combat_speed, ":value"),
  1987. (else_try),
  1988. (eq, ":command", command_get_add_to_game_servers_list),
  1989. (server_get_add_to_game_servers_list, ":value"),
  1990. (else_try),
  1991. (eq, ":command", command_set_add_to_game_servers_list),
  1992. (val_clamp, ":value", 0, 2),
  1993. (server_set_add_to_game_servers_list, ":value"),
  1994. (else_try),
  1995. (eq, ":command", command_get_anti_cheat),
  1996. (server_get_anti_cheat, ":value"),
  1997. (else_try),
  1998. (eq, ":command", command_set_anti_cheat),
  1999. (val_clamp, ":value", 0, 2),
  2000. (server_set_anti_cheat, ":value"),
  2001. (else_try),
  2002. (eq, ":command", command_get_renaming_server_allowed),
  2003. (server_get_renaming_server_allowed, ":value"),
  2004. (else_try),
  2005. (eq, ":command", command_set_renaming_server_allowed),
  2006. (val_clamp, ":value", 0, 2),
  2007. (assign, "$g_renaming_server_allowed", ":value"),
  2008. (else_try),
  2009. (eq, ":command", command_get_changing_game_type_allowed),
  2010. (server_get_changing_game_type_allowed, ":value"),
  2011. (else_try),
  2012. (eq, ":command", command_set_changing_game_type_allowed),
  2013. (val_clamp, ":value", 0, 2),
  2014. (assign, "$g_changing_game_type_allowed", ":value"),
  2015. (else_try),
  2016. (eq, ":command", command_start_scene),
  2017. (try_begin),
  2018. (is_between, ":value", scenes_begin, scenes_end),
  2019. (assign, "$g_next_scene", ":value"),
  2020. (store_script_param, "$g_next_game_type", 3),
  2021. (else_try),
  2022. (assign, ":error_string_id", "str_invalid_scene"),
  2023. (try_end),
  2024. (else_try),
  2025. (eq, ":command", command_open_admin_panel),
  2026. (start_presentation, "prsnt_game_multiplayer_admin_panel"),
  2027. (else_try),
  2028. (eq, ":command", command_open_game_rules),
  2029. (start_presentation, "prsnt_game_rules"),
  2030. (else_try),
  2031. (eq, ":command", command_set_server_mission_timer),
  2032. (assign, "$g_server_mission_timer_when_player_joined", ":value"),
  2033. (call_script, "script_after_client_is_setup"),
  2034. (else_try),
  2035. (eq, ":command", command_scale_squad),
  2036. (val_clamp, ":value", 0, 101),
  2037. (assign, "$g_initial_stockpile_multiplier", ":value"),
  2038. (else_try),
  2039. (assign, ":error_string_id", "str_command_not_implemented"),
  2040. (try_end),
  2041. (assign, reg0, ":error_string_id"),
  2042. (assign, reg1, ":value"),
  2043. (eq, ":error_string_id", 0),
  2044. (try_begin),
  2045. (multiplayer_is_server),
  2046. (call_script, "script_cf_command_should_update_clients", ":command"),
  2047. (get_max_players, ":max_players"),
  2048. (try_for_range, ":player_id", 1, ":max_players"),
  2049. (player_is_active, ":player_id"),
  2050. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, ":command", ":value"),
  2051. (try_end),
  2052. (try_end),
  2053. (eq, ":error_string_id", 0),
  2054. ]),
  2055.  
  2056. ("cf_command_should_update_clients", # succeeds if the command should be applied on all clients when changed on the server
  2057. [(store_script_param, ":command", 1),
  2058.  
  2059. (is_between, ":command", commands_module_system_begin, commands_module_system_end),
  2060. (this_or_next|eq, ":command", command_set_force_default_armor),
  2061. (this_or_next|eq, ":command", command_set_respawn_period),
  2062. (this_or_next|eq, ":command", command_set_num_bots_voteable),
  2063. (this_or_next|eq, ":command", command_set_maps_voteable),
  2064. (this_or_next|eq, ":command", command_set_factions_voteable),
  2065. (this_or_next|eq, ":command", command_set_kick_voteable),
  2066. (this_or_next|eq, ":command", command_set_ban_voteable),
  2067. (this_or_next|eq, ":command", command_set_force_default_armor),
  2068. (eq, ":command", command_set_disallow_ranged_weapons),
  2069. ]),
  2070.  
  2071. ("player_return_game_rules", # return server settings to a player when requested
  2072. [(store_script_param, ":player_id", 1),
  2073. (store_script_param, ":admin_request", 2), # if 1, also return settings private to admins
  2074.  
  2075. (try_begin),
  2076. (this_or_next|eq, ":admin_request", 0),
  2077. (player_is_admin, ":player_id"),
  2078. (this_or_next|eq, ":admin_request", 0),
  2079. (player_slot_eq, ":player_id", slot_player_admin_no_panel, 0),
  2080. (server_get_max_num_players, ":max_num_players"),
  2081. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_max_players, ":max_num_players"),
  2082. (server_get_anti_cheat, ":anti_cheat"),
  2083. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_anti_cheat, ":anti_cheat"),
  2084. (server_get_ghost_mode, ":ghost_mode"),
  2085. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_ghost_mode, ":ghost_mode"),
  2086. (server_get_control_block_dir, ":control_block_dir"),
  2087. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_control_block_direction, ":control_block_dir"),
  2088. (server_get_combat_speed, ":combat_speed"),
  2089. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_combat_speed, ":combat_speed"),
  2090. (server_get_add_to_game_servers_list, ":add_to_servers_list"),
  2091. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_add_to_game_servers_list, ":add_to_servers_list"),
  2092. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_valid_vote_ratio, "$g_valid_vote_ratio"),
  2093. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_starting_gold, "$g_starting_gold_multiplier"),
  2094. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_combat_gold_bonus, "$g_combat_gold_multiplier"),
  2095. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_force_default_armor, "$g_force_weather"),
  2096. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_map_time_limit, "$g_game_time_limit"),
  2097. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_team_point_limit, "$g_victory_condition"),
  2098. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_bot_count, "$g_bot_count"),
  2099. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_num_bots_voteable, "$g_max_herd_animal_count"),
  2100. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_round_max_seconds, "$g_spawn_item_prune_time"),
  2101. (str_store_server_name, s0),
  2102. (multiplayer_send_string_to_player, ":player_id", server_event_return_server_name, s0),
  2103. (try_begin),
  2104. (eq, ":admin_request", 0),
  2105. (multiplayer_send_int_to_player, ":player_id", server_event_return_game_rules, command_open_game_rules),
  2106. (else_try),
  2107. (server_get_renaming_server_allowed, "$g_renaming_server_allowed"),
  2108. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_renaming_server_allowed, "$g_renaming_server_allowed"),
  2109. (server_get_changing_game_type_allowed, "$g_changing_game_type_allowed"),
  2110. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_changing_game_type_allowed, "$g_changing_game_type_allowed"),
  2111. (str_store_server_password, s0),
  2112. (multiplayer_send_string_to_player, ":player_id", server_event_return_password, s0),
  2113. (multiplayer_send_int_to_player, ":player_id", server_event_return_game_rules, command_open_admin_panel),
  2114. (try_end),
  2115. (try_end),
  2116. ]),
  2117.  
  2118. ("initialize_game_rules", # set module default settings before loading the server configuration
  2119. [
  2120. (assign, "$g_respawn_period", 5),
  2121. (assign, "$g_scenes_voteable", 0),
  2122. (assign, "$g_kick_voteable", 1),
  2123. (assign, "$g_ban_voteable", 1),
  2124. (assign, "$g_valid_vote_ratio", 51),
  2125. (assign, "$g_starting_gold_multiplier", 100),
  2126. (assign, "$g_combat_gold_multiplier", 100),
  2127. (assign, "$g_force_weather", 2),
  2128. (assign, "$g_game_time_limit", 1440),
  2129. (assign, "$g_victory_condition", 0),
  2130. (assign, "$g_name_server_enabled", 0),
  2131. (assign, "$g_spawn_item_prune_time", 600),
  2132. (assign, "$g_full_respawn_health", 0),
  2133. (assign, "$g_max_herd_animal_count", 20),
  2134. (assign, "$g_initial_stockpile_multiplier", 50),
  2135. (troop_set_slot, "trp_serf", slot_troop_ranking, 0),
  2136. (troop_set_slot, "trp_peasant", slot_troop_ranking, 1),
  2137. (troop_set_slot, "trp_militia", slot_troop_ranking, 2),
  2138. (troop_set_slot, "trp_huntsman", slot_troop_ranking, 4),
  2139. (troop_set_slot, "trp_craftsman", slot_troop_ranking, 6),
  2140. (troop_set_slot, "trp_healer", slot_troop_ranking, 8),
  2141. (troop_set_slot, "trp_herdsman", slot_troop_ranking, 9),
  2142. (troop_set_slot, "trp_traveler", slot_troop_ranking, 10),
  2143. (troop_set_slot, "trp_ruffian", slot_troop_ranking, 12),
  2144. (troop_set_slot, "trp_brigand", slot_troop_ranking, 14),
  2145. (troop_set_slot, "trp_mercenary", slot_troop_ranking, 19),
  2146. (troop_set_slot, "trp_footman", slot_troop_ranking, 20),
  2147. (troop_set_slot, "trp_archer", slot_troop_ranking, 21),
  2148. (troop_set_slot, "trp_crossbowman", slot_troop_ranking, 22),
  2149. (troop_set_slot, "trp_lancer", slot_troop_ranking, 23),
  2150. (troop_set_slot, "trp_sailor", slot_troop_ranking, 24),
  2151. (troop_set_slot, "trp_engineer", slot_troop_ranking, 30),
  2152. (troop_set_slot, "trp_doctor", slot_troop_ranking, 35),
  2153. (troop_set_slot, "trp_master_smith", slot_troop_ranking, 36),
  2154. (troop_set_slot, "trp_sergeant", slot_troop_ranking, 40),
  2155. (troop_set_slot, "trp_man_at_arms", slot_troop_ranking, 41),
  2156. (troop_set_slot, "trp_lord", slot_troop_ranking, 99),
  2157. (troop_set_slot, "trp_godlike_hero", slot_troop_ranking, 100),
  2158. (troop_set_slot, "trp_peasant", slot_troop_spawn_health_percent, 100),
  2159. (troop_set_slot, "trp_serf", slot_troop_spawn_health_percent, 100),
  2160. (troop_set_slot, "trp_militia", slot_troop_spawn_health_percent, 70),
  2161. (troop_set_slot, "trp_huntsman", slot_troop_spawn_health_percent, 70),
  2162. (troop_set_slot, "trp_craftsman", slot_troop_spawn_health_percent, 80),
  2163. (troop_set_slot, "trp_healer", slot_troop_spawn_health_percent, 90),
  2164. (troop_set_slot, "trp_footman", slot_troop_spawn_health_percent, 40),
  2165. (troop_set_slot, "trp_archer", slot_troop_spawn_health_percent, 40),
  2166. (troop_set_slot, "trp_crossbowman", slot_troop_spawn_health_percent, 40),
  2167. (troop_set_slot, "trp_lancer", slot_troop_spawn_health_percent, 40),
  2168. (troop_set_slot, "trp_man_at_arms", slot_troop_spawn_health_percent, 35),
  2169. (troop_set_slot, "trp_sergeant", slot_troop_spawn_health_percent, 35),
  2170. (troop_set_slot, "trp_engineer", slot_troop_spawn_health_percent, 50),
  2171. (troop_set_slot, "trp_master_smith", slot_troop_spawn_health_percent, 35),
  2172. (troop_set_slot, "trp_doctor", slot_troop_spawn_health_percent, 70),
  2173. (troop_set_slot, "trp_sailor", slot_troop_spawn_health_percent, 50),
  2174. (troop_set_slot, "trp_traveler", slot_troop_spawn_health_percent, 70),
  2175. (troop_set_slot, "trp_herdsman", slot_troop_spawn_health_percent, 80),
  2176. (troop_set_slot, "trp_lord", slot_troop_spawn_health_percent, 30),
  2177. (troop_set_slot, "trp_ruffian", slot_troop_spawn_health_percent, 55),
  2178. (troop_set_slot, "trp_brigand", slot_troop_spawn_health_percent, 55),
  2179. (troop_set_slot, "trp_mercenary", slot_troop_spawn_health_percent, 80),
  2180. (troop_set_slot, "trp_godlike_hero", slot_troop_spawn_health_percent, 100),
  2181.  
  2182. (troop_set_slot, "trp_farmer", slot_troop_ranking, 0), #RAMARAUNT ADD
  2183. (troop_set_slot, "trp_levy", slot_troop_ranking, 2),
  2184. (troop_set_slot, "trp_hunter", slot_troop_ranking, 4),
  2185. (troop_set_slot, "trp_tailor", slot_troop_ranking, 6),
  2186. (troop_set_slot, "trp_shepherd", slot_troop_ranking, 9),
  2187. (troop_set_slot, "trp_explorer", slot_troop_ranking, 10),
  2188. (troop_set_slot, "trp_thug", slot_troop_ranking, 12),
  2189. (troop_set_slot, "trp_thief", slot_troop_ranking, 14),
  2190. (troop_set_slot, "trp_retainer", slot_troop_ranking, 20),
  2191. (troop_set_slot, "trp_bow_master", slot_troop_ranking, 21),
  2192. (troop_set_slot, "trp_horse_archer", slot_troop_ranking, 21),
  2193. (troop_set_slot, "trp_samurai_horse_archer", slot_troop_ranking, 21),
  2194. (troop_set_slot, "trp_ninja", slot_troop_ranking, 21),
  2195. (troop_set_slot, "trp_elephant_master", slot_troop_ranking, 21),
  2196. (troop_set_slot, "trp_sharpshooter", slot_troop_ranking, 22),
  2197. (troop_set_slot, "trp_outrider", slot_troop_ranking, 23),
  2198. (troop_set_slot, "trp_funanori", slot_troop_ranking, 24),
  2199. (troop_set_slot, "trp_architect", slot_troop_ranking, 30),
  2200. (troop_set_slot, "trp_physician", slot_troop_ranking, 35),
  2201. (troop_set_slot, "trp_blacksmith", slot_troop_ranking, 36),
  2202. (troop_set_slot, "trp_samauri", slot_troop_ranking, 40),
  2203. (troop_set_slot, "trp_lancer", slot_troop_ranking, 41),
  2204. (troop_set_slot, "trp_farmer", slot_troop_spawn_health_percent, 50),
  2205. (troop_set_slot, "trp_levy", slot_troop_spawn_health_percent, 50),
  2206. (troop_set_slot, "trp_hunter", slot_troop_spawn_health_percent, 50),
  2207. (troop_set_slot, "trp_tailor", slot_troop_spawn_health_percent, 50),
  2208. (troop_set_slot, "trp_shepherd", slot_troop_spawn_health_percent, 50),
  2209. (troop_set_slot, "trp_explorer", slot_troop_spawn_health_percent, 50),
  2210. (troop_set_slot, "trp_thug", slot_troop_spawn_health_percent, 50),
  2211. (troop_set_slot, "trp_thief", slot_troop_spawn_health_percent, 50),
  2212. (troop_set_slot, "trp_retainer",slot_troop_spawn_health_percent, 50),
  2213. (troop_set_slot, "trp_bow_master", slot_troop_spawn_health_percent, 50),
  2214. (troop_set_slot, "trp_horse_archer", slot_troop_spawn_health_percent, 50),
  2215. (troop_set_slot, "trp_samurai_horse_archer", slot_troop_spawn_health_percent, 50),
  2216. (troop_set_slot, "trp_ninja", slot_troop_spawn_health_percent, 50),
  2217. (troop_set_slot, "trp_elephant_master", slot_troop_spawn_health_percent, 50),
  2218. (troop_set_slot, "trp_sharpshooter", slot_troop_spawn_health_percent, 50),
  2219. (troop_set_slot, "trp_outrider", slot_troop_spawn_health_percent, 50),
  2220. (troop_set_slot, "trp_funanori", slot_troop_spawn_health_percent, 50),
  2221. (troop_set_slot, "trp_architect", slot_troop_spawn_health_percent, 50),
  2222. (troop_set_slot, "trp_physician", slot_troop_spawn_health_percent, 50),
  2223. (troop_set_slot, "trp_blacksmith", slot_troop_spawn_health_percent, 50),
  2224. (troop_set_slot, "trp_samauri", slot_troop_spawn_health_percent, 50),
  2225. (troop_set_slot, "trp_lancer", slot_troop_spawn_health_percent, 50),
  2226. (assign, "$g_extra_item_details_1_string_id", -1),
  2227. (assign, "$g_extra_item_details_2_string_id", -1),
  2228. ]),
  2229.  
  2230. ("initialize_scene_globals", # reset global values to initial values when starting a mission
  2231. [
  2232. (assign, "$g_game_ended", 0),
  2233. (assign, "$g_victory_condition_time", 0),
  2234. (assign, "$g_spawn_marker_count", 0),
  2235. (assign, "$g_spawned_bot_count", 0),
  2236. (assign, "$g_overflow_gold_value", 0),
  2237. (assign, "$g_loop_player_id", 0),
  2238. (assign, "$g_loop_player_check_outlaw", 0),
  2239. (assign, "$g_loop_player_check_outlaw_time", 0),
  2240. (assign, "$g_loop_agent_last_checked", 0),
  2241. (assign, "$g_loop_agent_check_time", 0),
  2242. (assign, "$g_loop_horse_check", 0),
  2243. (assign, "$g_loop_horse_check_time", 0),
  2244. (assign, "$g_loop_health_check", 0),
  2245. (assign, "$g_loop_health_check_time", 0),
  2246. (troop_set_slot, "trp_ship_array", slot_ship_array_count, 0),
  2247. (troop_set_slot, "trp_ship_array", slot_ship_array_collision_props_count, 0),
  2248. (troop_set_slot, "trp_cart_array", slot_array_count, 0),
  2249. (troop_set_slot, "trp_removed_scene_props", slot_array_count, 0),
  2250. (assign, "$g_loop_ship_to_check", 0),
  2251. (assign, "$g_loop_ship_check_time", 0),
  2252. (assign, "$g_ambient_sound_instance_no", 0),
  2253. (assign, "$g_rain_sound_channel", -1),
  2254. (assign, "$g_show_inventory_instance_id", 0),
  2255. (assign, "$g_last_inventory_unique_id", 0),
  2256. (assign, "$g_loop_animal_herd_to_move", 0),
  2257. (assign, "$g_loop_animal_herd_leader", -1),
  2258. (assign, "$g_loop_animal_herd_begin", 0),
  2259. (assign, "$g_time_last_herd_animal_disappeared", 0),
  2260. (assign, "$g_recent_nearby_deaths_factor", 0),
  2261. (assign, "$g_player_has_spawned_after_connecting", 0),
  2262. (faction_set_slot, "fac_1", slot_faction_banner_mesh, "mesh_banner_kingdom_f"),
  2263. (faction_set_slot, "fac_2", slot_faction_banner_mesh, "mesh_banner_kingdom_b"),
  2264. (faction_set_slot, "fac_3", slot_faction_banner_mesh, "mesh_banner_kingdom_a"),
  2265. (faction_set_slot, "fac_4", slot_faction_banner_mesh, "mesh_banner_kingdom_d"),
  2266. (faction_set_slot, "fac_5", slot_faction_banner_mesh, "mesh_banner_kingdom_e"),
  2267. (faction_set_slot, "fac_6", slot_faction_banner_mesh, "mesh_banner_kingdom_c"),
  2268. (faction_set_slot, "fac_7", slot_faction_banner_mesh, "mesh_banner_kingdom_g"),
  2269. (faction_set_slot, "fac_8", slot_faction_banner_mesh, "mesh_banner_a03"),
  2270. (faction_set_name, "fac_1", "str_fac_1_default_name"),
  2271. (faction_set_name, "fac_2", "str_fac_2_default_name"),
  2272. (faction_set_name, "fac_3", "str_fac_3_default_name"),
  2273. (faction_set_name, "fac_4", "str_fac_4_default_name"),
  2274. (faction_set_name, "fac_5", "str_fac_5_default_name"),
  2275. (faction_set_name, "fac_6", "str_fac_6_default_name"),
  2276. (faction_set_name, "fac_7", "str_fac_7_default_name"),
  2277. (faction_set_name, "fac_8", "str_fac_8_default_name"),
  2278. (store_sub, ":slot_relations_end", factions_end, factions_begin),
  2279. (val_add, ":slot_relations_end", slot_faction_relations_begin),
  2280. (try_for_range, ":faction_id", factions_begin, factions_end),
  2281. (faction_set_slot, ":faction_id", slot_faction_is_active, 0),
  2282. (faction_set_slot, ":faction_id", slot_faction_is_locked, 0),
  2283. (faction_set_slot, ":faction_id", slot_faction_name_is_custom, 0),
  2284. (faction_set_slot, ":faction_id", slot_faction_lord_player_uid, 0),
  2285. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, 0),
  2286. (faction_set_slot, ":faction_id", slot_faction_poll_end_time, 0),
  2287. (try_for_range, ":relations_slot", slot_faction_relations_begin, ":slot_relations_end"),
  2288. (faction_set_slot, ":faction_id", ":relations_slot", 0),
  2289. (try_end),
  2290. (try_end),
  2291. (faction_set_slot, factions_end, slot_faction_poll_end_time, 0),
  2292. (troop_set_slot, "trp_inactive_players_array", slot_player_array_size, 0),
  2293. (troop_set_slot, "trp_last_chat_message", slot_last_chat_message_event_type, 0),
  2294. (troop_set_slot, "trp_last_chat_message", slot_last_chat_message_not_recieved, 0),
  2295. (str_clear, s0),
  2296. (try_for_range, ":chat_overlay_troop_id", chat_overlay_ring_buffer_begin, chat_overlay_ring_buffer_end),
  2297. (troop_set_name, ":chat_overlay_troop_id", s0),
  2298. (troop_set_plural_name, ":chat_overlay_troop_id", s0),
  2299. (try_end),
  2300. (assign, "$g_chat_overlay_local_buffer_stored", chat_overlay_ring_buffer_begin),
  2301. (assign, "$g_chat_overlay_faction_buffer_stored", chat_overlay_ring_buffer_begin),
  2302. ]),
  2303.  
  2304. ("preset_message", # display a message built into the module, using a string id and parameters
  2305. [(store_script_param, "$g_preset_message_string_id", 1),
  2306. (store_script_param, ":flags", 2),
  2307. (store_script_param, "$g_preset_message_value_1", 3),
  2308. (store_script_param, "$g_preset_message_value_2", 4),
  2309.  
  2310. (assign, ":color", ":flags"), # unpack the color from the flags parameter
  2311. (val_and, ":color", preset_message_color_mask),
  2312. (try_begin),
  2313. (eq, ":color", preset_message_white),
  2314. (assign, "$g_preset_message_color", 0xFFFFFFFF),
  2315. (else_try),
  2316. (eq, ":color", preset_message_red),
  2317. (assign, "$g_preset_message_color", 0xFFFF4422),
  2318. (else_try),
  2319. (eq, ":color", preset_message_green),
  2320. (assign, "$g_preset_message_color", 0xFF33DD11),
  2321. (else_try),
  2322. (eq, ":color", preset_message_blue),
  2323. (assign, "$g_preset_message_color", 0xFFFF4422),
  2324. (else_try),
  2325. (eq, ":color", preset_message_yellow),
  2326. (assign, "$g_preset_message_color", 0xFFFFEE11),
  2327. (try_end),
  2328.  
  2329. (assign, "$g_preset_message_type", ":flags"), # unpack the type from the flags parameter
  2330. (val_and, "$g_preset_message_type", preset_message_type_mask),
  2331. (try_begin),
  2332. (eq, "$g_preset_message_type", preset_message_read_object),
  2333. (try_begin),
  2334. (gt, "$g_preset_message_value_1", 0),
  2335. (assign, "$g_presentation_read_object_button_string_id", "$g_preset_message_value_1"),
  2336. (else_try),
  2337. (assign, "$g_presentation_read_object_button_string_id", "str_done"),
  2338. (try_end),
  2339. (start_presentation, "prsnt_read_object"),
  2340. (else_try),
  2341. (assign, "$g_preset_message_params", ":flags"),
  2342. (val_and, "$g_preset_message_params", preset_message_params_mask),
  2343.  
  2344. # keep the same as in prsnt_preset_message_* - unfortunately scripts and presentations are not run in order
  2345. (try_begin),
  2346. (eq, "$g_preset_message_params", preset_message_item),
  2347. (is_between, "$g_preset_message_value_1", 1, all_items_end),
  2348. (str_store_item_name, s1, "$g_preset_message_value_1"),
  2349. (assign, reg1, "$g_preset_message_value_2"),
  2350. (else_try),
  2351. (eq, "$g_preset_message_params", preset_message_agent),
  2352. (agent_is_active, "$g_preset_message_value_1"),
  2353. (str_store_agent_name, s1, "$g_preset_message_value_1"),
  2354. (assign, reg1, "$g_preset_message_value_2"),
  2355. (else_try),
  2356. (eq, "$g_preset_message_params", preset_message_player),
  2357. (player_is_active, "$g_preset_message_value_1"),
  2358. (str_store_player_username, s1, "$g_preset_message_value_1"),
  2359. (assign, reg1, "$g_preset_message_value_2"),
  2360. (else_try),
  2361. (is_between, "$g_preset_message_params", preset_message_faction, preset_message_faction_castle + 1),
  2362. (is_between, "$g_preset_message_value_1", factions_begin, factions_end),
  2363. (str_store_faction_name, s1, "$g_preset_message_value_1"),
  2364. (faction_get_color, "$g_preset_message_color", "$g_preset_message_value_1"),
  2365. (eq, "$g_preset_message_params", preset_message_faction_castle),
  2366. (call_script, "script_str_store_castle_name", s2, "$g_preset_message_value_2"),
  2367. (else_try),
  2368. (assign, reg1, "$g_preset_message_value_1"),
  2369. (assign, reg2, "$g_preset_message_value_2"),
  2370. (try_end),
  2371. # end keep same
  2372.  
  2373. (assign, ":log", ":flags"), # check whether to save in the chat log
  2374. (val_and, ":log", preset_message_log),
  2375. (try_begin),
  2376. (eq, ":log", preset_message_log),
  2377. (display_message, "$g_preset_message_string_id", "$g_preset_message_color"),
  2378. (try_end),
  2379.  
  2380. (assign, ":fail_sound", ":flags"),
  2381. (val_and, ":fail_sound", preset_message_fail_sound),
  2382. (try_begin),
  2383. (eq, ":fail_sound", preset_message_fail_sound),
  2384. (play_sound, "snd_failure"),
  2385. (try_end),
  2386.  
  2387. (try_begin),
  2388. (eq, "$g_preset_message_display_enabled", 0),
  2389. (else_try),
  2390. (eq, "$g_preset_message_type", preset_message_small),
  2391. (start_presentation, "prsnt_preset_message_small"),
  2392. (else_try),
  2393. (eq, "$g_preset_message_type", preset_message_big),
  2394. (start_presentation, "prsnt_preset_message_big"),
  2395. (try_end),
  2396. (try_end),
  2397. ]),
  2398.  
  2399. ("chat_event_increment", # store the next chat event number in reg0, wrapping around from the end back to the start
  2400. [(store_script_param, reg0, 1),
  2401.  
  2402. (val_and, reg0, net_chat_event_mask),
  2403. (try_begin),
  2404. (this_or_next|ge, reg0, client_event_chat_message_end - 1),
  2405. (lt, reg0, client_event_chat_message_begin),
  2406. (assign, reg0, client_event_chat_message_begin),
  2407. (else_try),
  2408. (val_add, reg0, 1),
  2409. (try_end),
  2410. ]),
  2411.  
  2412. ("cf_chat_event_is_new", # check whether a chat event is probably new or old, depending on the event number
  2413. [(store_script_param, ":event", 1),
  2414. (store_script_param, ":player_id", 2),
  2415.  
  2416. (val_and, ":event", net_chat_event_mask),
  2417. (player_get_slot, ":next_event", ":player_id", slot_player_next_chat_event_type),
  2418. (val_and, ":next_event", net_chat_event_mask),
  2419. (try_begin),
  2420. (eq, ":event", ":next_event"),
  2421. (assign, ":continue", 1),
  2422. (assign, ":type_valid", 1),
  2423. (else_try),
  2424. (assign, ":type_valid", 0),
  2425. (store_sub, ":event_difference", ":event", ":next_event"),
  2426. (try_begin),
  2427. (lt, ":event_difference", 0),
  2428. (val_add, ":event_difference", client_event_chat_message_end - client_event_chat_message_begin),
  2429. (try_end),
  2430. (lt, ":event_difference", (client_event_chat_message_end - client_event_chat_message_begin) / 2),
  2431. (assign, ":continue", 1),
  2432. (else_try),
  2433. (assign, ":continue", 0),
  2434. (try_end),
  2435. (assign, reg0, ":type_valid"),
  2436. (eq, ":continue", 1),
  2437. ]),
  2438.  
  2439. ("chat_overlay_add_to_local_buffer", # add messages to the buffer for the overlay for local and faction chat
  2440. [(store_script_param, ":color", 1), # the color of the message
  2441.  
  2442. (val_add, "$g_chat_overlay_local_buffer_stored", 1),
  2443. (try_begin),
  2444. (neg|is_between, "$g_chat_overlay_local_buffer_stored", chat_overlay_ring_buffer_begin, chat_overlay_ring_buffer_end),
  2445. (assign, "$g_chat_overlay_local_buffer_stored", chat_overlay_ring_buffer_begin),
  2446. (try_end),
  2447. (troop_set_name, "$g_chat_overlay_local_buffer_stored", s0),
  2448. (troop_set_slot, "$g_chat_overlay_local_buffer_stored", slot_chat_overlay_local_color, ":color"),
  2449. ]),
  2450.  
  2451. ("cf_no_input_presentation_active", # check that no presentation is active that should be grabbing keyboard or mouse input
  2452. [
  2453. (neg|is_presentation_active, "prsnt_chat_box"),
  2454. (neg|is_presentation_active, "prsnt_show_inventory"),
  2455. (neg|is_presentation_active, "prsnt_money_bag"),
  2456. (neg|is_presentation_active, "prsnt_tabbed_stats_chart"),
  2457. (neg|is_presentation_active, "prsnt_escape_menu"),
  2458. (neg|is_presentation_active, "prsnt_action_menu"),
  2459. (neg|is_presentation_active, "prsnt_animation_menu"),
  2460. (neg|is_presentation_active, "prsnt_animation_menu_no_mouse_grab"),
  2461. (neg|is_presentation_active, "prsnt_poll_menu"),
  2462. (neg|is_presentation_active, "prsnt_list_players"),
  2463. (neg|is_presentation_active, "prsnt_list_scenes"),
  2464. (neg|is_presentation_active, "prsnt_list_factions"),
  2465. (neg|is_presentation_active, "prsnt_faction_banner_selection"),
  2466. (neg|is_presentation_active, "prsnt_admin_menu"),
  2467. (neg|is_presentation_active, "prsnt_faction_admin_menu"),
  2468. (neg|is_presentation_active, "prsnt_game_multiplayer_admin_panel"),
  2469. (neg|is_presentation_active, "prsnt_game_rules"),
  2470. (neg|is_presentation_active, "prsnt_admin_item_select"),
  2471. ]),
  2472.  
  2473. ("initialize_banner_info", # store background colors for all the banners in an array
  2474. [
  2475. (troop_set_slot, "trp_banner_background_color_array", 0, 0xFFAAAA99), # plain white for scene props and item icons
  2476. (troop_set_slot, "trp_banner_background_color_array", 1, 0xFF554433), # brown for commoners and outlaws
  2477. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a01", 0xFF8f4531),
  2478. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a02", 0xFFd9d7d1),
  2479. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a03", 0xFF373736),
  2480. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a04", 0xFFa48b28),
  2481. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a05", 0xFF497735),
  2482. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a06", 0xFF82362d),
  2483. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a07", 0xFF793329),
  2484. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a08", 0xFF262521),
  2485. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a09", 0xFFd9dad1),
  2486. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a10", 0xFF524563),
  2487. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a11", 0xFF91312c),
  2488. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a12", 0xFFafa231),
  2489. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a13", 0xFF706d3c),
  2490. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a14", 0xFFd6d3ce),
  2491. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a15", 0xFFd6d3ce),
  2492. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a16", 0xFF394584),
  2493. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a17", 0xFF42662e),
  2494. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a18", 0xFFdfded6),
  2495. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a19", 0xFF292724),
  2496. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a20", 0xFF58611b),
  2497. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_a21", 0xFF313a67),
  2498. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b01", 0xFF9c924a),
  2499. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b02", 0xFF998b39),
  2500. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b03", 0xFF365168),
  2501. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b04", 0xFFd6d3ce),
  2502. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b05", 0xFF94a642),
  2503. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b06", 0xFF944131),
  2504. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b07", 0xFF893b34),
  2505. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b08", 0xFF425510),
  2506. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b09", 0xFF94452e),
  2507. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b10", 0xFF475a94),
  2508. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b11", 0xFFd1b231),
  2509. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b12", 0xFFe1e2df),
  2510. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b13", 0xFF997c1e),
  2511. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b14", 0xFFc6b74d),
  2512. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b15", 0xFFad9a18),
  2513. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b16", 0xFF212421),
  2514. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b17", 0xFF8c2021),
  2515. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b18", 0xFF4d7136),
  2516. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b19", 0xFF395d84),
  2517. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b20", 0xFF527539),
  2518. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_b21", 0xFF9c3c39),
  2519. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c01", 0xFF42518c),
  2520. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c02", 0xFFa46a2c),
  2521. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c03", 0xFF9f5141),
  2522. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c04", 0xFF2c6189),
  2523. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c05", 0xFF556421),
  2524. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c06", 0xFF9d621e),
  2525. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c07", 0xFFdeded6),
  2526. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c08", 0xFF6e4891),
  2527. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c09", 0xFF313031),
  2528. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c10", 0xFFdedfd9),
  2529. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c11", 0xFF865a29),
  2530. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c12", 0xFF8c3821),
  2531. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c13", 0xFF524273),
  2532. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c14", 0xFFd1cec6),
  2533. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c15", 0xFF604283),
  2534. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c16", 0xFF395584),
  2535. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c17", 0xFF6b4139),
  2536. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c18", 0xFF47620d),
  2537. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c19", 0xFFd6d7d6),
  2538. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c20", 0xFF2e2f2c),
  2539. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_c21", 0xFF313031),
  2540. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d01", 0xFF7e3f2e),
  2541. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d02", 0xFF343434),
  2542. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d03", 0xFF3c496b),
  2543. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d04", 0xFFd9d8d1),
  2544. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d05", 0xFF99823c),
  2545. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d06", 0xFF9f822e),
  2546. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d07", 0xFF393839),
  2547. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d08", 0xFFa54931),
  2548. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d09", 0xFFdfdcd6),
  2549. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d10", 0xFF9f4a36),
  2550. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d11", 0xFF8c7521),
  2551. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d12", 0xFF9f4631),
  2552. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d13", 0xFF793324),
  2553. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d14", 0xFF395076),
  2554. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d15", 0xFF2c2b2c),
  2555. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d16", 0xFF657121),
  2556. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d17", 0xFF7e3121),
  2557. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d18", 0xFF76512e),
  2558. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d19", 0xFFe7e3de),
  2559. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d20", 0xFF947921),
  2560. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_d21", 0xFF4d7b7c),
  2561. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e01", 0xFF343331),
  2562. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e02", 0xFFa74d36),
  2563. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e03", 0xFFe7e3de),
  2564. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e04", 0xFFd6d8ce),
  2565. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e05", 0xFF3e4d67),
  2566. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e06", 0xFF9f842e),
  2567. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e07", 0xFF4d6994),
  2568. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e08", 0xFF4a6118),
  2569. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e09", 0xFF943c29),
  2570. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e10", 0xFF394479),
  2571. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e11", 0xFF343331),
  2572. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e12", 0xFF3f4d5d),
  2573. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e13", 0xFF4a6489),
  2574. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e14", 0xFF313031),
  2575. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e15", 0xFFd6d7ce),
  2576. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e16", 0xFFc69e00),
  2577. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e17", 0xFF638e52),
  2578. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e18", 0xFFdcdbd3),
  2579. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e19", 0xFFdbdcd3),
  2580. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e20", 0xFF843831),
  2581. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_e21", 0xFF8c3421),
  2582. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f01", 0xFF8f4631),
  2583. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f02", 0xFF672a29),
  2584. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f03", 0xFF4f6d86),
  2585. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f04", 0xFF978021),
  2586. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f05", 0xFF5d6c29),
  2587. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f06", 0xFFa55d4a),
  2588. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f07", 0xFF315184),
  2589. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f08", 0xFF3f4e9d),
  2590. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f09", 0xFF525918),
  2591. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f10", 0xFF52496b),
  2592. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f11", 0xFF00928c),
  2593. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f12", 0xFF4a699c),
  2594. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f13", 0xFF76713f),
  2595. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f14", 0xFF8f2e2c),
  2596. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f15", 0xFF60492e),
  2597. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f16", 0xFF735531),
  2598. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f17", 0xFF315d84),
  2599. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f18", 0xFF393c39),
  2600. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f19", 0xFF42824a),
  2601. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f20", 0xFF733829),
  2602. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_f21", 0xFF9c5542),
  2603. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g01", 0xFFc39d31),
  2604. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g02", 0xFFcbb670),
  2605. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g03", 0xFF394a18),
  2606. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g04", 0xFF372708),
  2607. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g05", 0xFF9a6810),
  2608. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g06", 0xFFb27910),
  2609. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g07", 0xFF8c8621),
  2610. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g08", 0xFF975a03),
  2611. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g09", 0xFF2c2924),
  2612. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g10", 0xFFaa962c),
  2613. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g11", 0xFFa2822e),
  2614. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g12", 0xFF7b8a8c),
  2615. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g13", 0xFF3c0908),
  2616. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g14", 0xFF24092c),
  2617. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g15", 0xFF671e14),
  2618. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g16", 0xFF103042),
  2619. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g17", 0xFF4a4500),
  2620. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g18", 0xFF703324),
  2621. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g19", 0xFF24293c),
  2622. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g20", 0xFF5d6966),
  2623. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_g21", 0xFF521c08),
  2624. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h01", 0xFFbdae39),
  2625. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h02", 0xFF5d689f),
  2626. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h03", 0xFF526518),
  2627. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h04", 0xFFbabbb2),
  2628. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h05", 0xFFdedede),
  2629. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h06", 0xFF38383a),
  2630. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h07", 0xFF3a4273),
  2631. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h08", 0xFF272727),
  2632. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h09", 0xFFd82929),
  2633. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h10", 0xFF313031),
  2634. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h11", 0xFF9e3e35),
  2635. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h12", 0xFF831119),
  2636. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h13", 0xFF458fd6),
  2637. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h14", 0xFFffffff),
  2638. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h15", 0xFF586617),
  2639. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h16", 0xFFbe3630),
  2640. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h17", 0xFFbdbaad),
  2641. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h18", 0xFF293052),
  2642. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h19", 0xFF908b0b),
  2643. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h20", 0xFF2d2d2d),
  2644. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_h21", 0xFF272727),
  2645. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i01", 0xFF840008),
  2646. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i02", 0xFFb0880d),
  2647. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i03", 0xFFb5ae94),
  2648. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i04", 0xFFfcdc1b),
  2649. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i05", 0xFF948908),
  2650. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i06", 0xFF630408),
  2651. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i07", 0xFF9f9300),
  2652. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i08", 0xFFbaa773),
  2653. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i09", 0xFFbdbeb5),
  2654. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i10", 0xFF9c9a94),
  2655. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i11", 0xFFd3ceaa),
  2656. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i12", 0xFF393e57),
  2657. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i13", 0xFF570a0a),
  2658. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i14", 0xFF303030),
  2659. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i15", 0xFF730908),
  2660. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i16", 0xFF2d690e),
  2661. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i17", 0xFF892418),
  2662. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i18", 0xFF292f4f),
  2663. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i19", 0xFF0a1458),
  2664. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i20", 0xFFd2c297),
  2665. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_i21", 0xFF2a2a2a),
  2666. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j01", 0xFF737373),
  2667. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j02", 0xFF772020),
  2668. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j03", 0xFF812528),
  2669. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j04", 0xFF7b1f10),
  2670. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j05", 0xFF41250e),
  2671. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j06", 0xFF981817),
  2672. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j07", 0xFF841f14),
  2673. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j08", 0xFF2b3234),
  2674. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j09", 0xFF591d1d),
  2675. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j10", 0xFF622419),
  2676. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j11", 0xFF950404),
  2677. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j12", 0xFF950404),
  2678. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j13", 0xFFd7d8cb),
  2679. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j14", 0xFF7e6d1d),
  2680. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j15", 0xFF932c1d),
  2681. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j16", 0xFF4e1d15),
  2682. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j17", 0xFF9fa28f),
  2683. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j18", 0xFF1762ac),
  2684. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j19", 0xFF2d462f),
  2685. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j20", 0xFF183f21),
  2686. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_j21", 0xFF730000),
  2687. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k01", 0xFF2539ad),
  2688. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k02", 0xFF6b0000),
  2689. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k03", 0xFF252525),
  2690. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k04", 0xFF2b3153),
  2691. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k05", 0xFF7b1212),
  2692. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k06", 0xFFbabbb2),
  2693. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k07", 0xFF6b140b),
  2694. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k08", 0xFFecebe9),
  2695. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k09", 0xFF2b4e7f),
  2696. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k10", 0xFF626157),
  2697. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k11", 0xFF201f1c),
  2698. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k12", 0xFF5b241b),
  2699. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k13", 0xFFa11111),
  2700. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k14", 0xFFb67c0e),
  2701. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k15", 0xFF836e1c),
  2702. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k16", 0xFF2b3962),
  2703. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k17", 0xFFbabbb2),
  2704. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k18", 0xFF3d0101),
  2705. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k19", 0xFF47908c),
  2706. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k20", 0xFF3f7084),
  2707. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_k21", 0xFF989c90),
  2708. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l01", 0xFF5a1901),
  2709. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l02", 0xFF3f495d),
  2710. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l03", 0xFFa56118),
  2711. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l04", 0xFF10283c),
  2712. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l05", 0xFF434238),
  2713. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l06", 0xFF0d3717),
  2714. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l07", 0xFF263944),
  2715. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l08", 0xFF3d1b50),
  2716. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l09", 0xFF8b171a),
  2717. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l10", 0xFF2f154d),
  2718. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l11", 0xFF001943),
  2719. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l12", 0xFFc9cac6),
  2720. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l13", 0xFFe9cd12),
  2721. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l14", 0xFFa02d35),
  2722. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l15", 0xFFb0b0a7),
  2723. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l16", 0xFF6b0809),
  2724. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l17", 0xFF2d5b01),
  2725. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l18", 0xFF861102),
  2726. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l19", 0xFFaa3811),
  2727. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l20", 0xFF3e1b50),
  2728. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_l21", 0xFF2c4151),
  2729. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m01", 0xFF00006d),
  2730. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m02", 0xFF680605),
  2731. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m03", 0xFFcfc3a7),
  2732. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m04", 0xFFed8720),
  2733. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m05", 0xFF946f22),
  2734. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m06", 0xFF003278),
  2735. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m07", 0xFFbabbb2),
  2736. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m08", 0xFF313031),
  2737. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m09", 0xFF762221),
  2738. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m10", 0xFF555555),
  2739. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m11", 0xFF004388),
  2740. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m12", 0xFF313031),
  2741. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_m13", 0xFFbabbb2),
  2742. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_a", 0xFF316184),
  2743. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_b", 0xFFd6d3bd),
  2744. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_c", 0xFF633039),
  2745. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_d", 0xFF3f6c2e),
  2746. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_e", 0xFFc6a64a),
  2747. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_f", 0xFF5a2421),
  2748. (troop_set_slot, "trp_banner_background_color_array", "mesh_banner_kingdom_g", 0xFF86411e),
  2749. (troop_set_slot, "trp_banner_background_color_array", "mesh_banners_default_a", 0xFF242424),
  2750. ]),
  2751.  
  2752. ("item_set_banner", # called from triggers of heraldic items and scene props
  2753. [(store_script_param, ":tableau_id", 1), # in module_tableau_materials
  2754. (store_script_param, ":agent_id", 2),
  2755. #(store_script_param, ":troop_id", 3), # used in Native, but unused in this mod
  2756.  
  2757. (try_begin),
  2758. (agent_is_active, ":agent_id"),
  2759. (agent_get_player_id, ":player_id", ":agent_id"),
  2760. (player_is_active, ":player_id"),
  2761. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  2762. (try_begin),
  2763. (ge, ":player_faction_id", castle_factions_begin),
  2764. (faction_get_slot, ":banner_mesh", ":player_faction_id", slot_faction_banner_mesh),
  2765. (gt, ":banner_mesh", 0),
  2766. (else_try), # banner mesh 1 is for a plain brown background
  2767. (assign, ":banner_mesh", 1),
  2768. (try_end),
  2769. (else_try), # banner mesh 0 is for a plain white background
  2770. (assign, ":banner_mesh", 0),
  2771. (try_end),
  2772. (cur_item_set_tableau_material, ":tableau_id", ":banner_mesh"),
  2773. ]),
  2774.  
  2775. ("cf_add_item_to_troop_equipment_slots", # store a troop default item in slots for easy selection by the random equipment scripts
  2776. [(store_script_param, ":troop_id", 1),
  2777. (store_script_param, ":item_id", 2),
  2778.  
  2779. (item_get_type, ":item_type", ":item_id"),
  2780. (try_begin),
  2781. (eq, ":item_type", itp_type_one_handed_wpn),
  2782. (assign, ":equipment_slot_begin", slot_troop_equipment_one_hand_begin),
  2783. (else_try),
  2784. (is_between, ":item_type", itp_type_two_handed_wpn, itp_type_polearm + 1),
  2785. (assign, ":equipment_slot_begin", slot_troop_equipment_two_hand_begin),
  2786. (else_try),
  2787. (is_between, ":item_type", itp_type_bow, itp_type_thrown + 1),
  2788. (assign, ":equipment_slot_begin", slot_troop_equipment_ranged_begin),
  2789. (else_try),
  2790. (is_between, ":item_type", itp_type_arrows, itp_type_bolts + 1),
  2791. (assign, ":equipment_slot_begin", slot_troop_equipment_ammo_begin),
  2792. (else_try),
  2793. (eq, ":item_type", itp_type_shield),
  2794. (assign, ":equipment_slot_begin", slot_troop_equipment_shield_begin),
  2795. (else_try),
  2796. (eq, ":item_type", itp_type_head_armor),
  2797. (assign, ":equipment_slot_begin", slot_troop_equipment_head_begin),
  2798. (else_try),
  2799. (eq, ":item_type", itp_type_body_armor),
  2800. (assign, ":equipment_slot_begin", slot_troop_equipment_body_begin),
  2801. (else_try),
  2802. (eq, ":item_type", itp_type_foot_armor),
  2803. (assign, ":equipment_slot_begin", slot_troop_equipment_foot_begin),
  2804. (else_try),
  2805. (eq, ":item_type", itp_type_hand_armor),
  2806. (assign, ":equipment_slot_begin", slot_troop_equipment_hand_begin),
  2807. (else_try),
  2808. (eq, ":item_type", itp_type_horse),
  2809. (assign, ":equipment_slot_begin", slot_troop_equipment_horse_begin),
  2810. (else_try),
  2811. (assign, ":equipment_slot_begin", -1),
  2812. (try_end),
  2813. (neq, ":equipment_slot_begin", -1),
  2814.  
  2815. (troop_get_slot, ":equipment_slot_count", ":troop_id", ":equipment_slot_begin"),
  2816. (lt, ":equipment_slot_count", troop_slot_count_per_equipment_type - 1),
  2817. (val_add, ":equipment_slot_count", 1),
  2818. (troop_set_slot, ":troop_id", ":equipment_slot_begin", ":equipment_slot_count"),
  2819. (val_add, ":equipment_slot_begin", ":equipment_slot_count"),
  2820. (troop_set_slot, ":troop_id", ":equipment_slot_begin", ":item_id"),
  2821. ]),
  2822.  
  2823. ("initialize_troop_equipment_slots", # set troop default item slots from the hard coded inventory, for use with random equipment scripts
  2824. [
  2825. (try_begin),
  2826. (multiplayer_is_server),
  2827. (try_for_range, ":troop_id", playable_troops_begin, playable_troops_end),
  2828. (troop_get_inventory_capacity, ":capacity", ":troop_id"),
  2829. (try_for_range, ":inv_slot", 0, ":capacity"),
  2830. (troop_get_inventory_slot, ":item_id", ":troop_id", ":inv_slot"),
  2831. (gt, ":item_id", 0),
  2832. (call_script, "script_cf_add_item_to_troop_equipment_slots", ":troop_id", ":item_id"),
  2833. (try_end),
  2834. (try_end),
  2835. (try_end),
  2836. ]),
  2837.  
  2838. ("cf_troop_get_random_equipment", # store in reg0 a random item of a certain type from the troop's default equipment
  2839. [(store_script_param, ":troop_id", 1),
  2840. (store_script_param, ":slot_begin", 2), # the type of item: slot_troop_equipment_*
  2841.  
  2842. (troop_get_slot, ":item_count", ":troop_id", ":slot_begin"),
  2843. (gt, ":item_count", 0),
  2844. (val_add, ":slot_begin", 1),
  2845. (store_add, ":slot_end", ":slot_begin", ":item_count"),
  2846. (store_random_in_range, ":random_slot", ":slot_begin", ":slot_end"),
  2847. (troop_get_slot, reg0, ":troop_id", ":random_slot"),
  2848. ]),
  2849.  
  2850. ("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
  2851. [(store_script_param, ":player_id", 1), # must be valid
  2852. (store_script_param, ":player_slot", 2), # slot_player_equip_*
  2853. (store_script_param, ":troop_id", 3),
  2854. (store_script_param, ":troop_slot", 4), # the type of item: slot_troop_equipment_*
  2855.  
  2856. (player_get_slot, ":existing_item_id", ":player_id", ":player_slot"),
  2857. (lt, ":existing_item_id", all_items_begin),
  2858. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", ":troop_slot"),
  2859. (val_mul, reg0, -1),
  2860. (player_set_slot, ":player_id", ":player_slot", reg0),
  2861. ]),
  2862.  
  2863. ("player_add_default_troop_items", # server: fill player weapon slots with default items, if there are none equipped already
  2864. [(store_script_param, ":player_id", 1), # must be valid
  2865. (store_script_param, ":troop_id", 2),
  2866.  
  2867. (assign, ":free_slots", 0), # find the first free slot
  2868. (assign, ":free_slots_begin", slot_player_equip_end),
  2869. (try_for_range, ":player_slot", slot_player_equip_item_0, slot_player_equip_head),
  2870. (player_get_slot, ":existing_item_id", ":player_id", ":player_slot"),
  2871. (lt, ":existing_item_id", all_items_begin),
  2872. (val_min, ":free_slots_begin", ":player_slot"),
  2873. (val_add, ":free_slots", 1),
  2874. (try_end),
  2875. (assign, ":ranged_count", 0),
  2876. (try_begin), # try add ranged weapons if in the troop defaults
  2877. (ge, ":free_slots", 2), # only if there are at least 2 free slots, for weapon and ammo
  2878. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_ranged_begin),
  2879. (assign, ":ranged_item_id", reg0),
  2880. (item_get_type, ":ranged_item_type", ":ranged_item_id"),
  2881. (try_begin), # thrown needs no ammo
  2882. (eq, ":ranged_item_type", itp_type_thrown),
  2883. (assign, ":ranged_count", 1),
  2884. (else_try), # otherwise check for the correct ammo
  2885. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_ammo_begin),
  2886. (assign, ":ammo_item_id", reg0),
  2887. (val_sub, ":ranged_item_type", itp_type_bow - itp_type_arrows),
  2888. (assign, ":ammo_slot_end", slot_troop_equipment_ammo_begin + troop_slot_count_per_equipment_type + 1),
  2889. (try_for_range, ":ammo_slot", slot_troop_equipment_ammo_begin + 1, ":ammo_slot_end"), # check over all ammo slots for the correct type
  2890. (item_get_type, ":ammo_item_type", ":ammo_item_id"),
  2891. (eq, ":ammo_item_type", ":ranged_item_type"),
  2892. (assign, ":ammo_slot_end", -1), # exit loop if found
  2893. (assign, ":ranged_count", 2),
  2894. (else_try),
  2895. (troop_get_slot, ":ammo_item_id", ":troop_id", ":ammo_slot"), # otherwise check the next slot
  2896. (try_end),
  2897. (try_end),
  2898. (try_end),
  2899. (store_sub, ":free_melee_slots", ":free_slots", ":ranged_count"),
  2900. (assign, ":one_hand_added", 0),
  2901. (assign, ":shield_added", 0),
  2902. (assign, ":two_hand_added", 0),
  2903. (assign, ":two_hand_item_id", 0),
  2904. (assign, ":ranged_added", 0),
  2905. (assign, ":ammo_added", 0),
  2906. (try_for_range, ":slot_counter", 0, ":free_slots"), # loop over the remaining free slots, adding different types of default weapons if possible
  2907. (try_begin),
  2908. (lt, ":slot_counter", ":free_melee_slots"),
  2909. (eq, ":one_hand_added", 0),
  2910. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_one_hand_begin),
  2911. (val_add, ":one_hand_added", 1),
  2912. (else_try),
  2913. (lt, ":slot_counter", ":free_melee_slots"),
  2914. (eq, ":shield_added", 0),
  2915. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_shield_begin),
  2916. (val_add, ":shield_added", 1),
  2917. (else_try),
  2918. (lt, ":slot_counter", ":free_melee_slots"),
  2919. (le, ":two_hand_added", 1),
  2920. (call_script, "script_cf_troop_get_random_equipment", ":troop_id", slot_troop_equipment_two_hand_begin),
  2921. (neq, reg0, ":two_hand_item_id"),
  2922. (val_add, ":two_hand_added", 1),
  2923. (assign, ":two_hand_item_id", reg0),
  2924. (else_try),
  2925. (ge, ":ranged_count", 1),
  2926. (eq, ":ranged_added", 0),
  2927. (assign, reg0, ":ranged_item_id"),
  2928. (val_add, ":ranged_added", 1),
  2929. (else_try),
  2930. (ge, ":ranged_count", 2),
  2931. (eq, ":ammo_added", 0),
  2932. (assign, reg0, ":ammo_item_id"),
  2933. (val_add, ":ammo_added", 1),
  2934. (else_try),
  2935. (assign, ":free_slots", -1),
  2936. (try_end),
  2937. (gt, ":free_slots", -1),
  2938. (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
  2939. (player_set_slot, ":player_id", ":free_slots_begin", reg0),
  2940. (val_add, ":free_slots_begin", 1),
  2941. (assign, ":free_slots_end", slot_player_equip_head), # find the number of the next free slot
  2942. (try_for_range, ":next_free_slot", ":free_slots_begin", ":free_slots_end"),
  2943. (player_get_slot, ":existing_item_id", ":player_id", ":next_free_slot"),
  2944. (lt, ":existing_item_id", all_items_begin),
  2945. (assign, ":free_slots_begin", ":next_free_slot"),
  2946. (assign, ":free_slots_end", -1),
  2947. (try_end),
  2948. (try_begin),
  2949. (neq, ":free_slots_end", -1), # if no more free slots found, end the loop
  2950. (assign, ":free_slots", -1),
  2951. (try_end),
  2952. (try_end),
  2953. (try_begin),
  2954. (call_script, "script_cf_player_add_default_troop_item", ":player_id", slot_player_equip_horse, ":troop_id", slot_troop_equipment_horse_begin),
  2955. (try_end),
  2956. ]),
  2957.  
  2958. ("player_add_default_troop_armor", # server: fill player armor slots with default items, if there are none equipped already
  2959. [(store_script_param, ":player_id", 1), # must be valid
  2960. (store_script_param, ":troop_id", 2),
  2961.  
  2962. (assign, ":troop_slot", slot_troop_equipment_head_begin),
  2963. (try_for_range, ":player_slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  2964. (try_begin),
  2965. (call_script, "script_cf_player_add_default_troop_item", ":player_id", ":player_slot", ":troop_id", ":troop_slot"),
  2966. (try_end),
  2967. (val_add, ":troop_slot", troop_slot_count_per_equipment_type), # jump to the beginning troop equipment slot for the next type
  2968. (try_end),
  2969. ]),
  2970.  
  2971. ("set_random_spawn_position", # set a spawn position at ground level within the specified range of pos1; overwrites pos10
  2972. [(store_script_param, ":range", 1),
  2973.  
  2974. (store_mul, ":negative_range", ":range", -1),
  2975. (init_position, pos10),
  2976. (position_copy_origin, pos10, pos1),
  2977. (store_random_in_range, ":offset", ":negative_range", ":range"),
  2978. (position_move_x, pos10, ":offset"),
  2979. (store_random_in_range, ":offset", ":negative_range", ":range"),
  2980. (position_move_y, pos10, ":offset"),
  2981. (store_random_in_range, ":offset", 0, 360),
  2982. (position_rotate_z, pos10, ":offset"),
  2983. (position_set_z_to_ground_level, pos10),
  2984. (set_spawn_position, pos10),
  2985. ]),
  2986.  
  2987. ("player_add_equipped_items", # server: when respawning and possibly changing troop, calculate the combination of usable previously equipped items and new default items
  2988. [(store_script_param, ":player_id", 1), # must be valid
  2989. (store_script_param, ":troop_id", 2),
  2990.  
  2991. (player_get_agent_id, ":agent_id", ":player_id"),
  2992. (try_begin),
  2993. (agent_is_active, ":agent_id"),
  2994. (agent_is_alive, ":agent_id"), # only add previously equipped items if the agent is alive
  2995. (agent_get_position, pos1, ":agent_id"),
  2996. (assign, ":has_bow", 0),
  2997. (assign, ":has_crossbow", 0),
  2998. (assign, ":check_ammo", 0),
  2999. (assign, ":player_slot", slot_player_equip_item_0),
  3000. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  3001. (assign, ":store_item_id", 0),
  3002. (assign, ":store_item_ammo", 0),
  3003. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3004. (try_begin),
  3005. (ge, ":item_id", all_items_begin),
  3006. (item_get_type, ":item_type", ":item_id"),
  3007. (try_begin),
  3008. (neq, ":item_type", itp_type_arrows),
  3009. (neq, ":item_type", itp_type_bolts),
  3010. (neq, ":item_type", itp_type_thrown),
  3011. (assign, ":max_ammo", 0),
  3012. (assign, ":ammo", 0),
  3013. (else_try),
  3014. (item_get_slot, ":max_ammo", ":item_id", slot_item_max_ammo),
  3015. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  3016. (neq, ":item_type", itp_type_thrown),
  3017. (assign, ":check_ammo", 1),
  3018. (try_end),
  3019. (try_begin),
  3020. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  3021. (try_begin),
  3022. (eq, ":max_ammo", 0),
  3023. (assign, ":store_item_id", ":item_id"),
  3024. (else_try),
  3025. (gt, ":ammo", 0),
  3026. (assign, ":store_item_id", ":item_id"),
  3027. (assign, ":store_item_ammo", ":ammo"),
  3028. (try_end),
  3029. (try_begin),
  3030. (eq, ":item_type", itp_type_bow),
  3031. (assign, ":has_bow", 1),
  3032. (else_try),
  3033. (eq, ":item_type", itp_type_crossbow),
  3034. (assign, ":has_crossbow", 1),
  3035. (try_end),
  3036. (else_try),
  3037. (ge, ":ammo", ":max_ammo"),
  3038. (call_script, "script_set_random_spawn_position", 50),
  3039. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  3040. (call_script, "script_check_on_item_dropped", ":agent_id", ":item_id", reg0, 0),
  3041. (try_end),
  3042. (try_end),
  3043. (player_set_slot, ":player_id", ":player_slot", ":store_item_id"),
  3044. (store_add, ":ammo_slot", ":equip_slot", slot_player_equip_item_0_ammo),
  3045. (player_set_slot, ":player_id", ":ammo_slot", ":store_item_ammo"),
  3046. (val_add, ":player_slot", 1),
  3047. (try_end),
  3048. (try_begin),
  3049. (eq, ":check_ammo", 1),
  3050. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  3051. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3052. (ge, ":item_id", all_items_begin),
  3053. (assign, ":keep", 1),
  3054. (item_get_type, ":item_type", ":item_id"),
  3055. (try_begin),
  3056. (eq, ":item_type", itp_type_arrows),
  3057. (assign, ":keep", ":has_bow"),
  3058. (else_try),
  3059. (eq, ":item_type", itp_type_bolts),
  3060. (assign, ":keep", ":has_crossbow"),
  3061. (try_end),
  3062. (eq, ":keep", 0),
  3063. (store_add, ":player_slot", ":equip_slot", slot_player_equip_item_0),
  3064. (player_set_slot, ":player_id", ":player_slot", 0),
  3065. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  3066. (item_slot_eq, ":item_id", slot_item_max_ammo, ":ammo"),
  3067. (call_script, "script_set_random_spawn_position", 50),
  3068. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  3069. (call_script, "script_check_on_item_dropped", ":agent_id", ":item_id", reg0, 0),
  3070. (try_end),
  3071. (try_end),
  3072. (try_begin),
  3073. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  3074. (gt, ":horse_agent_id", -1),
  3075. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  3076. (store_agent_hit_points, ":hit_points", ":horse_agent_id", 1),
  3077. (init_position, pos2),
  3078. (position_move_x, pos2, 50),
  3079. (position_transform_position_to_parent, pos3, pos1, pos2),
  3080. (position_set_z_to_ground_level, pos3),
  3081. (set_spawn_position, pos3),
  3082. (spawn_horse, ":horse_item_id"),
  3083. (agent_set_hit_points, reg0, ":hit_points", 1),
  3084. (try_end),
  3085. (assign, ":player_slot", slot_player_equip_head),
  3086. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  3087. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3088. (try_begin),
  3089. (ge, ":item_id", all_items_begin),
  3090. (try_begin),
  3091. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  3092. (else_try),
  3093. (player_set_slot, ":player_id", ":player_slot", 0),
  3094. (try_end),
  3095. (try_end),
  3096. (val_add, ":player_slot", 1),
  3097. (try_end),
  3098. (try_end),
  3099. (call_script, "script_player_add_default_troop_items", ":player_id", ":troop_id"),
  3100. (call_script, "script_player_add_default_troop_armor", ":player_id", ":troop_id"),
  3101. ]),
  3102.  
  3103. ("player_add_spawn_items", # server: add the previously calculated and stored equipment to the engine's list of items to spawn with
  3104. [(store_script_param, ":player_id", 1), # must be valid
  3105. (store_script_param, ":add_weapons", 2), # 0 = armor and shields only, 1 = weapons also
  3106.  
  3107. (assign, ":player_slot", slot_player_equip_item_0),
  3108. (try_for_range, ":equip_slot", ek_item_0, ek_horse + 1),
  3109. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3110. (val_abs, ":item_id"),
  3111. (try_begin),
  3112. (ge, ":item_id", all_items_begin),
  3113. (item_get_type, ":item_type", ":item_id"),
  3114. (this_or_next|eq, ":add_weapons", 1),
  3115. (this_or_next|is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  3116. (eq, ":item_type", itp_type_shield),
  3117. (player_add_spawn_item, ":player_id", ":equip_slot", ":item_id"),
  3118. (try_end),
  3119. (val_add, ":player_slot", 1),
  3120. (try_end),
  3121. ]),
  3122.  
  3123. ("player_equip_stored_default_items", # server: after spawning, equip weapons saved in equipment slots
  3124. [(store_script_param, ":player_id", 1), # must be valid
  3125.  
  3126. (player_get_agent_id, ":agent_id", ":player_id"),
  3127. (try_for_range, ":player_slot", slot_player_equip_item_0, slot_player_equip_item_3 + 1),
  3128. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3129. (lt, ":item_id", 0),
  3130. (val_abs, ":item_id"),
  3131. (item_get_type, ":item_type", ":item_id"),
  3132. (neq, ":item_type", itp_type_shield),
  3133. (agent_equip_item, ":agent_id", ":item_id"),
  3134. (try_end),
  3135. ]),
  3136.  
  3137. ("player_set_stored_ammo_counts", # server: after spawning, try set counts for ammo items to the stored values
  3138. [(store_script_param, ":player_id", 1), # must be valid
  3139.  
  3140. (player_get_agent_id, ":agent_id", ":player_id"),
  3141. (try_for_range, ":player_slot", slot_player_equip_item_0, slot_player_equip_item_3 + 1),
  3142. (player_get_slot, ":item_id", ":player_id", ":player_slot"),
  3143. (ge, ":item_id", all_items_begin),
  3144. (store_add, ":ammo_slot", ":player_slot", slot_player_equip_item_0_ammo - slot_player_equip_item_0),
  3145. (player_get_slot, ":item_ammo", ":player_id", ":ammo_slot"),
  3146. (gt, ":item_ammo", 0),
  3147. (assign, ":loop_end", slot_player_equip_item_3 + 1),
  3148. (try_for_range, ":other_player_slot", slot_player_equip_item_0, ":loop_end"),
  3149. (player_slot_eq, ":player_id", ":other_player_slot", ":item_id"),
  3150. (try_begin),
  3151. (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
  3152. (assign, ":loop_end", -1),
  3153. (else_try),
  3154. (gt, ":other_player_slot", ":player_slot"), # add the ammo value of all subsequent slots for the same item
  3155. (store_add, ":ammo_slot", ":other_player_slot", slot_player_equip_item_0_ammo - slot_player_equip_item_0),
  3156. (player_get_slot, ":slot_ammo", ":player_id", ":ammo_slot"),
  3157. (gt, ":slot_ammo", 0),
  3158. (val_add, ":item_ammo", ":slot_ammo"),
  3159. (try_end),
  3160. (try_end),
  3161. (neq, ":loop_end", -1),
  3162. (gt, ":item_ammo", 0),
  3163. (agent_set_ammo, ":agent_id", ":item_id", ":item_ammo"), # this operation sets total ammo for all equipped items of that type
  3164. (try_end),
  3165. ]),
  3166.  
  3167. ("player_get_spawn_point", # server: store in reg0 an appropriate spawn point for the player: the one requested if valid, otherwise pick randomly
  3168. [(store_script_param, ":player_id", 1), # must be valid
  3169.  
  3170. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  3171. (player_get_slot, ":spawn_point", ":player_id", slot_player_requested_spawn_point),
  3172. (player_set_slot, ":player_id", slot_player_requested_spawn_point, 0),
  3173. (try_begin),
  3174. (gt, ":spawn_point", 0),
  3175. (val_sub, ":spawn_point", 1), # the requested spawn point numbers are from 1 - 5, but the corresponding entry points are 0 - 4
  3176. (try_begin),
  3177. (is_between, ":faction_id", castle_factions_begin, factions_end),
  3178. (store_mod, ":castle_spawn_no", ":spawn_point", 10),
  3179. (is_between, ":castle_spawn_no", 0, 5),
  3180. (store_div, ":castle_no", ":spawn_point", 10),
  3181. (val_sub, ":castle_no", castle_factions_begin),
  3182. (call_script, "script_cf_castle_is_active", ":castle_no"),
  3183. (troop_slot_eq, "trp_mission_data", ":castle_no", ":faction_id"),
  3184. (else_try),
  3185. (is_between, ":faction_id", factions_begin, castle_factions_begin),
  3186. (is_between, ":spawn_point", 0, 5),
  3187. (store_mul, ":entry_point_begin", ":faction_id", 10),
  3188. (val_add, ":spawn_point", ":entry_point_begin"),
  3189. (else_try),
  3190. (assign, ":spawn_point", -1),
  3191. (try_end),
  3192. (gt, ":spawn_point", -1),
  3193. (else_try), # no spawn point requested, or it was invalid
  3194. (try_begin),
  3195. (is_between, ":faction_id", castle_factions_begin, factions_end),
  3196. (assign, ":owned_castles", 0),
  3197. (assign, ":temp_slot", 0), # add all castles owned by their faction to a temporary list
  3198. (try_for_range, ":castle_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  3199. (troop_get_slot, ":owner_faction", "trp_mission_data", ":castle_no"),
  3200. (eq, ":owner_faction", ":faction_id"),
  3201. (call_script, "script_cf_castle_is_active", ":castle_no"),
  3202. (troop_set_slot, "trp_temp_array", ":temp_slot", ":castle_no"),
  3203. (val_add, ":owned_castles", 1),
  3204. (val_add, ":temp_slot", 1),
  3205. (try_end),
  3206. (gt, ":owned_castles", 0),
  3207. (store_random_in_range, ":random_slot", 0, ":owned_castles"), # get a random owned castle
  3208. (troop_get_slot, ":entry_point_begin", "trp_temp_array", ":random_slot"),
  3209. (val_add, ":entry_point_begin", castle_factions_begin),
  3210. (val_mul, ":entry_point_begin", 10),
  3211. (else_try),
  3212. (is_between, ":faction_id", factions_begin, castle_factions_begin),
  3213. (store_mul, ":entry_point_begin", ":faction_id", 10),
  3214. (else_try),
  3215. (assign, ":entry_point_begin", 0),
  3216. (try_end),
  3217. (store_add, ":entry_point_end", ":entry_point_begin", 5), # get a random entry point in the calculated section
  3218. (store_random_in_range, ":spawn_point", ":entry_point_begin", ":entry_point_end"),
  3219. (try_end),
  3220. (assign, reg0, ":spawn_point"),
  3221. ]),
  3222.  
  3223. ("player_respawn_in_place", # server: save values for respawning a player at the same place; normally for changing troop
  3224. [(store_script_param, ":player_id", 1), # must be valid
  3225.  
  3226. (player_get_agent_id, ":agent_id", ":player_id"),
  3227. (store_agent_hit_points, ":health_percent", ":agent_id", 0),
  3228. (player_set_slot, ":player_id", slot_player_spawn_health_percent, ":health_percent"),
  3229. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  3230. (player_set_slot, ":player_id", slot_player_spawn_food_amount, ":food_amount"),
  3231. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":player_id", slot_player_spawn_food_amount, ":food_amount"),
  3232. (agent_get_position, pos1, ":agent_id"),
  3233. (try_begin), # if there are not enough spawn marker scene props, generate more
  3234. (ge, ":player_id", "$g_spawn_marker_count"),
  3235. (assign, ":start_count", "$g_spawn_marker_count"),
  3236. (server_get_max_num_players, "$g_spawn_marker_count"),
  3237. (val_add, "$g_spawn_marker_count", 1),
  3238. (try_begin),
  3239. (ge, ":player_id", "$g_spawn_marker_count"),
  3240. (store_add, "$g_spawn_marker_count", ":player_id", 1),
  3241. (try_end),
  3242. (set_spawn_position, pos1),
  3243. (try_for_range, ":unused", ":start_count", "$g_spawn_marker_count"),
  3244. (spawn_scene_prop, "spr_code_spawn_marker"),
  3245. (try_end),
  3246. (try_end),
  3247. (try_begin), # use the spawn marker prop of the number corresponding to the player id
  3248. (scene_prop_get_instance, ":instance_id", "spr_code_spawn_marker", ":player_id"),
  3249. (prop_instance_set_position, ":instance_id", pos1, 1),
  3250. (try_end),
  3251. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_at_marker),
  3252. (agent_fade_out, ":agent_id"),
  3253. (call_script, "script_player_get_spawn_point", ":player_id"),
  3254. (player_spawn_new_agent, ":player_id", reg0),
  3255. ]),
  3256.  
  3257. ("cf_player_check_spawn_agent", # server: check if the a new agent should be spawned for a player
  3258. [(store_script_param, ":player_id", 1), # must be valid
  3259.  
  3260. (assign, ":spawn", 0),
  3261. (player_get_slot, ":spawn_state", ":player_id", slot_player_spawn_state),
  3262. (try_begin),
  3263. (eq, ":spawn_state", player_spawn_state_dead),
  3264. (player_get_team_no, ":team_no", ":player_id"),
  3265. (try_begin),
  3266. (this_or_next|eq, ":team_no", team_spectators),
  3267. (player_slot_eq, ":player_id", slot_player_requested_spawn_point, -1), # has not selected to join the game yet after client connection
  3268. (else_try),
  3269. (player_get_agent_id, ":agent_id", ":player_id"),
  3270. (neg|agent_is_active, ":agent_id"),
  3271. (assign, ":spawn", 1),
  3272. (else_try),
  3273. (agent_is_alive, ":agent_id"),
  3274. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_alive),
  3275. (else_try),
  3276. (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
  3277. (gt, ":elapsed_time", "$g_respawn_period"),
  3278. (assign, ":spawn", 1),
  3279. (try_end),
  3280. (try_begin),
  3281. (eq, ":spawn", 1),
  3282. (player_get_troop_id, ":troop_id", ":player_id"),
  3283. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3284. (try_begin),
  3285. (call_script, "script_cf_player_can_use_troop", ":player_id", ":troop_id"),
  3286. (else_try),
  3287. (player_get_slot, ":troop_id", ":player_id", slot_player_non_lord_troop_id),
  3288. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3289. (call_script, "script_cf_player_can_use_troop", ":player_id", ":troop_id"),
  3290. (player_set_troop_id, ":player_id", ":troop_id"),
  3291. (else_try),
  3292. (assign, ":troop_id", playable_troops_begin),
  3293. (player_set_troop_id, ":player_id", ":troop_id"),
  3294. (try_end),
  3295. (call_script, "script_player_add_default_troop_items", ":player_id", ":troop_id"),
  3296. (call_script, "script_player_add_default_troop_armor", ":player_id", ":troop_id"),
  3297. (call_script, "script_player_add_spawn_items", ":player_id", 0),
  3298. (call_script, "script_player_get_spawn_point", ":player_id"),
  3299. (player_set_slot, ":player_id", slot_player_spawn_entry_point, reg0),
  3300. (player_spawn_new_agent, ":player_id", reg0),
  3301. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_invulnerable),
  3302. (store_mission_timer_a, ":spawn_time"),
  3303. (player_set_slot, ":player_id", slot_player_spawn_invulnerable_time, ":spawn_time"),
  3304. (try_end),
  3305. (else_try), # if the player is currently alive under spawn protection, check if the time is up
  3306. (eq, ":spawn_state", player_spawn_state_invulnerable),
  3307. (player_get_agent_id, ":agent_id", ":player_id"),
  3308. (agent_is_active, ":agent_id"),
  3309. (agent_is_alive, ":agent_id"),
  3310. (player_get_slot, ":spawn_invulnerable_time", ":player_id", slot_player_spawn_invulnerable_time),
  3311. (store_mission_timer_a, ":current_time"),
  3312. (val_sub, ":current_time", ":spawn_invulnerable_time"),
  3313. (try_begin),
  3314. (ge, ":current_time", spawn_invulnerable_time),
  3315. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_alive),
  3316. (player_set_slot, ":player_id", slot_player_spawn_invulnerable_time, 0),
  3317. (agent_set_team, ":agent_id", team_default),
  3318. (call_script, "script_player_equip_stored_default_items", ":player_id"),
  3319. (try_end),
  3320. (try_end),
  3321. (eq, ":spawn", 1),
  3322. ]),
  3323.  
  3324. ("on_agent_spawned", # server and clients: set agent slots and attributes after spawning
  3325. [(store_script_param, ":agent_id", 1), # must be valid
  3326.  
  3327. (agent_set_slot, ":agent_id", slot_agent_horse_last_rider, -1),
  3328. (agent_set_slot, ":agent_id", slot_agent_freeze_instance_id, -1),
  3329. (agent_set_slot, ":agent_id", slot_agent_poisoner_agent_id, -1),
  3330. (agent_set_slot, ":agent_id", slot_agent_poisoner_player_uid, -1),
  3331. (agent_set_slot, ":agent_id", slot_agent_fishing_last_school, -1),
  3332. (agent_set_slot, ":agent_id", slot_agent_last_horse_ridden, -1),
  3333. (agent_set_slot, ":agent_id", slot_agent_hunting_last_carcass, -1),
  3334. (agent_set_slot, ":agent_id", slot_agent_animal_herd_manager, -1),
  3335. (agent_set_slot, ":agent_id", slot_agent_animal_carcass_instance_id, -1),
  3336. (try_begin),
  3337. (eq, "$g_full_respawn_health", 0),
  3338. (agent_is_human, ":agent_id"),
  3339. (agent_set_max_hit_points, ":agent_id", max_hit_points_percent),
  3340. (try_end),
  3341. (agent_get_player_id, ":player_id", ":agent_id"),
  3342. (try_begin),
  3343. (player_is_active, ":player_id"),
  3344. (player_get_slot, ":food_amount", ":player_id", slot_player_spawn_food_amount),
  3345. (try_begin),
  3346. (gt, ":food_amount", 0),
  3347. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  3348. (player_set_slot, ":player_id", slot_player_spawn_food_amount, 0),
  3349. (try_end),
  3350. (try_begin),
  3351. (player_is_admin, ":player_id"),
  3352. (player_get_troop_id, ":troop_id", ":player_id"),
  3353. (eq, ":troop_id", "trp_godlike_hero"),
  3354. (agent_set_use_speed_modifier, ":agent_id", 1000),
  3355. (try_end),
  3356. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  3357. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3358. (ge, ":item_id", all_items_begin),
  3359. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 1, 1),
  3360. (try_end),
  3361. (multiplayer_is_server),
  3362. (player_get_slot, ":spawn_state", ":player_id", slot_player_spawn_state),
  3363. (try_begin),
  3364. (eq, ":spawn_state", player_spawn_state_invulnerable),
  3365. (agent_set_team, ":agent_id", team_spawn_invulnerable),
  3366. (try_begin),
  3367. (eq, "$g_full_respawn_health", 0),
  3368. (player_get_slot, ":spawn_health_percent", ":player_id", slot_player_next_spawn_health_percent),
  3369. (agent_set_hit_points, ":agent_id", ":spawn_health_percent", 0),
  3370. (try_end),
  3371. (else_try),
  3372. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_alive),
  3373. (eq, ":spawn_state", player_spawn_state_at_marker),
  3374. (scene_prop_get_instance, ":instance_id", "spr_code_spawn_marker", ":player_id"),
  3375. (prop_instance_get_position, pos1, ":instance_id"),
  3376. (agent_set_position, ":agent_id", pos1),
  3377. (player_get_slot, ":spawn_health_percent", ":player_id", slot_player_spawn_health_percent),
  3378. (try_begin),
  3379. (gt, ":spawn_health_percent", 0),
  3380. (agent_set_hit_points, ":agent_id", ":spawn_health_percent", 0),
  3381. (player_set_slot, ":player_id", slot_player_spawn_health_percent, 0),
  3382. (try_end),
  3383. (call_script, "script_player_set_stored_ammo_counts", ":player_id"),
  3384. (try_end),
  3385. (try_begin),
  3386. (neq, ":spawn_state", player_spawn_state_invulnerable),
  3387. (agent_set_team, ":agent_id", team_default),
  3388. (try_end),
  3389. (try_begin),
  3390. (eq, "$g_mute_global_chat", 1),
  3391. (player_set_is_muted, ":player_id", "$g_mute_global_chat"),
  3392. (try_end),
  3393. (try_end),
  3394.  
  3395. #ramaraunt add initial food
  3396. (agent_set_slot, ":agent_id", slot_agent_food_amount, 50),
  3397. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, 50),
  3398. ]),
  3399.  
  3400. ("setup_agent_for_respawn", # server: when an agent dies, clean up slots and attached props; set up lootable items
  3401. [(store_script_param, ":agent_id", 1),
  3402.  
  3403. (try_begin),
  3404. (agent_is_active, ":agent_id"),
  3405. (agent_get_attached_scene_prop, ":instance_id", ":agent_id"),
  3406. (try_begin),
  3407. (prop_instance_is_valid, ":instance_id"),
  3408. (agent_set_attached_scene_prop, ":agent_id", -1),
  3409. (call_script, "script_cart_set_detached_position", ":instance_id"),
  3410. (try_end),
  3411. (agent_set_slot, ":agent_id", slot_agent_died_normally, 1),
  3412. (agent_set_slot, ":agent_id", slot_agent_cannot_attack, 0), # so the attack restrictons checking loop will skip this agent
  3413. (agent_get_player_id, ":player_id", ":agent_id"),
  3414. (player_is_active, ":player_id"),
  3415. (agent_get_position, pos1, ":agent_id"),
  3416. (set_spawn_position, pos1),
  3417. (store_random_in_range, ":imod", imod_plain, imod_cracked + 1),
  3418. (spawn_item, "itm_agent_corpse", ":imod", "$g_spawn_item_prune_time"),
  3419. (assign, ":corpse_instance_id", reg0),
  3420. (prop_instance_set_position, ":corpse_instance_id", pos1),
  3421. (store_mission_timer_a, ":prune_time"),
  3422. (val_add, ":prune_time", "$g_spawn_item_prune_time"),
  3423. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_prune_time, ":prune_time"),
  3424. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_count, corpse_inventory_slots),
  3425. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_max_length, corpse_inventory_max_length),
  3426. (val_add, "$g_last_inventory_unique_id", 1),
  3427. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_unique_id, "$g_last_inventory_unique_id"),
  3428. (assign, ":inventory_slot", slot_scene_prop_inventory_begin),
  3429. (try_for_range, ":player_equip_slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  3430. (player_get_slot, ":item_id", ":player_id", ":player_equip_slot"),
  3431. (ge, ":item_id", all_items_begin),
  3432. (scene_prop_set_slot, ":corpse_instance_id", ":inventory_slot", ":item_id"),
  3433. (val_add, ":inventory_slot", 1),
  3434. (try_end),
  3435. (try_begin), # if the only items dropped were rubbish default items, remove the corpse now for performance reasons
  3436. (eq, ":inventory_slot", slot_scene_prop_inventory_begin),
  3437. (scene_prop_set_prune_time, ":corpse_instance_id", 1),
  3438. (try_end),
  3439. (try_for_range, ":player_equip_slot", slot_player_equip_item_0, slot_player_equip_end),
  3440. (player_set_slot, ":player_id", ":player_equip_slot", 0),
  3441. (try_end),
  3442. (agent_get_position, pos1, ":agent_id"),
  3443. (agent_get_wielded_item, ":weapon_item_id", ":agent_id", 0),
  3444. (agent_get_wielded_item, ":shield_item_id", ":agent_id", 1),
  3445. (set_fixed_point_multiplier, 100),
  3446. (position_get_z, ":height", pos1), # the engine only drops the wielded items, only if above water level: drop all equipped items
  3447. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  3448. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  3449. (ge, ":item_id", all_items_begin),
  3450. (try_begin),
  3451. (this_or_next|eq, ":item_id", ":weapon_item_id"),
  3452. (eq, ":item_id", ":shield_item_id"),
  3453. (gt, ":height", -50),
  3454. (neq, ":item_id", "itm_money_bag"),
  3455. (else_try),
  3456. (store_add, ":unequip_slot", ":equip_slot", 1),
  3457. (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
  3458. (call_script, "script_set_random_spawn_position", 50),
  3459. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  3460. (call_script, "script_check_on_item_dropped", ":agent_id", ":item_id", reg0, 1),
  3461. (try_end),
  3462. (try_end),
  3463. (agent_get_slot, ":freeze_instance_id", ":agent_id", slot_agent_freeze_instance_id),
  3464. (try_begin),
  3465. (gt, ":freeze_instance_id", -1),
  3466. (call_script, "script_remove_scene_prop", ":freeze_instance_id"),
  3467. (agent_set_slot, ":agent_id", slot_agent_freeze_instance_id, -1),
  3468. (try_end),
  3469. (try_begin),
  3470. (neq, "$g_game_type", "mt_permanent_death"),
  3471. (agent_get_troop_id, ":troop_id", ":agent_id"),
  3472. (troop_get_slot, ":spawn_health_percent", ":troop_id", slot_troop_spawn_health_percent),
  3473. (player_set_slot, ":player_id", slot_player_next_spawn_health_percent, ":spawn_health_percent"),
  3474. (player_get_slot, ":inactive_index", ":player_id", slot_player_inactive_index),
  3475. (try_begin), # save values to the inactive players array
  3476. (gt, ":inactive_index", 0),
  3477. (player_get_unique_id, ":unique_id", ":player_id"),
  3478. (troop_slot_eq, "trp_inactive_players_array", ":inactive_index", ":unique_id"),
  3479. (call_script, "script_cf_player_store_inactive", ":player_id", ":inactive_index"),
  3480. (try_end),
  3481. (else_try),
  3482. (player_set_slot, ":player_id", slot_player_next_spawn_health_percent, 100),
  3483. (player_set_troop_id, ":player_id", playable_troops_begin),
  3484. (player_set_slot, ":player_id", slot_player_faction_id, factions_begin),
  3485. (try_end),
  3486. (player_set_slot, ":player_id", slot_player_spawn_state, player_spawn_state_dead),
  3487. (try_end),
  3488. ]),
  3489.  
  3490. ("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
  3491. [(store_script_param, ":player_id", 1), # must be valid
  3492.  
  3493. (player_set_team_no, ":player_id", team_default),
  3494. (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
  3495. (player_set_slot, ":player_id", slot_player_next_chat_event_type, client_event_chat_message_begin),
  3496. (try_for_range, ":castle_owner_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  3497. (troop_get_slot, ":castle_owner", "trp_mission_data", ":castle_owner_slot"),
  3498. (faction_slot_eq, ":castle_owner", slot_faction_is_active, 1),
  3499. (multiplayer_send_3_int_to_player, ":player_id", server_event_troop_set_slot, "trp_mission_data", ":castle_owner_slot", ":castle_owner"),
  3500. (try_end),
  3501. (try_for_range, ":faction_id", factions_begin, factions_end),
  3502. (faction_slot_eq, ":faction_id", slot_faction_is_active, 1),
  3503. (ge, ":faction_id", castle_factions_begin),
  3504. (faction_get_slot, ":banner_mesh", ":faction_id", slot_faction_banner_mesh),
  3505. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", slot_faction_banner_mesh, ":banner_mesh"),
  3506. (try_begin),
  3507. (faction_slot_eq, ":faction_id", slot_faction_name_is_custom, 1),
  3508. (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"),
  3509. (str_store_faction_name, s0, ":faction_id"),
  3510. (multiplayer_send_string_to_player, ":player_id", server_event_faction_set_name, s0),
  3511. (try_end),
  3512. (try_for_range, ":other_faction_id", castle_factions_begin, factions_end),
  3513. (faction_slot_eq, ":faction_id", slot_faction_is_active, 1),
  3514. (store_add, ":relation_slot", slot_faction_relations_begin, ":other_faction_id"),
  3515. (faction_get_slot, ":relation", ":faction_id", ":relation_slot"),
  3516. (neq, ":relation", 0),
  3517. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", ":relation_slot", ":relation"),
  3518. (try_end),
  3519. (try_begin),
  3520. (faction_slot_eq, ":faction_id", slot_faction_is_locked, 1),
  3521. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", slot_faction_is_locked, 1),
  3522. (try_end),
  3523. (try_end),
  3524. (scene_prop_get_num_instances, ":pole_num", "spr_pw_castle_capture_point"),
  3525. (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
  3526. (scene_prop_get_instance, ":pole_instance_id", "spr_pw_castle_capture_point", ":pole_no"),
  3527. (scene_prop_get_slot, ":capture_faction_id", ":pole_instance_id", slot_scene_prop_capture_faction_id),
  3528. (gt, ":capture_faction_id", 0),
  3529. (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"),
  3530. (try_end),
  3531. (get_max_players, ":max_players"),
  3532. (player_get_unique_id, ":player_unique_id", ":player_id"),
  3533. (troop_get_slot, ":inactive_array_size", "trp_inactive_players_array", slot_player_array_size),
  3534. (try_begin), # try find player data in the inactive array, from a previous play session
  3535. (gt, ":inactive_array_size", 0),
  3536. (store_sub, ":inactive_last_entry_number", ":inactive_array_size", 1),
  3537. (store_mul, ":inactive_index", ":inactive_last_entry_number", player_array_entry_size),
  3538. (val_add, ":inactive_index", slot_player_array_begin),
  3539. (assign, ":loop_end", ":inactive_array_size"),
  3540. (try_for_range, ":unused", 0, ":loop_end"),
  3541. (troop_get_slot, ":inactive_unique_id", "trp_inactive_players_array", ":inactive_index"),
  3542. (neq, ":inactive_unique_id", ":player_unique_id"),
  3543. (val_sub, ":inactive_index", player_array_entry_size),
  3544. (else_try),
  3545. (troop_set_slot, "trp_inactive_players_array", ":inactive_index", 0),
  3546. (assign, ":loop_end", -1),
  3547. (try_end),
  3548. (eq, ":loop_end", -1),
  3549. (store_add, ":temp_index", ":inactive_index", player_array_troop_id),
  3550. (troop_get_slot, ":troop_id", "trp_inactive_players_array", ":temp_index"),
  3551. (store_add, ":temp_index", ":inactive_index", player_array_faction_id),
  3552. (troop_get_slot, ":faction_id", "trp_inactive_players_array", ":temp_index"),
  3553. (store_add, ":temp_index", ":inactive_index", player_array_gold_value),
  3554. (troop_get_slot, ":gold_value", "trp_inactive_players_array", ":temp_index"),
  3555. (store_add, ":temp_index", ":inactive_index", player_array_outlaw_rating),
  3556. (troop_get_slot, ":outlaw_rating", "trp_inactive_players_array", ":temp_index"),
  3557. (try_begin),
  3558. (gt, ":outlaw_rating", 0),
  3559. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":player_id", slot_player_outlaw_rating, ":outlaw_rating"),
  3560. (try_end),
  3561. (try_begin),
  3562. (neq, ":faction_id", 0),
  3563. (try_for_range, ":other_player_id", 1, ":max_players"),
  3564. (player_is_active, ":other_player_id"),
  3565. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  3566. (try_end),
  3567. (try_begin),
  3568. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":player_unique_id"),
  3569. (call_script, "script_player_set_lord", ":player_id", ":faction_id"),
  3570. (try_end),
  3571. (try_end),
  3572. (else_try), # otherwise, set default attributes
  3573. (assign, ":troop_id", playable_troops_begin),
  3574. (assign, ":faction_id", factions_begin),
  3575. (try_begin),
  3576. (neq, "$g_game_type", "mt_no_money"),
  3577. (neq, "$g_game_type", "mt_permanent_death"),
  3578. (store_random_in_range, ":gold_value", 30, 100),
  3579. (val_mul, ":gold_value", "$g_starting_gold_multiplier"),
  3580. (val_div, ":gold_value", 100),
  3581. (else_try),
  3582. (assign, ":gold_value", 0),
  3583. (try_end),
  3584. (assign, ":outlaw_rating", 0),
  3585. (try_end),
  3586. (player_set_troop_id, ":player_id", ":troop_id"),
  3587. (player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  3588. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 0),
  3589. (player_set_slot, ":player_id", slot_player_outlaw_rating, ":outlaw_rating"),
  3590. (troop_get_slot, ":spawn_health_percent", ":troop_id", slot_troop_spawn_health_percent),
  3591. (player_set_slot, ":player_id", slot_player_next_spawn_health_percent, ":spawn_health_percent"),
  3592. (try_begin),
  3593. (neq, ":faction_id", "fac_commoners"),
  3594. (str_store_player_username, s0, ":player_id"),
  3595. (str_store_faction_name, s1, ":faction_id"),
  3596. (server_add_message_to_log, "str_s0_joined_the_s1"),
  3597. (try_end),
  3598. (try_for_range, ":other_player_id", 1, ":max_players"),
  3599. (neq, ":other_player_id", ":player_id"),
  3600. (player_is_active, ":other_player_id"),
  3601. (player_get_slot, ":other_faction_id", ":other_player_id", slot_player_faction_id),
  3602. (try_begin),
  3603. (neq, ":other_faction_id", 0),
  3604. (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),
  3605. (try_end),
  3606. (player_get_score, ":score", ":other_player_id"),
  3607. (player_get_kill_count, ":kills", ":other_player_id"),
  3608. (player_get_death_count, ":deaths", ":other_player_id"),
  3609. (multiplayer_send_4_int_to_player, ":player_id", server_event_set_player_score_kill_death, ":other_player_id", ":score", ":kills", ":deaths"),
  3610. (try_begin),
  3611. (player_slot_eq, ":other_player_id", slot_player_is_lord, 1),
  3612. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_is_lord, 1),
  3613. (try_end),
  3614. (try_end),
  3615. (try_for_agents, ":other_agent_id"),
  3616. (agent_get_attached_scene_prop, ":attached_instance_id", ":other_agent_id"),
  3617. (ge, ":attached_instance_id", 0),
  3618. (multiplayer_send_2_int_to_player, ":player_id", server_event_set_attached_scene_prop, ":other_agent_id", ":attached_instance_id"),
  3619. (try_end),
  3620. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_respawn_period, "$g_respawn_period"),
  3621. #(multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_num_bots_voteable, "$g_num_bots_voteable"),
  3622. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_maps_voteable, "$g_scenes_voteable"),
  3623. #(multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_factions_voteable, "$g_factions_voteable"),
  3624. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_kick_voteable, "$g_kick_voteable"),
  3625. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_ban_voteable, "$g_ban_voteable"),
  3626. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_force_default_armor, "$g_force_weather"),
  3627. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_disallow_ranged_weapons, "$g_full_respawn_health"),
  3628. (store_mission_timer_a, ":mission_timer"),
  3629. (multiplayer_send_2_int_to_player, ":player_id", server_event_return_game_rules, command_set_server_mission_timer, ":mission_timer"),
  3630. ]),
  3631.  
  3632. ("after_client_is_setup", # clients: called after the server has finished sending the initial module data updates
  3633. [
  3634. (assign, "$g_preset_message_display_enabled", 1),
  3635. (call_script, "script_redraw_castle_banners", redraw_client_banner_positions, -1),
  3636. ]),
  3637.  
  3638. ("cf_save_player_exit", # server: when a player disconnects, save attributes to the inactive players list
  3639. [(store_script_param, ":player_id", 1), # must be valid
  3640.  
  3641. (player_get_troop_id, ":troop_id", ":player_id"),
  3642. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3643. (player_get_unique_id, ":player_unique_id", ":player_id"),
  3644. (troop_get_slot, ":inactive_array_size", "trp_inactive_players_array", slot_player_array_size),
  3645. (assign, ":loop_end", ":inactive_array_size"),
  3646. (assign, ":inactive_index", slot_player_array_begin),
  3647. (try_for_range, ":unused", 0, ":loop_end"),
  3648. (this_or_next|troop_slot_eq, "trp_inactive_players_array", ":inactive_index", 0),
  3649. (troop_slot_eq, "trp_inactive_players_array", ":inactive_index", ":player_unique_id"),
  3650. (assign, ":loop_end", -1),
  3651. (else_try),
  3652. (val_add, ":inactive_index", player_array_entry_size),
  3653. (try_end),
  3654. (try_begin),
  3655. (call_script, "script_cf_player_store_inactive", ":player_id", ":inactive_index"),
  3656. (troop_set_slot, "trp_inactive_players_array", ":inactive_index", ":player_unique_id"),
  3657. (player_set_slot, ":player_id", slot_player_inactive_index, ":inactive_index"),
  3658. (neq, ":loop_end", -1),
  3659. (val_add, ":inactive_array_size", 1),
  3660. (troop_set_slot, "trp_inactive_players_array", slot_player_array_size, ":inactive_array_size"),
  3661. (try_end),
  3662. (assign, ":loop_end", factions_end),
  3663. (try_for_range, ":faction_id", castle_factions_begin, ":loop_end"),
  3664. (faction_get_slot, ":lord_player_uid", ":faction_id", slot_faction_lord_player_uid),
  3665. (eq, ":lord_player_uid", ":player_unique_id"),
  3666. (assign, ":loop_end", -1),
  3667. (store_mission_timer_a, ":current_time"),
  3668. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, ":current_time"),
  3669. (try_end),
  3670. ]),
  3671.  
  3672. ("cf_player_store_inactive", # server: store player attributes starting at a specified index in a list
  3673. [(store_script_param, ":player_id", 1), # must be valid
  3674. (store_script_param, ":inactive_index", 2),
  3675.  
  3676. (player_get_troop_id, ":troop_id", ":player_id"),
  3677. (is_between, ":troop_id", playable_troops_begin, playable_troops_end),
  3678. (try_begin),
  3679. (neq, "$g_game_type", "mt_permanent_death"),
  3680. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  3681. (player_get_gold, ":gold_value", ":player_id"),
  3682. (else_try),
  3683. (assign, ":troop_id", playable_troops_begin),
  3684. (assign, ":faction_id", factions_begin),
  3685. (assign, ":gold_value", 0),
  3686. (try_end),
  3687. (store_add, ":temp_index", ":inactive_index", player_array_troop_id),
  3688. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":troop_id"),
  3689. (store_add, ":temp_index", ":inactive_index", player_array_faction_id),
  3690. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":faction_id"),
  3691. (store_add, ":temp_index", ":inactive_index", player_array_gold_value),
  3692. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":gold_value"),
  3693. (player_get_slot, ":outlaw_rating", ":player_id", slot_player_outlaw_rating),
  3694. (store_add, ":temp_index", ":inactive_index", player_array_outlaw_rating),
  3695. (troop_set_slot, "trp_inactive_players_array", ":temp_index", ":outlaw_rating"),
  3696. ]),
  3697.  
  3698. ("apply_consequences_for_agent_death", # server and clients: when an agent dies, adjust scores, display messages, drop a loot money bag, check outlaw rating
  3699. [(store_script_param, ":dead_agent_id", 1),
  3700. (store_script_param, ":killer_agent_id", 2),
  3701.  
  3702. (try_begin),
  3703. (gt, ":dead_agent_id", -1),
  3704. (agent_get_player_id, ":dead_player_id", ":dead_agent_id"),
  3705. (player_is_active, ":dead_player_id"),
  3706. (try_begin),
  3707. (gt, ":killer_agent_id", -1),
  3708. (neq, ":killer_agent_id", ":dead_agent_id"),
  3709. (agent_get_player_id, ":killer_player_id", ":killer_agent_id"),
  3710. (player_is_active, ":killer_player_id"),
  3711. (player_get_slot, ":dead_faction_id", ":dead_player_id", slot_player_faction_id),
  3712. (player_get_slot, ":killer_faction_id", ":killer_player_id", slot_player_faction_id),
  3713. (try_begin),
  3714. (lt, ":dead_faction_id", castle_factions_begin),
  3715. (lt, ":killer_faction_id", castle_factions_begin),
  3716. (assign, ":dead_player_add_score", -1),
  3717. (assign, ":killer_player_add_score", 1),
  3718. (else_try),
  3719. (call_script, "script_cf_factions_are_hostile", ":dead_faction_id", ":killer_faction_id"),
  3720. (assign, ":dead_player_add_score", -1),
  3721. (assign, ":killer_player_add_score", 1),
  3722. (else_try),
  3723. (assign, ":dead_player_add_score", 0),
  3724. (assign, ":killer_player_add_score", -1),
  3725. (try_begin),
  3726. (str_store_player_username, s0, ":killer_player_id"),
  3727. (try_begin),
  3728. (eq, ":dead_faction_id", ":killer_faction_id"),
  3729. (assign, ":string_id", "str_s0_killed_faction_member"),
  3730. (else_try),
  3731. (assign, ":string_id", "str_s0_killed_friendly_faction_member"),
  3732. (try_end),
  3733. (try_begin),
  3734. (neg|multiplayer_is_server),
  3735. (display_message, ":string_id", 0xFFAA0000),
  3736. (else_try),
  3737. (server_add_message_to_log, ":string_id"),
  3738. (try_end),
  3739. (try_end),
  3740. (try_end),
  3741. (else_try),
  3742. (assign, ":dead_player_add_score", -1),
  3743. (assign, ":killer_player_add_score", 0),
  3744. (try_end),
  3745. (else_try),
  3746. (assign, ":dead_player_add_score", 0),
  3747. (assign, ":killer_player_add_score", 0),
  3748. (try_end),
  3749. (try_begin),
  3750. (le, ":dead_player_add_score", -1),
  3751. (player_get_score, ":dead_player_score", ":dead_player_id"),
  3752. (val_add, ":dead_player_score", ":dead_player_add_score"),
  3753. (player_set_score, ":dead_player_id", ":dead_player_score"),
  3754. (player_get_death_count, ":dead_player_deaths", ":dead_player_id"),
  3755. (val_add, ":dead_player_deaths", 1),
  3756. (player_set_death_count, ":dead_player_id", ":dead_player_deaths"),
  3757. (try_begin),
  3758. (multiplayer_is_server),
  3759. (neq, "$g_game_type", "mt_no_money"),
  3760. (call_script, "script_player_drop_loot", ":dead_player_id"),
  3761. (try_end),
  3762. (try_end),
  3763. (try_begin),
  3764. (neq, ":killer_player_add_score", 0),
  3765. (player_get_score, ":killer_player_score", ":killer_player_id"),
  3766. (val_add, ":killer_player_score", ":killer_player_add_score"),
  3767. (player_set_score, ":killer_player_id", ":killer_player_score"),
  3768. (ge, ":killer_player_add_score", 1),
  3769. (player_get_kill_count, ":killer_player_kills", ":killer_player_id"),
  3770. (val_add, ":killer_player_kills", 1),
  3771. (player_set_kill_count, ":killer_player_id", ":killer_player_kills"),
  3772. (try_end),
  3773. (try_begin),
  3774. (multiplayer_is_server),
  3775. (try_begin),
  3776. (le, ":killer_player_add_score", -1),
  3777. (call_script, "script_player_change_check_outlaw_rating", ":killer_player_id", outlaw_rating_for_team_kill, 0),
  3778. (else_try),
  3779. (player_is_active, ":killer_player_id"),
  3780. (player_slot_eq, ":killer_player_id", slot_player_faction_id, "fac_outlaws"),
  3781. (call_script, "script_player_change_check_outlaw_rating", ":killer_player_id", outlaw_rating_for_kill, 0),
  3782. (try_end),
  3783. (else_try),
  3784. (agent_is_active, ":killer_agent_id"),
  3785. (agent_is_active, ":dead_agent_id"),
  3786. (agent_is_human, ":dead_agent_id"),
  3787. (mission_cam_get_position, pos1),
  3788. (agent_get_position, pos2, ":dead_agent_id"),
  3789. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  3790. (try_begin),
  3791. (lt, ":sq_distance", sq(max_distance_local_chat)),
  3792. (val_add, "$g_recent_nearby_deaths_factor", 50),
  3793. (ge, "$g_recent_nearby_deaths_factor", 100),
  3794. (music_set_situation, mtf_sit_fight),
  3795. (try_end),
  3796. (multiplayer_get_my_player, ":my_player_id"),
  3797. (try_begin),
  3798. (player_is_active, ":my_player_id"),
  3799. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  3800. (eq, ":dead_agent_id", ":my_agent_id"),
  3801. (music_set_situation, mtf_sit_killed),
  3802. (try_end),
  3803. (try_end),
  3804. ]),
  3805.  
  3806. ("player_change_check_outlaw_rating", # server: update a player's outlaw rating and change faction if necessary
  3807. [(store_script_param, ":player_id", 1), # must be valid
  3808. (store_script_param, ":add_rating", 2),
  3809. (store_script_param, ":force_outlawed", 3), # change to outlaws even if the rating is not past the threshold
  3810.  
  3811. (player_get_slot, ":outlaw_rating", ":player_id", slot_player_outlaw_rating),
  3812. (store_add, ":new_outlaw_rating", ":outlaw_rating", ":add_rating"),
  3813. (val_min, ":new_outlaw_rating", outlaw_rating_maximum),
  3814. (try_begin),
  3815. (neq, ":new_outlaw_rating", ":outlaw_rating"),
  3816. (player_set_slot, ":player_id", slot_player_outlaw_rating, ":new_outlaw_rating"),
  3817. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":player_id", slot_player_outlaw_rating, ":new_outlaw_rating"),
  3818. (try_end),
  3819. (try_begin),
  3820. (neg|player_slot_eq, ":player_id", slot_player_faction_id, "fac_outlaws"),
  3821. (this_or_next|eq, ":force_outlawed", 1),
  3822. (ge, ":new_outlaw_rating", outlaw_rating_outlawed),
  3823. (call_script, "script_player_set_worse_respawn_troop", ":player_id", "trp_ruffian"),
  3824. (call_script, "script_change_faction", ":player_id", "fac_outlaws", change_faction_type_outlawed),
  3825. (try_end),
  3826. ]),
  3827.  
  3828. ("player_drop_loot", # server: drop a loot money bag based on amount carried and server settings
  3829. [(store_script_param, ":player_id", 1), # must be valid
  3830.  
  3831. (try_begin),
  3832. (neq, "$g_game_type", "mt_no_money"),
  3833. (player_get_gold, ":gold", ":player_id"),
  3834. (gt, ":gold", 0),
  3835. (try_begin),
  3836. (neq, "$g_game_type", "mt_permanent_death"),
  3837. (store_random_in_range, ":loot_multiplier", 10, 21),
  3838. (store_mul, ":gold_loot", ":loot_multiplier", "$g_combat_gold_multiplier"),
  3839. (val_min, ":gold_loot", 10000),
  3840. (val_mul, ":gold_loot", ":gold"),
  3841. (val_div, ":gold_loot", 10000),
  3842. (val_sub, ":gold", ":gold_loot"),
  3843. (else_try),
  3844. (assign, ":gold_loot", ":gold"),
  3845. (assign, ":gold", 0),
  3846. (try_end),
  3847. (gt, ":gold_loot", 0),
  3848. (call_script, "script_player_adjust_gold", ":player_id", ":gold", 0),
  3849. (player_get_agent_id, ":agent_id", ":player_id"),
  3850. (agent_get_position, pos1, ":agent_id"),
  3851. (call_script, "script_set_random_spawn_position", 50),
  3852. (spawn_item, "itm_money_bag", 0, "$g_spawn_item_prune_time"),
  3853. (scene_prop_set_slot, reg0, slot_scene_prop_gold_value, ":gold_loot"),
  3854. (try_end),
  3855. ]),
  3856.  
  3857. ("check_name_server", # server: send a test message to the name server to check whether it should be enabled
  3858. [
  3859. (try_begin),
  3860. (eq, "$g_name_server_enabled", 0),
  3861. (str_store_string, s1, "str_name_server"),
  3862. (neg|str_is_empty, s1),
  3863. (str_store_string, s2, "str_name_server_password"),
  3864. (neg|str_is_empty, s2),
  3865. (assign, reg1, 0),
  3866. (assign, reg2, 0),
  3867. (str_clear, s3),
  3868. (send_message_to_url, "str_http_s1_password_s2_id_reg1_uid_reg2_name_s3"),
  3869. (try_end),
  3870. ]),
  3871.  
  3872. ("player_check_name", # server: check the player name and unique id with the name server, if enabled
  3873. [(store_script_param, ":player_id", 1), # must be valid
  3874.  
  3875. (try_begin),
  3876. (eq, "$g_name_server_enabled", 1), # this is set upon reply to a test message sent at server start
  3877. (str_store_string, s1, "str_name_server"),
  3878. (str_store_string, s2, "str_name_server_password"),
  3879. (assign, reg1, ":player_id"),
  3880. (player_get_unique_id, reg2, ":player_id"),
  3881. (str_store_player_username, s3, ":player_id"),
  3882. (str_encode_url, s3),
  3883. (str_store_string, s0, "str_http_s1_password_s2_id_reg1_uid_reg2_name_s3"),
  3884. (try_begin),
  3885. (player_is_admin, ":player_id"),
  3886. (str_store_string, s0, "str_http_s0_admin"),
  3887. (try_end),
  3888. (send_message_to_url, s0),
  3889. (try_end),
  3890. ]),
  3891.  
  3892. ("player_set_admin_permissions", # unpack an admin permissions bitset and apply it to player slots
  3893. [(store_script_param, ":player_id", 1), # must be valid
  3894. (store_script_param, ":permissions", 2),
  3895.  
  3896. (try_for_range, ":slot", slot_player_admin_no_panel, slot_player_admin_end),
  3897. (assign, ":value", ":permissions"),
  3898. (val_and, ":value", 0x1),
  3899. (val_rshift, ":permissions", 1),
  3900. (eq, ":value", 0),
  3901. (player_set_slot, ":player_id", ":slot", 1),
  3902. (try_end),
  3903. ]),
  3904.  
  3905. ])
  3906.  
  3907. def generate_load_profile_options(): # generate operations to load settings stored in the current profile's banner id
  3908. script_body = [(assign, ":option_bits", "$g_current_profile_banner_id"),
  3909. (val_rshift, ":option_bits", profile_banner_id_option_bits_begin)]
  3910. for option in profile_options:
  3911. script_body.extend([(assign, option, ":option_bits"),
  3912. (val_and, option, 0x1),
  3913. (val_rshift, ":option_bits", 1)])
  3914. script_body.pop()
  3915. return [lazy.block(script_body)]
  3916.  
  3917. def generate_store_profile_options(): # generate operations to store on/off settings in the current profile's banner id
  3918. script_body = [(assign, ":option_bits", 0)]
  3919. for i, option in enumerate(profile_options):
  3920. script_body.extend([(assign, ":option_bit", option),
  3921. (val_clamp, ":option_bit", 0, 2),
  3922. (val_lshift, ":option_bit", i),
  3923. (val_or, ":option_bits", ":option_bit")])
  3924. script_body.extend([(val_lshift, ":option_bits", profile_banner_id_option_bits_begin),
  3925. (assign, ":profile_banner_id", "$g_current_profile_banner_id"),
  3926. (val_and, ":profile_banner_id", profile_banner_id_mask),
  3927. (val_or, ":option_bits", ":profile_banner_id"),
  3928. (assign, "$g_current_profile_banner_id", ":option_bits"),
  3929. (profile_set_banner_id, ":option_bits")])
  3930. return [lazy.block(script_body)]
  3931.  
  3932. scripts.extend([
  3933.  
  3934. ("load_profile_options", generate_load_profile_options()),
  3935.  
  3936. ("store_profile_options", generate_store_profile_options()),
  3937.  
  3938. ("client_check_show_respawn_time_counter",
  3939. [(store_script_param, ":agent_id", 1),
  3940.  
  3941. (try_begin),
  3942. (neg|multiplayer_is_dedicated_server),
  3943. (multiplayer_get_my_player, ":my_player_id"),
  3944. (is_between, ":my_player_id", 0, max_num_players),
  3945. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  3946. (eq, ":my_agent_id", ":agent_id"),
  3947. (store_mission_timer_a, "$g_respawn_start_time"),
  3948. (start_presentation, "prsnt_respawn_time_counter"),
  3949. (try_end),
  3950. ]),
  3951.  
  3952. ("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
  3953. [(store_script_param, ":instance_id", 1),
  3954. (store_script_param, ":sound_id", 2), # must be valid
  3955.  
  3956. (try_begin),
  3957. (gt, ":instance_id", -1),
  3958. (prop_instance_is_valid, ":instance_id"),
  3959. (prop_instance_get_position, pos60, ":instance_id"),
  3960. (val_lshift, ":sound_id", net_sound_shift), # pack instance id and sound id into one number
  3961. (le, ":instance_id", net_sound_mask),
  3962. (val_or, ":instance_id", ":sound_id"),
  3963. (is_between, ":instance_id", 0, net_value_upper_bound),
  3964. (try_for_agents, ":agent_id"),
  3965. (agent_is_active, ":agent_id"),
  3966. (agent_get_player_id, ":player_id", ":agent_id"),
  3967. (player_is_active, ":player_id"),
  3968. (agent_get_position, pos61, ":agent_id"),
  3969. (get_sq_distance_between_positions, ":sq_distance", pos60, pos61),
  3970. (le, ":sq_distance", sq(max_distance_to_play_sound)),
  3971. (multiplayer_send_int_to_player, ":player_id", server_event_scene_prop_play_sound, ":instance_id"),
  3972. (try_end),
  3973. (try_end),
  3974. ]),
  3975.  
  3976. ("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
  3977. [(store_script_param, ":agent_id", 1), # must be valid
  3978. (store_script_param, ":instance_id", 2),
  3979. (store_script_param, ":sound_id", 3), # must be valid
  3980.  
  3981. (agent_get_wielded_item, ":item_id", ":agent_id"),
  3982. (try_begin),
  3983. (gt, ":item_id", all_items_begin),
  3984. (item_get_type, ":item_type", ":item_id"),
  3985. (is_between, ":item_type", itp_type_bow, itp_type_thrown + 1),
  3986. (call_script, "script_scene_prop_play_sound", ":instance_id", ":sound_id"),
  3987. (else_try),
  3988. (agent_play_sound, ":agent_id", ":sound_id"),
  3989. (try_end),
  3990. ]),
  3991.  
  3992. ("play_sound_at_position", # server: send messages to clients to play a sound at the position stored in pos0, if their agent is nearby
  3993. [(store_script_param, ":sound_id", 1), # must be valid
  3994.  
  3995. (set_fixed_point_multiplier, 1),
  3996. (position_get_x, ":pos_x", pos0),
  3997. (position_get_y, ":pos_y", pos0),
  3998. (position_get_z, ":pos_z", pos0),
  3999. (set_fixed_point_multiplier, 100),
  4000. (val_add, ":pos_z", net_pack_3_value_upper_bound / 2),
  4001. (val_clamp, ":pos_x", 0, net_pack_3_value_upper_bound),
  4002. (val_clamp, ":pos_y", 0, net_pack_3_value_upper_bound),
  4003. (val_clamp, ":pos_z", 0, net_pack_3_value_upper_bound),
  4004. (assign, ":packed_position", ":pos_x"), # pack position x,y,z into one number
  4005. (val_lshift, ":pos_y", net_pack_3_shift_2),
  4006. (val_or, ":packed_position", ":pos_y"),
  4007. (val_lshift, ":pos_z", net_pack_3_shift_3),
  4008. (val_or, ":packed_position", ":pos_z"),
  4009. (try_for_agents, ":agent_id"),
  4010. (agent_is_active, ":agent_id"),
  4011. (agent_get_player_id, ":player_id", ":agent_id"),
  4012. (player_is_active, ":player_id"),
  4013. (agent_get_position, pos60, ":agent_id"),
  4014. (get_sq_distance_between_positions, ":sq_distance", pos0, pos60),
  4015. (le, ":sq_distance", sq(max_distance_to_play_sound)),
  4016. (multiplayer_send_2_int_to_player, ":player_id", server_event_play_sound_at_position, ":sound_id", ":packed_position"),
  4017. (try_end),
  4018. ]),
  4019.  
  4020. ("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
  4021. [(store_script_param, ":player_id", 1), # must be valid
  4022. (store_script_param, ":gold_cost", 2),
  4023.  
  4024. (player_get_gold, ":player_gold", ":player_id"),
  4025. (try_begin), # defensive check in case a large gold value has been corrupted by the server
  4026. (neg|multiplayer_is_server),
  4027. (gt, "$g_overflow_gold_value", max_correctly_displayed_gold),
  4028. (neq, ":player_gold", "$g_overflow_gold_value"),
  4029. (player_set_gold, ":player_gold", "$g_overflow_gold_value"),
  4030. (assign, ":player_gold", "$g_overflow_gold_value"),
  4031. (try_end),
  4032. (try_begin),
  4033. (lt, ":player_gold", ":gold_cost"),
  4034. (neq, "$g_game_type", "mt_no_money"),
  4035. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_dont_have_enough_money", preset_message_error),
  4036. (try_end),
  4037. (this_or_next|ge, ":player_gold", ":gold_cost"),
  4038. (eq, "$g_game_type", "mt_no_money"),
  4039. ]),
  4040.  
  4041. ("player_adjust_gold", # server: adjust player gold, sending large values manually that would overflow in the engine code, and playing an appropriate sound
  4042. [(store_script_param, ":player_id", 1), # must be valid
  4043. (store_script_param, ":gold_value", 2), # ignored if not positive
  4044. (store_script_param, ":add_abs_sub", 3), # -1 = subtract, 0 = set, 1 = add
  4045.  
  4046. (try_begin),
  4047. (neq, "$g_game_type", "mt_no_money"),
  4048. (ge, ":gold_value", 0),
  4049. (this_or_next|eq, ":add_abs_sub", 0),
  4050. (gt, ":gold_value", 0),
  4051. (player_get_gold, ":original_player_gold", ":player_id"),
  4052. (try_begin),
  4053. (gt, ":add_abs_sub", 0),
  4054. (store_add, ":player_gold", ":original_player_gold", ":gold_value"),
  4055. (assign, ":sound", "snd_money_received"),
  4056. (else_try),
  4057. (lt, ":add_abs_sub", 0),
  4058. (store_sub, ":player_gold", ":original_player_gold", ":gold_value"),
  4059. (assign, ":sound", "snd_money_paid"),
  4060. (else_try),
  4061. (assign, ":player_gold", ":gold_value"),
  4062. (assign, ":sound", -1),
  4063. (try_end),
  4064. (val_clamp, ":player_gold", 0, max_possible_gold),
  4065. (player_set_gold, ":player_id", ":player_gold"), # set gold before manually updating clients, so corrupted network messages don't overwrite the update
  4066. (try_begin),
  4067. (gt, ":player_gold", max_correctly_displayed_gold),
  4068. (multiplayer_send_int_to_player, ":player_id", server_event_set_overflow_gold, ":player_gold"),
  4069. (else_try),
  4070. (gt, ":original_player_gold", max_correctly_displayed_gold),
  4071. (multiplayer_send_message_to_player, ":player_id", server_event_set_overflow_gold),
  4072. (try_end),
  4073. (try_begin),
  4074. (gt, ":sound", -1),
  4075. (player_get_agent_id, ":agent_id", ":player_id"),
  4076. (gt, ":agent_id", -1),
  4077. (agent_is_alive, ":agent_id"),
  4078. (agent_play_sound, ":agent_id", ":sound"),
  4079. (try_end),
  4080. (try_end),
  4081. ]),
  4082.  
  4083. ("scene_prop_get_multiplier", # calculate the price multiplier from value 1 of a scene prop, returning in reg2
  4084. [(store_script_param, ":instance_id", 1), # must be valid
  4085.  
  4086. (prop_instance_get_variation_id, ":multiplier_no", ":instance_id"),
  4087. (val_div, ":multiplier_no", 10),
  4088. (try_begin),
  4089. (eq, ":multiplier_no", 0),
  4090. (assign, reg2, 100),
  4091. (else_try),
  4092. (try_begin),
  4093. (is_between, ":multiplier_no", 1, 5),
  4094. (store_mul, reg2, ":multiplier_no", 20),
  4095. (else_try),
  4096. (is_between, ":multiplier_no", 5, 10),
  4097. (store_add, reg2, ":multiplier_no", 1),
  4098. (val_mul, reg2, 20),
  4099. (else_try),
  4100. (eq, ":multiplier_no", 10),
  4101. (assign, reg2, 350),
  4102. (else_try),
  4103. (eq, ":multiplier_no", 11),
  4104. (assign, reg2, 500),
  4105. (else_try),
  4106. (eq, ":multiplier_no", 12),
  4107. (assign, reg2, 1000),
  4108. (try_end),
  4109. (try_end),
  4110. ]),
  4111.  
  4112. ("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
  4113. [(store_script_param, ":instance_id", 1), # must be valid
  4114. (store_script_param, ":item_id", 2), # if invalid, set the base value below
  4115. (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
  4116.  
  4117. (try_begin),
  4118. (eq, "$g_game_type", "mt_no_money"),
  4119. (assign, ":value", 0),
  4120. (assign, ":multiplier", 0),
  4121. (else_try),
  4122. (eq, "$g_game_type", "mt_feudalism"),
  4123. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_resource_stockpile, 1),
  4124. (assign, ":value", 0),
  4125. (assign, ":multiplier", 0),
  4126. (else_try),
  4127. (scene_prop_get_slot, ":value", ":instance_id", slot_scene_prop_gold_value),
  4128. (eq, ":value", 0), # not already cached: calculate the value by applying the multipliers
  4129. (try_begin),
  4130. (gt, ":item_id", -1),
  4131. (store_item_value, ":base_value", ":item_id"),
  4132. (try_begin),
  4133. (gt, ":base_value_multiplier", 0),
  4134. (val_mul, ":base_value", ":base_value_multiplier"),
  4135. (val_div, ":base_value", 100),
  4136. (try_end),
  4137. (else_try),
  4138. (assign, ":base_value", ":base_value_multiplier"),
  4139. (try_end),
  4140. (gt, ":base_value", 0),
  4141. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4142. (assign, ":multiplier", reg2),
  4143. (try_begin),
  4144. (eq, ":multiplier", 100),
  4145. (assign, ":value", ":base_value"),
  4146. (else_try),
  4147. (store_mul, ":value", ":base_value", ":multiplier"),
  4148. (val_div, ":value", 100),
  4149. (val_max, ":value", 1),
  4150. (try_end),
  4151. (scene_prop_get_slot, ":scene_prop_multiplier", ":instance_id", slot_scene_prop_gold_multiplier),
  4152. (try_begin),
  4153. (gt, ":scene_prop_multiplier", 0),
  4154. (val_mul, ":multiplier", ":scene_prop_multiplier"),
  4155. (val_div, ":multiplier", 100),
  4156. (val_mul, ":value", ":scene_prop_multiplier"),
  4157. (val_div, ":value", 100),
  4158. (val_max, ":value", 1),
  4159. (try_end),
  4160. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_value, ":value"),
  4161. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_multiplier, ":multiplier"),
  4162. (else_try), # otherwise used cached values
  4163. (scene_prop_get_slot, ":multiplier", ":instance_id", slot_scene_prop_gold_multiplier),
  4164. (try_end),
  4165. (assign, reg0, ":value"),
  4166. (assign, reg1, ":multiplier"),
  4167. ]),
  4168.  
  4169. ("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
  4170. [(store_script_param, ":price_area_scene_prop_id", 1), # must be a scene prop id (kind)
  4171. (store_script_param, ":price_area_count", 2), # must be the result of calling scene_prop_get_num_instances for the above scene prop id
  4172.  
  4173. (try_begin), # if there is only only one price area of this type, use it for the entire scene
  4174. (eq, ":price_area_count", 1),
  4175. (scene_prop_get_instance, ":instance_id", ":price_area_scene_prop_id", 0),
  4176. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4177. (else_try), # if there are multiple price areas, try find the closest enclosing area, or interpolate
  4178. (gt, ":price_area_count", 1),
  4179. (assign, ":price_multiplier", 0),
  4180. (set_fixed_point_multiplier, 100),
  4181. (assign, ":closest_distance_inside", 1000000),
  4182. (assign, ":inside_area_multiplier", -1),
  4183. (assign, ":proportional_factor_sum", 0),
  4184. (try_for_range, ":instance_no", 0, ":price_area_count"),
  4185. (scene_prop_get_instance, ":instance_id", ":price_area_scene_prop_id", ":instance_no"),
  4186. (prop_instance_get_position, pos41, ":instance_id"),
  4187. (position_set_z, pos41, 0),
  4188. (get_distance_between_positions, ":current_distance", pos40, pos41),
  4189. (prop_instance_get_scale, pos42, ":instance_id"),
  4190. (position_get_scale_x, ":current_area_radius", pos42),
  4191. (val_mul, ":current_area_radius", 100),
  4192. (try_begin), # try find the closest area that the position is inside
  4193. (lt, ":current_distance", ":closest_distance_inside"),
  4194. (lt, ":current_distance", ":current_area_radius"),
  4195. (assign, ":closest_distance_inside", ":current_distance"),
  4196. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4197. (assign, ":inside_area_multiplier", reg2),
  4198. (else_try), # otherwise store the distances to the edge of each price area in the scene, for later calculation
  4199. (eq, ":inside_area_multiplier", -1), # skip if inside at least one area
  4200. (store_sub, ":distance_from_area_edge", ":current_distance", ":current_area_radius"),
  4201. (val_div, ":distance_from_area_edge", 1000),
  4202. (val_max, ":distance_from_area_edge", 1),
  4203. (store_div, ":proportional_factor", 1000, ":distance_from_area_edge"),
  4204. (troop_set_slot, "trp_temp_array", ":instance_no", ":instance_id"),
  4205. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_multiplier, ":proportional_factor"),
  4206. (val_add, ":proportional_factor_sum", ":proportional_factor"),
  4207. (try_end),
  4208. (try_end),
  4209. (try_begin), # if inside an area, use that price multiplier
  4210. (neq, ":inside_area_multiplier", -1),
  4211. (assign, ":price_multiplier", ":inside_area_multiplier"),
  4212. (else_try), # otherwise finish interpolating the price multiplier between all areas, after distance proportions can be calculated
  4213. (try_for_range, ":instance_no", 0, ":price_area_count"), # finish interpolating the price multiplier, after proportions of the total can be calculated
  4214. (troop_get_slot, ":instance_id", "trp_temp_array", ":instance_no"),
  4215. (scene_prop_get_slot, ":normalized_proportional_factor", ":instance_id", slot_scene_prop_gold_multiplier),
  4216. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_multiplier, 0), # reset the slot after using it as temporary storage
  4217. (val_mul, ":normalized_proportional_factor", 1000),
  4218. (val_div, ":normalized_proportional_factor", ":proportional_factor_sum"),
  4219. (call_script, "script_scene_prop_get_multiplier", ":instance_id"),
  4220. (store_mul, ":proportional_multiplier", reg2, ":normalized_proportional_factor"),
  4221. (val_add, ":price_multiplier", ":proportional_multiplier"),
  4222. (try_end),
  4223. (val_div, ":price_multiplier", 1000),
  4224. (try_end),
  4225. (assign, reg2, ":price_multiplier"),
  4226. (try_end),
  4227. ]),
  4228.  
  4229. ("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
  4230. [(store_script_param, ":instance_id", 1), # must be valid
  4231.  
  4232. (scene_prop_get_num_instances, ":local_wood_price_areas", "spr_pw_local_wood_price_area"),
  4233. (scene_prop_get_num_instances, ":local_iron_price_areas", "spr_pw_local_iron_price_area"),
  4234. (scene_prop_get_num_instances, ":local_cloth_price_areas", "spr_pw_local_cloth_price_area"),
  4235. (scene_prop_get_num_instances, ":local_leather_price_areas", "spr_pw_local_leather_price_area"),
  4236. (scene_prop_get_num_instances, ":local_precious_price_areas", "spr_pw_local_precious_price_area"),
  4237. (try_begin), # if there are no areas in the scene, use the precalculated default cost
  4238. (eq, ":local_wood_price_areas", 0),
  4239. (eq, ":local_iron_price_areas", 0),
  4240. (eq, ":local_cloth_price_areas", 0),
  4241. (eq, ":local_leather_price_areas", 0),
  4242. (eq, ":local_precious_price_areas", 0),
  4243. (scene_prop_get_slot, ":resource_refund_cost", ":instance_id", slot_scene_prop_resources_default_cost),
  4244. (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
  4245. (assign, ":resource_refund_cost", 0),
  4246. (assign, ":local_wood_price_multiplier", -1),
  4247. (assign, ":local_iron_price_multiplier", -1),
  4248. (assign, ":local_cloth_price_multiplier", -1),
  4249. (assign, ":local_leather_price_multiplier", -1),
  4250. (assign, ":local_precious_price_multiplier", -1),
  4251. (set_fixed_point_multiplier, 100),
  4252. (prop_instance_get_position, pos40, ":instance_id"),
  4253. (position_set_z, pos40, 0),
  4254. (try_for_range, ":resource_slot", slot_scene_prop_crafting_resource_1, slot_scene_prop_crafting_resource_4 + 1),
  4255. (scene_prop_get_slot, ":resource_item_id", ":instance_id", ":resource_slot"),
  4256. (ge, ":resource_item_id", all_items_begin),
  4257. (assign, reg2, 0),
  4258. (item_get_slot, ":item_class", ":resource_item_id", slot_item_class),
  4259. (try_begin),
  4260. lazy.block([
  4261. lazy.block([
  4262. (eq, ":item_class", item_class),
  4263. (try_begin),
  4264. (eq, local_price_multiplier_var, -1),
  4265. (call_script, "script_calculate_local_resource_price_multiplier", spr_local_price_area, local_price_count_var),
  4266. (assign, local_price_multiplier_var, reg2),
  4267. (else_try),
  4268. (assign, reg2, local_price_multiplier_var),
  4269. (try_end),
  4270. (else_try)]) for item_class, local_price_multiplier_var, spr_local_price_area, local_price_count_var in
  4271. [(item_class_wood, ":local_wood_price_multiplier", "spr_pw_local_wood_price_area", ":local_wood_price_areas"),
  4272. (item_class_iron, ":local_iron_price_multiplier", "spr_pw_local_iron_price_area", ":local_iron_price_areas"),
  4273. (item_class_cloth,":local_cloth_price_multiplier", "spr_pw_local_cloth_price_area", ":local_cloth_price_areas"),
  4274. (item_class_leather,":local_leather_price_multiplier", "spr_pw_local_leather_price_area", ":local_leather_price_areas"),
  4275. (item_class_precious,":local_precious_price_multiplier", "spr_pw_local_precious_price_area", ":local_precious_price_areas"),
  4276. ]
  4277. ]),
  4278. (try_end),
  4279. (store_item_value, ":item_cost", ":resource_item_id"),
  4280. (try_begin),
  4281. (gt, reg2, 0),
  4282. (val_mul, ":item_cost", reg2),
  4283. (val_div, ":item_cost", 100),
  4284. (try_end),
  4285. (val_add, ":resource_refund_cost", ":item_cost"),
  4286. (try_end),
  4287. (try_end),
  4288. (scene_prop_set_slot, ":instance_id", slot_scene_prop_resource_refund_cost, ":resource_refund_cost"),
  4289. (assign, reg1, ":resource_refund_cost"),
  4290. ]),
  4291.  
  4292. ("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
  4293. [
  4294. (assign, ":current_faction", castle_factions_begin),
  4295. (try_for_range, ":current_castle_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4296. (troop_set_slot, "trp_mission_data", ":current_castle_slot", ":current_faction"),
  4297. (val_add, ":current_faction", 1),
  4298. (try_begin),
  4299. (eq, ":current_faction", factions_end),
  4300. (assign, ":current_faction", castle_factions_begin),
  4301. (try_end),
  4302. (try_end),
  4303. (faction_set_slot, "fac_commoners", slot_faction_is_active, 1),
  4304. (faction_set_slot, "fac_outlaws", slot_faction_is_active, 1),
  4305. (scene_prop_get_num_instances, ":pole_num", "spr_pw_castle_capture_point"),
  4306. (try_for_range, ":pole_no", 0, ":pole_num"),
  4307. (scene_prop_get_instance, ":instance_id", "spr_pw_castle_capture_point", ":pole_no"),
  4308. (prop_instance_get_variation_id_2, ":capture_type", ":instance_id"),
  4309. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4310. (try_begin),
  4311. (neq, ":capture_type", capture_point_type_primary),
  4312. (scene_prop_set_slot, ":instance_id", slot_scene_prop_capture_faction_id, reg0),
  4313. (else_try),
  4314. (faction_set_slot, reg0, slot_faction_is_active, 1),
  4315. (gt, reg1, -1),
  4316. (val_add, reg1, slot_mission_data_castle_is_active_begin),
  4317. (troop_set_slot, "trp_mission_data", reg1, 1),
  4318. (try_end),
  4319. (try_end),
  4320. (assign, "$g_scene_num_castle_factions", 0),
  4321. (try_for_range, ":faction_id", castle_factions_begin, factions_end),
  4322. (faction_slot_eq, ":faction_id", slot_faction_is_active, 1),
  4323. (val_add, "$g_scene_num_castle_factions", 1),
  4324. (try_end),
  4325. (try_for_range, ":slot", slot_mission_data_castle_allows_training_begin, slot_mission_data_castle_allows_training_end),
  4326. (troop_set_slot, "trp_mission_data", ":slot", 0),
  4327. (try_end),
  4328. (try_for_range, ":scene_prop_id", "spr_pw_change_troop_peasant", "spr_pw_change_troop_mercenary"),
  4329. (scene_prop_get_num_instances, ":num_instances", ":scene_prop_id"),
  4330. (try_for_range, ":instance_no", 0, ":num_instances"),
  4331. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  4332. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4333. (gt, reg1, -1),
  4334. (store_add, ":castle_is_active_slot", slot_mission_data_castle_is_active_begin, reg1),
  4335. (troop_slot_eq, "trp_mission_data", ":castle_is_active_slot", 1),
  4336. (val_add, reg1, slot_mission_data_castle_allows_training_begin),
  4337. (troop_set_slot, "trp_mission_data", reg1, 1),
  4338. (try_end),
  4339. (try_end),
  4340. (call_script, "script_setup_castle_names"),
  4341. ]),
  4342.  
  4343. ("cf_castle_is_active",
  4344. [(store_script_param, ":castle_no", 1),
  4345.  
  4346. (is_between, ":castle_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4347. (val_add, ":castle_no", slot_mission_data_castle_is_active_begin),
  4348. (troop_slot_eq, "trp_mission_data", ":castle_no", 1),
  4349. ]),
  4350.  
  4351. ("capture_castle", # server: perform capture of the castle by the faction, without checking anything
  4352. [(store_script_param, ":faction_id", 1),
  4353. (store_script_param, ":castle_no", 2),
  4354.  
  4355. (try_begin),
  4356. (is_between, ":faction_id", castle_factions_begin, factions_end),
  4357. (call_script, "script_cf_castle_is_active", ":castle_no"),
  4358. (troop_set_slot, "trp_mission_data", ":castle_no", ":faction_id"),
  4359. (get_max_players, ":num_players"),
  4360. (try_for_range, ":player_id", 1, ":num_players"),
  4361. (player_is_active, ":player_id"),
  4362. (multiplayer_send_3_int_to_player, ":player_id", server_event_troop_set_slot, "trp_mission_data", ":castle_no", ":faction_id"),
  4363. (try_end),
  4364. (call_script, "script_redraw_castle_banners", redraw_castle_banners, ":castle_no"),
  4365. (try_end),
  4366. ]),
  4367.  
  4368. ("cf_use_capture_point", # server: after an agent uses a capture point scene prop, capture the castle if checks succeed
  4369. [(store_script_param, ":agent_id", 1), # must be valid
  4370. (store_script_param, ":instance_id", 2), # must be valid
  4371. (store_script_param, ":completed", 3), # 1 if completed using the scene prop
  4372.  
  4373. (agent_get_player_id, ":player_id", ":agent_id"),
  4374. (player_is_active, ":player_id"),
  4375. (this_or_next|neq, ":completed", 1),
  4376. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_disabled, ":player_id"), # player started using when not hostile
  4377. (scene_prop_set_slot, ":instance_id", slot_scene_prop_disabled, 0),
  4378. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  4379. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4380. (assign, ":faction_id", reg0),
  4381. (assign, ":castle_no", reg1),
  4382. (gt, ":castle_no", -1),
  4383. (prop_instance_get_variation_id_2, ":capture_type", ":instance_id"),
  4384. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  4385. (try_begin), # capturing a hostile point with own faction's banner
  4386. (neq, ":faction_id", ":player_faction_id"),
  4387. (troop_get_slot, ":castle_owning_faction_id", "trp_mission_data", ":castle_no"),
  4388. (try_begin),
  4389. (eq, ":castle_owning_faction_id", ":player_faction_id"), # allow capturing back secondary points belonging to the castle even when at peace
  4390. (else_try),
  4391. (call_script, "script_cf_factions_are_hostile", ":faction_id", ":player_faction_id"),
  4392. (else_try),
  4393. (assign, ":castle_no", -1),
  4394. (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"),
  4395. (try_begin),
  4396. (neq, ":completed", 1),
  4397. (scene_prop_set_slot, ":instance_id", slot_scene_prop_disabled, ":player_id"), # disable capturing if factions are not hostile at start of use
  4398. (try_end),
  4399. (try_end),
  4400. (gt, ":castle_no", -1),
  4401. (faction_get_slot, ":banner_item_id", ":player_faction_id", slot_faction_banner_mesh),
  4402. (val_sub, ":banner_item_id", banner_meshes_begin),
  4403. (val_add, ":banner_item_id", banner_items_begin),
  4404. (eq, ":wielded_item_id", ":banner_item_id"),
  4405. (item_get_slot, ":difficulty", ":wielded_item_id", slot_item_difficulty),
  4406. (agent_get_troop_id, ":troop_id", ":agent_id"),
  4407. (store_attribute_level, ":strength", ":troop_id", ca_strength),
  4408. (ge, ":strength", ":difficulty"),
  4409. (try_begin), # when capturing a primary point, check whether the required secondary points have been captured
  4410. (eq, ":capture_type", capture_point_type_primary),
  4411. (assign, ":type_secondary_all_check_result", -1),
  4412. (assign, ":type_secondary_one_check_result", -1),
  4413. (scene_prop_get_num_instances, ":pole_num", "spr_pw_castle_capture_point"),
  4414. (try_for_range, ":pole_no", 0, ":pole_num"),
  4415. (scene_prop_get_instance, ":other_instance_id", "spr_pw_castle_capture_point", ":pole_no"),
  4416. (prop_instance_get_variation_id_2, ":other_capture_type", ":other_instance_id"),
  4417. (neq, ":other_capture_type", capture_point_type_primary),
  4418. (call_script, "script_scene_prop_get_owning_faction", ":other_instance_id"),
  4419. (eq, reg1, ":castle_no"),
  4420. (try_begin),
  4421. (eq, ":other_capture_type", capture_point_type_secondary_all),
  4422. (try_begin),
  4423. (neq, reg0, ":player_faction_id"),
  4424. (assign, ":type_secondary_all_check_result", 0),
  4425. (assign, ":pole_num", 0),
  4426. (try_end),
  4427. (else_try),
  4428. (eq, ":other_capture_type", capture_point_type_secondary_one),
  4429. (try_begin),
  4430. (neq, reg0, ":player_faction_id"),
  4431. (val_max, ":type_secondary_one_check_result", 0),
  4432. (else_try),
  4433. (assign, ":type_secondary_one_check_result", 1),
  4434. (try_end),
  4435. (try_end),
  4436. (try_end),
  4437. (try_begin),
  4438. (neq, ":type_secondary_all_check_result", 0),
  4439. (neq, ":type_secondary_one_check_result", 0),
  4440. (try_begin),
  4441. (eq, ":completed", 1),
  4442. (call_script, "script_cf_agent_consume_item", ":agent_id", ":banner_item_id", 1),
  4443. (call_script, "script_capture_castle", ":player_faction_id", ":castle_no"),
  4444. (try_end),
  4445. (else_try),
  4446. (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"),
  4447. (try_end),
  4448. (else_try), # capturing a single secondary point
  4449. (eq, ":completed", 1),
  4450. (is_between, ":capture_type", capture_point_type_secondary_all, capture_point_type_secondary_one + 1),
  4451. (call_script, "script_cf_agent_consume_item", ":agent_id", ":banner_item_id", 1),
  4452. (scene_prop_set_slot, ":instance_id", slot_scene_prop_capture_faction_id, ":player_faction_id"),
  4453. (call_script, "script_redraw_castle_banners", redraw_single_capture_point_banner, ":instance_id"),
  4454. (try_end),
  4455. (else_try), # as lord, giving away an owned castle using the other faction's banner
  4456. (eq, ":completed", 1),
  4457. (eq, ":faction_id", ":player_faction_id"),
  4458. (eq, ":capture_type", capture_point_type_primary),
  4459. (call_script, "script_cf_player_is_lord", ":player_id"),
  4460. (assign, ":loop_end", factions_end),
  4461. (try_for_range, ":other_faction_id", castle_factions_begin, ":loop_end"),
  4462. (neq, ":other_faction_id", ":player_faction_id"),
  4463. (faction_get_slot, ":banner_item_id", ":other_faction_id", slot_faction_banner_mesh),
  4464. (val_sub, ":banner_item_id", banner_meshes_begin),
  4465. (val_add, ":banner_item_id", banner_items_begin),
  4466. (eq, ":wielded_item_id", ":banner_item_id"),
  4467. (assign, ":loop_end", -1),
  4468. (try_end),
  4469. (eq, ":loop_end", -1),
  4470. (call_script, "script_cf_agent_consume_item", ":agent_id", ":banner_item_id", 1),
  4471. (call_script, "script_capture_castle", ":other_faction_id", ":castle_no"),
  4472. (else_try),
  4473. (assign, ":castle_no", -1),
  4474. (try_end),
  4475. (gt, ":castle_no", -1),
  4476. ]),
  4477.  
  4478. ("cf_victory_condition_met", # server: check if a victory condition for the mission has been met; if so, reg0 = victorious faction id
  4479. [
  4480. (ge, "$g_victory_condition", 1),
  4481. (assign, ":last_owner_faction", -1),
  4482. (assign, ":loop_end", slot_mission_data_castle_owner_faction_end),
  4483. (try_for_range, ":castle_no", slot_mission_data_castle_owner_faction_begin, ":loop_end"),
  4484. (store_add, ":castle_active_slot", ":castle_no", slot_mission_data_castle_is_active_begin),
  4485. (troop_slot_eq, "trp_mission_data", ":castle_active_slot", 1),
  4486. (troop_get_slot, ":owner_faction", "trp_mission_data", ":castle_no"),
  4487. (try_begin),
  4488. (neq, ":last_owner_faction", -1),
  4489. (neq, ":owner_faction", ":last_owner_faction"),
  4490. (assign, ":loop_end", -1),
  4491. (try_end),
  4492. (assign, ":last_owner_faction", ":owner_faction"),
  4493. (try_end),
  4494. (neq, ":loop_end", -1),
  4495. (assign, reg0, ":owner_faction"),
  4496. ]),
  4497.  
  4498. ("redraw_castle_banners", # redraw heraldic banner tableaus using various tricks
  4499. [(store_script_param, ":redraw_type", 1), # constants starting with redraw_
  4500. (store_script_param, ":value", 2), # castle number, faction id, or instance id, depending on redraw_type
  4501.  
  4502. (try_begin),
  4503. (this_or_next|eq, ":redraw_type", redraw_all_banners),
  4504. (eq, ":redraw_type", redraw_client_banner_positions),
  4505. (else_try),
  4506. (eq, ":redraw_type", redraw_castle_banners),
  4507. (is_between, ":value", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4508. (else_try),
  4509. (eq, ":redraw_type", redraw_faction_banners),
  4510. (is_between, ":value", castle_factions_begin, factions_end),
  4511. (else_try),
  4512. (eq, ":redraw_type", redraw_single_capture_point_banner),
  4513. (prop_instance_is_valid, ":value"),
  4514. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":value"),
  4515. (eq, ":scene_prop_id", "spr_pw_castle_capture_point"),
  4516. (scene_prop_get_slot, ":faction_id", ":value", slot_scene_prop_capture_faction_id),
  4517. (call_script, "script_redraw_castle_banner_instance", ":redraw_type", ":value", ":scene_prop_id", ":faction_id", "itm_pw_banner_castle_fac_1a"),
  4518. (assign, ":redraw_type", -1),
  4519. (else_try),
  4520. (assign, ":redraw_type", -1),
  4521. (try_end),
  4522. (try_begin),
  4523. (gt, ":redraw_type", -1),
  4524. (try_begin),
  4525. (eq, ":redraw_type", redraw_faction_banners),
  4526. (faction_get_slot, ":banner_variant", ":value", slot_faction_castle_banner_variant),
  4527. (val_add, ":banner_variant", 1), # change to the other banner variant to force the engine to redraw the tableaus with the new texture
  4528. (val_mod, ":banner_variant", 2),
  4529. (faction_set_slot, ":value", slot_faction_castle_banner_variant, ":banner_variant"),
  4530. (try_end),
  4531. (call_script, "script_redraw_castle_banner_kind", ":redraw_type", ":value", "spr_pw_castle_capture_point", "itm_pw_banner_castle_fac_1a"),
  4532. (call_script, "script_redraw_castle_banner_kind", ":redraw_type", ":value", "spr_pw_castle_wall_banner", "itm_pw_banner_wall_fac_1a"),
  4533. (try_end),
  4534. ]),
  4535.  
  4536. ("redraw_castle_banner_kind", # redraw heraldic banners of a certain scene prop kind
  4537. [(store_script_param, ":redraw_type", 1), # constants starting with redraw_
  4538. (store_script_param, ":value", 2), # castle number or faction id, depending on redraw_type
  4539. (store_script_param, ":pole_scene_prop_id", 3), # scene prop kind of the banner's pole
  4540. (store_script_param, ":begin_item_id", 4), # beginning item in the range to use for the banners
  4541.  
  4542. (set_fixed_point_multiplier, 100),
  4543. (scene_prop_get_num_instances, ":pole_count", ":pole_scene_prop_id"),
  4544. (try_for_range, ":pole_no", 0, ":pole_count"),
  4545. (scene_prop_get_instance, ":pole_instance_id", ":pole_scene_prop_id", ":pole_no"),
  4546. (call_script, "script_scene_prop_get_owning_faction", ":pole_instance_id"),
  4547. (try_begin),
  4548. (this_or_next|eq, ":redraw_type", redraw_all_banners),
  4549. (eq, ":redraw_type", redraw_client_banner_positions),
  4550. (else_try),
  4551. (eq, ":redraw_type", redraw_castle_banners),
  4552. (prop_instance_get_variation_id_2, ":capture_type", ":pole_instance_id"),
  4553. (eq, ":capture_type", capture_point_type_primary),
  4554. (eq, reg1, ":value"),
  4555. (else_try),
  4556. (eq, ":redraw_type", redraw_faction_banners),
  4557. (eq, reg0, ":value"),
  4558. (else_try),
  4559. (assign, reg1, -1),
  4560. (try_end),
  4561. (gt, reg1, -1),
  4562. (call_script, "script_redraw_castle_banner_instance", ":redraw_type", ":pole_instance_id", ":pole_scene_prop_id", reg0, ":begin_item_id"),
  4563. (try_end),
  4564. ]),
  4565.  
  4566. ("redraw_castle_banner_instance", # redraw heraldic banners of a certain scene prop kind
  4567. [(store_script_param, ":redraw_type", 1), # constants starting with redraw_
  4568. (store_script_param, ":pole_instance_id", 2), # must be valid
  4569. (store_script_param, ":pole_scene_prop_id", 3), # scene prop kind of the banner's pole
  4570. (store_script_param, ":faction_id", 4), # must be valid
  4571. (store_script_param, ":begin_item_id", 5), # beginning item in the range to use for the banners
  4572.  
  4573. (faction_get_slot, ":banner_item_id", ":faction_id", slot_faction_castle_banner_variant),
  4574. (val_mul, ":banner_item_id", max_castle_count),
  4575. (val_add, ":banner_item_id", ":faction_id"),
  4576. (val_sub, ":banner_item_id", castle_factions_begin),
  4577. (val_add, ":banner_item_id", ":begin_item_id"),
  4578. (prop_instance_get_position, pos2, ":pole_instance_id"),
  4579. (try_begin),
  4580. (neq, ":redraw_type", redraw_client_banner_positions),
  4581. (scene_prop_get_slot, ":old_banner_instance_id", ":pole_instance_id", slot_scene_prop_linked_scene_prop),
  4582. (gt, ":old_banner_instance_id", 0), # remove the old banner item, if any
  4583. (prop_instance_is_valid, ":old_banner_instance_id"),
  4584. (prop_instance_get_scene_prop_kind, ":scene_prop_item_id", ":old_banner_instance_id"),
  4585. (store_add, ":end_item_id", ":begin_item_id", max_castle_count * 2),
  4586. (is_between, ":scene_prop_item_id", ":begin_item_id", ":end_item_id"),
  4587. (scene_prop_set_prune_time, ":old_banner_instance_id", 0),
  4588. (else_try),
  4589. (eq, ":redraw_type", redraw_client_banner_positions),
  4590. (position_get_z, ":pole_z", pos2),
  4591. (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
  4592. (try_for_range, ":unused", 0, ":continue"),
  4593. (scene_spawned_item_get_num_instances, ":banner_count", ":banner_item_id"),
  4594. (try_for_range, ":banner_no", 0, ":banner_count"),
  4595. (scene_spawned_item_get_instance, ":banner_instance_id", ":banner_item_id", ":banner_no"),
  4596. (prop_instance_get_position, pos4, ":banner_instance_id"),
  4597. (position_set_z, pos4, ":pole_z"),
  4598. (get_sq_distance_between_positions, ":sq_distance", pos2, pos4),
  4599. (lt, ":sq_distance", 5),
  4600. (assign, ":banner_count", -1),
  4601. (assign, ":continue", -1),
  4602. (try_end),
  4603. (val_add, ":banner_item_id", max_castle_count),
  4604. (try_end),
  4605. (try_end),
  4606. (try_begin), # move capture point banners to the top of the pole
  4607. (eq, ":pole_scene_prop_id", "spr_pw_castle_capture_point"),
  4608. (prop_instance_get_scale, pos3, ":pole_instance_id"),
  4609. (position_get_scale_z, ":banner_height", pos3),
  4610. (val_mul, ":banner_height", 10),
  4611. (position_move_z, pos2, ":banner_height"),
  4612. (position_move_y, pos2, 11),
  4613. (try_end),
  4614. (try_begin),
  4615. (neq, ":redraw_type", redraw_client_banner_positions),
  4616. (set_spawn_position, pos2),
  4617. (spawn_item, ":banner_item_id", 0, 60 * 60 * 24 * 7 + 1), # spawn the new banner item for up to a week
  4618. (scene_prop_set_slot, ":pole_instance_id", slot_scene_prop_linked_scene_prop, reg0),
  4619. (prop_instance_set_position, reg0, pos2),
  4620. (else_try),
  4621. (eq, ":redraw_type", redraw_client_banner_positions),
  4622. (eq, ":banner_count", -1),
  4623. (prop_instance_set_position, ":banner_instance_id", pos2),
  4624. (try_end),
  4625. ]),
  4626.  
  4627. ("setup_castle_names", # check for linked sign posts to name a castle by, caching the string ids
  4628. [
  4629. (try_for_range, ":name_slot", slot_mission_data_castle_name_string_begin, slot_mission_data_castle_name_string_end),
  4630. (troop_set_slot, "trp_mission_data", ":name_slot", 0),
  4631. (try_end),
  4632. (scene_prop_get_num_instances, ":sign_num", "spr_pw_castle_sign"),
  4633. (try_for_range, ":sign_no", 0, ":sign_num"),
  4634. (scene_prop_get_instance, ":instance_id", "spr_pw_castle_sign", ":sign_no"),
  4635. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4636. (is_between, reg1, slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4637. (store_add, ":name_slot", reg1, slot_mission_data_castle_name_string_begin),
  4638. (troop_slot_eq, "trp_mission_data", ":name_slot", 0),
  4639. (prop_instance_get_variation_id_2, ":name_string_id", ":instance_id"),
  4640. (val_add, ":name_string_id", castle_names_begin),
  4641. (try_begin),
  4642. (is_between, ":name_string_id", castle_names_begin, castle_names_end),
  4643. (assign, ":loop_end", slot_mission_data_castle_name_string_end),
  4644. (try_for_range, ":other_name_slot", slot_mission_data_castle_name_string_begin, ":loop_end"),
  4645. (neq, ":other_name_slot", ":name_slot"),
  4646. (troop_slot_eq, "trp_mission_data", ":other_name_slot", ":name_string_id"),
  4647. (assign, ":loop_end", -1),
  4648. (try_end),
  4649. (neq, ":loop_end", -1),
  4650. (else_try),
  4651. (assign, ":name_string_id", castle_names_end),
  4652. (try_end),
  4653. (troop_set_slot, "trp_mission_data", ":name_slot", ":name_string_id"),
  4654. (try_end),
  4655. ]),
  4656.  
  4657. ("str_store_castle_name", # store a castle's name in the passed string register
  4658. [(store_script_param, ":output_castle_name", 1), # the string register to store in
  4659. (store_script_param, ":castle_no", 2),
  4660.  
  4661. (try_begin),
  4662. (is_between, ":castle_no", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4663. (val_add, ":castle_no", slot_mission_data_castle_name_string_begin),
  4664. (troop_get_slot, ":name_string_id", "trp_mission_data", ":castle_no"),
  4665. (is_between, ":name_string_id", castle_names_begin, castle_names_end),
  4666. (str_store_string, ":output_castle_name", ":name_string_id"),
  4667. (else_try),
  4668. (str_store_string, ":output_castle_name", castle_names_end),
  4669. (try_end),
  4670. ]),
  4671.  
  4672. ("setup_castle_money_chests", # check for linked money chests for each castle, caching the instance ids
  4673. [
  4674. (try_for_range, ":chest_slot", slot_mission_data_castle_money_chest_begin, slot_mission_data_castle_money_chest_end),
  4675. (troop_set_slot, "trp_mission_data", ":chest_slot", 0),
  4676. (try_end),
  4677. (try_for_range, ":interest_slot", slot_mission_data_interest_box_begin,slot_mission_data_interest_box_end), #RAMARAUNT ADD TRY LOOP
  4678. (troop_set_slot, "trp_mission_data", ":interest_slot", 0),
  4679. (try_end),
  4680. (try_begin),
  4681. (neq, "$g_game_type", "mt_no_money"),
  4682. (scene_prop_get_num_instances, ":chest_num", "spr_pw_castle_money_chest"),
  4683. (scene_prop_get_num_instances, ":ledger_num", "spr_pws_castle_faction_interest_ledger"),
  4684. (try_for_range, ":chest_no", 0, ":chest_num"),
  4685. (scene_prop_get_instance, ":instance_id", "spr_pw_castle_money_chest", ":chest_no"),
  4686. (scene_prop_set_slot, ":chest_no", slot_money_chest_interest_timer, 0),
  4687. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  4688. (assign, ":chest_fac", reg1),
  4689. (is_between, ":chest_fac", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4690. (store_add, ":chest_slot", ":chest_fac", slot_mission_data_castle_money_chest_begin),
  4691. (troop_slot_eq, "trp_mission_data", ":chest_slot", 0),
  4692. (troop_set_slot, "trp_mission_data", ":chest_slot", ":instance_id"),
  4693. (try_for_range, ":ledger_no", 0, ":ledger_num"), #RAMARAUNT LEDGERS ADD
  4694. (scene_prop_get_instance, ":ledger_id", "spr_pws_castle_faction_interest_ledger", ":ledger_no"),
  4695. (call_script, "script_scene_prop_get_owning_faction", ":ledger_id"),
  4696. (eq, ":chest_fac", reg1),
  4697. (store_add, ":ledger_slot", ":chest_slot", slot_mission_data_interest_box_begin),
  4698. (troop_slot_eq, "trp_mission_data", ":ledger_slot", 0),
  4699. (troop_set_slot, "trp_mission_data", ":ledger_slot", ":ledger_no"),
  4700. (try_end),
  4701. (try_end),
  4702. (try_end),
  4703. ]),
  4704.  
  4705. ("castle_receive_gold", # server: send money directly into the castle's linked chest
  4706. [(store_script_param, ":castle_slot", 1),
  4707. (store_script_param, ":gold_value", 2),
  4708. (store_script_param, ":percentage", 3), # if greater than -1, applied as a percentage to the value
  4709.  
  4710. (try_begin),
  4711. (neq, "$g_game_type", "mt_no_money"),
  4712. (is_between, ":castle_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4713. (assign, ":fac_no", ":castle_slot"),
  4714. (val_add, ":castle_slot", slot_mission_data_castle_money_chest_begin),
  4715. (troop_get_slot, ":instance_id", "trp_mission_data", ":castle_slot"),
  4716. (gt, ":instance_id", 0),
  4717. (store_add, ":ledger_slot", ":fac_no", slot_mission_data_interest_box_begin),
  4718. (troop_get_slot, ":ledger_id", "trp_mission_data", ":ledger_slot"),
  4719. (neq, ":ledger_slot", 0),
  4720. (scene_prop_get_slot, ":chest_gold", ":instance_id", slot_scene_prop_stock_count),
  4721. (call_script, "script_scene_prop_ledger_get_money", ":ledger_id"),
  4722. (ge, ":chest_gold", reg0),
  4723. (try_begin),
  4724. (gt, ":percentage", -1),
  4725. (val_mul, ":gold_value", ":percentage"),
  4726. (val_div, ":gold_value", 100),
  4727. (try_end),
  4728. (val_add, ":chest_gold", ":gold_value"),
  4729. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":chest_gold"),
  4730. (try_end),
  4731. ]),
  4732.  
  4733. ("cf_castle_recieve_taxes", #Ramaraunt script: this script is called for each chest every 30 seconds.
  4734. [(try_for_range, ":fac_no", 0, 9),
  4735. (store_add, ":chest_slot", slot_mission_data_castle_money_chest_begin, ":fac_no"),
  4736. (store_add, ":ledger_slot", slot_mission_data_interest_box_begin, ":fac_no"),
  4737. (troop_get_slot, ":chest_id", "trp_mission_data", ":chest_slot"),
  4738. (troop_get_slot, ":ledger_id", "trp_mission_data", ":ledger_slot"),
  4739. (scene_prop_get_slot, ":chest_gold", ":chest_id", slot_scene_prop_stock_count),
  4740. (call_script, "script_scene_prop_ledger_get_money", ":ledger_id"),
  4741. (try_begin),
  4742. (ge, ":chest_gold", reg0),
  4743. (scene_prop_get_slot, ":timer", ":chest_id", slot_money_chest_interest_timer),
  4744. (try_begin),
  4745. (ge, ":timer", 20),
  4746. (scene_prop_set_slot, ":chest_id", slot_money_chest_interest_timer, 0),
  4747. (neq, ":ledger_id", 0),
  4748. (val_add, ":chest_gold", reg1),
  4749. (scene_prop_set_slot, ":chest_id", slot_scene_prop_stock_count, ":chest_gold"),
  4750. (else_try),
  4751. (store_add, ":timer", 1),
  4752. (scene_prop_set_slot, ":chest_id", slot_money_chest_interest_timer, ":timer"),
  4753. (try_end),
  4754. (else_try),
  4755. (scene_prop_set_slot, ":chest_id", slot_money_chest_interest_timer, 0),
  4756. (try_end),
  4757.  
  4758. (try_end),
  4759.  
  4760. ]),
  4761.  
  4762. ("faction_set_color_from_banner", # gets the background color for a banner and lightens it to set as the faction color
  4763. [(store_script_param, ":faction_id", 1),
  4764. (store_script_param, ":banner_mesh", 2),
  4765.  
  4766. (troop_get_slot, ":color", "trp_banner_background_color_array", ":banner_mesh"),
  4767. (store_div, ":red", ":color", 0x10000),
  4768. (val_and, ":red", 0xFF),
  4769. (val_mul, ":red", 2),
  4770. (val_min, ":red", 0xFF),
  4771. (val_mul, ":red", 0x10000),
  4772. (store_div, ":green", ":color", 0x100),
  4773. (val_and, ":green", 0xFF),
  4774. (val_mul, ":green", 2),
  4775. (val_min, ":green", 0xFF),
  4776. (val_mul, ":green", 0x100),
  4777. (assign, ":blue", ":color"),
  4778. (val_and, ":blue", 0xFF),
  4779. (val_mul, ":blue", 2),
  4780. (val_min, ":blue", 0xFF),
  4781. (store_add, ":color", ":red", ":green"),
  4782. (val_add, ":color", ":blue"),
  4783. (faction_set_color, ":faction_id", ":color"),
  4784. ]),
  4785.  
  4786. ("faction_redraw_heraldic_items", # client: redraw heraldic armor worn by all players in a faction
  4787. [(store_script_param, ":faction_id", 1),
  4788.  
  4789. (get_max_players, ":max_players"),
  4790. (try_for_range, ":player_id", 1, ":max_players"),
  4791. (player_is_active, ":player_id"),
  4792. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  4793. (call_script, "script_player_redraw_heraldic_items", ":player_id"),
  4794. (try_end),
  4795. ]),
  4796.  
  4797. ("player_redraw_heraldic_items", # client: redraw heraldic armor worn by a player
  4798. [(store_script_param, ":player_id", 1), # must be valid
  4799.  
  4800. (player_get_agent_id, ":agent_id", ":player_id"),
  4801. (try_begin),
  4802. (agent_is_active, ":agent_id"),
  4803. (agent_is_alive, ":agent_id"),
  4804. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  4805. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  4806. (ge, ":item_id", all_items_begin),
  4807. (item_slot_eq, ":item_id", slot_item_class, item_class_heraldic),
  4808. (store_sub, ":no_item_id", ":equip_slot", ek_head),
  4809. (val_add, ":no_item_id", "itm_invisible_head"),
  4810. (agent_equip_item, ":agent_id", ":no_item_id"),
  4811. (agent_equip_item, ":agent_id", ":item_id"),
  4812. (try_end),
  4813. (try_end),
  4814. ]),
  4815.  
  4816. ("cf_factions_are_hostile",
  4817. [(store_script_param, ":faction_1_id", 1),
  4818. (store_script_param, ":faction_2_id", 2),
  4819.  
  4820. (neq, ":faction_1_id", ":faction_2_id"),
  4821. (store_add, ":faction_1_slot", ":faction_1_id", slot_faction_relations_begin),
  4822. (store_add, ":faction_2_slot", ":faction_2_id", slot_faction_relations_begin),
  4823. (this_or_next|neg|faction_slot_ge, ":faction_1_id", ":faction_2_slot", 1),
  4824. (neg|faction_slot_ge, ":faction_2_id", ":faction_1_slot", 1),
  4825. ]),
  4826.  
  4827. ("display_faction_relation_change", # server and clients: calculate and display changed faction relations
  4828. [(store_script_param, ":faction_id", 1),
  4829. (store_script_param, ":other_faction_id", 2),
  4830. (store_script_param, ":previous_relation", 3),
  4831. (store_script_param, ":new_relation", 4),
  4832.  
  4833. (assign, ":string_id", -1),
  4834. (try_begin),
  4835. (eq, ":new_relation", ":previous_relation"),
  4836. (else_try),
  4837. (lt, ":new_relation", 1),
  4838. (ge, ":previous_relation", 1),
  4839. (assign, ":string_id", "str_s1_now_hostile_towards_s10"),
  4840. (else_try),
  4841. (lt, ":previous_relation", 1),
  4842. (ge, ":new_relation", 1),
  4843. (assign, ":string_id", "str_s1_and_s10_made_peace"),
  4844. (try_end),
  4845. (try_begin),
  4846. (gt, ":string_id", -1),
  4847. (store_add, ":other_relation_slot", slot_faction_relations_begin, ":faction_id"),
  4848. (try_begin),
  4849. (faction_slot_ge, ":other_faction_id", ":other_relation_slot", 1),
  4850. (str_store_faction_name, s10, ":other_faction_id"),
  4851. (try_begin),
  4852. (multiplayer_is_server),
  4853. (str_store_faction_name, s1, ":faction_id"),
  4854. (server_add_message_to_log, ":string_id"),
  4855. (else_try),
  4856. (call_script, "script_preset_message", ":string_id", preset_message_faction|preset_message_log|preset_message_big, ":faction_id", 0),
  4857. (try_end),
  4858. (else_try),
  4859. (neg|multiplayer_is_server),
  4860. (multiplayer_get_my_player, ":my_player_id"),
  4861. (player_slot_eq, ":my_player_id", slot_player_is_lord, 1),
  4862. (player_slot_eq, ":my_player_id", slot_player_faction_id, ":other_faction_id"),
  4863. (faction_get_color, ":faction_color", ":faction_id"),
  4864. (try_begin),
  4865. (eq, ":string_id", "str_s1_now_hostile_towards_s10"),
  4866. (assign, ":string_id", "str_lord_of_s1_withdraws_offer_of_peace"),
  4867. (else_try),
  4868. (eq, ":string_id", "str_s1_and_s10_made_peace"),
  4869. (assign, ":string_id", "str_lord_of_s1_offers_peace"),
  4870. (try_end),
  4871. (str_store_faction_name, s1, ":faction_id"),
  4872. (display_message, ":string_id", ":faction_color"),
  4873. (try_end),
  4874. (try_end),
  4875. ]),
  4876.  
  4877. ("scene_prop_get_owning_faction", # get the current owning faction and castle number associated with a scene prop, storing in reg0 and reg1
  4878. [(store_script_param, ":instance_id", 1), # must be valid
  4879.  
  4880. (prop_instance_get_variation_id, ":scene_prop_owner_slot", ":instance_id"),
  4881. (val_mod, ":scene_prop_owner_slot", 10), # stored in the first digit of scene prop value 1, set with the scene editor
  4882. (try_begin),
  4883. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_mercenary, 1),
  4884. (ge, ":scene_prop_owner_slot", castle_factions_begin),
  4885. (val_sub, ":scene_prop_owner_slot", castle_factions_begin),
  4886. (val_clamp, ":scene_prop_owner_slot", slot_mission_data_castle_owner_faction_begin, slot_mission_data_castle_owner_faction_end),
  4887. (scene_prop_get_slot, reg0, ":instance_id", slot_scene_prop_capture_faction_id),
  4888. (try_begin),
  4889. (le, reg0, 0),
  4890. (troop_get_slot, reg0, "trp_mission_data", ":scene_prop_owner_slot"),
  4891. (try_end),
  4892. (assign, reg1, ":scene_prop_owner_slot"),
  4893. (else_try),
  4894. (assign, reg0, ":scene_prop_owner_slot"),
  4895. (assign, reg1, -1),
  4896. (try_end),
  4897. (val_clamp, reg0, factions_begin, factions_end),
  4898. ]),
  4899.  
  4900. ("scene_prop_ledger_get_money", # get the amount of gold from the ledger and store it in reg0 and reg1 RAMARAUNT ADD
  4901. [(store_script_param, ":instance_id", 1), # must be valid
  4902.  
  4903. (prop_instance_get_variation_id_2, ":scene_prop_ledger_amount", ":instance_id"),
  4904. (val_mul, ":scene_prop_ledger_amount", 10000),
  4905. (assign, reg0, ":scene_prop_ledger_amount"),
  4906. (val_mul, ":scene_prop_ledger_amount", .05),
  4907. (assign, reg1, ":scene_prop_ledger_amount"),
  4908.  
  4909. ]),
  4910.  
  4911. ("cf_can_change_faction", # check that a player can change to the selected faction, storing the error message in reg1 if not
  4912. [(store_script_param, ":player_id", 1), # must be valid
  4913. (store_script_param, ":faction_id", 2),
  4914.  
  4915. (try_begin),
  4916. (faction_slot_eq, ":faction_id", slot_faction_is_active, 0),
  4917. (assign, reg1, "str_scene_error_this_faction_is_not_active"),
  4918. (else_try),
  4919. (assign, reg1, 0),
  4920. (try_end),
  4921. (eq, reg1, 0),
  4922. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  4923. (assign, reg0, ":player_faction_id"),
  4924. (try_begin),
  4925. (neq, ":player_faction_id", ":faction_id"),
  4926. (neq, ":player_faction_id", "fac_commoners"),
  4927. (neq, ":faction_id", "fac_commoners"),
  4928. (assign, reg1, "str_must_leave_s1_first"),
  4929. (try_end),
  4930. (eq, reg1, 0),
  4931. (try_begin),
  4932. (neq, ":faction_id", "fac_outlaws"),
  4933. (eq, ":player_faction_id", "fac_outlaws"),
  4934. (player_slot_ge, ":player_id", slot_player_outlaw_rating, 1),
  4935. (assign, reg1, "str_you_have_been_outlawed"),
  4936. (try_end),
  4937. (eq, reg1, 0),
  4938. ]),
  4939.  
  4940. ("cf_faction_set_lord", # server: try set a faction's lord, failing if the player id and unique id don't match
  4941. [(store_script_param, ":player_id", 1), # if valid, checked against unique_id
  4942. (store_script_param, ":unique_id", 2), # if player_id is not valid, store in a faction slot so they are set lord when reconnected
  4943. (store_script_param, ":faction_id", 3),
  4944.  
  4945. (assign, ":fail", 0),
  4946. (try_begin),
  4947. (neg|player_is_active, ":player_id"),
  4948. (store_mission_timer_a, ":last_seen_time"),
  4949. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, ":last_seen_time"),
  4950. (else_try),
  4951. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  4952. (player_get_unique_id, ":player_unique_id", ":player_id"),
  4953. (eq, ":player_unique_id", ":unique_id"),
  4954. (call_script, "script_player_set_lord", ":player_id", ":faction_id"),
  4955. (else_try),
  4956. (assign, ":fail", 1),
  4957. (try_end),
  4958. (eq, ":fail", 0),
  4959. (faction_set_slot, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  4960. ]),
  4961.  
  4962. ("player_set_lord", # server: set a player as lord of a faction, changing all the appropriate slots
  4963. [(store_script_param, ":player_id", 1), # must be valid
  4964. (store_script_param, ":faction_id", 2),
  4965.  
  4966. (get_max_players, ":max_players"),
  4967. (try_for_range, ":other_player_id", 1, ":max_players"),
  4968. (player_is_active, ":other_player_id"),
  4969. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_player_set_slot, ":player_id", slot_player_is_lord, 1),
  4970. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":faction_id"),
  4971. (neq, ":other_player_id", ":player_id"),
  4972. (player_get_slot, ":was_lord", ":other_player_id", slot_player_is_lord),
  4973. (player_set_slot, ":other_player_id", slot_player_is_lord, 0),
  4974. (player_set_slot, ":other_player_id", slot_player_last_faction_kicked_from, 0),
  4975. (player_get_slot, ":has_door_key", ":other_player_id", slot_player_has_faction_door_key),
  4976. (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"),
  4977. (player_get_slot, ":has_money_key", ":other_player_id", slot_player_has_faction_money_key),
  4978. (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"),
  4979. (player_get_slot, ":has_item_key", ":other_player_id", slot_player_has_faction_item_key),
  4980. (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"),
  4981. (try_begin), # for the previous lord, remove the announcement permission, but leave all other settings unchanged
  4982. (eq, ":was_lord", 1),
  4983. (assign, ":can_announce", 0),
  4984. (player_set_slot, ":other_player_id", slot_player_can_faction_announce, ":can_announce"),
  4985. (else_try),
  4986. (player_get_slot, ":can_announce", ":other_player_id", slot_player_can_faction_announce),
  4987. (try_end),
  4988. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_can_faction_announce, ":can_announce"),
  4989. (player_get_slot, ":is_muted", ":other_player_id", slot_player_faction_chat_muted),
  4990. (multiplayer_send_3_int_to_player, ":player_id", server_event_player_set_slot, ":other_player_id", slot_player_faction_chat_muted, ":is_muted"),
  4991. (try_end),
  4992. (player_set_slot, ":player_id", slot_player_is_lord, 1),
  4993. (player_set_slot, ":player_id", slot_player_has_faction_door_key, 1),
  4994. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 1),
  4995. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 1),
  4996. (player_set_slot, ":player_id", slot_player_can_faction_announce, 1),
  4997. (player_set_slot, ":player_id", slot_player_faction_chat_muted, 0),
  4998. (faction_set_slot, ":faction_id", slot_faction_lord_last_seen_time, 0),
  4999. (str_store_faction_name, s1, ":faction_id"),
  5000. (str_store_player_username, s10, ":player_id"),
  5001. (server_add_message_to_log, "str_s10_now_lord_of_s1"),
  5002. ]),
  5003.  
  5004. ("cf_player_is_lord",
  5005. [(store_script_param, ":player_id", 1), # must be valid
  5006.  
  5007. (assign, ":fail", 0),
  5008. (try_begin),
  5009. (multiplayer_is_server),
  5010. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  5011. (is_between, ":faction_id", factions_begin, factions_end),
  5012. (player_get_unique_id, ":unique_id", ":player_id"),
  5013. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  5014. (else_try),
  5015. (neg|multiplayer_is_server),
  5016. (player_slot_eq, ":player_id", slot_player_is_lord, 1),
  5017. (else_try),
  5018. (assign, ":fail", 1),
  5019. (try_end),
  5020. (eq, ":fail", 0),
  5021. ]),
  5022.  
  5023. ("cf_player_can_use_troop", # check if the player meets restrictions for certain troops
  5024. [(store_script_param, ":player_id", 1), # must be valid
  5025. (store_script_param, ":troop_id", 2),
  5026.  
  5027. (assign, ":fail", 0),
  5028. (try_begin),
  5029. (eq, ":troop_id", "trp_godlike_hero"),
  5030. (try_begin),
  5031. (player_is_admin, ":player_id"),
  5032. (player_slot_eq, ":player_id", slot_player_admin_no_godlike_troop, 0),
  5033. (else_try),
  5034. (assign, ":fail", 1),
  5035. (try_end),
  5036. (else_try),
  5037. (store_skill_level, ":leadership", "skl_leadership", ":troop_id"),
  5038. (eq, ":leadership", 0),
  5039. (else_try),
  5040. (call_script, "script_cf_player_is_lord", ":player_id"),
  5041. (else_try),
  5042. (assign, ":fail", 1),
  5043. (try_end),
  5044. (eq, ":fail", 0),
  5045. ]),
  5046.  
  5047. ("change_faction", # server: change a player's faction
  5048. [(store_script_param, ":player_id", 1), # must be valid
  5049. (store_script_param, ":faction_id", 2),
  5050. (store_script_param, ":change_faction_type", 3), # constants starting with change_faction_type_
  5051.  
  5052. (try_begin),
  5053. (neg|player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  5054. (player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  5055. (get_max_players, ":num_players"),
  5056. (try_for_range, ":other_player_id", 1, ":num_players"),
  5057. (player_is_active, ":other_player_id"),
  5058. (try_begin),
  5059. (eq, ":change_faction_type", 0),
  5060. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_player_set_slot, ":player_id", slot_player_faction_id, ":faction_id"),
  5061. (else_try),
  5062. (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"),
  5063. (try_end),
  5064. (try_end),
  5065. (player_set_slot, ":player_id", slot_player_is_lord, 0), # reset all faction permissions
  5066. (player_get_unique_id, ":unique_id", ":player_id"),
  5067. (try_begin),
  5068. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  5069. (faction_set_slot, ":faction_id", slot_faction_lord_player_uid, 0),
  5070. (try_end),
  5071. (player_set_slot, ":player_id", slot_player_has_faction_door_key, 0),
  5072. (player_set_slot, ":player_id", slot_player_has_faction_money_key, 0),
  5073. (player_set_slot, ":player_id", slot_player_has_faction_item_key, 0),
  5074. (player_set_slot, ":player_id", slot_player_can_faction_announce, 0),
  5075. (str_store_player_username, s0, ":player_id"),
  5076. (try_begin),
  5077. (eq, ":change_faction_type", change_faction_type_outlawed),
  5078. (server_add_message_to_log, "str_s0_has_been_outlawed"),
  5079. (else_try),
  5080. (str_store_faction_name, s1, ":faction_id"),
  5081. (server_add_message_to_log, "str_s0_joined_the_s1"),
  5082. (try_end),
  5083. (try_end),
  5084. ]),
  5085.  
  5086. ("cf_change_faction", # server: check if a player can join the faction associated with a scene prop, joining if so
  5087. [(store_script_param, ":agent_id", 1), # must be valid
  5088. (store_script_param, ":instance_id", 2), # must be valid
  5089. (store_script_param, ":change_faction_type", 3), # constants starting with change_faction_type_
  5090.  
  5091. (agent_get_player_id, ":player_id", ":agent_id"),
  5092. (player_is_active, ":player_id"),
  5093. (agent_is_alive, ":agent_id"),
  5094. (assign, ":fail", 0),
  5095. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5096. (assign, ":faction_id", reg0),
  5097. (try_begin), # either a non castle faction or linked to a castle - not a 'mercenary' station to allow resurrecting a faction
  5098. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_mercenary, 1),
  5099. (else_try), # otherwise, check to ensure the faction owns no castles (where the player should train at instead)
  5100. (assign, ":loop_end", slot_mission_data_castle_owner_faction_end),
  5101. (try_for_range, ":castle_no", slot_mission_data_castle_owner_faction_begin, ":loop_end"),
  5102. (troop_slot_eq, "trp_mission_data", ":castle_no", ":faction_id"),
  5103. (store_add, ":castle_allows_training_slot", slot_mission_data_castle_allows_training_begin, ":castle_no"),
  5104. (troop_slot_eq, "trp_mission_data", ":castle_allows_training_slot", 1),
  5105. (assign, ":loop_end", -1),
  5106. (try_end),
  5107. (neq, ":loop_end", -1),
  5108. (else_try),
  5109. (assign, ":fail", 1),
  5110. (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"),
  5111. (try_end),
  5112. (eq, ":fail", 0),
  5113. (try_begin),
  5114. (call_script, "script_cf_can_change_faction", ":player_id", ":faction_id"),
  5115. (call_script, "script_change_faction", ":player_id", ":faction_id", ":change_faction_type"),
  5116. (else_try),
  5117. (assign, ":fail", 1),
  5118. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, reg1, preset_message_faction|preset_message_fail_sound, reg0),
  5119. (try_end),
  5120. (eq, ":fail", 0),
  5121. ]),
  5122.  
  5123. ("player_set_worse_respawn_troop", # server: crude check to try pick whether the players current troop or the target has worse stats
  5124. [(store_script_param, ":player_id", 1), # must be valid
  5125. (store_script_param, ":troop_id", 2),
  5126.  
  5127. (try_begin),
  5128. (player_get_agent_id, ":agent_id", ":player_id"),
  5129. (agent_is_active, ":agent_id"),
  5130. (agent_get_troop_id, ":current_troop_id", ":agent_id"),
  5131. (else_try),
  5132. (player_get_troop_id, ":current_troop_id", ":player_id"),
  5133. (try_end),
  5134. (store_attribute_level, ":strength", ":current_troop_id", ca_strength),
  5135. (try_begin),
  5136. (ge, ":strength", 9),
  5137. (player_set_troop_id, ":player_id", ":troop_id"),
  5138. (try_end),
  5139. ]),
  5140.  
  5141. ("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
  5142. [(store_script_param, ":agent_id", 1), # must be valid
  5143. (store_script_param, ":instance_id", 2), # must be valid
  5144.  
  5145. (call_script, "script_cf_change_faction", ":agent_id", ":instance_id", change_faction_type_no_respawn),
  5146. (agent_get_player_id, ":player_id", ":agent_id"),
  5147. (scene_prop_get_slot, ":troop_id", ":instance_id", slot_scene_prop_troop_id),
  5148. (call_script, "script_player_set_worse_respawn_troop", ":player_id", ":troop_id"),
  5149. ]),
  5150.  
  5151. ("cf_change_troop", # server: try change a player's troop and / or faction
  5152. [(store_script_param, ":agent_id", 1), # must be valid
  5153. (store_script_param, ":instance_id", 2), # must be valid
  5154. (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
  5155.  
  5156. (agent_get_player_id, ":player_id", ":agent_id"),
  5157. (player_is_active, ":player_id"),
  5158. (agent_is_alive, ":agent_id"),
  5159. (scene_prop_get_slot, ":troop_id", ":instance_id", slot_scene_prop_troop_id),
  5160. (assign, ":fail", 0),
  5161. (try_begin),
  5162. (call_script, "script_cf_player_can_use_troop", ":player_id", ":troop_id"),
  5163. (else_try),
  5164. (assign, ":fail", 1),
  5165. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  5166. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_you_are_not_lord_of_s1", preset_message_faction, ":faction_id"),
  5167. (try_end),
  5168. (eq, ":fail", 0),
  5169. (agent_get_troop_id, ":current_troop_id", ":agent_id"),
  5170. (try_begin),
  5171. (neq, ":current_troop_id", ":troop_id"),
  5172. (eq, ":cancel", 0),
  5173. (scene_prop_get_slot, ":gold_cost", ":instance_id", slot_scene_prop_gold_value),
  5174. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_cost"),
  5175. (call_script, "script_cf_change_faction", ":agent_id", ":instance_id", change_faction_type_respawn),
  5176. (call_script, "script_player_adjust_gold", ":player_id", ":gold_cost", -1),
  5177. (player_set_troop_id, ":player_id", ":troop_id"),
  5178. (try_begin),
  5179. (store_skill_level, ":new_leadership", "skl_leadership", ":troop_id"),
  5180. (gt, ":new_leadership", 0),
  5181. (store_skill_level, ":old_leadership", "skl_leadership", ":current_troop_id"),
  5182. (eq, ":old_leadership", 0),
  5183. (player_set_slot, ":player_id", slot_player_non_lord_troop_id, ":current_troop_id"),
  5184. (try_end),
  5185. (call_script, "script_player_add_equipped_items", ":player_id", ":troop_id"),
  5186. (call_script, "script_player_add_spawn_items", ":player_id", 1),
  5187. (call_script, "script_player_respawn_in_place", ":player_id"),
  5188. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5189. (call_script, "script_castle_receive_gold", reg1, ":gold_cost", castle_training_gold_percentage),
  5190. (else_try),
  5191. (eq, ":current_troop_id", ":troop_id"),
  5192. (call_script, "script_cf_change_faction", ":agent_id", ":instance_id", change_faction_type_no_respawn),
  5193. (player_set_troop_id, ":player_id", ":troop_id"),
  5194. (else_try),
  5195. (assign, ":fail", 1),
  5196. (try_end),
  5197. (eq, ":fail", 0),
  5198. ]),
  5199.  
  5200. ("cf_check_troop_can_equip_item", # check the item has no hard requirements that prevent the troop or player from equipping it
  5201. [(store_script_param, ":troop_id", 1),
  5202. (store_script_param, ":item_id", 2),
  5203. (store_script_param, ":player_id", 3),
  5204.  
  5205. (assign, ":fail", 0),
  5206. (try_begin),
  5207. (player_is_active, ":player_id"),
  5208. (player_get_gender, ":player_gender", ":player_id"),
  5209. (item_get_slot, ":item_gender", ":item_id", slot_item_gender),
  5210. (neq, ":item_gender", 0), # male gendered items can be equipped by anyone
  5211. (neq, ":player_gender", ":item_gender"),
  5212. (assign, ":fail", 1),
  5213. (else_try),
  5214. (item_get_slot, ":difficulty", ":item_id", slot_item_difficulty),
  5215. (ge, ":difficulty", 30),
  5216. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  5217. (lt, ":troop_level", ":difficulty"),
  5218. (assign, ":fail", 1),
  5219. (try_end),
  5220. (eq, ":fail", 0),
  5221. ]),
  5222.  
  5223. ("cf_change_armor", # server: check whether the player can equip the armor item, changing if so
  5224. [(store_script_param, ":agent_id", 1),
  5225. (store_script_param, ":item_id", 2),
  5226.  
  5227. (agent_is_active, ":agent_id"),
  5228. (assign, ":fail", 0),
  5229. (agent_get_player_id, ":player_id", ":agent_id"),
  5230. (try_begin),
  5231. (player_is_active, ":player_id"),
  5232. (agent_get_troop_id, ":troop_id", ":agent_id"),
  5233. (try_begin),
  5234. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  5235. (else_try),
  5236. (assign, ":fail", 1),
  5237. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_cant_equip_item", preset_message_error),
  5238. (try_end),
  5239. (eq, ":fail", 0),
  5240. (item_get_type, ":item_type", ":item_id"),
  5241. (store_add, ":player_slot", ":item_type", slot_player_equip_head - itp_type_head_armor),
  5242. (player_set_slot, ":player_id", ":player_slot", ":item_id"),
  5243. (else_try),
  5244. (agent_is_non_player, ":agent_id"),
  5245. (agent_is_alive, ":agent_id"),
  5246. (else_try),
  5247. (assign, ":fail", 1),
  5248. (try_end),
  5249. (eq, ":fail", 0),
  5250. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  5251. ]),
  5252.  
  5253. ("change_armor", # server: equip an armor item on an agent, sending messages to all clients to update the mesh
  5254. [(store_script_param, ":agent_id", 1),
  5255. (store_script_param, ":item_id", 2),
  5256.  
  5257. (call_script, "script_agent_equip_armor", ":agent_id", ":item_id"),
  5258. (get_max_players, ":num_players"),
  5259. (try_for_range, ":player_id", 1, ":num_players"),
  5260. (player_is_active, ":player_id"),
  5261. (multiplayer_send_2_int_to_player, ":player_id", server_event_agent_equip_armor, ":agent_id", ":item_id"),
  5262. (try_end),
  5263. ]),
  5264.  
  5265. ("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
  5266. [(store_script_param, ":agent_id", 1), # must be valid
  5267. (store_script_param, ":item_id", 2),
  5268.  
  5269. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 1, 1),
  5270. (try_begin),
  5271. (is_between, ":item_id", all_items_begin, all_items_end),
  5272. (agent_equip_item, ":agent_id", ":item_id"),
  5273. (else_try),
  5274. (is_between, ":item_id", "itm_no_head", "itm_no_horse"),
  5275. (store_sub, ":equip_slot", ":item_id", "itm_no_head"),
  5276. (val_add, ":equip_slot", ek_head),
  5277. (agent_get_item_slot, ":equipped_item_id", ":agent_id", ":equip_slot"),
  5278. (gt, ":equipped_item_id", -1),
  5279. (agent_unequip_item, ":agent_id", ":equipped_item_id"),
  5280. (try_end),
  5281. (try_begin),
  5282. (neg|multiplayer_is_server),
  5283. (try_begin), # for admin armor disable agent visibility as well, to remove shadows
  5284. (is_between, ":item_id", "itm_invisible_head", "itm_invisible_sword"),
  5285. (agent_has_item_equipped, ":agent_id", "itm_invisible_head"),
  5286. (agent_has_item_equipped, ":agent_id", "itm_invisible_body"),
  5287. (agent_has_item_equipped, ":agent_id", "itm_invisible_foot"),
  5288. (agent_has_item_equipped, ":agent_id", "itm_invisible_hand"),
  5289. (agent_set_visibility, ":agent_id", 0),
  5290. (else_try),
  5291. (agent_set_visibility, ":agent_id", 1),
  5292. (try_end),
  5293. (try_end),
  5294. ]),
  5295.  
  5296. ("agent_remove_empty_ammo_stacks", # server: remove empty ammo stacks to free up slots for buying items and inventory transfers
  5297. [(store_script_param, ":agent_id", 1), # must be valid
  5298.  
  5299. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  5300. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  5301. (ge, ":item_id", all_items_begin),
  5302. (item_get_type, ":item_type", ":item_id"),
  5303. (this_or_next|eq, ":item_type", itp_type_arrows),
  5304. (this_or_next|eq, ":item_type", itp_type_bolts),
  5305. (eq, ":item_type", itp_type_thrown),
  5306. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  5307. (le, ":ammo", 0),
  5308. (val_add, ":equip_slot", 1),
  5309. (agent_unequip_item, ":agent_id", ":item_id", ":equip_slot"),
  5310. (try_end),
  5311. ]),
  5312.  
  5313. ("cf_buy_item", # server: handle players trying to buy an item from a stockpile
  5314. [(store_script_param, ":agent_id", 1), # must be valid
  5315. (store_script_param, ":instance_id", 2), # must be valid
  5316.  
  5317. (agent_get_player_id, ":player_id", ":agent_id"),
  5318. (player_is_active, ":player_id"),
  5319. (call_script, "script_agent_remove_empty_ammo_stacks", ":agent_id"),
  5320. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5321. (is_between, ":item_id", all_items_begin, all_items_end),
  5322. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5323. (assign, ":gold_value", reg0),
  5324. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  5325. (assign, ":fail", 0),
  5326. (item_get_type, ":item_type", ":item_id"),
  5327. (try_begin),
  5328. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  5329. (try_begin),
  5330. (call_script, "script_cf_change_armor", ":agent_id", ":item_id"),
  5331. (else_try),
  5332. (assign, ":fail", 1),
  5333. (try_end),
  5334. (else_try),
  5335. (set_spawn_position, pos1),
  5336. (eq, ":item_type", itp_type_horse),
  5337. (store_mission_timer_a, ":time"),
  5338. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  5339. (store_sub, ":interval", ":time", ":last_action_time"),
  5340. (try_begin), # prevent players from quickly and repeatedly buying horses to try overload the server
  5341. (ge, ":interval", repeat_action_min_interval),
  5342. (try_begin),
  5343. (neg|item_slot_eq, ":item_id", slot_item_animal_adult_item_id, 0),
  5344. (try_begin),
  5345. (call_script, "script_cf_can_spawn_herd_animal", ":agent_id"),
  5346. (call_script, "script_cf_spawn_herd_animal", ":item_id", -1),
  5347. (else_try),
  5348. (assign, ":fail", 1),
  5349. (try_end),
  5350. (else_try),
  5351. (spawn_horse, ":item_id"),
  5352. (try_end),
  5353. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  5354. (else_try),
  5355. (assign, ":fail", 1),
  5356. (try_end),
  5357. (else_try),
  5358. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  5359. (prop_instance_set_position, reg0, pos1),
  5360. (try_end),
  5361. (eq, ":fail", 0),
  5362. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", -1),
  5363. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5364. (call_script, "script_castle_receive_gold", reg1, ":gold_value", castle_tax_gold_percentage),
  5365. ]),
  5366.  
  5367. ("cf_sell_item", # server: handle players trying to sell an item to a stockpile
  5368. [(store_script_param, ":agent_id", 1), # must be valid
  5369. (store_script_param, ":instance_id", 2), # must be valid
  5370.  
  5371. (agent_get_player_id, ":player_id", ":agent_id"),
  5372. (player_is_active, ":player_id"),
  5373. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5374. (is_between, ":item_id", all_items_begin, all_items_end),
  5375. (assign, ":fail", 1),
  5376. (item_get_type, ":item_type", ":item_id"),
  5377. (try_begin),
  5378. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  5379. (try_begin), # use a dummy "no_" item id when removing armor
  5380. (agent_has_item_equipped, ":agent_id", ":item_id"),
  5381. (store_sub, ":no_item_id", ":item_type", itp_type_head_armor),
  5382. (val_add, ":no_item_id", "itm_no_head"),
  5383. (store_sub, ":player_slot", ":item_type", itp_type_head_armor),
  5384. (val_add, ":player_slot", slot_player_equip_head),
  5385. (player_set_slot, ":player_id", ":player_slot", ":no_item_id"),
  5386. (call_script, "script_change_armor", ":agent_id", ":no_item_id"),
  5387. (assign, ":fail", 0),
  5388. (try_end),
  5389. (else_try),
  5390. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  5391. (assign, ":fail", 0),
  5392. (try_end),
  5393. (eq, ":fail", 0),
  5394. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5395. (call_script, "script_calculate_stockpile_taxed_price", ":instance_id", reg0),
  5396. (call_script, "script_player_adjust_gold", ":player_id", reg0, 1),
  5397. ]),
  5398.  
  5399. ("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
  5400. [(store_script_param, ":agent_id", 1), # must be valid
  5401. (store_script_param, ":instance_id", 2), # must be valid
  5402.  
  5403. (assign, reg0, 0),
  5404. (agent_get_player_id, ":player_id", ":agent_id"),
  5405. (player_is_active, ":player_id"),
  5406. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5407. (is_between, ":item_id", all_items_begin, all_items_end),
  5408. (item_get_type, ":item_type", ":item_id"),
  5409. (eq, ":item_type", itp_type_horse),
  5410. (assign, ":error_string_id", -1),
  5411. (agent_get_slot, ":horse_agent_id", ":agent_id", slot_agent_last_horse_ridden),
  5412. (agent_is_active, ":horse_agent_id"),
  5413. (agent_is_alive, ":horse_agent_id"),
  5414. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  5415. (eq, ":horse_item_id", ":item_id"),
  5416. (assign, reg0, 1),
  5417. (agent_slot_eq, ":horse_agent_id", slot_agent_horse_last_rider, ":agent_id"),
  5418. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  5419. (assign, ":error_string_id", "str_dismount_to_sell"),
  5420. (try_begin), # only allow selling horses that were last ridden by the player, are not badly wounded, and are close enough to the stockpile
  5421. (neq, ":rider_agent_id", ":agent_id"),
  5422. (assign, ":error_string_id", -1),
  5423. (eq, ":rider_agent_id", -1),
  5424. (assign, ":error_string_id", "str_horse_too_wounded_to_sell"),
  5425. (store_agent_hit_points, ":horse_hit_points", ":horse_agent_id", 0),
  5426. (gt, ":horse_hit_points", 50),
  5427. (assign, ":error_string_id", -1),
  5428. (store_mission_timer_a, ":time"),
  5429. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  5430. (store_sub, ":interval", ":time", ":last_action_time"),
  5431. (ge, ":interval", repeat_action_min_interval),
  5432. (assign, reg0, 0),
  5433. (agent_get_position, pos20, ":agent_id"),
  5434. (agent_get_position, pos21, ":horse_agent_id"),
  5435. (get_sq_distance_between_positions, ":sq_distance", pos20, pos21),
  5436. (le, ":sq_distance", sq(max_distance_to_use)),
  5437. (assign, ":error_string_id", 0),
  5438. (assign, reg0, 1),
  5439. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  5440. (else_try),
  5441. (gt, ":error_string_id", 0),
  5442. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":error_string_id", preset_message_error),
  5443. (try_end),
  5444. (eq, ":error_string_id", 0),
  5445. (agent_fade_out, ":horse_agent_id"),
  5446. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5447. (call_script, "script_calculate_stockpile_taxed_price", ":instance_id", reg0),
  5448. (store_mul, ":gold_value", reg0, ":horse_hit_points"),
  5449. (val_div, ":gold_value", 100),
  5450. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5451. ]),
  5452.  
  5453. ("cf_export_item", # server: handle players exporting an item out of the game world
  5454. [(store_script_param, ":agent_id", 1), # must be valid
  5455. (store_script_param, ":instance_id", 2), # must be valid
  5456.  
  5457. (agent_get_player_id, ":player_id", ":agent_id"),
  5458. (player_is_active, ":player_id"),
  5459. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5460. (is_between, ":item_id", all_items_begin, all_items_end),
  5461. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  5462. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", base_export_percentage),
  5463. (assign, ":gold_value", reg0),
  5464. (prop_instance_get_variation_id_2, ":tax_multiplier", ":instance_id"),
  5465. (try_begin),
  5466. (neq, "$g_game_type", "mt_feudalism"),
  5467. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5468. (else_try),
  5469. (val_add, ":tax_multiplier", 100),
  5470. (try_end),
  5471. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5472. (call_script, "script_castle_receive_gold", reg1, ":gold_value", ":tax_multiplier"),
  5473. ]),
  5474.  
  5475. ("cf_gain_gold", # server: give a player gold based on a scene prop's preset value
  5476. [(store_script_param, ":agent_id", 1), # must be valid
  5477. (store_script_param, ":instance_id", 2), # must be valid
  5478.  
  5479. (agent_get_player_id, ":player_id", ":agent_id"),
  5480. (player_is_active, ":player_id"),
  5481. (scene_prop_get_slot, ":gold_value", ":instance_id", slot_scene_prop_gold_value),
  5482. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5483. ]),
  5484.  
  5485. ("cf_read_book", # cause a book to show in a presentation window
  5486. [(store_script_param, ":book_string_id", 1),
  5487. (store_script_param, ":agent_id", 2), # if valid, show on this player's client
  5488.  
  5489. (try_begin),
  5490. (multiplayer_is_server),
  5491. (agent_get_player_id, ":player_id", ":agent_id"),
  5492. (player_is_active, ":player_id"),
  5493. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":book_string_id", preset_message_read_object),
  5494. (else_try),
  5495. (call_script, "script_preset_message", ":book_string_id", preset_message_read_object, 0, 0),
  5496. (try_end),
  5497. ]),
  5498.  
  5499. ("cf_buy_banner", # server: handle players trying to buy a faction banner
  5500. [(store_script_param, ":agent_id", 1), # must be valid
  5501. (store_script_param, ":instance_id", 2), # must be valid
  5502.  
  5503. (agent_get_player_id, ":player_id", ":agent_id"),
  5504. (player_is_active, ":player_id"),
  5505. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  5506. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5507. (assign, ":faction_id", reg0),
  5508. (try_begin),
  5509. (eq, ":faction_id", ":player_faction_id"),
  5510. (assign, ":fail", 0),
  5511. (else_try),
  5512. (assign, ":fail", 1),
  5513. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, "str_not_a_member_of_s1", preset_message_faction, ":faction_id"),
  5514. (try_end),
  5515. (eq, ":fail", 0),
  5516. (faction_get_slot, ":banner_no", ":faction_id", slot_faction_banner_mesh),
  5517. (val_sub, ":banner_no", banner_meshes_begin),
  5518. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  5519. (val_add, ":item_id", ":banner_no"),
  5520. (is_between, ":item_id", banner_items_begin, banner_items_end),
  5521. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  5522. (assign, ":gold_value", reg0),
  5523. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  5524. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", -1),
  5525. (prop_instance_get_position, pos1, ":instance_id"),
  5526. (position_move_y, pos1, -5),
  5527. (set_spawn_position, pos1),
  5528. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  5529. ]),
  5530.  
  5531. ("cf_use_destroy_heap", # server: allow players to permanently destroy wielded items or the contents of an attached cart
  5532. [(store_script_param, ":agent_id", 1), # must be valid
  5533.  
  5534. (assign, ":fail", 1),
  5535. (agent_get_horse, ":attach_agent_id", ":agent_id"),
  5536. (try_begin),
  5537. (le, ":attach_agent_id", -1),
  5538. (assign, ":attach_agent_id", ":agent_id"),
  5539. (try_end),
  5540. (agent_get_attached_scene_prop, ":attached_instance_id", ":attach_agent_id"),
  5541. (try_begin),
  5542. (prop_instance_is_valid, ":attached_instance_id"),
  5543. (try_begin),
  5544. (scene_prop_get_slot, ":inventory_slot_end", ":attached_instance_id", slot_scene_prop_inventory_count),
  5545. (gt, ":inventory_slot_end", 0),
  5546. (val_add, ":inventory_slot_end", slot_scene_prop_inventory_begin),
  5547. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_slot_end"),
  5548. (scene_prop_set_slot, ":attached_instance_id", ":inventory_slot", 0),
  5549. (try_end),
  5550. (assign, ":fail", 0),
  5551. (get_max_players, ":max_players"),
  5552. (try_for_range, ":other_player_id", 1, ":max_players"),
  5553. (player_is_active, ":other_player_id"),
  5554. (player_slot_eq, ":other_player_id", slot_player_accessing_instance_id, ":attached_instance_id"),
  5555. (player_set_slot, ":other_player_id", slot_player_accessing_instance_id, 0),
  5556. (multiplayer_send_int_to_player, ":other_player_id", server_event_show_inventory, -1),
  5557. (try_end),
  5558. (try_end),
  5559. (else_try),
  5560. (agent_get_wielded_item, ":item_id", ":agent_id", 0),
  5561. (try_begin),
  5562. (is_between, ":item_id", all_items_begin, all_items_end),
  5563. (else_try),
  5564. (agent_get_wielded_item, ":item_id", ":agent_id", 1),
  5565. (is_between, ":item_id", all_items_begin, all_items_end),
  5566. (else_try),
  5567. (assign, ":item_id", -1),
  5568. (try_end),
  5569. (neq, ":item_id", -1),
  5570. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  5571. (try_begin),
  5572. (eq, ":item_id", "itm_money_bag"),
  5573. (call_script, "script_cf_pop_agent_money_bag_value", ":agent_id"),
  5574. (try_end),
  5575. (assign, ":fail", 0),
  5576. (try_end),
  5577. (eq, ":fail", 0),
  5578. ]),
  5579.  
  5580. ("remove_scene_prop", # server: move an unused scene prop to where it is unlikely to be visible
  5581. [(store_script_param, ":instance_id", 1),
  5582.  
  5583. (set_fixed_point_multiplier, 100),
  5584. (position_set_x, pos0, -5000),
  5585. (position_set_y, pos0, -5000),
  5586. (position_set_z, pos0, -5000),
  5587. (prop_instance_set_position, ":instance_id", pos0),
  5588. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  5589. (prop_instance_enable_physics, ":instance_id", 0),
  5590. ]),
  5591.  
  5592. ("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
  5593. [(store_script_param, ":scene_prop_id", 1), # the desired scene prop kind
  5594.  
  5595. (scene_prop_get_num_instances, ":instance_num", ":scene_prop_id"),
  5596. (try_for_range, ":instance_no", 0, ":instance_num"),
  5597. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  5598. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  5599. (assign, ":instance_num", -1),
  5600. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  5601. (prop_instance_enable_physics, ":instance_id", 1),
  5602. (assign, reg0, ":instance_id"),
  5603. (try_end),
  5604. (try_begin),
  5605. (neq, ":instance_num", -1),
  5606. (set_spawn_position, pos0),
  5607. (spawn_scene_prop, ":scene_prop_id"),
  5608. (try_end),
  5609. ]),
  5610.  
  5611. ("cf_can_use_scene_prop", # check whether a prop instance id is the correct scene prop kind and is in range of the agent
  5612. [(store_script_param, ":player_id", 1),
  5613. (store_script_param, ":instance_id", 2),
  5614. (store_script_param, ":required_scene_prop_id", 3),
  5615.  
  5616. (prop_instance_is_valid, ":instance_id"),
  5617. (prop_instance_get_scene_prop_kind, ":scene_prop_id", ":instance_id"),
  5618. (eq, ":scene_prop_id", ":required_scene_prop_id"),
  5619. (player_is_active, ":player_id"),
  5620. (player_get_agent_id, ":agent_id", ":player_id"),
  5621. (agent_is_alive, ":agent_id"),
  5622. (agent_get_position, pos1, ":agent_id"),
  5623. (prop_instance_get_position, pos2, ":instance_id"),
  5624. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  5625. (le, ":sq_distance", sq(max_distance_to_use)),
  5626. ]),
  5627.  
  5628. ("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
  5629. [(store_script_param, ":scene_prop_id", 1), # the desired scene prop kind
  5630. (store_script_param, ":maximum_sq_distance", 2), # this is the maximum distance to check squared, so use the sq() function for passing preset values
  5631.  
  5632. (scene_prop_get_num_instances, ":count", ":scene_prop_id"),
  5633. (gt, ":count", 0),
  5634. (assign, ":closest_sq_distance", ":maximum_sq_distance"),
  5635. (try_for_range, ":instance_no", 0, ":count"),
  5636. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  5637. (prop_instance_get_position, pos0, ":instance_id"),
  5638. (get_sq_distance_between_positions, ":sq_distance", pos0, pos1),
  5639. (lt, ":sq_distance", ":closest_sq_distance"),
  5640. (assign, ":closest_sq_distance", ":sq_distance"),
  5641. (assign, reg0, ":instance_id"),
  5642. (try_end),
  5643. (lt, ":closest_sq_distance", ":maximum_sq_distance"),
  5644. ]),
  5645.  
  5646. ("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
  5647. [(store_script_param, ":player_id", 1), # must be valid
  5648. (store_script_param, ":instance_id", 2),
  5649. (store_script_param, ":gold_value", 3), # positive values to deposit, negative to withdraw
  5650.  
  5651. (assign, ":fail_message", -1),
  5652. (try_begin),
  5653. (neq, "$g_game_type", "mt_no_money"),
  5654. (neq, ":gold_value", 0),
  5655. (assign, ":fail_message", "str_no_money_chest_nearby"),
  5656. (call_script, "script_cf_can_use_scene_prop", ":player_id", ":instance_id", "spr_pw_castle_money_chest"),
  5657. (scene_prop_get_slot, ":chest_gold", ":instance_id", slot_scene_prop_stock_count),
  5658. (try_begin),
  5659. (lt, ":gold_value", 0),
  5660. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  5661. (try_begin),
  5662. (eq, reg1, -1),
  5663. (else_try),
  5664. (neg|multiplayer_is_server),
  5665. (else_try),
  5666. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  5667. (else_try),
  5668. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  5669. (player_slot_eq, ":player_id", slot_player_has_faction_money_key, 1),
  5670. (else_try),
  5671. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  5672. (call_script, "script_cf_player_is_lord", ":player_id"),
  5673. (else_try),
  5674. (assign, ":fail_message", "str_cant_open_money_chest"),
  5675. (try_end),
  5676. (neq, ":fail_message", "str_cant_open_money_chest"),
  5677. (assign, ":fail_message", "str_not_enough_money_in_chest"),
  5678. (store_mul, ":gold_requested", ":gold_value", -1),
  5679. (ge, ":chest_gold", ":gold_requested"),
  5680. (try_begin),
  5681. (multiplayer_is_server),
  5682. (val_sub, ":chest_gold", ":gold_requested"),
  5683. (call_script, "script_player_adjust_gold", ":player_id", ":gold_requested", 1),
  5684. (try_end),
  5685. (assign, ":fail_message", 0),
  5686. (else_try),
  5687. (gt, ":gold_value", 0),
  5688. (assign, ":fail_message", "str_dont_have_enough_money"),
  5689. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  5690. (try_begin),
  5691. (multiplayer_is_server),
  5692. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", -1),
  5693. (val_add, ":chest_gold", ":gold_value"),
  5694. (val_clamp, ":chest_gold", 0, max_possible_gold),
  5695. (try_end),
  5696. (assign, ":fail_message", 0),
  5697. (try_end),
  5698. (try_end),
  5699. (try_begin),
  5700. (eq, ":fail_message", 0),
  5701. (try_begin),
  5702. (multiplayer_is_server),
  5703. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":chest_gold"),
  5704. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":chest_gold"),
  5705. (else_try),
  5706. (multiplayer_send_3_int_to_server, client_event_transfer_gold, ":instance_id", ":gold_value"),
  5707. (try_end),
  5708. (else_try),
  5709. (multiplayer_is_server),
  5710. (gt, ":fail_message", 0),
  5711. (neq, ":fail_message", "str_dont_have_enough_money"),
  5712. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":fail_message", preset_message_error),
  5713. (try_end),
  5714. (assign, reg0, ":fail_message"),
  5715. (eq, ":fail_message", 0),
  5716. ]),
  5717.  
  5718. ("cf_drop_money_bag_item", # server: handle players dropping money bags
  5719. [(store_script_param, ":player_id", 1), # must be valid
  5720. (store_script_param, ":gold_amount", 2),
  5721.  
  5722. (player_get_agent_id, ":agent_id", ":player_id"),
  5723. (agent_is_alive, ":agent_id"),
  5724. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_amount"),
  5725. (store_mission_timer_a, ":time"),
  5726. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  5727. (store_sub, ":interval", ":time", ":last_action_time"),
  5728. (this_or_next|ge, ":interval", repeat_action_min_interval),
  5729. (player_is_admin, ":player_id"),
  5730. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  5731. (call_script, "script_player_adjust_gold", ":player_id", ":gold_amount", -1),
  5732. (agent_get_position, pos1, ":agent_id"),
  5733. (position_move_y, pos1, 50),
  5734. (set_spawn_position, pos1),
  5735. (spawn_item, "itm_money_bag", 0, "$g_spawn_item_prune_time"),
  5736. (scene_prop_set_slot, reg0, slot_scene_prop_gold_value, ":gold_amount"),
  5737. ]),
  5738.  
  5739. ("cf_pop_agent_money_bag_value", # remove the last added money bag amount from the agent's slots
  5740. [(store_script_param, ":agent_id", 1), # must be valid
  5741.  
  5742. (assign, ":last_value", 0),
  5743. (try_for_range_backwards, ":value_slot", slot_agent_money_bag_1_value, slot_agent_money_bag_4_value + 1),
  5744. (agent_get_slot, ":value", ":agent_id", ":value_slot"),
  5745. (agent_set_slot, ":agent_id", ":value_slot", ":last_value"),
  5746. (assign, ":last_value", ":value"),
  5747. (try_end),
  5748. (assign, reg0, ":last_value"),
  5749. (gt, ":last_value", 0),
  5750. ]),
  5751.  
  5752. ("cf_use_money_bag_item", # server: handle players retrieving the contents of equipped money bags
  5753. [(store_script_param, ":agent_id", 1), # must be valid
  5754.  
  5755. (neq, "$g_game_type", "mt_no_money"),
  5756. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_money_bag", 1),
  5757. (call_script, "script_cf_pop_agent_money_bag_value", ":agent_id"),
  5758. (assign, ":gold_value", reg0),
  5759. (agent_get_player_id, ":player_id", ":agent_id"),
  5760. (player_is_active, ":player_id"),
  5761. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", 1),
  5762. ]),
  5763.  
  5764. ("check_on_item_picked_up", # server: extra checks when an agent picks up an item
  5765. [(store_script_param, ":agent_id", 1), # must be valid
  5766. (store_script_param, ":item_id", 2),
  5767. (store_script_param, ":instance_id", 3), # must be the item instance's id
  5768.  
  5769. (try_begin),
  5770. (eq, ":item_id", "itm_money_bag"), # since the item instance will be removed immediately aftewards, transfer the contents to an agent slot
  5771. (neq, "$g_game_type", "mt_no_money"),
  5772. (scene_prop_get_slot, ":value", ":instance_id", slot_scene_prop_gold_value),
  5773. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_value, 0),
  5774. (try_for_range, ":value_slot", slot_agent_money_bag_1_value, slot_agent_money_bag_4_value + 1),
  5775. (agent_get_slot, ":next_value", ":agent_id", ":value_slot"),
  5776. (agent_set_slot, ":agent_id", ":value_slot", ":value"),
  5777. (assign, ":value", ":next_value"),
  5778. (try_end),
  5779. (else_try),
  5780. (this_or_next|eq, ":item_id", "itm_invisible_sword"),
  5781. (eq, ":item_id", "itm_admin_scalpel"),
  5782. (agent_get_player_id, ":player_id", ":agent_id"),
  5783. (player_is_active, ":player_id"),
  5784. (neg|player_is_admin, ":player_id"),
  5785. (agent_unequip_item, ":agent_id", ":item_id"),
  5786. (try_end),
  5787. ]),
  5788.  
  5789. ("check_on_item_dropped", # server: extra checks when an agent drops an item
  5790. [(store_script_param, ":agent_id", 1), # must be valid
  5791. (store_script_param, ":item_id", 2),
  5792. (store_script_param, ":instance_id", 3), # must be the dropped item instance's id
  5793. (store_script_param, ":agent_died", 4), # set to 1 for dropping when the agent dies
  5794.  
  5795. (set_fixed_point_multiplier, 100),
  5796. (try_begin), # only check for items over a certain id, near the end of the list
  5797. (le, ":item_id", "itm_lock_pick"),
  5798. (else_try),
  5799. (eq, ":item_id", "itm_money_bag"),
  5800. (try_begin),
  5801. (neq, "$g_game_type", "mt_no_money"),
  5802. (call_script, "script_cf_pop_agent_money_bag_value", ":agent_id"), # transfer from the agent slot into the new dropped item instance
  5803. (scene_prop_set_slot, ":instance_id", slot_scene_prop_gold_value, reg0),
  5804. (try_end),
  5805. (else_try),
  5806. (is_between, ":item_id", "itm_pw_banner_pole_a01", "itm_pw_banner_castle_fac_1a"),
  5807. (neq, ":agent_died", 1), # if not dropped because the agent died, plant the flag pole upright
  5808. (prop_instance_get_position, pos1, ":instance_id"),
  5809. (position_rotate_x, pos1, 90),
  5810. (prop_instance_set_position, ":instance_id", pos1),
  5811. (assign, ":flag_prune_time", "$g_spawn_item_prune_time"),
  5812. (val_max, ":flag_prune_time", 3600), # prevent it disappearing for at least an hour
  5813. (scene_prop_set_prune_time, ":instance_id", ":flag_prune_time"),
  5814. (else_try),
  5815. (eq, ":item_id", "itm_fishing_net"),
  5816. (prop_instance_get_position, pos1, ":instance_id"),
  5817. (position_get_z, ":height", pos1),
  5818. (try_begin),
  5819. (lt, ":height", -100),
  5820. (agent_get_troop_id, ":troop_id", ":agent_id"),
  5821. (store_skill_level, ":placement_skill", "skl_labouring", ":troop_id"),
  5822. (else_try),
  5823. (assign, ":placement_skill", 0),
  5824. (try_end),
  5825. (scene_prop_set_slot, ":instance_id", slot_scene_prop_position, ":placement_skill"),
  5826. (else_try),
  5827. (eq, ":item_id", "itm_scythe"),
  5828. (prop_instance_get_position, pos1, ":instance_id"),
  5829. (position_rotate_x, pos1, 11),
  5830. (prop_instance_set_position, ":instance_id", pos1),
  5831. (else_try),
  5832. (this_or_next|eq, ":item_id", "itm_beer_jug"),
  5833. (eq, ":item_id", "itm_wheat_sheaf"),
  5834. (prop_instance_get_position, pos1, ":instance_id"),
  5835. (position_rotate_x, pos1, 90),
  5836. (position_move_z, pos1, 21, 1),
  5837. (prop_instance_set_position, ":instance_id", pos1),
  5838. (else_try),
  5839. (this_or_next|eq, ":item_id", "itm_flour_sack"),
  5840. (this_or_next|eq, ":item_id", "itm_beer_cask"),
  5841. (this_or_next|eq, ":item_id", "itm_must_barrel"),
  5842. (eq, ":item_id", "itm_wine_barrel"),
  5843. (prop_instance_get_position, pos1, ":instance_id"),
  5844. (position_move_z, pos1, 16, 1),
  5845. (prop_instance_set_position, ":instance_id", pos1),
  5846. (else_try),
  5847. (eq, ":item_id", "itm_die"),
  5848. (prop_instance_get_position, pos1, ":instance_id"),
  5849. (position_move_y, pos1, 50),
  5850. (store_random_in_range, ":throw_result", 0, 6),
  5851. (try_begin),
  5852. (eq, ":throw_result", 0),
  5853. (else_try),
  5854. (eq, ":throw_result", 1),
  5855. (position_rotate_x, pos1, 90),
  5856. (else_try),
  5857. (eq, ":throw_result", 2),
  5858. (position_rotate_y, pos1, 90),
  5859. (else_try),
  5860. (eq, ":throw_result", 3),
  5861. (position_rotate_y, pos1, -90),
  5862. (else_try),
  5863. (eq, ":throw_result", 4),
  5864. (position_rotate_x, pos1, -90),
  5865. (else_try),
  5866. (position_rotate_x, pos1, 180),
  5867. (try_end),
  5868. (prop_instance_set_position, ":instance_id", pos1),
  5869. (else_try), # remove admin items dropped on the ground
  5870. (this_or_next|eq, ":item_id", "itm_invisible_sword"),
  5871. (this_or_next|eq, ":item_id", "itm_admin_lock_pick"),
  5872. (eq, ":item_id", "itm_admin_scalpel"),
  5873. (init_position, pos1),
  5874. (position_set_z, pos1, z_position_to_hide_object),
  5875. (prop_instance_set_position, ":instance_id", pos1),
  5876. (scene_prop_set_prune_time, ":instance_id", 1),
  5877. (try_end),
  5878. ]),
  5879.  
  5880. ("agent_calculate_stat_modifiers_for_item", # clients: return the modifiers in reg10 - reg14; server: apply the modifiers if that parameter is set
  5881. [(store_script_param, ":agent_id", 1), # must be valid
  5882. (store_script_param, ":item_id", 2),
  5883. (store_script_param, ":equipped", 3), # 1 = the item was equipped and wielded so add modifiers, 0 = the item was unwielded, so remove modifiers
  5884. (store_script_param, ":apply", 4), # server only: 1 = apply the modifiers to the agent rather than returning them
  5885.  
  5886. (try_begin),
  5887. (multiplayer_is_server),
  5888. (eq, ":equipped", 1),
  5889. (eq, ":apply", 1), # if the item is the same as the last calcuated for this agent, skip the redundant calculations
  5890. (agent_slot_eq, ":agent_id", slot_agent_last_apply_factors_item_id, ":item_id"),
  5891. (else_try),
  5892. (assign, ":handled", 1),
  5893. (assign, ":cannot_attack", 0),
  5894. (item_get_slot, ":difficulty", ":item_id", slot_item_difficulty),
  5895. (item_get_type, ":item_type", ":item_id"),
  5896. (try_begin),
  5897. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  5898. (try_begin), # if the armor has restrictions, calculate the modifier factors
  5899. (gt, ":difficulty", 0),
  5900. (eq, ":equipped", 1),
  5901. (agent_get_troop_id, ":troop_id", ":agent_id"),
  5902. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  5903. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  5904. (val_max, ":difficulty_level", 0),
  5905. (store_mul, ":damage_factor", ":difficulty_level", armor_damage_reduction_factor),
  5906. (try_begin),
  5907. (eq, ":item_type", itp_type_head_armor),
  5908. (store_mul, ":speed_factor", ":difficulty_level", head_armor_speed_reduction_factor),
  5909. (store_mul, ":accuracy_factor", ":difficulty_level", head_armor_accuracy_reduction_factor),
  5910. (store_mul, ":reload_factor", ":difficulty_level", head_armor_reload_reduction_factor),
  5911. (else_try),
  5912. (eq, ":item_type", itp_type_body_armor),
  5913. (store_mul, ":speed_factor", ":difficulty_level", body_armor_speed_reduction_factor),
  5914. (store_mul, ":accuracy_factor", ":difficulty_level", body_armor_accuracy_reduction_factor),
  5915. (store_mul, ":reload_factor", ":difficulty_level", body_armor_reload_reduction_factor),
  5916. (else_try),
  5917. (eq, ":item_type", itp_type_foot_armor),
  5918. (store_mul, ":speed_factor", ":difficulty_level", foot_armor_speed_reduction_factor),
  5919. (store_mul, ":accuracy_factor", ":difficulty_level", foot_armor_accuracy_reduction_factor),
  5920. (store_mul, ":reload_factor", ":difficulty_level", foot_armor_reload_reduction_factor),
  5921. (else_try),
  5922. (eq, ":item_type", itp_type_hand_armor),
  5923. (store_mul, ":speed_factor", ":difficulty_level", hand_armor_speed_reduction_factor),
  5924. (store_mul, ":accuracy_factor", ":difficulty_level", hand_armor_accuracy_reduction_factor),
  5925. (store_mul, ":reload_factor", ":difficulty_level", hand_armor_reload_reduction_factor),
  5926. (try_end),
  5927. (else_try),
  5928. (assign, ":damage_factor", 0),
  5929. (assign, ":speed_factor", 0),
  5930. (assign, ":accuracy_factor", 0),
  5931. (assign, ":reload_factor", 0),
  5932. (try_end),
  5933. (assign, ":item_damage_factor", ":damage_factor"),
  5934. (assign, ":item_speed_factor", ":speed_factor"),
  5935. (assign, ":item_accuracy_factor", ":accuracy_factor"),
  5936. (assign, ":item_reload_factor", ":reload_factor"),
  5937. (assign, ":slot", slot_agent_head_damage_factor),
  5938. (try_for_range, ":current_type", itp_type_head_armor, itp_type_hand_armor + 1),
  5939. (neq, ":current_type", ":item_type"), # add cached factors for armor equipped in other slots
  5940. (agent_get_slot, ":existing_damage_factor", ":agent_id", ":slot"),
  5941. (val_add, ":damage_factor", ":existing_damage_factor"),
  5942. (val_add, ":slot", 1),
  5943. (agent_get_slot, ":existing_speed_factor", ":agent_id", ":slot"),
  5944. (val_add, ":speed_factor", ":existing_speed_factor"),
  5945. (val_add, ":slot", 1),
  5946. (agent_get_slot, ":existing_accuracy_factor", ":agent_id", ":slot"),
  5947. (val_add, ":accuracy_factor", ":existing_accuracy_factor"),
  5948. (val_add, ":slot", 1),
  5949. (agent_get_slot, ":existing_reload_factor", ":agent_id", ":slot"),
  5950. (val_add, ":reload_factor", ":existing_reload_factor"),
  5951. (val_add, ":slot", 1),
  5952. (else_try), # if applying, cache the factors for the current armor item's slot
  5953. (eq, ":apply", 1),
  5954. (agent_set_slot, ":agent_id", ":slot", ":item_damage_factor"),
  5955. (val_add, ":slot", 1),
  5956. (agent_set_slot, ":agent_id", ":slot", ":item_speed_factor"),
  5957. (val_add, ":slot", 1),
  5958. (agent_set_slot, ":agent_id", ":slot", ":item_accuracy_factor"),
  5959. (val_add, ":slot", 1),
  5960. (agent_set_slot, ":agent_id", ":slot", ":item_reload_factor"),
  5961. (val_add, ":slot", 1),
  5962. (else_try), # otherwise skip the slots for the current armor item
  5963. (val_add, ":slot", 4),
  5964. (try_end),
  5965. (try_begin),
  5966. (eq, ":apply", 1), # if applying, cache the total armor factors
  5967. (agent_set_slot, ":agent_id", slot_agent_armor_damage_factor, ":damage_factor"),
  5968. (agent_set_slot, ":agent_id", slot_agent_armor_speed_factor, ":speed_factor"),
  5969. (agent_set_slot, ":agent_id", slot_agent_armor_accuracy_factor, ":accuracy_factor"),
  5970. (agent_set_slot, ":agent_id", slot_agent_armor_reload_factor, ":reload_factor"),
  5971. (assign, ":damage_through", ":speed_factor"),
  5972. (val_min, ":damage_through", 100),
  5973. (agent_set_slot, ":agent_id", slot_agent_armor_damage_through, ":damage_through"),
  5974. (try_end), # add existing weapon factors
  5975. (agent_get_slot, ":weapon_damage_factor", ":agent_id", slot_agent_weapon_damage_factor),
  5976. (val_add, ":damage_factor", ":weapon_damage_factor"),
  5977. (agent_get_slot, ":weapon_speed_factor", ":agent_id", slot_agent_weapon_speed_factor),
  5978. (val_add, ":speed_factor", ":weapon_speed_factor"),
  5979. (agent_get_slot, ":weapon_accuracy_factor", ":agent_id", slot_agent_weapon_accuracy_factor),
  5980. (val_add, ":accuracy_factor", ":weapon_accuracy_factor"),
  5981. (agent_get_slot, ":weapon_reload_factor", ":agent_id", slot_agent_weapon_reload_factor),
  5982. (val_add, ":reload_factor", ":weapon_reload_factor"),
  5983. (else_try),
  5984. (try_begin),
  5985. (assign, ":damage_factor", 0),
  5986. (assign, ":speed_factor", 0),
  5987. (try_begin), # for crossbows, apply extra accuracy and reload factors based on proficiency
  5988. (eq, ":item_type", itp_type_crossbow),
  5989. (eq, ":equipped", 1),
  5990. (agent_get_troop_id, ":troop_id", ":agent_id"),
  5991. (store_proficiency_level, ":crossbow", ":troop_id", wpt_crossbow),
  5992. (lt, ":crossbow", 100),
  5993. (store_sub, ":accuracy_factor", 100, ":crossbow"),
  5994. (val_div, ":accuracy_factor", 2),
  5995. (assign, ":reload_factor", ":accuracy_factor"),
  5996. (else_try),
  5997. (assign, ":accuracy_factor", 0),
  5998. (assign, ":reload_factor", 0),
  5999. (try_end),
  6000. (gt, ":difficulty", 0),
  6001. (eq, ":equipped", 1),
  6002. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6003. (try_begin),
  6004. (is_between, ":item_type", itp_type_one_handed_wpn, itp_type_polearm + 1),
  6005. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  6006. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  6007. (val_max, ":difficulty_level", 0),
  6008. (store_mul, ":damage_factor", ":difficulty_level", melee_damage_reduction_factor),
  6009. (store_mul, ":speed_factor", ":difficulty_level", melee_speed_reduction_factor),
  6010. (try_begin),
  6011. (gt, ":difficulty_level", melee_max_level_difference),
  6012. (assign, ":cannot_attack", 1),
  6013. (try_end),
  6014. (else_try),
  6015. (eq, ":item_type", itp_type_crossbow),
  6016. (store_attribute_level, ":troop_level", ":troop_id", ca_strength),
  6017. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  6018. (val_max, ":difficulty_level", 0),
  6019. (store_mul, ":damage_factor", ":difficulty_level", crossbow_damage_reduction_factor),
  6020. (store_mul, ":speed_factor", ":difficulty_level", crossbow_speed_reduction_factor),
  6021. (store_mul, ":accuracy_factor_2", ":difficulty_level", crossbow_accuracy_reduction_factor),
  6022. (val_add, ":accuracy_factor", ":accuracy_factor_2"),
  6023. (store_mul, ":reload_factor_2", ":difficulty_level", crossbow_reload_reduction_factor),
  6024. (val_add, ":reload_factor", ":reload_factor_2"),
  6025. (try_begin),
  6026. (gt, ":difficulty_level", crossbow_max_level_difference),
  6027. (assign, ":cannot_attack", 1),
  6028. (try_end),
  6029. (else_try),
  6030. (this_or_next|eq, ":item_type", itp_type_bow),
  6031. (eq, ":item_type", itp_type_thrown),
  6032. (try_begin),
  6033. (eq, ":item_type", itp_type_bow),
  6034. (store_skill_level, ":troop_level", "skl_power_draw", ":troop_id"),
  6035. (else_try),
  6036. (eq, ":item_type", itp_type_thrown),
  6037. (store_skill_level, ":troop_level", "skl_power_throw", ":troop_id"),
  6038. (try_end),
  6039. (store_sub, ":difficulty_level", ":difficulty", ":troop_level"),
  6040. (val_max, ":difficulty_level", 0),
  6041. (store_mul, ":damage_factor", ":difficulty_level", bow_thrown_damage_reduction_factor),
  6042. (store_mul, ":speed_factor", ":difficulty_level", bow_thrown_speed_reduction_factor),
  6043. (store_mul, ":accuracy_factor", ":difficulty_level", bow_thrown_accuracy_reduction_factor),
  6044. (try_begin),
  6045. (gt, ":troop_level", 0),
  6046. (le, ":difficulty_level", bow_ranged_max_level_difference),
  6047. (else_try),
  6048. (assign, ":cannot_attack", 1),
  6049. (try_end),
  6050. (else_try),
  6051. (assign, ":handled", 0), # an unhandled item type
  6052. (try_end),
  6053. (else_try),
  6054. (neg|is_between, ":item_type", itp_type_one_handed_wpn, itp_type_polearm + 1),
  6055. (neg|is_between, ":item_type", itp_type_bow, itp_type_thrown + 1),
  6056. (assign, ":handled", 0), # an unhandled item type
  6057. (try_end),
  6058. (eq, ":handled", 1),
  6059. (try_begin),
  6060. (eq, ":apply", 1), # if applying, cache the weapon factors
  6061. (agent_set_slot, ":agent_id", slot_agent_weapon_damage_factor, ":damage_factor"),
  6062. (agent_set_slot, ":agent_id", slot_agent_weapon_speed_factor, ":speed_factor"),
  6063. (agent_set_slot, ":agent_id", slot_agent_weapon_accuracy_factor, ":accuracy_factor"),
  6064. (agent_set_slot, ":agent_id", slot_agent_weapon_reload_factor, ":reload_factor"),
  6065. (try_end), # add existing armor factors
  6066. (agent_get_slot, ":armor_damage_factor", ":agent_id", slot_agent_armor_damage_factor),
  6067. (val_add, ":damage_factor", ":armor_damage_factor"),
  6068. (agent_get_slot, ":armor_speed_factor", ":agent_id", slot_agent_armor_speed_factor),
  6069. (val_add, ":speed_factor", ":armor_speed_factor"),
  6070. (agent_get_slot, ":armor_accuracy_factor", ":agent_id", slot_agent_armor_accuracy_factor),
  6071. (val_add, ":accuracy_factor", ":armor_accuracy_factor"),
  6072. (agent_get_slot, ":armor_reload_factor", ":agent_id", slot_agent_armor_reload_factor),
  6073. (val_add, ":reload_factor", ":armor_reload_factor"),
  6074. (try_end),
  6075. (assign, ":damage_modifier", 100),
  6076. (assign, ":speed_modifier", 100),
  6077. (assign, ":accuracy_modifier", 100),
  6078. (assign, ":reload_modifier", 100),
  6079. (try_begin), # convert the total factors (additive) into modifiers (subtracting from 100)
  6080. (eq, ":handled", 1),
  6081. (try_begin),
  6082. (gt, ":damage_factor", 0),
  6083. (store_sub, ":damage_modifier", reduction_factor_base, ":damage_factor"),
  6084. (val_max, ":damage_modifier", 0),
  6085. (try_end),
  6086. (try_begin),
  6087. (gt, ":speed_factor", 0),
  6088. (store_sub, ":speed_modifier", reduction_factor_base, ":speed_factor"),
  6089. (val_max, ":speed_modifier", 0),
  6090. (try_end),
  6091. (try_begin),
  6092. (gt, ":accuracy_factor", 0),
  6093. (store_sub, ":accuracy_modifier", reduction_factor_base, ":accuracy_factor"),
  6094. (val_max, ":accuracy_modifier", 0),
  6095. (try_end),
  6096. (try_begin),
  6097. (gt, ":reload_factor", 0),
  6098. (store_sub, ":reload_modifier", reduction_factor_base, ":reload_factor"),
  6099. (val_max, ":reload_modifier", 0),
  6100. (try_end),
  6101. (try_begin), # get the agent's wielded item type if the one being checked is not a weapon
  6102. (neg|is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  6103. (assign, ":wielded_item_type", ":item_type"),
  6104. (else_try),
  6105. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  6106. (gt, ":wielded_item_id", -1),
  6107. (item_get_type, ":wielded_item_type", ":wielded_item_id"),
  6108. (else_try),
  6109. (assign, ":wielded_item_type", -1),
  6110. (try_end),
  6111. (try_begin), # prevent attacking if relevant modifiers are zero
  6112. (neq, ":cannot_attack", 1),
  6113. (neq, ":speed_modifier", 0),
  6114. (neq, ":damage_modifier", 0),
  6115. (this_or_next|neq, ":accuracy_modifier", 0),
  6116. (neg|is_between, ":wielded_item_type", itp_type_bow, itp_type_thrown + 1),
  6117. (this_or_next|neq, ":reload_modifier", 0),
  6118. (neq, ":wielded_item_type", itp_type_crossbow),
  6119. (assign, ":cannot_attack", 0),
  6120. (else_try),
  6121. (assign, ":cannot_attack", 1),
  6122. (try_end),
  6123. (eq, ":apply", 1),
  6124. (agent_set_slot, ":agent_id", slot_agent_cannot_attack, ":cannot_attack"),
  6125. (try_begin), # only apply modifiers on the server: it seems to cause memory leaks on clients
  6126. (multiplayer_is_server),
  6127. (agent_set_damage_modifier, ":agent_id", ":damage_modifier"),
  6128. (agent_set_ranged_damage_modifier, ":agent_id", ":damage_modifier"),
  6129. (agent_set_speed_modifier, ":agent_id", ":speed_modifier"),
  6130. (agent_set_accuracy_modifier, ":agent_id", ":accuracy_modifier"),
  6131. (agent_set_reload_speed_modifier, ":agent_id", ":reload_modifier"),
  6132. (try_begin), # remember the item id to avoid duplicate calculation if the script is called twice, by hard coded triggers or whatever
  6133. (eq, ":equipped", 1),
  6134. (agent_set_slot, ":agent_id", slot_agent_last_apply_factors_item_id, ":item_id"),
  6135. (else_try),
  6136. (agent_set_slot, ":agent_id", slot_agent_last_apply_factors_item_id, -1),
  6137. (try_end),
  6138. (try_end),
  6139. (else_try),
  6140. (neq, ":apply", 1),
  6141. (assign, reg10, ":cannot_attack"),
  6142. (assign, reg11, ":damage_modifier"),
  6143. (assign, reg12, ":speed_modifier"),
  6144. (assign, reg13, ":accuracy_modifier"),
  6145. (assign, reg14, ":reload_modifier"),
  6146. (try_end),
  6147. (try_end),
  6148. ]),
  6149.  
  6150. ("scene_prop_adjust_hit", # server: adjust hit damage by an agent on a resource scene prop for tools, skill, and more; reg0 = agent id
  6151. [(store_script_param, ":instance_id", 1), # must be valid
  6152. (store_script_param, ":hit_damage", 2),
  6153. (store_script_param, ":hardness", 3), # divides the damage dealt by this number
  6154. (store_script_param, ":tool_class", 4), # constants starting with item_class_
  6155. (store_script_param, ":skill_id", 5),
  6156. (store_script_param, ":attack_direction_range", 6), # second digit = direction from agent_get_action_dir, first digit = subsequent directions to include
  6157. (set_fixed_point_multiplier, 1),
  6158. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  6159. (set_fixed_point_multiplier, 100),
  6160.  
  6161. (try_begin),
  6162. (gt, ":skill_id", -1),
  6163. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6164. (store_skill_level, ":skill", ":skill_id", ":troop_id"),
  6165. (try_begin),
  6166. (le, ":skill", 0),
  6167. (val_mul, ":hit_damage", 10),
  6168. (else_try),
  6169. (val_mul, ":hit_damage", 50),
  6170. (val_mul, ":hit_damage", ":skill"),
  6171. (try_end),
  6172. (else_try),
  6173. (val_mul, ":hit_damage", 100),
  6174. (try_end),
  6175. (try_begin),
  6176. (ge, ":hit_damage", 100), # will be divided by 100 later, so checking if the damage can be greater than 0
  6177. (try_begin),
  6178. (gt, ":attack_direction_range", -1),
  6179. (store_div, ":attack_direction_end", ":attack_direction_range", 10),
  6180. (val_mod, ":attack_direction_range", 10),
  6181. (val_add, ":attack_direction_end", ":attack_direction_range"),
  6182. (val_add, ":attack_direction_end", 1),
  6183. (agent_get_action_dir, ":attack_direction", ":agent_id"),
  6184. (neg|is_between, ":attack_direction", ":attack_direction_range", ":attack_direction_end"),
  6185. (val_div, ":hit_damage", 3),
  6186. (try_end),
  6187. (ge, ":hit_damage", 100),
  6188. (try_begin),
  6189. (gt, ":tool_class", -1),
  6190. (agent_get_wielded_item, ":wielded_item", ":agent_id", 0),
  6191. (try_begin),
  6192. (gt, ":wielded_item", -1),
  6193. (item_get_slot, ":wielded_item_class", ":wielded_item", slot_item_class),
  6194. (eq, ":wielded_item_class", ":tool_class"),
  6195. (else_try),
  6196. (val_div, ":hit_damage", 5),
  6197. (try_end),
  6198. (try_end),
  6199. (val_max, ":hardness", 1),
  6200. (val_div, ":hit_damage", ":hardness"),
  6201. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  6202. (store_sub, ":hunger_factor", max_food_amount, ":food_amount"),
  6203. (val_mul, ":hunger_factor", ":hardness"),
  6204. (val_mul, ":hunger_factor", ":hit_damage"),
  6205. (val_div, ":hunger_factor", max_food_amount * 7),
  6206. (val_sub, ":hit_damage", ":hunger_factor"),
  6207. (val_max, ":hit_damage", 0),
  6208. (try_begin), # decrease food amount based on a probability to simulate an average of less than one point per hit
  6209. (gt, ":food_amount", 0),
  6210. (store_random_in_range, ":random", ":hardness", 16),
  6211. (gt, ":random", 12),
  6212. (val_sub, ":food_amount", 1),
  6213. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  6214. (store_mod, ":remainder", ":food_amount", 5),
  6215. (eq, ":remainder", 0), # only send food bar updates to the player's client about every 5% used
  6216. (agent_get_player_id, ":player_id", ":agent_id"),
  6217. (player_is_active, ":player_id"),
  6218. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  6219. (try_end),
  6220. (try_end),
  6221. (val_div, ":hit_damage", 100),
  6222. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  6223. (assign, reg0, ":agent_id"),
  6224. ]),
  6225.  
  6226. ("scene_prop_damage_no_destroy", # server: adjust damage to a scene prop so it is never destroyed; reg1 = adjusted damage, reg2 = adjusted hit points
  6227. [(store_script_param, ":instance_id", 1), # must be valid
  6228. (store_script_param, ":hit_damage", 2),
  6229.  
  6230. (scene_prop_get_hit_points, ":hit_points", ":instance_id"),
  6231. (val_sub, ":hit_points", ":hit_damage"),
  6232. (try_begin),
  6233. (lt, ":hit_points", min_scene_prop_hit_points),
  6234. (val_add, ":hit_damage", ":hit_points"),
  6235. (val_sub, ":hit_damage", min_scene_prop_hit_points),
  6236. (assign, ":hit_points", min_scene_prop_hit_points),
  6237. (try_end),
  6238. (set_trigger_result, ":hit_damage"),
  6239. (assign, reg1, ":hit_damage"),
  6240. (assign, reg2, ":hit_points"),
  6241. ]),
  6242.  
  6243. ("cf_check_drop_resource", # server: check if scene prop hit points have decreased enough to drop resources; storing the number to drop in reg0
  6244. [(store_script_param, ":instance_id", 1), # must be valid
  6245. (store_script_param, ":hit_points", 2), # current hit points
  6246. (store_script_param, ":hit_points_for_resource", 3), # hit damage required per resource dropped
  6247. (store_script_param, ":random_adjustment", 4), # maximum random adjustment to the above value
  6248.  
  6249. (scene_prop_get_slot, ":next_resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  6250. (assign, reg0, 0),
  6251. (assign, ":loop_condition", 10), # only check for a maximum of 10 iterations, to prevent long or infinite loops
  6252. (try_for_range, ":unused", 0, ":loop_condition"),
  6253. (ge, ":next_resource_hp", ":hit_points"),
  6254. (val_sub, ":next_resource_hp", ":hit_points_for_resource"),
  6255. (try_begin),
  6256. (gt, ":random_adjustment", 0),
  6257. (store_random_in_range, ":random_hp", 0, ":random_adjustment"),
  6258. (val_sub, ":next_resource_hp", ":random_hp"),
  6259. (try_end),
  6260. (val_add, reg0, 1),
  6261. (else_try),
  6262. (assign, ":loop_condition", -1),
  6263. (try_end),
  6264. (neq, reg0, 0),
  6265. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":next_resource_hp"),
  6266. ]),
  6267.  
  6268. ("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
  6269. [(multiplayer_is_server),
  6270. (store_script_param, ":instance_id", 1), # must be valid
  6271. (store_script_param, ":hit_damage", 2),
  6272. (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
  6273. (store_script_param, ":hit_points_for_resource", 4),
  6274. (store_script_param, ":hardness", 5),
  6275. (store_script_param, ":resource_imod", 6), # item mesh variation to match the visual appearance
  6276. (store_script_param, ":regrow_interval", 7),
  6277.  
  6278. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6279. (assign, ":break_effect", 0),
  6280. (try_begin),
  6281. (this_or_next|eq, ":state", scene_prop_state_active),
  6282. (eq, ":state", scene_prop_state_destroyed),
  6283. (call_script, "script_scene_prop_adjust_hit", ":instance_id", ":hit_damage", ":hardness", item_class_wood_cutting, "skl_labouring", 11),
  6284. (assign, ":agent_id", reg0),
  6285. (assign, ":hit_damage", reg1),
  6286. (assign, ":hit_points", reg2),
  6287. (try_begin),
  6288. (lt, ":hit_points", ":fell_tree_hit_points"),
  6289. (try_begin),
  6290. (eq, ":state", scene_prop_state_destroyed),
  6291. (le, ":hit_points", min_scene_prop_hit_points),
  6292. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6293. (prop_instance_get_position, pos2, ":instance_id"),
  6294. (position_move_z, pos2, -5000, 1),
  6295. (prop_instance_animate_to_position, ":instance_id", pos2, 2000),
  6296. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6297. (else_try),
  6298. (eq, ":state", scene_prop_state_active),
  6299. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  6300. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6301. (copy_position, pos3, pos2), # calculate the best angle to match the terrain by measuring at multiple distances along the felled length
  6302. (assign, ":trunk_angle", 90),
  6303. (try_for_range, ":count", 1, 4),
  6304. (position_move_x, pos3, 500),
  6305. (position_get_distance_to_ground_level, ":ground_distance", pos3),
  6306. (store_sub, ":slope_ratio", ":ground_distance", 30),
  6307. (val_abs, ":slope_ratio"),
  6308. (convert_to_fixed_point, ":slope_ratio"),
  6309. (store_mul, ":trunk_distance", ":count", 500),
  6310. (val_div, ":slope_ratio", ":trunk_distance"),
  6311. (store_atan, ":test_angle", ":slope_ratio"),
  6312. (convert_from_fixed_point, ":test_angle"),
  6313. (try_begin),
  6314. (lt, ":ground_distance", 0),
  6315. (val_mul, ":test_angle", -1),
  6316. (try_end),
  6317. (val_min, ":trunk_angle", ":test_angle"),
  6318. (try_end),
  6319. (val_add, ":trunk_angle", 90),
  6320. (position_rotate_y, pos2, ":trunk_angle"),
  6321. (prop_instance_animate_to_position, ":instance_id", pos2, 300),
  6322. (assign, ":break_effect", 1),
  6323. (scene_prop_get_slot, ":attached_item_count", ":instance_id", slot_scene_prop_inventory_count), # drop attached items on the ground
  6324. (val_add, ":attached_item_count", slot_scene_prop_inventory_begin),
  6325. (try_for_range, ":slot", slot_scene_prop_inventory_begin, ":attached_item_count"),
  6326. (scene_prop_get_slot, ":attached_instance_id", ":instance_id", ":slot"),
  6327. (prop_instance_is_valid, ":attached_instance_id"),
  6328. (scene_prop_slot_eq, ":attached_instance_id", slot_scene_prop_linked_scene_prop, ":instance_id"),
  6329. (prop_instance_get_position, pos4, ":attached_instance_id"),
  6330. (position_move_z, pos4, -50),
  6331. (position_set_z_to_ground_level, pos4),
  6332. (prop_instance_set_position, ":attached_instance_id", pos4),
  6333. (try_end),
  6334. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_count, 0),
  6335. (try_end),
  6336. (assign, ":resource_item_id", "itm_wood_block"),
  6337. (else_try),
  6338. (assign, ":resource_item_id", "itm_branch"),
  6339. (try_end),
  6340. (try_begin),
  6341. (call_script, "script_cf_check_drop_resource", ":instance_id", ":hit_points", ":hit_points_for_resource", 0),
  6342. (assign, ":resource_count", reg0),
  6343. (try_for_range, ":unused", 0, ":resource_count"),
  6344. (call_script, "script_set_random_spawn_position", 200),
  6345. (spawn_item, ":resource_item_id", ":resource_imod", "$g_spawn_item_prune_time"),
  6346. (try_end),
  6347. (assign, ":break_effect", 1),
  6348. (try_end),
  6349. (else_try), # don't allow damaging destroyed and hidden trees, for whatever reason
  6350. (assign, ":hit_damage", 0),
  6351. (set_trigger_result, 0),
  6352. (set_fixed_point_multiplier, 1),
  6353. (position_get_x, ":agent_id", pos2),
  6354. (set_fixed_point_multiplier, 100),
  6355. (try_end),
  6356. (try_begin),
  6357. (eq, ":break_effect", 1),
  6358. (particle_system_burst, "psys_dummy_straw", pos1, 40),
  6359. (particle_system_burst, "psys_gourd_piece_2", pos1, 5),
  6360. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  6361. (else_try),
  6362. (ge, ":hit_damage", 5),
  6363. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  6364. (particle_system_burst, "psys_gourd_piece_2", pos1, 2),
  6365. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  6366. (else_try),
  6367. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  6368. (try_end),
  6369. ]),
  6370.  
  6371. ("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
  6372. [(store_script_param, ":instance_id", 1), # must be valid
  6373. (store_script_param, ":regrow_interval", 2),
  6374.  
  6375. (prop_instance_get_variation_id_2, ":regrow_interval_multiplier", ":instance_id"),
  6376. (val_max, ":regrow_interval_multiplier", 1),
  6377. (val_mul, ":regrow_interval", ":regrow_interval_multiplier"),
  6378. (store_mission_timer_a, ":time"),
  6379. (val_add, ":time", ":regrow_interval"),
  6380. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state_time, ":time"),
  6381. (troop_get_slot, ":resources_count", "trp_removed_scene_props", slot_array_count),
  6382. (store_add, ":loop_end", ":resources_count", slot_array_begin),
  6383. (try_for_range, ":resource_slot", slot_array_begin, ":loop_end"),
  6384. (neg|troop_slot_ge, "trp_removed_scene_props", ":resource_slot", 1),
  6385. (troop_set_slot, "trp_removed_scene_props", ":resource_slot", ":instance_id"),
  6386. (assign, ":loop_end", -1),
  6387. (try_end),
  6388. (try_begin),
  6389. (neq, ":loop_end", -1),
  6390. (troop_set_slot, "trp_removed_scene_props", ":loop_end", ":instance_id"),
  6391. (val_add, ":resources_count", 1),
  6392. (troop_set_slot, "trp_removed_scene_props", slot_array_count, ":resources_count"),
  6393. (try_end),
  6394. ]),
  6395.  
  6396. ("regrow_resource", # server: generic regrowing script called if a custom one is not set
  6397. [(store_script_param, ":instance_id", 1), # must be valid
  6398.  
  6399. (set_fixed_point_multiplier, 100),
  6400. (prop_instance_get_starting_position, pos1, ":instance_id"),
  6401. (copy_position, pos2, pos1),
  6402. (position_move_z, pos2, -5000, 1),
  6403. (prop_instance_set_position, ":instance_id", pos2),
  6404. (prop_instance_animate_to_position, ":instance_id", pos1, 6000),
  6405. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_regenerating),
  6406. (prop_instance_enable_physics, ":instance_id", 1),
  6407. ]),
  6408.  
  6409. ("regrow_fruit_tree", # server: either regrow the tree or produce fruit
  6410. [(store_script_param, ":instance_id", 1), # must be valid
  6411.  
  6412. (assign, ":regrow_again", 1),
  6413. (try_begin), # tree is already active, so regrow fruit
  6414. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6415. (scene_prop_get_slot, ":attached_item_count", ":instance_id", slot_scene_prop_inventory_count), # check for fruit still unpicked
  6416. (val_add, ":attached_item_count", slot_scene_prop_inventory_begin),
  6417. (assign, ":first_invalid_slot", -1),
  6418. (assign, ":existing_fruit_count", 0),
  6419. (try_for_range, ":slot", slot_scene_prop_inventory_begin, ":attached_item_count"),
  6420. (scene_prop_get_slot, ":attached_instance_id", ":instance_id", ":slot"),
  6421. (prop_instance_is_valid, ":attached_instance_id"),
  6422. (scene_prop_slot_eq, ":attached_instance_id", slot_scene_prop_linked_scene_prop, ":instance_id"),
  6423. (val_add, ":existing_fruit_count", 1),
  6424. (try_begin), # compress the attached fruit array to be continuous and valid
  6425. (gt, ":first_invalid_slot", -1),
  6426. (scene_prop_set_slot, ":instance_id", ":first_invalid_slot", ":attached_instance_id"),
  6427. (val_add, ":first_invalid_slot", 1),
  6428. (try_end),
  6429. (else_try),
  6430. (eq, ":first_invalid_slot", -1),
  6431. (assign, ":first_invalid_slot", ":slot"),
  6432. (try_end),
  6433. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_count, ":existing_fruit_count"),
  6434. (scene_prop_get_slot, ":fruit_count", ":instance_id", slot_scene_prop_fruit_count),
  6435. (store_mul, ":maximum_fruit_count", ":fruit_count", 2),
  6436. (try_begin),
  6437. (lt, ":existing_fruit_count", ":maximum_fruit_count"), # only grow new fruit if not loaded with old
  6438. (scene_prop_get_slot, ":fruit_item_id", ":instance_id", slot_scene_prop_resource_item_id),
  6439. (scene_prop_get_slot, ":fruit_height", ":instance_id", slot_scene_prop_height),
  6440. (scene_prop_get_slot, ":fruit_width", ":instance_id", slot_scene_prop_width),
  6441. (store_random_in_range, ":random_factor", 50, 101),
  6442. (store_mul, ":new_fruit_count", ":fruit_count", ":random_factor"),
  6443. (val_div, ":new_fruit_count", 100),
  6444. (prop_instance_get_position, pos1, ":instance_id"),
  6445. (init_position, pos3),
  6446. (position_move_z, pos1, ":fruit_height"),
  6447. (store_add, ":fruit_item_index", ":existing_fruit_count", slot_scene_prop_inventory_begin),
  6448. (try_for_range, ":unused", 0, ":new_fruit_count"),
  6449. (copy_position, pos2, pos1), # produce fruit items within a sphere of radius fruit_width, centered at fruit_height above the tree origin
  6450. (store_random_in_range, ":random_angle", -180, 180),
  6451. (position_rotate_z, pos2, ":random_angle"),
  6452. (store_random_in_range, ":random_angle", -80, 81),
  6453. (position_rotate_x, pos2, ":random_angle"),
  6454. (store_random_in_range, ":random_distance", 30, ":fruit_width"),
  6455. (position_move_y, pos2, ":random_distance"),
  6456. (position_copy_rotation, pos2, pos3),
  6457. (store_random_in_range, ":random_angle", -180, 180),
  6458. (position_rotate_z, pos2, ":random_angle"),
  6459. (set_spawn_position, pos2),
  6460. (spawn_item, ":fruit_item_id", 0, "$g_spawn_item_prune_time"),
  6461. (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
  6462. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":instance_id"),
  6463. (val_add, ":fruit_item_index", 1),
  6464. (try_end),
  6465. (val_add, ":new_fruit_count", ":existing_fruit_count"),
  6466. (scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_count, ":new_fruit_count"),
  6467. (try_end),
  6468. (else_try), # call the normal regrowing script if cut down
  6469. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6470. (call_script, "script_regrow_resource", ":instance_id"),
  6471. (else_try),
  6472. (assign, ":regrow_again", 0),
  6473. (try_end),
  6474. (try_begin), # set up the callback for the next fruiting cycle
  6475. (eq, ":regrow_again", 1),
  6476. (scene_prop_get_slot, ":regrow_interval", ":instance_id", slot_scene_prop_fruiting_interval),
  6477. (store_random_in_range, ":random_factor", 80, 121),
  6478. (val_mul, ":regrow_interval", ":random_factor"),
  6479. (val_div, ":regrow_interval", 100),
  6480. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6481. (try_end),
  6482. ]),
  6483.  
  6484. ("cf_resource_animation_finished", # server: called when an animation for a regrowing resource scene prop is finished, to change the state
  6485. [(multiplayer_is_server),
  6486. (store_script_param, ":instance_id", 1), # must be valid
  6487. (store_script_param, ":hit_points_for_resource", 2),
  6488.  
  6489. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6490. (try_begin),
  6491. (eq, ":state", scene_prop_state_regenerating),
  6492. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6493. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  6494. (scene_prop_set_hit_points, ":instance_id", ":full_hit_points"),
  6495. (val_sub, ":full_hit_points", ":hit_points_for_resource"),
  6496. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":full_hit_points"),
  6497. (else_try),
  6498. (eq, ":state", scene_prop_state_hidden),
  6499. (prop_instance_enable_physics, ":instance_id", 0),
  6500. (try_end),
  6501. ]),
  6502.  
  6503. ("initialize_resource_hit_points", # adjust the hit points for certain resource scene props using scene editor values
  6504. [(store_script_param, ":instance_id", 1), # must be valid
  6505. (store_script_param, ":hit_points_for_resource", 2),
  6506.  
  6507. (prop_instance_get_variation_id, ":start_hit_points", ":instance_id"),
  6508. (val_mul, ":start_hit_points", 120),
  6509. (val_clamp, ":start_hit_points", 120, max_correctly_displayed_hp + 1),
  6510. (scene_prop_set_hit_points, ":instance_id", ":start_hit_points"),
  6511. (scene_prop_set_slot, ":instance_id", slot_scene_prop_full_hit_points, ":start_hit_points"),
  6512. (try_begin),
  6513. (multiplayer_is_server),
  6514. (gt, ":hit_points_for_resource", -1),
  6515. (val_sub, ":start_hit_points", ":hit_points_for_resource"),
  6516. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":start_hit_points"),
  6517. (else_try),
  6518. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, 1),
  6519. (try_end),
  6520. ]),
  6521.  
  6522. ("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
  6523. [(multiplayer_is_server),
  6524. (store_script_param, ":instance_id", 1), # must be valid
  6525. (store_script_param, ":hit_damage", 2),
  6526. (store_script_param, ":hit_points_for_resource", 3),
  6527. (store_script_param, ":resource_item_id", 4),
  6528. (store_script_param, ":hardness", 5),
  6529. (store_script_param, ":tool_class", 6), # constants starting with item_class_
  6530. (store_script_param, ":skill_id", 7),
  6531. (store_script_param, ":attack_direction_range", 8), # second digit = direction from agent_get_action_dir, first digit = subsequent directions to include
  6532. (store_script_param, ":spawn_on_ground", 9), # 0 = spawn resources at the hit position, 1 = spawn at a random nearby position on the ground
  6533. (store_script_param, ":regrow_interval", 10),
  6534. (store_script_param, ":effect_script_id", 11), # if greater than -1, called as a script to play visual or sound effects
  6535. (store_script_param, ":random_hit_points_adjustment", 12), # maximum random adjustment to hit_points_for_resource
  6536.  
  6537. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6538. (try_begin),
  6539. (eq, ":state", scene_prop_state_active),
  6540. (call_script, "script_scene_prop_adjust_hit", ":instance_id", ":hit_damage", ":hardness", ":tool_class", ":skill_id", ":attack_direction_range"),
  6541. (assign, ":agent_id", reg0),
  6542. (assign, ":hit_damage", reg1),
  6543. (assign, ":hit_points", reg2),
  6544. (assign, ":resource_count", 0),
  6545. (try_begin),
  6546. (le, ":hit_points", min_scene_prop_hit_points),
  6547. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6548. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6549. (position_move_z, pos2, -1000, 1),
  6550. (prop_instance_animate_to_position, ":instance_id", pos2, 500),
  6551. (particle_system_burst, "psys_dummy_smoke", pos2, 10),
  6552. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6553. (assign, ":resource_count", -1),
  6554. (else_try),
  6555. (call_script, "script_cf_check_drop_resource", ":instance_id", ":hit_points", ":hit_points_for_resource", ":random_hit_points_adjustment"),
  6556. (assign, ":resource_count", reg0),
  6557. (try_for_range, ":unused", 0, ":resource_count"),
  6558. (try_begin),
  6559. (eq, ":spawn_on_ground", 1),
  6560. (call_script, "script_set_random_spawn_position", 50),
  6561. (else_try),
  6562. (set_spawn_position, pos1),
  6563. (try_end),
  6564. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  6565. (try_end),
  6566. (try_end),
  6567. (try_begin),
  6568. (gt, ":effect_script_id", -1),
  6569. (agent_is_active, ":agent_id"),
  6570. (call_script, ":effect_script_id", ":agent_id", ":instance_id", ":hit_damage", ":resource_count"),
  6571. (try_end),
  6572. (else_try),
  6573. (set_trigger_result, 0),
  6574. (try_end),
  6575. ]),
  6576.  
  6577. ("hit_iron_mine_effect",
  6578. [(store_script_param, ":agent_id", 1),
  6579. (store_script_param, ":instance_id", 2),
  6580. (store_script_param, ":hit_damage", 3),
  6581. (store_script_param, ":resource_count", 4),
  6582.  
  6583. (try_begin),
  6584. (eq, ":resource_count", -1),
  6585. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_body_fall_big"),
  6586. (particle_system_burst, "psys_dummy_smoke", pos1, 15),
  6587. (else_try),
  6588. (gt, ":resource_count", 0),
  6589. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_body_fall_small"),
  6590. (particle_system_burst, "psys_dummy_smoke", pos1, 5),
  6591. (else_try),
  6592. (ge, ":hit_damage", 5),
  6593. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_mining_hit"),
  6594. (else_try),
  6595. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_mining_scratch"),
  6596. (try_end),
  6597. ]),
  6598.  
  6599. ("hit_bush_effect",
  6600. [(store_script_param, ":agent_id", 1),
  6601. (store_script_param, ":instance_id", 2),
  6602. (store_script_param, ":unused", 3),
  6603. (store_script_param, ":resource_count", 4),
  6604.  
  6605. (try_begin),
  6606. (gt, ":resource_count", 0),
  6607. (particle_system_burst, "psys_dummy_straw", pos1, 3),
  6608. (try_end),
  6609. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  6610. ]),
  6611.  
  6612. ("cf_hit_damage_resource", # server: handle damage to a resource that is not supposed to be hit
  6613. [(multiplayer_is_server),
  6614. (store_script_param, ":instance_id", 1),
  6615. (store_script_param, ":hit_damage", 2),
  6616. (store_script_param, ":regrow_interval", 3),
  6617.  
  6618. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6619. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  6620. (try_begin),
  6621. (le, reg2, min_scene_prop_hit_points),
  6622. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6623. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6624. (position_move_z, pos2, -1000, 1),
  6625. (prop_instance_animate_to_position, ":instance_id", pos2, 500),
  6626. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6627. (try_end),
  6628. ]),
  6629.  
  6630. ("cf_use_resource", # server: handle resource scene props that are gathered by using
  6631. [(store_script_param, ":agent_id", 1), # must be valid
  6632. (store_script_param, ":instance_id", 2), # must be valid
  6633. (store_script_param, ":resource_item_id", 3),
  6634. (store_script_param, ":resource_hit_points", 4),
  6635. (store_script_param, ":regrow_interval", 5),
  6636. (store_script_param, ":sound_id", 6), # sound to play when a resource item is spawned
  6637.  
  6638. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6639. (store_skill_level, ":labouring", "skl_labouring", ":troop_id"),
  6640. (gt, ":labouring", 0),
  6641. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  6642. (eq, ":weapon", -1),
  6643. (agent_get_wielded_item, ":shield", ":agent_id", 1),
  6644. (eq, ":shield", -1),
  6645. (store_mul, ":less_damage", ":resource_hit_points", ":labouring"),
  6646. (val_div, ":less_damage", 19),
  6647. (val_sub, ":resource_hit_points", ":less_damage"),
  6648. (scene_prop_get_hit_points, ":hit_points", ":instance_id"),
  6649. (store_sub, ":resulting_hit_points", ":hit_points", ":resource_hit_points"),
  6650. (try_begin),
  6651. (ge, ":resulting_hit_points", min_scene_prop_hit_points),
  6652. (agent_get_position, pos1, ":agent_id"),
  6653. (call_script, "script_set_random_spawn_position", 50),
  6654. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  6655. (particle_system_burst, "psys_dummy_smoke", pos10, 5),
  6656. (try_begin),
  6657. (is_between, ":sound_id", 0, "snd_sounds_end"),
  6658. (agent_play_sound, ":agent_id", ":sound_id"),
  6659. (try_end),
  6660. (else_try),
  6661. (assign, ":resulting_hit_points", min_scene_prop_hit_points),
  6662. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6663. (set_fixed_point_multiplier, 100),
  6664. (prop_instance_get_starting_position, pos1, ":instance_id"),
  6665. (position_move_z, pos1, -1000, 1),
  6666. (prop_instance_animate_to_position, ":instance_id", pos1, 300),
  6667. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6668. (try_end),
  6669. (scene_prop_set_hit_points, ":instance_id", ":resulting_hit_points"),
  6670. ]),
  6671.  
  6672. ("cf_setup_field", # server: set up linked plants scene prop for a field grown resource
  6673. [(multiplayer_is_server),
  6674. (neq, "$g_edit_scene", 1),
  6675. (store_script_param, ":instance_id", 1), # must be valid
  6676. (store_script_param, ":plant_scene_prop_id", 2),
  6677.  
  6678. (set_fixed_point_multiplier, 100),
  6679. (prop_instance_get_starting_position, pos1, ":instance_id"),
  6680. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  6681. (val_mul, ":height", -2),
  6682. (position_move_z, pos1, ":height"),
  6683. (set_spawn_position, pos1),
  6684. (spawn_scene_prop, ":plant_scene_prop_id"),
  6685. (scene_prop_set_slot, ":instance_id", slot_scene_prop_linked_scene_prop, reg0),
  6686. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":instance_id"),
  6687. (prop_instance_set_position, reg0, pos1),
  6688. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6689. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, min_scene_prop_hit_points),
  6690. (scene_prop_set_hit_points, ":instance_id", min_scene_prop_hit_points),
  6691. ]),
  6692.  
  6693. ("cf_hit_field", # server: handle planting, watering, harvesting, and spoiling a field resource; should be called from ti_on_scene_prop_hit
  6694. [(multiplayer_is_server),
  6695. (store_script_param, ":instance_id", 1), # must be valid
  6696. (store_script_param, ":hit_damage", 2),
  6697. (store_script_param, ":hit_points_for_resource", 3),
  6698. (store_script_param, ":resource_item_id", 4),
  6699. (store_script_param, ":plant_item_id", 5),
  6700. (store_script_param, ":tool_class", 6), # constants starting with item_class_
  6701. (store_script_param, ":regrow_interval", 7),
  6702. (set_fixed_point_multiplier, 1),
  6703. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  6704. (set_fixed_point_multiplier, 100),
  6705.  
  6706. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6707. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6708. (store_skill_level, ":skill", "skl_labouring", ":troop_id"),
  6709. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  6710. (try_begin), # planting seeds
  6711. (eq, ":wielded_item_id", ":plant_item_id"),
  6712. (set_trigger_result, 0),
  6713. (gt, ":skill", 0),
  6714. (store_mission_timer_a, ":time"),
  6715. (try_begin),
  6716. (eq, ":state", scene_prop_state_hidden),
  6717. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_regenerating),
  6718. (store_div, ":hidden_time", ":regrow_interval", 2),
  6719. (val_add, ":hidden_time", ":time"),
  6720. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state_time, ":hidden_time"),
  6721. (scene_prop_set_slot, ":instance_id", slot_scene_prop_seeds, 1),
  6722. (scene_prop_get_slot, ":full_hp", ":instance_id", slot_scene_prop_full_hit_points),
  6723. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":full_hp"),
  6724. (scene_prop_get_slot, ":plant_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  6725. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6726. (store_mul, ":animate_time", ":regrow_interval", 100),
  6727. (prop_instance_animate_to_position, ":plant_instance_id", pos2, ":animate_time"),
  6728. (else_try),
  6729. (eq, ":state", scene_prop_state_regenerating),
  6730. (scene_prop_slot_ge, ":instance_id", slot_scene_prop_state_time, ":time"),
  6731. (scene_prop_get_slot, ":seeds", ":instance_id", slot_scene_prop_seeds),
  6732. (val_add, ":seeds", 1),
  6733. (scene_prop_set_slot, ":instance_id", slot_scene_prop_seeds, ":seeds"),
  6734. (try_end),
  6735. (else_try), # watering
  6736. (eq, ":wielded_item_id", "itm_water_bucket"),
  6737. (set_trigger_result, 0),
  6738. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_water_bucket", 1),
  6739. (agent_equip_item, ":agent_id", "itm_bucket"),
  6740. (agent_set_wielded_item, ":agent_id", "itm_bucket"),
  6741. (scene_prop_get_slot, ":water", ":instance_id", slot_scene_prop_water),
  6742. (val_add, ":water", 1),
  6743. (scene_prop_set_slot, ":instance_id", slot_scene_prop_water, ":water"),
  6744. (else_try), # prevent damaging an inactive field
  6745. (neq, ":state", scene_prop_state_active),
  6746. (neq, ":state", scene_prop_state_regenerating),
  6747. (set_trigger_result, 0),
  6748. (else_try), # harvest or spoil, depending on tool and skill
  6749. (assign, ":original_damage", ":hit_damage"),
  6750. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  6751. (assign, ":hit_damage", reg1),
  6752. (assign, ":hit_points", reg2),
  6753. (assign, ":destroyed", 0),
  6754. (try_begin),
  6755. (eq, ":state", scene_prop_state_active),
  6756. (try_begin),
  6757. (le, ":hit_points", min_scene_prop_hit_points),
  6758. (assign, ":destroyed", 1),
  6759. (try_end),
  6760. (gt, ":skill", 0),
  6761. (gt, ":wielded_item_id", -1),
  6762. (item_slot_eq, ":wielded_item_id", slot_item_class, ":tool_class"),
  6763. (try_begin),
  6764. (call_script, "script_cf_check_drop_resource", ":instance_id", ":hit_points", ":hit_points_for_resource", 10),
  6765. (assign, ":resource_count", reg0),
  6766. (try_for_range, ":unused", 0, ":resource_count"),
  6767. (call_script, "script_set_random_spawn_position", 50),
  6768. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  6769. (position_rotate_x, pos10, 90),
  6770. (position_move_z, pos10, 30, 1),
  6771. (prop_instance_set_position, reg0, pos10),
  6772. (particle_system_burst, "psys_dummy_smoke", pos10, 5),
  6773. (try_end),
  6774. (try_end),
  6775. (else_try),
  6776. (scene_prop_get_slot, ":resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  6777. (val_sub, ":resource_hp", ":original_damage"),
  6778. (try_begin),
  6779. (le, ":resource_hp", min_scene_prop_hit_points),
  6780. (assign, ":resource_hp", min_scene_prop_hit_points),
  6781. (assign, ":destroyed", 1),
  6782. (try_end),
  6783. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":resource_hp"),
  6784. (try_end),
  6785. (try_begin), # if destroyed, make the plants disappear
  6786. (eq, ":destroyed", 1),
  6787. (scene_prop_set_slot, ":instance_id", slot_scene_prop_seeds, 0),
  6788. (scene_prop_set_slot, ":instance_id", slot_scene_prop_water, 0),
  6789. (prop_instance_get_starting_position, pos2, ":instance_id"),
  6790. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  6791. (store_mul, ":animate_time", ":height", 2),
  6792. (val_mul, ":height", -2),
  6793. (position_move_z, pos2, ":height"),
  6794. (scene_prop_get_slot, ":plant_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  6795. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6796. (prop_instance_stop_animating, ":plant_instance_id"),
  6797. (prop_instance_animate_to_position, ":plant_instance_id", pos2, ":animate_time"),
  6798. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6799. (try_end),
  6800. (try_end),
  6801. ]),
  6802.  
  6803. ("cf_field_animation_finished", # server: set up the field for harvesting after the growing animation is finished
  6804. [(store_script_param, ":plant_instance_id", 1), # must be valid
  6805. (store_script_param, ":optimum_seeds", 2),
  6806. (store_script_param, ":optimum_water", 3),
  6807.  
  6808. (scene_prop_get_slot, ":instance_id", ":plant_instance_id", slot_scene_prop_linked_scene_prop),
  6809. (gt, ":instance_id", 0),
  6810. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6811. (try_begin),
  6812. (eq, ":state", scene_prop_state_regenerating),
  6813. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6814. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  6815. (scene_prop_get_slot, ":resource_hit_points", ":instance_id", slot_scene_prop_next_resource_hp),
  6816. (store_sub, ":damage", ":full_hit_points", ":resource_hit_points"),
  6817. (scene_prop_get_slot, ":seeds", ":instance_id", slot_scene_prop_seeds),
  6818. (store_sub, ":seed_damage", ":optimum_seeds", ":seeds"),
  6819. (try_begin),
  6820. (gt, ":seed_damage", 0),
  6821. (val_mul, ":seed_damage", ":full_hit_points"),
  6822. (val_div, ":seed_damage", ":optimum_seeds"),
  6823. (val_add, ":damage", ":seed_damage"),
  6824. (try_end),
  6825. (scene_prop_get_slot, ":water", ":instance_id", slot_scene_prop_water),
  6826. (store_sub, ":water_damage", ":optimum_water", ":water"),
  6827. (try_begin),
  6828. (gt, ":water_damage", 0),
  6829. (val_mul, ":water_damage", ":full_hit_points"),
  6830. (val_div, ":water_damage", ":optimum_water"),
  6831. (val_div, ":water_damage", 4),
  6832. (val_add, ":damage", ":water_damage"),
  6833. (try_end),
  6834. (store_sub, ":hit_points", ":full_hit_points", ":damage"),
  6835. (val_max, ":hit_points", min_scene_prop_hit_points),
  6836. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  6837. (val_sub, ":hit_points", 50),
  6838. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":hit_points"),
  6839. (else_try),
  6840. (eq, ":state", scene_prop_state_destroyed),
  6841. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6842. (try_end),
  6843. ]),
  6844.  
  6845. ("cf_hit_vine", # server: handle hitting a vine grown resource; should be called from ti_on_scene_prop_hit
  6846. [(multiplayer_is_server),
  6847. (store_script_param, ":instance_id", 1), # must be valid
  6848. (store_script_param, ":hit_damage", 2),
  6849. (store_script_param, ":tool_class", 3), # constants starting with item_class_
  6850. (store_script_param, ":regrow_interval", 4),
  6851.  
  6852. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  6853. (try_begin),
  6854. (eq, ":state", scene_prop_state_active),
  6855. (call_script, "script_scene_prop_adjust_hit", ":instance_id", ":hit_damage", 1, ":tool_class", "skl_labouring", 21),
  6856. (assign, ":agent_id", reg0),
  6857. (assign, ":hit_damage", reg1),
  6858. (assign, ":hit_points", reg2),
  6859. (agent_get_wielded_item, ":wielded_item", ":agent_id", 0),
  6860. (try_begin),
  6861. (gt, ":wielded_item", -1),
  6862. (neg|item_slot_eq, ":wielded_item", slot_item_class, ":tool_class"),
  6863. (scene_prop_get_slot, ":damaged_hit_points", ":instance_id", slot_scene_prop_next_resource_hp),
  6864. (val_sub, ":damaged_hit_points", ":hit_damage"),
  6865. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":damaged_hit_points"),
  6866. (try_end),
  6867. (try_begin),
  6868. (le, ":hit_points", min_scene_prop_hit_points),
  6869. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  6870. (call_script, "script_add_resource_to_regrow_list", ":instance_id", ":regrow_interval"),
  6871. (try_end),
  6872. (else_try),
  6873. (set_fixed_point_multiplier, 1),
  6874. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  6875. (set_fixed_point_multiplier, 100),
  6876. (set_trigger_result, 0),
  6877. (assign, ":hit_damage", 0),
  6878. (try_end),
  6879. (try_begin),
  6880. (ge, ":hit_damage", 5),
  6881. (particle_system_burst, "psys_dummy_straw", pos1, 3),
  6882. (particle_system_burst, "psys_grape_leaf", pos1, 1),
  6883. (else_try),
  6884. (particle_system_burst, "psys_dummy_straw", pos1, 1),
  6885. (try_end),
  6886. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  6887. ]),
  6888.  
  6889. ("regrow_vine", # server: resource regrowing script to spawn vine fruit items
  6890. [(store_script_param, ":instance_id", 1), # must be valid
  6891.  
  6892. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  6893. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  6894. (scene_prop_set_hit_points, ":instance_id", ":full_hit_points"),
  6895. (scene_prop_get_slot, ":damaged_hit_points", ":instance_id", slot_scene_prop_next_resource_hp),
  6896. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":full_hit_points"),
  6897. (scene_prop_get_slot, ":resource_item_id", ":instance_id", slot_scene_prop_resource_item_id),
  6898. (scene_prop_get_slot, ":max_resources", ":instance_id", slot_scene_prop_seeds),
  6899. (scene_prop_get_slot, ":length", ":instance_id", slot_scene_prop_length),
  6900. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  6901. (store_add, ":max_height", ":height", 50),
  6902. (prop_instance_get_position, pos1, ":instance_id"),
  6903. (val_max, ":damaged_hit_points", 0),
  6904. (store_mul, ":resources", ":damaged_hit_points", ":max_resources"),
  6905. (val_div, ":resources", ":full_hit_points"),
  6906. (store_div, ":resource_count", ":resources", 2),
  6907. (store_random_in_range, ":resource_count", ":resource_count", ":resources"),
  6908. (set_fixed_point_multiplier, 100),
  6909. (try_for_range, ":unused", 0, ":resource_count"),
  6910. (copy_position, pos2, pos1),
  6911. (store_random_in_range, ":x_offset", 50, ":length"),
  6912. (position_move_x, pos2, ":x_offset"),
  6913. (store_random_in_range, ":y_offset", -50, 51),
  6914. (position_move_y, pos2, ":y_offset"),
  6915. (store_random_in_range, ":z_offset", ":height", ":max_height"),
  6916. (position_move_z, pos2, ":z_offset"),
  6917. (position_rotate_x, pos2, 90),
  6918. (set_spawn_position, pos2),
  6919. (spawn_item, ":resource_item_id", 0, "$g_spawn_item_prune_time"),
  6920. (prop_instance_set_position, reg0, pos2),
  6921. (try_end),
  6922. ]),
  6923.  
  6924. ("setup_linked_scene_props", # server, edit mode: called at mission start to find necessary links for certain scene prop kinds
  6925. [(store_script_param, ":scene_prop_id", 1),
  6926.  
  6927. (scene_prop_get_num_instances, ":num_instances", ":scene_prop_id"),
  6928. (try_for_range, ":begin_scene_prop_no", 0, ":num_instances"), # iterate over all scene props of the specified kind
  6929. (scene_prop_get_instance, ":begin_instance_id", ":scene_prop_id", ":begin_scene_prop_no"),
  6930. (scene_prop_slot_eq, ":begin_instance_id", slot_scene_prop_linked_scene_prop, 0),
  6931. (prop_instance_get_variation_id_2, ":begin_var_2", ":begin_instance_id"),
  6932. (prop_instance_get_position, pos1, ":begin_instance_id"),
  6933. (try_for_range, ":linked_scene_prop_no", 0, linked_scene_prop_slot_count), # iterate over all scene prop kinds required to link
  6934. (store_add, ":linked_scene_prop_param_no", ":linked_scene_prop_no", 2),
  6935. (store_script_param, ":linked_scene_prop_id", ":linked_scene_prop_param_no"),
  6936. (gt, ":linked_scene_prop_id", -1),
  6937. (store_add, ":linked_scene_prop_slot", slot_scene_prop_linked_scene_prop, ":linked_scene_prop_no"),
  6938. (assign, ":nearest_instance_id", -1),
  6939. (assign, ":nearest_distance", -1),
  6940. (scene_prop_get_num_instances, ":num_check_instances", ":linked_scene_prop_id"),
  6941. (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
  6942. (scene_prop_get_instance, ":check_instance_id", ":linked_scene_prop_id", ":check_scene_prop_no"),
  6943. (neq, ":check_instance_id", ":begin_instance_id"),
  6944. (prop_instance_get_variation_id_2, ":check_var_2", ":check_instance_id"),
  6945. (eq, ":check_var_2", ":begin_var_2"), # match scene editor value 2 to narrow down the search
  6946. (scene_prop_slot_eq, ":check_instance_id", slot_scene_prop_linked_scene_prop, 0),
  6947. (prop_instance_get_position, pos2, ":check_instance_id"),
  6948. (get_sq_distance_between_positions, ":check_distance", pos1, pos2),
  6949. (this_or_next|eq, ":nearest_distance", -1),
  6950. (lt, ":check_distance", ":nearest_distance"),
  6951. (assign, ":nearest_distance", ":check_distance"),
  6952. (assign, ":nearest_instance_id", ":check_instance_id"),
  6953. (try_end),
  6954. (scene_prop_set_slot, ":begin_instance_id", ":linked_scene_prop_slot", ":nearest_instance_id"),
  6955. (try_begin), # success
  6956. (gt, ":nearest_instance_id", -1),
  6957. (scene_prop_set_slot, ":nearest_instance_id", slot_scene_prop_linked_scene_prop, ":begin_instance_id"),
  6958. (else_try), # failure to find a necessary linked prop
  6959. (multiplayer_is_server),
  6960. (assign, reg10, ":begin_instance_id"),
  6961. (prop_instance_get_scene_prop_kind, reg11, ":begin_instance_id"),
  6962. (assign, reg12, ":linked_scene_prop_id"),
  6963. (assign, reg13, ":begin_var_2"),
  6964. (display_message, "str_error_unable_to_find_link_scene_prop"),
  6965. (try_begin),
  6966. (eq, "$g_edit_scene", 1),
  6967. (troop_get_slot, ":count", "trp_removed_scene_props", slot_array_count),
  6968. (val_add, ":count", 1),
  6969. (troop_set_slot, "trp_removed_scene_props", slot_array_count, ":count"),
  6970. (troop_set_slot, "trp_removed_scene_props", ":count", ":begin_instance_id"),
  6971. (try_end),
  6972. (try_end),
  6973. (try_end),
  6974. (try_end),
  6975. ]),
  6976.  
  6977. ("setup_all_linked_scene_props", []), # generated to run the above script for each scene prop type that needs linking to other types
  6978. ("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)
  6979.  
  6980. ("cf_agent_pick_lock", # server: calculate whether an agent picks a lock successfully, based on skill, tool, and random chance
  6981. [(store_script_param, ":agent_id", 1), # must be valid
  6982. (store_script_param, ":probablity_multiplier", 2), # 100 means a 1% chance at looting level 1, up to 10000 for 100% success rate
  6983.  
  6984. (assign, reg0, 0),
  6985. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  6986. (gt, ":wielded_item_id", -1),
  6987. (item_slot_eq, ":wielded_item_id", slot_item_class, item_class_lock_pick),
  6988. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6989. (store_skill_level, ":looting", "skl_looting", ":troop_id"),
  6990. (gt, ":looting", 0),
  6991. (assign, reg0, ":looting"),
  6992. (try_begin),
  6993. (eq, ":wielded_item_id", "itm_admin_lock_pick"),
  6994. (agent_get_troop_id, ":troop_id", ":agent_id"),
  6995. (eq, ":troop_id", "trp_godlike_hero"),
  6996. (assign, ":random", 0),
  6997. (else_try),
  6998. (val_max, ":probablity_multiplier", 1),
  6999. (val_mul, ":looting", ":probablity_multiplier"),
  7000. (store_random_in_range, ":random", 0, 10000),
  7001. (try_end),
  7002. (try_begin),
  7003. (ge, ":random", ":looting"),
  7004. (agent_play_sound, ":agent_id", "snd_pick_lock_fail"),
  7005. (try_end),
  7006. (lt, ":random", ":looting"),
  7007. ]),
  7008.  
  7009. ("cf_use_teleport_door", # server: handle agents using a door which teleports to another linked door
  7010. [(store_script_param, ":agent_id", 1), # must be valid
  7011. (store_script_param, ":instance_id", 2), # must be valid
  7012. (store_script_param, ":x_offset", 3),
  7013. (store_script_param, ":y_offset", 4), # position offset relative to the linked door that the agent is moved to
  7014. (store_script_param, ":z_offset", 5),
  7015. (store_script_param, ":is_pickable", 6),
  7016.  
  7017. (scene_prop_get_slot, ":linked_door_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  7018. (gt, ":linked_door_instance_id", 0),
  7019. (agent_get_player_id, ":player_id", ":agent_id"),
  7020. (player_is_active, ":player_id"),
  7021. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  7022. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  7023. (assign, ":faction_id", reg0),
  7024. (assign, ":fail", 0),
  7025. (try_begin),
  7026. (eq, ":faction_id", "fac_commoners"),
  7027. (else_try),
  7028. (eq, ":faction_id", ":player_faction_id"),
  7029. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  7030. (try_begin),
  7031. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  7032. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  7033. (scene_prop_set_slot, ":linked_door_instance_id", slot_scene_prop_unlocked, 0),
  7034. (agent_play_sound, ":agent_id", "snd_lock"),
  7035. (try_end),
  7036. (else_try),
  7037. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  7038. (else_try),
  7039. (assign, reg0, 0),
  7040. (eq, ":is_pickable", 1),
  7041. (call_script, "script_cf_agent_pick_lock", ":agent_id", 100),
  7042. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  7043. (scene_prop_set_slot, ":linked_door_instance_id", slot_scene_prop_unlocked, 1),
  7044. (else_try),
  7045. (assign, ":fail", 1),
  7046. (gt, reg0, 0),
  7047. (else_try),
  7048. (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"),
  7049. (try_end),
  7050. (eq, ":fail", 0),
  7051. (prop_instance_get_position, pos1, ":linked_door_instance_id"),
  7052. (position_move_x, pos1, ":x_offset"),
  7053. (position_move_y, pos1, ":y_offset"),
  7054. (position_move_z, pos1, ":z_offset"),
  7055. (agent_set_position, ":agent_id", pos1),
  7056. ]),
  7057.  
  7058. ("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
  7059. [(store_script_param, ":agent_id", 1), # must be valid
  7060. (store_script_param, ":instance_id", 2), # must be valid
  7061.  
  7062. (agent_get_player_id, ":player_id", ":agent_id"),
  7063. (player_is_active, ":player_id"),
  7064. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  7065. (neq, reg0, "fac_commoners"),
  7066. (assign, ":faction_id", reg0),
  7067. (assign, ":fail", 1),
  7068. (try_begin),
  7069. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 0),
  7070. (agent_play_sound, ":agent_id", "snd_pick_lock_fail"),
  7071. (else_try),
  7072. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  7073. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  7074. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  7075. (scene_prop_get_slot, ":linked_door_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  7076. (try_begin),
  7077. (gt, ":linked_door_instance_id", 0),
  7078. (scene_prop_set_slot, ":linked_door_instance_id", slot_scene_prop_unlocked, 0),
  7079. (try_end),
  7080. (agent_play_sound, ":agent_id", "snd_lock"),
  7081. (assign, ":fail", 0),
  7082. (try_end),
  7083. (eq, ":fail", 0),
  7084. ]),
  7085.  
  7086. ("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
  7087. [(store_script_param, ":agent_id", 1), # must be valid
  7088. (store_script_param, ":item_1_id", 2),
  7089. (store_script_param, ":item_2_id", 3), # pass -1 to any of these to check for less items
  7090. (store_script_param, ":item_3_id", 4),
  7091. (store_script_param, ":item_4_id", 5),
  7092.  
  7093. (assign, ":item_1_slot", -1),
  7094. (assign, ":item_2_slot", -1),
  7095. (assign, ":item_3_slot", -1),
  7096. (assign, ":item_4_slot", -1),
  7097. (try_for_range, ":equip_slot", ek_item_0, ek_item_3 + 1),
  7098. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  7099. (ge, ":item_id", all_items_begin),
  7100. (store_add, ":offset_slot", ":equip_slot", 1),
  7101. (try_begin),
  7102. (eq, ":item_id", ":item_1_id"),
  7103. (eq, ":item_1_slot", -1),
  7104. (assign, ":item_1_slot", ":offset_slot"),
  7105. (else_try),
  7106. (eq, ":item_id", ":item_2_id"),
  7107. (eq, ":item_2_slot", -1),
  7108. (assign, ":item_2_slot", ":offset_slot"),
  7109. (else_try),
  7110. (eq, ":item_id", ":item_3_id"),
  7111. (eq, ":item_3_slot", -1),
  7112. (assign, ":item_3_slot", ":offset_slot"),
  7113. (else_try),
  7114. (eq, ":item_id", ":item_4_id"),
  7115. (eq, ":item_4_slot", -1),
  7116. (assign, ":item_4_slot", ":offset_slot"),
  7117. (try_end),
  7118. (try_end),
  7119. (this_or_next|lt, ":item_1_id", all_items_begin),
  7120. (gt, ":item_1_slot", -1),
  7121. (this_or_next|lt, ":item_2_id", all_items_begin),
  7122. (gt, ":item_2_slot", -1),
  7123. (this_or_next|lt, ":item_3_id", all_items_begin),
  7124. (gt, ":item_3_slot", -1),
  7125. (this_or_next|lt, ":item_4_id", all_items_begin),
  7126. (gt, ":item_4_slot", -1),
  7127. (try_begin),
  7128. (gt, ":item_1_slot", -1),
  7129. (agent_unequip_item, ":agent_id", ":item_1_id", ":item_1_slot"),
  7130. (try_end),
  7131. (try_begin),
  7132. (gt, ":item_2_slot", -1),
  7133. (agent_unequip_item, ":agent_id", ":item_2_id", ":item_2_slot"),
  7134. (try_end),
  7135. (try_begin),
  7136. (gt, ":item_3_slot", -1),
  7137. (agent_unequip_item, ":agent_id", ":item_3_id", ":item_3_slot"),
  7138. (try_end),
  7139. (try_begin),
  7140. (gt, ":item_4_slot", -1),
  7141. (agent_unequip_item, ":agent_id", ":item_4_id", ":item_4_slot"),
  7142. (try_end),
  7143. (assign, reg1, ":item_1_slot"),
  7144. (assign, reg2, ":item_2_slot"),
  7145. (assign, reg3, ":item_3_slot"),
  7146. (assign, reg4, ":item_4_slot"),
  7147. ]),
  7148.  
  7149. ("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
  7150. [(store_script_param, ":agent_id", 1), # must be valid
  7151. (store_script_param, ":resource_class", 2), # constants starting with item_class_
  7152. (store_script_param, ":maximum_required", 3), # don't consume more resource items if this amount is reached
  7153.  
  7154. (assign, ":amount_found", 0),
  7155. (assign, ":loop_end", ek_item_3 + 1),
  7156. (try_for_range, ":equip_slot", ek_item_0, ":loop_end"),
  7157. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  7158. (ge, ":item_id", all_items_begin),
  7159. (item_slot_eq, ":item_id", slot_item_class, ":resource_class"),
  7160. (item_get_slot, ":item_amount", ":item_id", slot_item_resource_amount),
  7161. (gt, ":item_amount", 0),
  7162. (val_add, ":amount_found", ":item_amount"),
  7163. (store_add, ":offset_slot", ":equip_slot", 1),
  7164. (agent_unequip_item, ":agent_id", ":item_id", ":offset_slot"),
  7165. (ge, ":amount_found", ":maximum_required"),
  7166. (assign, ":loop_end", -1),
  7167. (try_end),
  7168. (assign, reg0, ":amount_found"),
  7169. (gt, ":amount_found", 0),
  7170. ]),
  7171.  
  7172. ("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
  7173. [(store_script_param, ":agent_id", 1), # must be valid
  7174. (store_script_param, ":item_id", 2),
  7175. (store_script_param, ":count", 3), # 1 - 4 items to try consume
  7176.  
  7177. (agent_has_item_equipped, ":agent_id", ":item_id"),
  7178. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  7179. (item_get_type, ":item_type", ":item_id"),
  7180. (try_begin),
  7181. (neq, ":item_type", itp_type_arrows),
  7182. (neq, ":item_type", itp_type_bolts),
  7183. (neq, ":item_type", itp_type_thrown),
  7184. (assign, ":check_max_ammo", 0),
  7185. (else_try),
  7186. (item_get_slot, ":check_max_ammo", ":item_id", slot_item_max_ammo),
  7187. (try_end),
  7188. (assign, ":found", 0),
  7189. (assign, ":loop_end", ek_item_3 + 1),
  7190. (try_for_range, ":equip_slot", ek_item_0, ":loop_end"),
  7191. (agent_get_item_slot, ":equip_item_id", ":agent_id", ":equip_slot"),
  7192. (eq, ":equip_item_id", ":item_id"),
  7193. (try_begin), # for ammo items, require full stacks for consuming
  7194. (gt, ":check_max_ammo", 0),
  7195. (agent_get_ammo_for_slot, ":ammo", ":agent_id", ":equip_slot"),
  7196. (lt, ":ammo", ":check_max_ammo"),
  7197. (else_try),
  7198. (store_add, ":offset_slot", ":equip_slot", 1), # agent_get_item_slot numbered 0 - 3 = agent_unequip_item numbered 1 - 4
  7199. (troop_set_slot, "trp_temp_array", ":found", ":offset_slot"), # add items to a list for removing if enough found
  7200. (val_add, ":found", 1),
  7201. (ge, ":found", ":count"),
  7202. (assign, ":loop_end", -1),
  7203. (try_end),
  7204. (try_end),
  7205. (ge, ":found", ":count"),
  7206. (try_for_range, ":index", 0, ":count"),
  7207. (troop_get_slot, ":offset_slot", "trp_temp_array", ":index"),
  7208. (agent_unequip_item, ":agent_id", ":item_id", ":offset_slot"),
  7209. (try_end),
  7210. (try_begin),
  7211. (eq, ":wielded_item_id", ":item_id"),
  7212. (agent_set_wielded_item, ":agent_id", -1),
  7213. (call_script, "script_agent_calculate_stat_modifiers_for_item", ":agent_id", ":item_id", 0, 1),
  7214. (try_end),
  7215. (assign, reg0, ":offset_slot"),
  7216. ]),
  7217.  
  7218. ("spawn_processed_resources", # server: spawn a row of items on the ground in front of the agent; overwrites pos1
  7219. [(store_script_param, ":agent_id", 1), # must be valid
  7220. (store_script_param, ":processed_item_id", 2),
  7221. (store_script_param, ":processed_item_count", 3),
  7222.  
  7223. (agent_get_position, pos1, ":agent_id"),
  7224. (position_set_z_to_ground_level, pos1),
  7225. (position_move_y, pos1, 10),
  7226. (try_begin),
  7227. (gt, ":processed_item_count", 2),
  7228. (position_move_x, pos1, -20),
  7229. (try_end),
  7230. (assign, ":column", 0),
  7231. (try_for_range, ":unused", 0, ":processed_item_count"),
  7232. (set_spawn_position, pos1),
  7233. (spawn_item, ":processed_item_id", 0, "$g_spawn_item_prune_time"),
  7234. (try_begin),
  7235. (lt, ":column", 3),
  7236. (position_move_x, pos1, 10),
  7237. (val_add, ":column", 1),
  7238. (else_try),
  7239. (assign, ":column", 0),
  7240. (position_move_y, pos1, 10),
  7241. (position_move_x, pos1, -30),
  7242. (try_end),
  7243. (try_end),
  7244. ]),
  7245.  
  7246. ])
  7247.  
  7248. # Generate common parts of resource processing server scripts. 'resource_class' is constants starting with item_class_.
  7249. # 'start_effect' allows the script to proceed even if the 'finished' parameter is not 1, to allow playing effects at the start.
  7250. # 'get_relative_pos' calculates the relative position of the agent to the scene prop, to allow different actions.
  7251. def generate_process_init(skill=None, level=1, resource_class=None, start_effect=True, get_relative_pos=False):
  7252. operations = [(store_script_param, ":agent_id", 1)]
  7253. if start_effect or get_relative_pos:
  7254. operations.append((store_script_param, ":instance_id", 2))
  7255. operations.append((store_script_param, ":finished", 3))
  7256. if not start_effect:
  7257. operations.append((eq, ":finished", 1))
  7258. if skill is not None and level > 0:
  7259. operations.extend([(agent_get_troop_id, ":troop_id", ":agent_id"),
  7260. (store_skill_level, ":skill_level", skill, ":troop_id"),
  7261. (ge, ":skill_level", level)])
  7262. operations.extend([(agent_get_wielded_item, ":resource_item_id", ":agent_id", 0),
  7263. (ge, ":resource_item_id", all_items_begin)])
  7264. if resource_class is not None:
  7265. if isinstance(resource_class, list):
  7266. operations.extend([(this_or_next|item_slot_eq, ":resource_item_id", slot_item_class, rc) for rc in resource_class[:-1]])
  7267. resource_class = resource_class[-1]
  7268. operations.append((item_slot_eq, ":resource_item_id", slot_item_class, resource_class))
  7269. if get_relative_pos:
  7270. operations.extend([(set_fixed_point_multiplier, 100),
  7271. (prop_instance_get_position, pos1, ":instance_id"),
  7272. (agent_get_position, pos2, ":agent_id"),
  7273. (position_transform_position_to_local, pos3, pos1, pos2),
  7274. (position_get_y, ":relative_y_position", pos3)])
  7275. return lazy.block(operations)
  7276.  
  7277. scripts.extend([
  7278.  
  7279. ("cf_process_wood",
  7280. [generate_process_init(skill="skl_engineer", level=1, resource_class=item_class_wood),
  7281.  
  7282. (assign, ":processed_item_id", -1),
  7283. (assign, ":processed_item_count", 1),
  7284. (try_begin),
  7285. (eq, ":resource_item_id", "itm_branch"),
  7286. (assign, ":processed_item_id", "itm_wood_pole"),
  7287. (else_try),
  7288. (eq, ":resource_item_id", "itm_wood_pole"),
  7289. (assign, ":processed_item_id", "itm_wood_pole_short"),
  7290. (assign, ":processed_item_count", 2),
  7291. (else_try),
  7292. (eq, ":resource_item_id", "itm_wood_pole_short"),
  7293. (assign, ":processed_item_id", "itm_stick"),
  7294. (assign, ":processed_item_count", 2),
  7295. (else_try),
  7296. (eq, ":resource_item_id", "itm_wood_block"),
  7297. (assign, ":processed_item_id", "itm_board"),
  7298. (assign, ":processed_item_count", 4),
  7299. (try_end),
  7300. (neq, ":processed_item_id", -1),
  7301. (try_begin),
  7302. (eq, ":finished", 1),
  7303. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7304. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7305. (else_try),
  7306. (eq, ":finished", 0),
  7307. (agent_play_sound, ":agent_id", "snd_saw_wood"),
  7308. (prop_instance_get_position, pos1, ":instance_id"),
  7309. (position_move_z, pos1, 50),
  7310. (particle_system_burst, "psys_cut_wood", pos1, 100),
  7311. (try_end),
  7312. ]),
  7313.  
  7314. ("cf_process_iron",
  7315. [generate_process_init(skill="skl_engineer", level=2, resource_class=[item_class_iron, item_class_precious], get_relative_pos=True),
  7316.  
  7317. (assign, ":processed_item_id", -1),
  7318. (assign, ":processed_item_count", 1),
  7319. (assign, ":resource_item_count", 1),
  7320. (try_begin),
  7321. (eq, ":resource_item_id", "itm_iron_ore"),
  7322. (assign, ":processed_item_count", 2),
  7323. (assign, ":processed_item_id", "itm_iron_bar"),
  7324. (else_try),
  7325. (eq, ":resource_item_id", "itm_iron_ore_small"),
  7326. (assign, ":processed_item_count", 2),
  7327. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7328. (else_try),
  7329. (eq, ":resource_item_id", "itm_gold_nugget"),
  7330. (assign, ":processed_item_count", 1),
  7331. (assign, ":resource_item_count", 4),
  7332. (assign, ":processed_item_id", "itm_gold_bar"),
  7333. (else_try),
  7334. (eq, ":resource_item_id", "itm_silver_nugget"),
  7335. (assign, ":processed_item_count", 1),
  7336. (assign, ":resource_item_count", 4),
  7337. (assign, ":processed_item_id", "itm_silver_bar"),
  7338. (else_try),
  7339. (ge, ":relative_y_position", 0),
  7340. (assign, ":processed_item_count", 2),
  7341. (try_begin),
  7342. (eq, ":resource_item_id", "itm_iron_bar_short"),
  7343. (assign, ":processed_item_id", "itm_iron_piece"),
  7344. (else_try),
  7345. (eq, ":resource_item_id", "itm_iron_bar"),
  7346. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7347. (else_try),
  7348. (eq, ":resource_item_id", "itm_iron_bar_long"),
  7349. (assign, ":processed_item_id", "itm_iron_bar"),
  7350. (try_end),
  7351. (else_try),
  7352. (assign, ":resource_item_count", 2),
  7353. (eq, ":resource_item_id", "itm_iron_piece"),
  7354. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7355. (else_try),
  7356. (eq, ":resource_item_id", "itm_iron_bar_short"),
  7357. (assign, ":processed_item_id", "itm_iron_bar"),
  7358. (else_try),
  7359. (eq, ":resource_item_id", "itm_iron_bar"),
  7360. (assign, ":processed_item_id", "itm_iron_bar_long"),
  7361. (try_end),
  7362. (ge, ":processed_item_id", all_items_begin),
  7363. (try_begin),
  7364. (eq, ":finished", 1),
  7365. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7366. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7367. (else_try),
  7368. (eq, ":finished", 0),
  7369. (agent_play_sound, ":agent_id", "snd_blacksmith"),
  7370. (prop_instance_get_position, pos1, ":instance_id"),
  7371. (position_move_z, pos1, 100),
  7372. (particle_system_burst, "psys_fireplace_fire_big", pos1, 100),
  7373. (try_end),
  7374. ]),
  7375.  
  7376. ("cf_process_iron_divide_only",
  7377. [generate_process_init(skill="skl_engineer", level=2, resource_class=item_class_iron),
  7378.  
  7379. (assign, ":processed_item_id", -1),
  7380. (try_begin),
  7381. (eq, ":resource_item_id", "itm_iron_bar_short"),
  7382. (assign, ":processed_item_id", "itm_iron_piece"),
  7383. (else_try),
  7384. (eq, ":resource_item_id", "itm_iron_bar"),
  7385. (assign, ":processed_item_id", "itm_iron_bar_short"),
  7386. (else_try),
  7387. (eq, ":resource_item_id", "itm_iron_bar_long"),
  7388. (assign, ":processed_item_id", "itm_iron_bar"),
  7389. (try_end),
  7390. (ge, ":processed_item_id", all_items_begin),
  7391. (try_begin),
  7392. (eq, ":finished", 1),
  7393. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7394. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 2),
  7395. (else_try),
  7396. (eq, ":finished", 0),
  7397. (agent_play_sound, ":agent_id", "snd_blacksmith"),
  7398. (neq, ":instance_id", 0),
  7399. (try_end),
  7400. ]),
  7401.  
  7402. ("cf_process_grind", #RAMARAUNT EDIT FOR RICE FLOUR
  7403. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7404.  
  7405. (assign, ":processed_item_id", -1),
  7406. (assign, ":processed_item_count", 1),
  7407. (assign, ":resource_item_count", 1),
  7408. (try_begin),
  7409. (eq, ":resource_item_id", "itm_wheat_sheaf"),
  7410. (assign, ":processed_item_id", "itm_flour_sack"),
  7411. (try_begin),
  7412. (ge, ":skill_level", 5),
  7413. (assign, ":resource_item_count", 3),
  7414. (else_try),
  7415. (assign, ":resource_item_count", 4),
  7416. (try_end),
  7417. (else_try),
  7418. (eq, ":resource_item_id", "itm_rice_bag"),
  7419. (assign, ":processed_item_id", "itm_rice_flour"),
  7420. (try_end),
  7421. (neq, ":processed_item_id", -1),
  7422. (try_begin),
  7423. (eq, ":finished", 1),
  7424. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7425. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7426. (else_try),
  7427. (eq, ":finished", 0),
  7428. (prop_instance_get_position, pos1, ":instance_id"),
  7429. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  7430. (particle_system_burst, "psys_dummy_smoke", pos1, 10),
  7431. (try_end),
  7432. ]),
  7433.  
  7434. ("cf_process_cook", #ALTERED BY RAMARAUNT
  7435. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7436.  
  7437. (assign, ":resource_2_item_id", -1),
  7438. (assign, ":resource_3_item_id", -1),
  7439. (assign, ":resource_4_item_id", -1),
  7440. (assign, ":processed_item_id", -1),
  7441. (assign, ":processed_item_count", 1),
  7442. (try_begin),
  7443. (eq, ":resource_item_id", "itm_flour_sack"),
  7444. (try_begin),
  7445. (agent_has_item_equipped, ":agent_id", "itm_water_bucket"),
  7446. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7447. (assign, ":processed_item_id", "itm_bread"),
  7448. (else_try),
  7449. (agent_has_item_equipped, ":agent_id", "itm_raw_meat"),
  7450. (assign, ":resource_2_item_id", "itm_raw_meat"),
  7451. (assign, ":processed_item_id", "itm_meat_pie"),
  7452. (else_try),
  7453. (agent_has_item_equipped, ":agent_id", "itm_salted_meat"),
  7454. (assign, ":resource_2_item_id", "itm_salted_meat"),
  7455. (assign, ":processed_item_id", "itm_meat_pie"),
  7456. (else_try),
  7457. (agent_has_item_equipped, ":agent_id", "itm_red_apple"),
  7458. (assign, ":resource_2_item_id", "itm_red_apple"),
  7459. (assign, ":resource_3_item_id", "itm_red_apple"),
  7460. (assign, ":resource_4_item_id", "itm_red_apple"),
  7461. (assign, ":processed_item_id", "itm_apple_pie"),
  7462. (try_end),
  7463. (try_begin),
  7464. (ge, ":skill_level", 5),
  7465. (assign, ":processed_item_count", 5),
  7466. (else_try),
  7467. (assign, ":processed_item_count", 4),
  7468. (try_end),
  7469. (else_try),
  7470. (this_or_next|eq, ":resource_item_id", "itm_fish"),
  7471. (eq, ":resource_item_id", "itm_salted_fish"),
  7472. (assign, ":processed_item_id", "itm_cooked_fish"),
  7473. (else_try),
  7474. (this_or_next|eq, ":resource_item_id", "itm_raw_meat"),
  7475. (eq, ":resource_item_id", "itm_salted_meat"),
  7476. (assign, ":processed_item_id", "itm_cooked_meat"),
  7477. (else_try), #mushroom soup
  7478. (eq, ":resource_item_id", "itm_shitocky_mushroom"),
  7479. (assign, ":processed_item_id", "itm_shitocky_soup"),
  7480. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7481. (else_try), #bad mushroom soupo
  7482. (eq, ":resource_item_id", "itm_bad_trip_mushroom"),
  7483. (assign, ":processed_item_id", "itm_shit_soup"),
  7484. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7485. (else_try), #vegetable soup
  7486. (this_or_next|eq, ":resource_item_id", "itm_cut_carrots"),
  7487. (this_or_next|eq, ":resource_item_id", "itm_cut_potato"),
  7488. (eq, ":resource_item_id", "itm_cabbage_leaf"),
  7489. (assign, ":processed_item_id", "itm_vegetable_soup_pot"),
  7490. (assign, ":resource_4_item_id", "itm_cabbage_leaf"),
  7491. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7492. (assign, ":resource_item_id", "itm_cut_potato"),
  7493. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7494. (else_try), #stew
  7495. (eq, ":resource_item_id", "itm_cut_meat"),
  7496. (assign, ":processed_item_id", "itm_stew_pot"),
  7497. (assign, ":resource_item_id", "itm_cut_meat"),
  7498. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7499. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7500. (assign, ":resource_4_item_id", "itm_cut_potato"),
  7501. (else_try), #natto
  7502. (eq, ":resource_item_id", "itm_soybeans"),
  7503. (assign, ":processed_item_id", "itm_natto"),
  7504. (assign, ":resource_3_item_id", "itm_karashi_mustard"),
  7505. (assign, ":resource_2_item_id", "itm_cut_onions"),
  7506. (else_try), #baked potato
  7507. (eq, ":resource_item_id", "itm_potato"),
  7508. (assign, ":processed_item_id", "itm_baked_potato"),
  7509. (else_try), #rice bread
  7510. (eq, ":resource_item_id", "itm_rice_flour"),
  7511. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7512. (assign, ":processed_item_id", "itm_rice_bread"),
  7513. (try_begin),
  7514. (ge, ":skill_level", 5),
  7515. (assign, ":processed_item_count", 5),
  7516. (else_try),
  7517. (assign, ":processed_item_count", 4),
  7518. (try_end),
  7519. (else_try), #noodles
  7520. (eq, ":resource_item_id", "itm_uncooked_noodles"),
  7521. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7522. (assign, ":processed_item_id", "itm_noodles"),
  7523. (assign, ":processed_item_count", 3),
  7524. (else_try), #baked potato
  7525. (eq, ":resource_item_id", "itm_teapot_unboiled"),
  7526. (assign, ":processed_item_id", "itm_teapot"),
  7527. (else_try), #mushroom stew poisinous
  7528. (eq, ":resource_item_id", "itm_cut_mushrooms_poison"),
  7529. (assign, ":processed_item_id", "itm_mushroom_stew_pot_poison"),
  7530. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7531. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7532. (assign, ":resource_4_item_id", "itm_cut_potato"),
  7533. (else_try), # mushroom stew
  7534. (eq, ":resource_item_id", "itm_cut_mushrooms"),
  7535. (assign, ":processed_item_id", "itm_mushroom_stew_pot"),
  7536. (assign, ":resource_3_item_id", "itm_cut_carrots"),
  7537. (assign, ":resource_2_item_id", "itm_water_bucket"),
  7538. (assign, ":resource_4_item_id", "itm_cut_potato"),
  7539. (try_end),
  7540. (neq, ":processed_item_id", -1),
  7541. (try_begin),
  7542. (eq, ":finished", 1),
  7543. (call_script, "script_cf_agent_consume_items", ":agent_id", ":resource_item_id", ":resource_2_item_id", ":resource_3_item_id", ":resource_4_item_id"),
  7544. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7545. (try_begin),
  7546. (eq, ":resource_2_item_id", "itm_water_bucket"),
  7547. (agent_equip_item, ":agent_id", "itm_bucket", reg2),
  7548. (try_end),
  7549. (else_try),
  7550. (eq, ":finished", 0),
  7551. (call_script, "script_scene_prop_play_sound", ":instance_id", "snd_fire"),
  7552. (prop_instance_get_position, pos1, ":instance_id"),
  7553. (copy_position, pos2, pos1),
  7554. (position_move_z, pos1, 100),
  7555. (position_move_y, pos1, -50),
  7556. (particle_system_burst, "psys_cooking_smoke", pos1, 100),
  7557. (particle_system_burst, "psys_fireplace_fire_small", pos2, 100),
  7558. (try_end),
  7559. ]),
  7560.  
  7561. ("cf_process_press", #ALTERED BY RAMARAUNT FOR RICE WINE
  7562. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7563.  
  7564. (assign, ":processed_item_id", -1),
  7565. (assign, ":processed_item_count", 1),
  7566. (assign, ":resource_item_count", 1),
  7567. (try_begin),
  7568. (eq, ":resource_item_id", "itm_grapes"),
  7569. (assign, ":processed_item_id", "itm_must_barrel"),
  7570. (assign, ":resource_item_count", 3),
  7571. (else_try),
  7572. (eq, ":resource_item_id", "itm_must_barrel"),
  7573. (assign, ":processed_item_id", "itm_wine_barrel"),
  7574. (try_begin),
  7575. (ge, ":skill_level", 5),
  7576. (assign, ":resource_item_count", 2),
  7577. (else_try),
  7578. (assign, ":resource_item_count", 3),
  7579. (try_end),
  7580. (else_try),
  7581. (eq, ":resource_item_id", "itm_rice_bag"),
  7582. (assign, ":processed_item_id", "itm_rice_wine_barrel"),
  7583. (assign, ":resource_item_count",1),
  7584. (try_end),
  7585. (neq, ":processed_item_id", -1),
  7586. (try_begin),
  7587. (eq, ":finished", 1),
  7588. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7589. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7590. (else_try),
  7591. (eq, ":finished", 0),
  7592. (prop_instance_get_position, pos1, ":instance_id"),
  7593. (particle_system_burst, "psys_wine_press_fill", pos1, 1),
  7594. (try_end),
  7595. ]),
  7596.  
  7597. ("cf_process_brew",
  7598. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food),
  7599.  
  7600. (assign, ":processed_item_id", -1),
  7601. (assign, ":processed_item_count", 1),
  7602. (try_begin),
  7603. (eq, ":resource_item_id", "itm_wheat_sheaf"),
  7604. (agent_has_item_equipped, ":agent_id", "itm_water_bucket"),
  7605. (assign, ":processed_item_id", "itm_beer_cask"),
  7606. (try_begin),
  7607. (ge, ":skill_level", 5),
  7608. (assign, ":resource_item_count", 2),
  7609. (else_try),
  7610. (assign, ":resource_item_count", 3),
  7611. (try_end),
  7612. (try_begin),
  7613. (eq, ":finished", 1),
  7614. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_water_bucket", 1),
  7615. (agent_equip_item, ":agent_id", "itm_bucket", reg0),
  7616. (try_end),
  7617. (try_end),
  7618. (neq, ":processed_item_id", -1),
  7619. (try_begin),
  7620. (eq, ":finished", 1),
  7621. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7622. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7623. (else_try),
  7624. (eq, ":finished", 0),
  7625. (prop_instance_get_position, pos1, ":instance_id"),
  7626. (position_move_x, pos1, -75),
  7627. (position_move_y, pos1, -25),
  7628. (position_move_z, pos1, 320),
  7629. (particle_system_burst, "psys_brewing_steam", pos1, 100),
  7630. (try_end),
  7631. ]),
  7632.  
  7633. ("cf_process_tavern", #ALTERED BY RAMARAUNT FOR RICE WINE
  7634. [generate_process_init(resource_class=item_class_food, start_effect=False),
  7635.  
  7636. (assign, ":processed_item_id", -1),
  7637. (assign, ":resource_item_count", 1),
  7638. (assign, ":processed_item_count", 1),
  7639. (store_script_param, ":instance_id", 2),
  7640. (prop_instance_get_position, pos1, ":instance_id"),
  7641. (try_begin),
  7642. (eq, ":resource_item_id", "itm_wine_barrel"),
  7643. (assign, ":processed_item_count", 4),
  7644. (assign, ":processed_item_id", "itm_wine_jar"),
  7645. (position_move_z, pos1, 105),
  7646. (position_rotate_x, pos1, 90),
  7647. (else_try),
  7648. (eq, ":resource_item_id", "itm_wine_jar"),
  7649. (assign, ":resource_item_count", 4),
  7650. (assign, ":processed_item_id", "itm_wine_barrel"),
  7651. (position_move_z, pos1, 114),
  7652. (else_try),
  7653. (eq, ":resource_item_id", "itm_beer_cask"),
  7654. (assign, ":processed_item_count", 4),
  7655. (assign, ":processed_item_id", "itm_beer_jug"),
  7656. (position_move_z, pos1, 120),
  7657. (position_rotate_x, pos1, 90),
  7658. (else_try),
  7659. (eq, ":resource_item_id", "itm_beer_jug"),
  7660. (assign, ":resource_item_count", 4),
  7661. (assign, ":processed_item_id", "itm_beer_cask"),
  7662. (position_move_z, pos1, 116),
  7663. (else_try), #SAKE ADD
  7664. (eq, ":resource_item_id", "itm_rice_wine_barrel"),
  7665. (assign, ":processed_item_count", 4),
  7666. (assign, ":processed_item_id", "itm_rice_wine_jug"),
  7667. (position_move_z, pos1, 120),
  7668. (position_rotate_x, pos1, 90),
  7669. (else_try),
  7670. (eq, ":resource_item_id", "itm_rice_wine_jug"),
  7671. (assign, ":resource_item_count", 4),
  7672. (assign, ":processed_item_id", "itm_rice_wine_barrel"),
  7673. (position_move_z, pos1, 116),
  7674. (else_try), #vege soup add
  7675. (eq, ":resource_item_id", "itm_vegetable_soup_pot"),
  7676. (assign, ":processed_item_count", 4),
  7677. (assign, ":processed_item_id", "itm_vegetable_soup_bowl"),
  7678. (position_move_z, pos1, 105),
  7679. (else_try),
  7680. (eq, ":resource_item_id", "itm_vegetable_soup_bowl"),
  7681. (assign, ":resource_item_count", 4),
  7682. (assign, ":processed_item_id", "itm_vegetable_soup_pot"),
  7683. (position_move_z, pos1, 116),
  7684. (else_try), #stew add
  7685. (eq, ":resource_item_id", "itm_stew_pot"),
  7686. (assign, ":processed_item_count", 4),
  7687. (assign, ":processed_item_id", "itm_stew_bowl"),
  7688. (position_move_z, pos1, 116),
  7689. (else_try),
  7690. (eq, ":resource_item_id", "itm_stew_bowl"),
  7691. (assign, ":resource_item_count", 4),
  7692. (assign, ":processed_item_id", "itm_stew_pot"),
  7693. (position_move_z, pos1, 116),
  7694. (else_try), #Milk add
  7695. (eq, ":resource_item_id", "itm_milk_bucket"),
  7696. (assign, ":processed_item_count", 4),
  7697. (assign, ":processed_item_id", "itm_milk_jug"),
  7698. (position_move_z, pos1, 120),
  7699. (position_rotate_x, pos1, 90),
  7700. (agent_equip_item, ":agent_id", "itm_bucket", 1),
  7701. (else_try), #tea
  7702. (eq, ":resource_item_id", "itm_teapot"),
  7703. (assign, ":processed_item_count", 4),
  7704. (assign, ":processed_item_id", "itm_cuppa_tea"),
  7705. (position_move_z, pos1, 116),
  7706. (else_try),
  7707. (eq, ":resource_item_id", "itm_cuppa_tea"),
  7708. (assign, ":resource_item_count", 4),
  7709. (assign, ":processed_item_id", "itm_teapot"),
  7710. (position_move_z, pos1, 116),
  7711. (else_try), #mushroom stew add
  7712. (eq, ":resource_item_id", "itm_mushroom_stew_pot"),
  7713. (assign, ":processed_item_count", 4),
  7714. (assign, ":processed_item_id", "itm_mushroom_stew_bowl"),
  7715. (position_move_z, pos1, 116),
  7716. (else_try),
  7717. (eq, ":resource_item_id", "itm_mushroom_stew_bowl"),
  7718. (assign, ":resource_item_count", 4),
  7719. (assign, ":processed_item_id", "itm_mushroom_stew_pot"),
  7720. (position_move_z, pos1, 116),
  7721. (else_try), #mushroom stew poison add
  7722. (eq, ":resource_item_id", "itm_mushroom_stew_pot_poison"),
  7723. (assign, ":processed_item_count", 4),
  7724. (assign, ":processed_item_id", "itm_mushroom_stew_bowl_poison"),
  7725. (position_move_z, pos1, 116),
  7726. (else_try),
  7727. (eq, ":resource_item_id", "itm_mushroom_stew_bowl_poison"),
  7728. (assign, ":resource_item_count", 4),
  7729. (assign, ":processed_item_id", "itm_mushroom_stew_pot_poison"),
  7730. (position_move_z, pos1, 116),
  7731. (try_end),
  7732.  
  7733. (neq, ":processed_item_id", -1),
  7734. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7735. (store_div, ":move_x", ":processed_item_count", 2),
  7736. (val_mul, ":move_x", -50),
  7737. (position_move_x, pos1, ":move_x"),
  7738. (try_for_range, ":unused", 0, ":processed_item_count"),
  7739. (set_spawn_position, pos1),
  7740. (spawn_item, ":processed_item_id", 0, "$g_spawn_item_prune_time"),
  7741. (prop_instance_set_position, reg0, pos1),
  7742. (position_move_x, pos1, 50),
  7743. (try_end),
  7744. ]),
  7745.  
  7746. ("cf_process_preserve",
  7747. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food, start_effect=False),
  7748.  
  7749. (assign, ":processed_item_id", -1),
  7750. (try_begin),
  7751. (eq, ":resource_item_id", "itm_fish"),
  7752. (assign, ":processed_item_id", "itm_salted_fish"),
  7753. (else_try),
  7754. (eq, ":resource_item_id", "itm_raw_meat"),
  7755. (assign, ":processed_item_id", "itm_salted_meat"),
  7756. (else_try),
  7757. (eq, ":resource_item_id", "itm_salt_sack"),
  7758. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_salt_sack", 1),
  7759. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_salt", 8),
  7760. (try_end),
  7761. (neq, ":processed_item_id", -1),
  7762. (call_script, "script_cf_agent_consume_items", ":agent_id", "itm_salt", ":resource_item_id", ":resource_item_id", ":resource_item_id"),
  7763. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 3),
  7764. ]),
  7765.  
  7766. #RAMARAUNT SCRIPT
  7767. ("cf_process_rice",
  7768. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food, start_effect=False),
  7769.  
  7770. (assign, ":processed_item_id", -1),
  7771. (try_begin),
  7772. (eq, ":resource_item_id", "itm_rice_bag"),
  7773. (assign, ":processed_item_id", "itm_rice_bowl"),
  7774. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7775. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 3),
  7776. (else_try),
  7777. (eq, ":resource_item_id", "itm_fish"),
  7778. (assign, ":processed_item_id", "itm_sushi"),
  7779. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_rice_bag", 1),
  7780. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7781. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7782. (else_try),
  7783. (eq, ":resource_item_id", "itm_carrot"),
  7784. (assign, ":processed_item_id", "itm_cut_carrots"),
  7785. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7786. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cut_carrots", 1),
  7787. (else_try),
  7788. (eq, ":resource_item_id", "itm_cabbage"),
  7789. (assign, ":processed_item_id", "itm_cabbage_leaf"),
  7790. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7791. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cabbage_leaf", 1),
  7792. (else_try),
  7793. (eq,":resource_item_id", "itm_potato"),
  7794. (assign, ":processed_item_id", "itm_cut_potato"),
  7795. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7796. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cut_potato", 1),
  7797. (else_try),
  7798. (this_or_next|eq, ":resource_item_id", "itm_salted_meat"),
  7799. (this_or_next|eq, ":resource_item_id", "itm_raw_meat"),
  7800. (eq, ":resource_item_id", "itm_cooked_meat"),
  7801. (assign, ":processed_item_id", "itm_cut_meat"),
  7802. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7803. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_cut_meat", 1),
  7804. (else_try),
  7805. (eq, ":resource_item_id", "itm_baked_potato"),
  7806. (assign, ":processed_item_id", "itm_buttered_baked_potato"),
  7807. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_butter_small", 1),
  7808. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7809. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_buttered_baked_potato", 1),
  7810. (else_try),
  7811. (eq,":resource_item_id", "itm_bread"),
  7812. (assign, ":processed_item_id", "itm_bread_cut"),
  7813. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7814. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 3),
  7815. (else_try),
  7816. (eq,":resource_item_id", "itm_onion"),
  7817. (assign, ":processed_item_id", "itm_cut_onions"),
  7818. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7819. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7820. (else_try),
  7821. (eq,":resource_item_id", "itm_bread_cut"),
  7822. (assign, ":processed_item_id", "itm_buttered_bread_cut"),
  7823. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_butter_small", 1),
  7824. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7825. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7826. (else_try),
  7827. (eq, ":resource_item_id", "itm_karashi_seeds"),
  7828. (assign, ":processed_item_id", "itm_karashi_mustard"),
  7829. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7830. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7831. (else_try),
  7832. (eq, ":resource_item_id", "itm_soybeans"),
  7833. (assign, ":processed_item_id", "itm_soybean_sauce"),
  7834. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7835. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7836. (else_try),
  7837. (eq, ":resource_item_id", "itm_soybean_sauce"),
  7838. (assign, ":processed_item_id", "itm_rice_with_soy_sauce"),
  7839. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_rice_bowl", 1),
  7840. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7841. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7842. (else_try),
  7843. (eq, ":resource_item_id", "itm_karashi_mustard"),
  7844. (assign, ":processed_item_id", "itm_rice_with_karashi_mustard"),
  7845. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_rice_bowl", 1),
  7846. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7847. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7848. (else_try),
  7849. (eq, ":resource_item_id", "itm_karashi_mustard"),
  7850. (assign, ":processed_item_id", "itm_rice_with_karashi_mustard_and_soy_sauce"),
  7851. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_rice_with_soy_sauce", 1),
  7852. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7853. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7854. (else_try),
  7855. (eq, ":resource_item_id", "itm_soybean_sauce"),
  7856. (assign, ":processed_item_id", "itm_rice_with_karashi_mustard_and_soy_sauce"),
  7857. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_rice_with_karashi_mustard", 1),
  7858. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7859. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7860. (else_try),
  7861. (eq, ":resource_item_id", "itm_rice_bread"),
  7862. (assign, ":processed_item_id", "itm_rice_bread_cut"),
  7863. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7864. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 3),
  7865. (else_try),
  7866. (eq, ":resource_item_id", "itm_rice_bread_cut"),
  7867. (assign, ":processed_item_id", "itm_rice_buttered_bread_cut"),
  7868. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_butter_small", 1),
  7869. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7870. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7871. (else_try),
  7872. (eq, ":resource_item_id", "itm_flour_sack"),
  7873. (assign, ":processed_item_id", "itm_uncooked_noodles"),
  7874. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7875. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7876. (else_try),
  7877. (eq, ":resource_item_id", "itm_soybean_sauce"),
  7878. (assign, ":processed_item_id", "itm_noodles_with_soy_sauce"),
  7879. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_noodles", 1),
  7880. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7881. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7882. (else_try),
  7883. (eq, ":resource_item_id", "itm_karashi_mustard"),
  7884. (assign, ":processed_item_id", "itm_noodles_with_mustard"),
  7885. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_rice_bowl", 1),
  7886. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7887. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7888. (else_try),
  7889. (eq, ":resource_item_id", "itm_karashi_mustard"),
  7890. (assign, ":processed_item_id", "itm_noodles_with_soy_sauce_and_mustard"),
  7891. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_noodles_with_soy_sauce", 1),
  7892. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7893. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7894. (else_try),
  7895. (eq, ":resource_item_id", "itm_soybean_sauce"),
  7896. (assign, ":processed_item_id", "itm_noodles_with_soy_sauce_and_mustard"),
  7897. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_karashi_mustard", 1),
  7898. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7899. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7900. (else_try),
  7901. (eq, ":resource_item_id", "itm_tea_herb"),
  7902. (assign, ":processed_item_id", "itm_teapot_unboiled"),
  7903. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_water_bucket", 1),
  7904. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7905. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7906. (agent_equip_item, ":agent_id", "itm_bucket", 1),
  7907. (else_try),
  7908. (eq,":resource_item_id", "itm_shitocky_mushroom"),
  7909. (assign, ":processed_item_id", "itm_cut_mushrooms"),
  7910. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7911. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7912. (else_try),
  7913. (eq,":resource_item_id", "itm_bad_trip_mushroom"),
  7914. (assign, ":processed_item_id", "itm_cut_mushrooms_poison"),
  7915. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7916. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7917. (try_end),
  7918.  
  7919.  
  7920.  
  7921. (neq, ":processed_item_id", -1),
  7922.  
  7923. ]),
  7924.  
  7925.  
  7926.  
  7927. #Ramaraunt Script
  7928. ("cf_process_churn",
  7929. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_food, start_effect=False),
  7930.  
  7931. (assign,":processed_item_id", -1),
  7932. (try_begin),
  7933. (eq, ":resource_item_id", "itm_milk_bucket"),
  7934. (assign, ":processed_item_id", "itm_butter_small"),
  7935. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7936. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 2),
  7937. (agent_equip_item, ":agent_id", "itm_bucket", 1),
  7938. (else_try),
  7939. (eq, ":resource_item_id", "itm_butter_small"),
  7940. (assign, ":processed_item_id", "itm_cheese"),
  7941. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7942. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", 1),
  7943. (try_end),
  7944. (neq, ":processed_item_id", -1),
  7945.  
  7946. ]),
  7947. ("cf_process_spin",
  7948. [generate_process_init(skill="skl_labouring", level=1, resource_class=item_class_cloth, start_effect=False),
  7949.  
  7950. (assign, ":processed_item_id", -1),
  7951. (assign, ":processed_item_count", 2),
  7952. (try_begin),
  7953. (eq, ":resource_item_id", "itm_flax_bundle"),
  7954. (assign, ":processed_item_id", "itm_linen_thread"),
  7955. (try_end),
  7956. (neq, ":processed_item_id", -1),
  7957. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", 1),
  7958. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7959. ]),
  7960.  
  7961. ("cf_process_weave",
  7962. [generate_process_init(skill="skl_tailoring", level=1, resource_class=item_class_cloth, start_effect=False),
  7963.  
  7964. (assign, ":processed_item_id", -1),
  7965. (assign, ":processed_item_count", 1),
  7966. (assign, ":resource_item_count", 1),
  7967. (try_begin),
  7968. (eq, ":resource_item_id", "itm_linen_thread"),
  7969. (assign, ":processed_item_count", 2),
  7970. (assign, ":processed_item_id", "itm_linen_cloth"),
  7971. (else_try),
  7972. (eq, ":resource_item_id", "itm_linen_cloth_small"),
  7973. (assign, ":resource_item_count", 4),
  7974. (assign, ":processed_item_id", "itm_linen_cloth"),
  7975. (try_end),
  7976. (neq, ":processed_item_id", -1),
  7977. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  7978. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  7979. ]),
  7980.  
  7981. ("cf_process_cut",
  7982. [generate_process_init(resource_class=[item_class_cloth, item_class_leather], start_effect=False),
  7983.  
  7984. (agent_get_troop_id, ":troop_id", ":agent_id"),
  7985. (store_skill_level, ":tailoring", "skl_tailoring", ":troop_id"),
  7986. (store_skill_level, ":engineer", "skl_engineer", ":troop_id"),
  7987. (this_or_next|ge, ":tailoring", 1),
  7988. (ge, ":engineer", 1),
  7989. (assign, ":processed_item_id", -1),
  7990. (assign, ":processed_item_count", 4),
  7991. (assign, ":resource_item_count", 1),
  7992. (try_begin),
  7993. (eq, ":resource_item_id", "itm_linen_cloth"),
  7994. (assign, ":processed_item_id", "itm_linen_cloth_small"),
  7995. (else_try),
  7996. (eq, ":resource_item_id", "itm_leather_roll"),
  7997. (assign, ":processed_item_id", "itm_leather_piece"),
  7998. (try_end),
  7999. (neq, ":processed_item_id", -1),
  8000. (call_script, "script_cf_agent_consume_item", ":agent_id", ":resource_item_id", ":resource_item_count"),
  8001. (call_script, "script_spawn_processed_resources", ":agent_id", ":processed_item_id", ":processed_item_count"),
  8002. ]),
  8003.  
  8004. ("cf_process_leather",
  8005. [generate_process_init(skill="skl_labouring", level=1, start_effect=False),
  8006.  
  8007. (eq, ":resource_item_id", "itm_raw_hide"),
  8008. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_raw_hide", 1),
  8009. (call_script, "script_spawn_processed_resources", ":agent_id", "itm_leather_roll", 2),
  8010. ]),
  8011.  
  8012. ("cf_use_resource_stockpile", # server: handle players using a stockpile for buying and selling resources, not crafting
  8013. [(store_script_param, ":agent_id", 1), # must be valid
  8014. (store_script_param, ":instance_id", 2), # mist be valid
  8015.  
  8016. (agent_get_player_id, ":player_id", ":agent_id"),
  8017. (player_is_active, ":player_id"),
  8018. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8019. (is_between, ":item_id", all_items_begin, all_items_end),
  8020. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8021. (agent_get_wielded_item, ":weapon_item_id", ":agent_id", 0),
  8022. (agent_get_wielded_item, ":shield_item_id", ":agent_id", 1),
  8023. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  8024. (assign, ":gold_value", reg0),
  8025. (assign, ":fail", 0),
  8026. (try_begin),
  8027. (this_or_next|eq, ":weapon_item_id", ":item_id"),
  8028. (eq, ":shield_item_id", ":item_id"),
  8029. (prop_instance_get_variation_id_2, ":stock_limit", ":instance_id"),
  8030. (val_div, ":stock_limit", 10),
  8031. (val_mul, ":stock_limit", 100),
  8032. (try_begin),
  8033. (this_or_next|eq, "$g_game_type", "mt_quick_battle"),
  8034. (this_or_next|eq, ":stock_limit", 0),
  8035. (lt, ":stock_count", ":stock_limit"),
  8036. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  8037. (assign, ":add_or_subtract", 1),
  8038. (val_add, ":stock_count", 1),
  8039. (else_try),
  8040. (assign, ":fail", 1),
  8041. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  8042. (try_end),
  8043. (else_try),
  8044. (this_or_next|gt, ":stock_count", 0),
  8045. (eq, "$g_game_type", "mt_quick_battle"),
  8046. (call_script, "script_cf_check_enough_gold", ":player_id", ":gold_value"),
  8047. (call_script, "script_spawn_processed_resources", ":agent_id", ":item_id", 1),
  8048. (assign, ":add_or_subtract", -1),
  8049. (val_sub, ":stock_count", 1),
  8050. (else_try),
  8051. (assign, ":fail", 1),
  8052. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  8053. (try_end),
  8054. (eq, ":fail", 0),
  8055. (try_begin),
  8056. (neq, "$g_game_type", "mt_no_money"),
  8057. (neq, "$g_game_type", "mt_feudalism"),
  8058. (call_script, "script_calculate_stockpile_taxed_price", ":instance_id", ":gold_value"),
  8059. (try_begin),
  8060. (eq, ":add_or_subtract", 1),
  8061. (assign, ":gold_value", reg0),
  8062. (else_try),
  8063. (eq, ":add_or_subtract", -1),
  8064. (assign, ":tax_value", reg1),
  8065. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  8066. (call_script, "script_castle_receive_gold", reg1, ":tax_value", -1),
  8067. (try_end),
  8068. (call_script, "script_player_adjust_gold", ":player_id", ":gold_value", ":add_or_subtract"),
  8069. (try_end),
  8070. (try_begin),
  8071. (neq, "$g_game_type", "mt_quick_battle"),
  8072. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8073. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8074. (try_end),
  8075. ]),
  8076.  
  8077. ("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
  8078. [(store_script_param, ":instance_id", 1), # must be valid
  8079. (store_script_param, ":gold_value", 2),
  8080.  
  8081. (store_mul, ":tax_value", ":gold_value", castle_tax_gold_percentage),
  8082. (try_begin),
  8083. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_is_resource_stockpile, 1),
  8084. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8085. (prop_instance_get_variation_id_2, ":stock_target", ":instance_id"),
  8086. (val_mod, ":stock_target", 10),
  8087. (val_mul, ":stock_target", 10),
  8088. (is_between, ":stock_count", 0, ":stock_target"),
  8089. (val_mul, ":tax_value", ":stock_count"),
  8090. (val_div, ":tax_value", ":stock_target"),
  8091. (try_end),
  8092. (val_div, ":tax_value", 100),
  8093. (store_sub, reg0, ":gold_value", ":tax_value"),
  8094. (assign, reg1, ":tax_value"),
  8095. ]),
  8096.  
  8097. ("cf_buy_sell_item_stockpile", # server: handle players using an item or horse stockpile for buying and selling
  8098. [(store_script_param, ":agent_id", 1), # must be valid
  8099. (store_script_param, ":instance_id", 2), # must be valid
  8100.  
  8101. (agent_get_player_id, ":player_id", ":agent_id"),
  8102. (player_is_active, ":player_id"),
  8103. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8104. (is_between, ":item_id", all_items_begin, all_items_end),
  8105. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8106. (agent_get_wielded_item, ":weapon_item_id", ":agent_id", 0),
  8107. (agent_get_wielded_item, ":shield_item_id", ":agent_id", 1),
  8108. (item_get_type, ":item_type", ":item_id"),
  8109. (assign, ":fail", 0),
  8110. (try_begin), # if the item is wielded or worn, try selling it
  8111. (this_or_next|eq, ":weapon_item_id", ":item_id"),
  8112. (this_or_next|eq, ":shield_item_id", ":item_id"),
  8113. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  8114. (call_script, "script_cf_sell_item", ":agent_id", ":instance_id"),
  8115. (val_add, ":stock_count", 1),
  8116. (else_try), # else try selling a horse
  8117. (assign, reg0, 0),
  8118. (eq, ":item_type", itp_type_horse),
  8119. (call_script, "script_cf_sell_horse", ":agent_id", ":instance_id"),
  8120. (val_add, ":stock_count", 1),
  8121. (else_try), # if the horse selling didn't respond with a failure message and the weapon hand is empty, try buy
  8122. (eq, reg0, 0),
  8123. (this_or_next|gt, ":stock_count", 0),
  8124. (eq, "$g_game_type", "mt_quick_battle"),
  8125. (eq, ":weapon_item_id", -1),
  8126. (call_script, "script_cf_buy_item", ":agent_id", ":instance_id"),
  8127. (val_sub, ":stock_count", 1),
  8128. (else_try),
  8129. (eq, ":stock_count", 0),
  8130. (assign, ":fail", 1),
  8131. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  8132. (try_end),
  8133. (eq, ":fail", 0),
  8134. (try_begin),
  8135. (neq, "$g_game_type", "mt_quick_battle"),
  8136. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8137. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8138. (try_end),
  8139. ]),
  8140.  
  8141. ("cf_craft_item_stockpile", # server: handle players crafting items at a stockpile
  8142. [(store_script_param, ":agent_id", 1), # must be valid
  8143. (store_script_param, ":instance_id", 2), # must be valid
  8144. (store_script_param, ":skill_1_id", 3),
  8145. (store_script_param, ":required_level_1", 4),
  8146. (store_script_param, ":skill_2_id", 5), # an optional alternate skill and level to craft with
  8147. (store_script_param, ":required_level_2", 6),
  8148. (store_script_param, ":resource_1_item_id", 7),
  8149. (store_script_param, ":resource_2_item_id", 8),
  8150. (store_script_param, ":resource_3_item_id", 9),
  8151. (store_script_param, ":resource_4_item_id", 10),
  8152.  
  8153. (neq, "$g_game_type", "mt_quick_battle"),
  8154. (agent_get_player_id, ":player_id", ":agent_id"),
  8155. (player_is_active, ":player_id"),
  8156. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8157. (is_between, ":item_id", all_items_begin, all_items_end),
  8158. (is_between, ":resource_1_item_id", all_items_begin, all_items_end),
  8159. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8160. (assign, ":error_string_id", 0),
  8161. (try_begin),
  8162. (assign, ":average_level", ":required_level_1"),
  8163. (try_begin),
  8164. (le, ":skill_1_id", -1),
  8165. (else_try),
  8166. (agent_get_troop_id, ":troop_id", ":agent_id"),
  8167. (store_skill_level, ":skill_1_level", ":skill_1_id", ":troop_id"),
  8168. (ge, ":skill_1_level", ":required_level_1"),
  8169. (else_try),
  8170. (gt, ":skill_2_id", -1),
  8171. (store_skill_level, ":skill_2_level", ":skill_2_id", ":troop_id"),
  8172. (ge, ":skill_2_level", ":required_level_2"),
  8173. (store_add, ":average_level", ":required_level_1", ":required_level_2"),
  8174. (val_div, ":average_level", 2),
  8175. (else_try),
  8176. (assign, ":error_string_id", "str_craft_not_skilled"),
  8177. (try_end),
  8178. (eq, ":error_string_id", 0),
  8179. (assign, ":error_string_id", "str_craft_wrong_resources"),
  8180. (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"),
  8181. (call_script, "script_scene_prop_get_item_crafting_refund_reward", ":instance_id"),
  8182. (call_script, "script_player_adjust_gold", ":player_id", reg0, 1),
  8183. (val_add, ":stock_count", 1),
  8184. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8185. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8186. (else_try),
  8187. (gt, ":error_string_id", 0),
  8188. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":error_string_id", preset_message_yellow|preset_message_fail_sound),
  8189. (try_end),
  8190. (eq, ":error_string_id", 0),
  8191. ]),
  8192.  
  8193. ("scene_prop_get_item_crafting_refund_reward", # reg0 = the total money given, reg1 = the local cost of all resources, reg2 = the variable extra reward
  8194. [(store_script_param, ":instance_id", 1), # must be valid
  8195.  
  8196. (prop_instance_get_variation_id_2, ":design_target_stock_count", ":instance_id"),
  8197. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8198. (store_sub, ":stock_count_factor", ":design_target_stock_count", ":stock_count"),
  8199. (try_begin),
  8200. (gt, ":stock_count_factor", 0),
  8201. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_item_id),
  8202. (call_script, "script_scene_prop_get_gold_value", ":instance_id", ":item_id", 0),
  8203. (store_mul, ":gold_reward", reg0, craft_price_gold_reward_percentage),
  8204. (val_div, ":gold_reward", 100),
  8205. (scene_prop_get_slot, ":skill_reward", ":instance_id", slot_scene_prop_average_craft_skill),
  8206. (val_mul, ":skill_reward", craft_skill_gold_reward_multiplier),
  8207. (val_add, ":gold_reward", ":skill_reward"),
  8208. (val_mul, ":gold_reward", ":stock_count_factor"),
  8209. (val_div, ":gold_reward", ":design_target_stock_count"),
  8210. (else_try),
  8211. (assign, ":gold_reward", 0),
  8212. (try_end),
  8213. (try_begin),
  8214. (neq, "$g_game_type", "mt_feudalism"),
  8215. (scene_prop_get_slot, reg1, ":instance_id", slot_scene_prop_resource_refund_cost),
  8216. (try_begin),
  8217. (lt, reg1, 0),
  8218. (call_script, "script_scene_prop_calculate_resource_refund_cost", ":instance_id"),
  8219. (try_end),
  8220. (else_try),
  8221. (assign, reg1, 0),
  8222. (try_end),
  8223. (assign, reg2, ":gold_reward"),
  8224. (store_add, reg0, reg1, ":gold_reward"),
  8225. ]),
  8226.  
  8227. ("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
  8228. [(store_script_param, ":instance_id", 1), # must be valid
  8229. (store_script_param, ":agent_id", 2), # must be valid
  8230. (store_script_param, ":hit_damage", 3),
  8231. (store_script_param, ":full_hit_points", 4),
  8232. (store_script_param, ":resource_class", 5), # constants starting with item_class_
  8233.  
  8234. (agent_is_alive, ":agent_id"),
  8235. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  8236. (gt, ":wielded_item_id", -1),
  8237. (item_get_slot, ":wielded_item_class", ":wielded_item_id", slot_item_class),
  8238. (eq, ":wielded_item_class", item_class_repair),
  8239. (agent_get_troop_id, ":troop_id", ":agent_id"),
  8240. (store_skill_level, ":engineer", "skl_engineer", ":troop_id"),
  8241. (gt, ":engineer", 0),
  8242. (set_trigger_result, 0),
  8243. (scene_prop_get_hit_points, ":hit_points", ":instance_id"),
  8244. (lt, ":hit_points", ":full_hit_points"),
  8245. (scene_prop_get_slot, ":next_resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  8246. (try_begin),
  8247. (gt, ":hit_points", ":next_resource_hp"),
  8248. (store_sub, ":maximum_required", ":full_hit_points", ":hit_points"),
  8249. (call_script, "script_cf_agent_consume_resource", ":agent_id", ":resource_class", ":maximum_required"),
  8250. (val_add, ":next_resource_hp", reg0),
  8251. (val_min, ":next_resource_hp", ":full_hit_points"),
  8252. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":next_resource_hp"),
  8253. (try_end),
  8254. (try_begin),
  8255. (le, ":hit_points", ":next_resource_hp"),
  8256. (val_add, ":hit_points", ":hit_damage"),
  8257. (val_mul, ":engineer", 20),
  8258. (val_add, ":hit_points", ":engineer"),
  8259. (val_min, ":hit_points", ":full_hit_points"),
  8260. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  8261. (assign, reg1, 0),
  8262. (else_try),
  8263. (assign, reg1, 1),
  8264. (try_end),
  8265. (assign, reg0, ":hit_points"),
  8266. ]),
  8267.  
  8268. ("cf_hit_repairable_scene_prop", # server: handle attacking a destructible and repairable scene prop; reg0 = constant starting with repairable_, reg1 = resulting hit points
  8269. [(store_script_param, ":instance_id", 1), # must be valid
  8270. (store_script_param, ":hit_damage", 2),
  8271. (store_script_param, ":full_hit_points", 3),
  8272. (store_script_param, ":resource_class", 4), # constants starting with item_class
  8273. (store_script_param, ":agent_id", 5), # must be valid
  8274. (store_script_param, ":repair_active", 6), # whether to allow repairing active, not fully destroyed scene props
  8275. (store_script_param, ":script_damage", 7), # 0 = damage applied by an agent from ti_on_scene_prop_hit, 1 = damage applied by a script
  8276.  
  8277. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  8278. (try_begin),
  8279. (agent_is_active, ":agent_id"),
  8280. (this_or_next|neq, ":state", scene_prop_state_active),
  8281. (eq, ":repair_active", 1),
  8282. (call_script, "script_cf_repair_scene_prop", ":instance_id", ":agent_id", ":hit_damage", ":full_hit_points", ":resource_class"),
  8283. (assign, ":hit_points", reg0),
  8284. (assign, ":resource_required", reg1),
  8285. (try_begin),
  8286. (ge, ":hit_points", ":full_hit_points"),
  8287. (neq, ":state", scene_prop_state_active),
  8288. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  8289. (get_max_players, ":max_players"),
  8290. (try_for_range, ":player_id", 1, ":max_players"),
  8291. (player_is_active, ":player_id"),
  8292. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":instance_id", -1),
  8293. (try_end),
  8294. (assign, ":result", repairable_repaired),
  8295. (else_try),
  8296. (eq, ":resource_required", 1),
  8297. (assign, ":result", repairable_resource_required),
  8298. (agent_get_player_id, ":player_id", ":agent_id"),
  8299. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_resource_required", preset_message_yellow|preset_message_fail_sound),
  8300. (else_try),
  8301. (assign, ":result", repairable_repairing),
  8302. (try_end),
  8303. (else_try),
  8304. (try_begin),
  8305. (eq, ":resource_class", item_class_wood),
  8306. (agent_is_active, ":agent_id"),
  8307. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  8308. (gt, ":wielded_item_id", -1),
  8309. (item_slot_eq, ":wielded_item_id", slot_item_bonus_against_wood, 1),
  8310. (val_mul, ":hit_damage", 2),
  8311. (try_end),
  8312. (scene_prop_get_slot, ":next_resource_hp", ":instance_id", slot_scene_prop_next_resource_hp),
  8313. (val_sub, ":next_resource_hp", ":hit_damage"),
  8314. (val_max, ":next_resource_hp", min_scene_prop_hit_points),
  8315. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, ":next_resource_hp"),
  8316. (call_script, "script_scene_prop_damage_no_destroy", ":instance_id", ":hit_damage"),
  8317. (assign, ":hit_damage", reg1),
  8318. (assign, ":hit_points", reg2),
  8319. (try_begin), # for damage by a script rather than an agent, reduce the hit points manually
  8320. (eq, ":script_damage", 1),
  8321. (gt, ":hit_damage", 0),
  8322. (scene_prop_set_hit_points, ":instance_id", ":hit_points"),
  8323. (try_end),
  8324. (try_begin),
  8325. (eq, ":state", scene_prop_state_active),
  8326. (try_begin),
  8327. (le, ":hit_points", min_scene_prop_hit_points),
  8328. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8329. (assign, ":result", repairable_destroyed),
  8330. (else_try),
  8331. (assign, ":result", repairable_hit),
  8332. (try_end),
  8333. (else_try),
  8334. (assign, ":result", repairable_hit_destroyed),
  8335. (try_end),
  8336. (try_end),
  8337. (assign, reg0, ":result"),
  8338. (assign, reg1, ":hit_points"),
  8339. ]),
  8340.  
  8341. ("cf_hit_door", # server: handle hitting a rotating destructible door; should be called from ti_on_scene_prop_hit
  8342. [(multiplayer_is_server),
  8343. (store_script_param, ":instance_id", 1), # must be valid
  8344. (store_script_param, ":hit_damage", 2),
  8345. (store_script_param, ":resource_class", 3),
  8346. (set_fixed_point_multiplier, 1),
  8347. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8348. (set_fixed_point_multiplier, 100),
  8349.  
  8350. (try_begin), # only allow repairing standing doors if they are open
  8351. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_rotation, 1),
  8352. (assign, ":repair_active", 1),
  8353. (else_try),
  8354. (assign, ":repair_active", 0),
  8355. (try_end),
  8356. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8357. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", ":resource_class", ":agent_id", ":repair_active", 0),
  8358. (assign, ":result", reg0),
  8359. (try_begin),
  8360. (eq, ":result", repairable_hit),
  8361. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  8362. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_shield_hit_wood_metal"),
  8363. (else_try),
  8364. (eq, ":result", repairable_destroyed),
  8365. (call_script, "script_destroy_door", ":agent_id", ":instance_id"),
  8366. (particle_system_burst, "psys_dummy_smoke", pos1, 20),
  8367. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8368. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  8369. (else_try),
  8370. (eq, ":result", repairable_hit_destroyed),
  8371. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8372. (else_try),
  8373. (eq, ":result", repairable_repairing),
  8374. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8375. (else_try),
  8376. (eq, ":result", repairable_repaired),
  8377. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8378. (prop_instance_animate_to_position, ":instance_id", pos2, 400),
  8379. (agent_play_sound, ":agent_id", "snd_man_grunt"),
  8380. (try_end),
  8381. ]),
  8382.  
  8383. ("destroy_door", # server: rotate destructible doors flat on the ground after destroyed
  8384. [(store_script_param, ":agent_id", 1), # if invalid, manually sets the hit points and state to destroyed
  8385. (store_script_param, ":instance_id", 2), # must be valid
  8386.  
  8387. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8388. (init_position, pos3),
  8389. (try_begin),
  8390. (agent_is_active, ":agent_id"),
  8391. (agent_get_position, pos5, ":agent_id"),
  8392. (else_try),
  8393. (scene_prop_set_hit_points, ":instance_id", min_scene_prop_hit_points),
  8394. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, min_scene_prop_hit_points),
  8395. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8396. (try_end),
  8397. (try_begin), # align the door along the ground away from the agent
  8398. (agent_is_active, ":agent_id"),
  8399. (prop_instance_get_position, pos6, ":instance_id"),
  8400. (position_is_behind_position, pos5, pos6),
  8401. (assign, ":direction", -1),
  8402. (position_move_y, pos3, 150),
  8403. (assign, ":ground_offset", 20),
  8404. (else_try),
  8405. (assign, ":direction", 1),
  8406. (position_move_y, pos3, -150),
  8407. (assign, ":ground_offset", 0),
  8408. (try_end),
  8409. (position_move_x, pos3, -50),
  8410. (position_transform_position_to_parent, pos4, pos2, pos3),
  8411. (position_move_z, pos4, 150, 1),
  8412. (position_get_distance_to_ground_level, ":ground_distance", pos4),
  8413. (val_sub, ":ground_distance", 150),
  8414. (store_atan2, ":ground_angle", ":ground_distance", 150),
  8415. (convert_from_fixed_point, ":ground_angle"),
  8416. (store_add, ":rotate_angle", 90, ":ground_angle"),
  8417. (val_mul, ":rotate_angle", ":direction"),
  8418. (position_rotate_x, pos2, ":rotate_angle"),
  8419. (position_move_z, pos2, ":ground_offset", 1),
  8420. (prop_instance_animate_to_position, ":instance_id", pos2, 100),
  8421. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, 0),
  8422. ]),
  8423.  
  8424. ("cf_use_rotate_door", # server: handle opening and closing a rotating door
  8425. [(store_script_param, ":agent_id", 1), # must be valid
  8426. (store_script_param, ":instance_id", 2), # must be valid
  8427. (store_script_param, ":left", 3), # 1 makes the door rotate the other way, for matching left and right doors
  8428.  
  8429. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  8430. (agent_get_player_id, ":player_id", ":agent_id"),
  8431. (player_is_active, ":player_id"),
  8432. (player_get_slot, ":player_faction_id", ":player_id", slot_player_faction_id),
  8433. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  8434. (assign, ":faction_id", reg0),
  8435. (prop_instance_get_variation_id_2, ":is_bolted", ":instance_id"),
  8436. (val_and, ":is_bolted", 0x2),
  8437. (assign, ":fail_string_id", 0),
  8438. (try_begin),
  8439. (eq, ":is_bolted", 0x2),
  8440. (try_begin),
  8441. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_rotation, 1),
  8442. (else_try),
  8443. (neq, ":faction_id", "fac_commoners"),
  8444. (eq, ":faction_id", ":player_faction_id"),
  8445. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  8446. (else_try),
  8447. (prop_instance_get_position, pos1, ":instance_id"),
  8448. (agent_get_position, pos2, ":agent_id"),
  8449. (neg|position_is_behind_position, pos2, pos1),
  8450. (else_try),
  8451. (assign, ":fail_string_id", "str_door_bolted"),
  8452. (try_end),
  8453. (else_try),
  8454. (eq, ":faction_id", "fac_commoners"),
  8455. (else_try),
  8456. (eq, ":faction_id", ":player_faction_id"),
  8457. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  8458. (else_try),
  8459. (assign, ":fail_string_id", "str_door_locked_by_s1"),
  8460. (try_end),
  8461. (try_begin),
  8462. (gt, ":fail_string_id", 0),
  8463. (prop_instance_get_variation_id_2, ":not_pickable", ":instance_id"),
  8464. (val_and, ":not_pickable", 0x4),
  8465. (neq, ":not_pickable", 0x4),
  8466. (try_begin),
  8467. (call_script, "script_cf_agent_pick_lock", ":agent_id", 100),
  8468. (assign, ":fail_string_id", 0),
  8469. (try_end),
  8470. (gt, reg0, 0),
  8471. (else_try),
  8472. (eq, ":fail_string_id", "str_door_bolted"),
  8473. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":fail_string_id", preset_message_error),
  8474. (else_try),
  8475. (eq, ":fail_string_id", "str_door_locked_by_s1"),
  8476. (multiplayer_send_3_int_to_player, ":player_id", server_event_preset_message, ":fail_string_id", preset_message_faction|preset_message_fail_sound, ":faction_id"),
  8477. (try_end),
  8478. (eq, ":fail_string_id", 0),
  8479. (call_script, "script_cf_rotate_door", ":instance_id", ":left"),
  8480. ]),
  8481.  
  8482. ("cf_rotate_door", # server: helper script to rotate doors
  8483. [(store_script_param, ":instance_id", 1), # must be valid
  8484. (store_script_param, ":left", 2),
  8485.  
  8486. (prop_instance_get_starting_position, pos1, ":instance_id"),
  8487. (try_begin),
  8488. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_rotation, 0),
  8489. (try_begin),
  8490. (eq, ":left", 1),
  8491. (position_rotate_z, pos1, -95),
  8492. (else_try),
  8493. (position_rotate_z, pos1, 95),
  8494. (try_end),
  8495. (assign, ":door_open", 1),
  8496. (else_try),
  8497. (assign, ":door_open", 0),
  8498. (try_end),
  8499. (scene_prop_set_slot, ":instance_id", slot_scene_prop_rotation, ":door_open"),
  8500. (scene_prop_enable_after_time, ":instance_id", 100),
  8501. (prop_instance_animate_to_position, ":instance_id", pos1, 100),
  8502. ]),
  8503.  
  8504. ("cf_init_rotate_door", # server: set the inital position of a rotating door
  8505. [(store_script_param, ":instance_id", 1), # must be valid
  8506. (store_script_param, ":left", 2),
  8507.  
  8508. (prop_instance_get_variation_id_2, ":bit_field", ":instance_id"),
  8509. (store_and, ":start_destroyed", ":bit_field", 0x10),
  8510. (try_begin),
  8511. (eq, ":start_destroyed", 0x10),
  8512. (call_script, "script_destroy_door", -1, ":instance_id"),
  8513. (else_try),
  8514. (store_and, ":initial_position", ":bit_field", 0x1),
  8515. (eq, ":initial_position", 0x1),
  8516. (call_script, "script_cf_rotate_door", ":instance_id", ":left"),
  8517. (try_end),
  8518. ]),
  8519.  
  8520. ("cf_hit_chest", # server: handle damaging and repairing a storage chest; should be called from ti_on_scene_prop_hit
  8521. [(multiplayer_is_server),
  8522. (store_script_param, ":instance_id", 1), # must be valid
  8523. (store_script_param, ":hit_damage", 2),
  8524. (store_script_param, ":full_hit_points", 3),
  8525. (set_fixed_point_multiplier, 1),
  8526. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8527. (set_fixed_point_multiplier, 100),
  8528.  
  8529. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, 0),
  8530. (assign, ":result", reg0),
  8531. (try_begin),
  8532. (eq, ":result", repairable_hit),
  8533. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_shield_hit_wood_metal"),
  8534. (else_try),
  8535. (eq, ":result", repairable_destroyed),
  8536. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  8537. (particle_system_burst, "psys_dummy_smoke", pos1, 10),
  8538. (particle_system_burst, "psys_dummy_straw", pos1, 30),
  8539. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_shield_broken"),
  8540. (else_try),
  8541. (eq, ":result", repairable_hit_destroyed),
  8542. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  8543. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8544. (else_try),
  8545. (eq, ":result", repairable_repairing),
  8546. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8547. (else_try),
  8548. (eq, ":result", repairable_repaired),
  8549. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  8550. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8551. (try_end),
  8552. ]),
  8553.  
  8554. ("cf_pick_chest_lock", # server: handle players trying to pick the lock of a storage chest
  8555. [(store_script_param, ":agent_id", 1), # must be valid
  8556. (store_script_param, ":instance_id", 2), # must be valid
  8557. (store_script_param, ":probability_multiplier", 3), # see script_cf_agent_pick_lock
  8558.  
  8559. (agent_get_player_id, ":player_id", ":agent_id"),
  8560. (player_is_active, ":player_id"),
  8561. (assign, ":fail", 0),
  8562. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  8563. (assign, ":faction_id", reg0),
  8564. (try_begin),
  8565. (eq, reg1, -1),
  8566. (else_try),
  8567. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  8568. (try_begin),
  8569. (player_slot_eq, ":player_id", slot_player_faction_id, ":faction_id"),
  8570. (player_slot_eq, ":player_id", slot_player_has_faction_door_key, 1),
  8571. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  8572. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 0),
  8573. (agent_play_sound, ":agent_id", "snd_lock"),
  8574. (try_end),
  8575. (else_try),
  8576. (assign, ":fail", 1),
  8577. (le, ":probability_multiplier", 0),
  8578. (agent_play_sound, ":agent_id", "snd_pick_lock_fail"),
  8579. (else_try),
  8580. (call_script, "script_cf_agent_pick_lock", ":agent_id", ":probability_multiplier"),
  8581. (scene_prop_set_slot, ":instance_id", slot_scene_prop_unlocked, 1),
  8582. (assign, ":fail", 0),
  8583. (else_try),
  8584. (le, reg0, 0),
  8585. (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"),
  8586. (try_end),
  8587. (eq, ":fail", 0),
  8588. ]),
  8589.  
  8590. ("cf_hit_bridge", # server: handle damaging and repairing bridges; should be called from ti_on_scene_prop_hit
  8591. [(multiplayer_is_server),
  8592. (store_script_param, ":instance_id", 1), # must be valid
  8593. (store_script_param, ":hit_damage", 2),
  8594. (store_script_param, ":script_damage", 3), # set to 1 when the agent hit a linked scene prop, to apply damage manually
  8595. (set_fixed_point_multiplier, 1),
  8596. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8597. (set_fixed_point_multiplier, 100),
  8598.  
  8599. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8600. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, ":script_damage"),
  8601. (assign, ":result", reg0),
  8602. (try_begin),
  8603. (eq, ":result", repairable_hit),
  8604. (particle_system_burst, "psys_dummy_straw", pos1, 30),
  8605. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  8606. (else_try),
  8607. (eq, ":result", repairable_destroyed),
  8608. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8609. (position_get_distance_to_terrain, ":distance", pos2),
  8610. (try_begin), # drop to terrain if above
  8611. (gt, ":distance", 0),
  8612. (val_mul, ":distance", -1),
  8613. (position_move_z, pos2, ":distance"),
  8614. (else_try), # otherwise if starting below terrain, drop to the lowest position
  8615. (position_get_z, ":distance", pos2),
  8616. (store_sub, ":distance", z_position_to_hide_object, ":distance"),
  8617. (position_set_z, pos2, z_position_to_hide_object),
  8618. (try_end),
  8619. (store_div, ":animation_time", ":distance", 2),
  8620. (val_abs, ":animation_time"),
  8621. (agent_get_position, pos3, ":agent_id"), # rotate bridge to fall faster on the side of the last attacker
  8622. (position_transform_position_to_local, pos4, pos2, pos3),
  8623. (position_get_x, ":distance_from_center", pos4),
  8624. (store_div, ":rotate_angle", ":distance_from_center", 30),
  8625. (assign, ":absolute_distance", ":distance"),
  8626. (val_abs, ":absolute_distance"),
  8627. (try_begin),
  8628. (le, ":absolute_distance", 1000),
  8629. (val_mul, ":rotate_angle", ":absolute_distance"),
  8630. (val_div, ":rotate_angle", 1000),
  8631. (try_end),
  8632. (val_clamp, ":rotate_angle", -40, 41),
  8633. (position_rotate_y, pos2, ":rotate_angle"),
  8634. (prop_instance_animate_to_position, ":instance_id", pos2, ":animation_time"),
  8635. (particle_system_burst, "psys_dummy_smoke", pos1, 20),
  8636. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8637. (particle_system_burst, "psys_game_water_splash_2", pos1, 100),
  8638. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  8639. (else_try),
  8640. (eq, ":result", repairable_hit_destroyed),
  8641. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8642. (else_try),
  8643. (eq, ":result", repairable_repairing),
  8644. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8645. (else_try),
  8646. (eq, ":result", repairable_repaired),
  8647. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8648. (prop_instance_stop_animating, ":instance_id"),
  8649. (prop_instance_set_position, ":instance_id", pos2),
  8650. (particle_system_burst, "psys_dummy_smoke", pos1, 50),
  8651. (agent_play_sound, ":agent_id", "snd_man_grunt"),
  8652. (try_end),
  8653. (assign, reg2, ":agent_id"),
  8654. ]),
  8655.  
  8656. ("cf_hit_bridge_footing", # server: handle damaging and repairing bridges indirectly through linked props; should be called from ti_on_scene_prop_hit
  8657. [(multiplayer_is_server),
  8658. (store_script_param, ":instance_id", 1), # must be valid
  8659. (store_script_param, ":hit_damage", 2),
  8660.  
  8661. (scene_prop_get_slot, ":bridge_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8662. (gt, ":bridge_instance_id", 0),
  8663. (call_script, "script_cf_hit_bridge", ":bridge_instance_id", ":hit_damage", 1),
  8664. (agent_get_player_id, ":player_id", reg2),
  8665. (try_begin),
  8666. (player_is_active, ":player_id"),
  8667. (scene_prop_get_hit_points, ":hit_points", ":bridge_instance_id"),
  8668. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":bridge_instance_id", ":hit_points"),
  8669. (try_end),
  8670. (set_trigger_result, 0),
  8671. ]),
  8672.  
  8673. ("cf_init_wall", # server: set up destructible wall positions and slots at mission start
  8674. [(store_script_param, ":instance_id", 1), # must be valid
  8675.  
  8676. (set_fixed_point_multiplier, 100),
  8677. (prop_instance_get_starting_position, pos1, ":instance_id"),
  8678. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  8679. (prop_instance_get_scale, pos3, ":instance_id"),
  8680. (position_get_scale_z, ":scale", pos3),
  8681. (val_mul, ":height", ":scale"),
  8682. (convert_from_fixed_point, ":height"),
  8683. (val_add, ":height", 100),
  8684. (val_mul, ":height", -1),
  8685. (position_move_z, pos1, ":height"),
  8686. (prop_instance_set_position, ":instance_id", pos1),
  8687. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8688. (scene_prop_set_slot, ":instance_id", slot_scene_prop_next_resource_hp, min_scene_prop_hit_points),
  8689. (scene_prop_set_hit_points, ":instance_id", min_scene_prop_hit_points),
  8690. ]),
  8691.  
  8692. ("cf_hit_wall", # server: handle damaging and repairing walls and ladders; should be called from ti_on_scene_prop_hit
  8693. [(multiplayer_is_server),
  8694. (store_script_param, ":instance_id", 1), # must be valid
  8695. (store_script_param, ":hit_damage", 2),
  8696. (store_script_param, ":script_damage", 3), # set to 1 when the agent hit a linked scene prop, to apply damage manually
  8697. (set_fixed_point_multiplier, 1),
  8698. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8699. (set_fixed_point_multiplier, 100),
  8700.  
  8701. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8702. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, ":script_damage"),
  8703. (assign, ":result", reg0),
  8704. (try_begin),
  8705. (eq, ":result", repairable_hit),
  8706. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8707. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  8708. (else_try),
  8709. (eq, ":result", repairable_destroyed),
  8710. (try_begin),
  8711. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_no_move_physics, 1),
  8712. (prop_instance_enable_physics, ":instance_id", 0),
  8713. (try_end),
  8714. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8715. (scene_prop_get_slot, ":height", ":instance_id", slot_scene_prop_height),
  8716. (prop_instance_get_scale, pos3, ":instance_id"),
  8717. (position_get_scale_z, ":scale", pos3),
  8718. (val_mul, ":height", ":scale"),
  8719. (convert_from_fixed_point, ":height"),
  8720. (val_add, ":height", 100),
  8721. (val_mul, ":height", -1),
  8722. (position_move_z, pos2, ":height"),
  8723. (prop_instance_animate_to_position, ":instance_id", pos2, 1000),
  8724. (particle_system_burst, "psys_dummy_smoke", pos1, 100),
  8725. (particle_system_burst, "psys_dummy_straw", pos1, 100),
  8726. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_break"),
  8727. (else_try),
  8728. (eq, ":result", repairable_hit_destroyed),
  8729. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8730. (else_try),
  8731. (eq, ":result", repairable_repairing),
  8732. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8733. (else_try),
  8734. (eq, ":result", repairable_repaired),
  8735. (try_begin),
  8736. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_no_move_physics, 1),
  8737. (prop_instance_enable_physics, ":instance_id", 0),
  8738. (try_end),
  8739. (prop_instance_get_starting_position, pos2, ":instance_id"),
  8740. (prop_instance_animate_to_position, ":instance_id", pos2, 1000),
  8741. (agent_play_sound, ":agent_id", "snd_man_grunt"),
  8742. (try_end),
  8743. (assign, reg2, ":agent_id"),
  8744. ]),
  8745.  
  8746. ("cf_hit_build_wall", # server: handle hitting the building station for walls and ladders; should be called from ti_on_scene_prop_hit
  8747. [(multiplayer_is_server),
  8748. (store_script_param, ":instance_id", 1), # must be valid
  8749. (store_script_param, ":hit_damage", 2),
  8750.  
  8751. (scene_prop_get_slot, ":wall_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8752. (gt, ":wall_instance_id", 0),
  8753. (call_script, "script_cf_hit_wall", ":wall_instance_id", ":hit_damage", 1),
  8754. (agent_get_player_id, ":player_id", reg2),
  8755. (try_begin),
  8756. (player_is_active, ":player_id"),
  8757. (scene_prop_get_hit_points, ":hit_points", ":wall_instance_id"),
  8758. (multiplayer_send_2_int_to_player, ":player_id", server_event_update_scene_prop_hit_points, ":wall_instance_id", ":hit_points"),
  8759. (try_end),
  8760. (set_trigger_result, 0),
  8761. ]),
  8762.  
  8763. ("cf_hit_construction_box", # server: handle building and damaging construction boxes; 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. (store_script_param, ":resource_class", 3), # constants starting with item_class_
  8768. (set_fixed_point_multiplier, 1),
  8769. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8770. (set_fixed_point_multiplier, 100),
  8771.  
  8772. (scene_prop_get_slot, ":full_hit_points", ":instance_id", slot_scene_prop_full_hit_points),
  8773. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", ":resource_class", ":agent_id", 1, 0),
  8774. (assign, ":result", reg0),
  8775. (try_begin),
  8776. (this_or_next|eq, ":result", repairable_hit),
  8777. (eq, ":result", repairable_destroyed),
  8778. (particle_system_burst, "psys_dummy_straw", pos1, 50),
  8779. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  8780. (else_try),
  8781. (eq, ":result", repairable_hit_destroyed),
  8782. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood_scratch"),
  8783. (else_try),
  8784. (eq, ":result", repairable_repairing),
  8785. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8786. (else_try),
  8787. (eq, ":result", repairable_repaired),
  8788. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  8789. (prop_instance_get_starting_position, pos1, ":instance_id"),
  8790. (particle_system_burst, "psys_dummy_smoke_big", pos1, 20),
  8791. (init_position, pos1),
  8792. (position_set_z, pos1, z_position_to_hide_object),
  8793. (prop_instance_set_position, ":instance_id", pos1),
  8794. (prop_instance_enable_physics, ":instance_id", 0),
  8795. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_hidden),
  8796. (try_end),
  8797. ]),
  8798.  
  8799. ("cf_init_fire_place", # server: set up the linked visible flames for a fire place prop at mission start
  8800. [(multiplayer_is_server),
  8801. (store_script_param, ":instance_id", 1), # must be valid
  8802.  
  8803. (set_fixed_point_multiplier, 100),
  8804. (init_position, pos1),
  8805. (position_set_z, pos1, z_position_to_hide_object),
  8806. (set_spawn_position, pos1),
  8807. (spawn_scene_prop, "spr_wood_heap_fire"),
  8808. (scene_prop_set_slot, ":instance_id", slot_scene_prop_linked_scene_prop, reg0),
  8809. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8810. (prop_instance_get_variation_id_2, ":initial_wood_amount", ":instance_id"),
  8811. (val_mul, ":initial_wood_amount", 1000),
  8812. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":initial_wood_amount"),
  8813. ]),
  8814.  
  8815. ("cf_hit_fire_place", # server: handle adding wood to, lighting, and extinguishing a fire place; should be called from ti_on_scene_prop_hit
  8816. [(multiplayer_is_server),
  8817. (store_script_param, ":instance_id", 1), # must be valid
  8818. (set_fixed_point_multiplier, 1),
  8819. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  8820. (set_fixed_point_multiplier, 100),
  8821.  
  8822. (set_trigger_result, 0),
  8823. (agent_get_wielded_item, ":wielded_item_id", ":agent_id", 0),
  8824. (gt, ":wielded_item_id", -1),
  8825. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  8826. (try_begin),
  8827. (eq, ":wielded_item_id", "itm_torch"),
  8828. (eq, ":state", scene_prop_state_destroyed),
  8829. (scene_prop_slot_ge, ":instance_id", slot_scene_prop_stock_count, 1),
  8830. (scene_prop_get_slot, ":fire_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8831. (prop_instance_is_valid, ":fire_instance_id"),
  8832. (prop_instance_get_position, pos1, ":instance_id"),
  8833. (prop_instance_set_position, ":fire_instance_id", pos1),
  8834. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  8835. (else_try),
  8836. (eq, ":wielded_item_id", "itm_water_bucket"),
  8837. (eq, ":state", scene_prop_state_active),
  8838. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_water_bucket", 1),
  8839. (agent_equip_item, ":agent_id", "itm_bucket", reg0),
  8840. (agent_set_wielded_item, ":agent_id", "itm_bucket"),
  8841. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8842. (scene_prop_get_slot, ":fire_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8843. (prop_instance_is_valid, ":fire_instance_id"),
  8844. (init_position, pos1),
  8845. (position_set_z, pos1, z_position_to_hide_object),
  8846. (prop_instance_set_position, ":fire_instance_id", pos1),
  8847. (else_try),
  8848. (item_slot_eq, ":wielded_item_id", slot_item_class, item_class_wood),
  8849. (item_get_slot, ":resource_amount", ":wielded_item_id", slot_item_resource_amount),
  8850. (gt, ":resource_amount", 0),
  8851. (call_script, "script_cf_agent_consume_item", ":agent_id", ":wielded_item_id", 1),
  8852. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8853. (val_add, ":stock_count", ":resource_amount"),
  8854. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8855. (try_end),
  8856. ]),
  8857.  
  8858. ("fire_place_burn", # server: consume wood while a fire is burning, remove the flames if no fuel left
  8859. [(store_script_param, ":instance_id", 1), # must be valid
  8860.  
  8861. (scene_prop_get_slot, ":state", ":instance_id", slot_scene_prop_state),
  8862. (try_begin),
  8863. (eq, ":state", scene_prop_state_active),
  8864. (scene_prop_get_slot, ":stock_count", ":instance_id", slot_scene_prop_stock_count),
  8865. (val_sub, ":stock_count", 200),
  8866. (val_max, ":stock_count", 0),
  8867. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":stock_count"),
  8868. (le, ":stock_count", 0),
  8869. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  8870. (scene_prop_get_slot, ":fire_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  8871. (prop_instance_is_valid, ":fire_instance_id"),
  8872. (set_fixed_point_multiplier, 100),
  8873. (init_position, pos1),
  8874. (position_set_z, pos1, z_position_to_hide_object),
  8875. (prop_instance_set_position, ":fire_instance_id", pos1),
  8876. (try_end),
  8877. ]),
  8878.  
  8879. ("winch_get_direction", # return the direction an agent will rotate a winch in reg0, based on relative position
  8880. [(store_script_param, ":agent_id", 1), # must be valid
  8881. (store_script_param, ":instance_id", 2), # must be valid
  8882.  
  8883. (prop_instance_get_starting_position, pos1, ":instance_id"),
  8884. (agent_get_position, pos2, ":agent_id"),
  8885. (position_transform_position_to_local, pos3, pos1, pos2),
  8886. (position_get_y, ":relative_y_position", pos3),
  8887. (try_begin),
  8888. (ge, ":relative_y_position", 0),
  8889. (assign, reg0, 1),
  8890. (else_try),
  8891. (assign, reg0, -1),
  8892. (try_end),
  8893. ]),
  8894.  
  8895. ("cf_use_winch", # server: handle players using a winch to move another linked object
  8896. [(store_script_param, ":agent_id", 1), # must be valid
  8897. (store_script_param, ":winch_instance_id", 2), # must be valid
  8898. (store_script_param, ":move_steps_plus_one", 3),
  8899. (store_script_param, ":step_size", 4),
  8900. (store_script_param, ":animation_time", 5),
  8901. (store_script_param, ":winch_type", 6), # constants starting with winch_type_
  8902.  
  8903. (agent_get_player_id, ":player_id", ":agent_id"),
  8904. (player_is_active, ":player_id"),
  8905. (agent_is_alive, ":agent_id"),
  8906. (call_script, "script_winch_get_direction", ":agent_id", ":winch_instance_id"),
  8907. (assign, ":direction", reg0),
  8908. (scene_prop_get_slot, ":moveable_instance_id", ":winch_instance_id", slot_scene_prop_linked_scene_prop),
  8909. (gt, ":moveable_instance_id", 0),
  8910. (scene_prop_get_slot, ":current_target", ":moveable_instance_id", slot_scene_prop_target_position),
  8911. (try_begin),
  8912. (eq, ":winch_type", winch_type_platform),
  8913. (scene_prop_get_slot, ":maximum_height", ":moveable_instance_id", slot_scene_prop_height),
  8914. (scene_prop_get_slot, ":maximum_depth", ":moveable_instance_id", slot_scene_prop_width),
  8915. (store_sub, ":move_steps_plus_one", ":maximum_height", ":maximum_depth"),
  8916. (val_div, ":move_steps_plus_one", ":step_size"),
  8917. (val_add, ":move_steps_plus_one", 1),
  8918. (try_end),
  8919. (try_begin),
  8920. (le, ":direction", -1),
  8921. (val_mul, ":direction", 2), # drop down twice as fast as raising up
  8922. (eq, ":winch_type", winch_type_portcullis),
  8923. (assign, ":new_target", 0), # portcullis drops all the way in one step
  8924. (neq, ":new_target", ":current_target"),
  8925. (assign, ":animation_time", 20),
  8926. (call_script, "script_scene_prop_play_sound", ":moveable_instance_id", "snd_body_fall_big"),
  8927. (else_try),
  8928. (store_add, ":new_target", ":current_target", ":direction"),
  8929. (val_clamp, ":new_target", 0, ":move_steps_plus_one"),
  8930. (try_end),
  8931. (neq, ":new_target", ":current_target"),
  8932. (scene_prop_set_slot, ":moveable_instance_id", slot_scene_prop_target_position, ":new_target"),
  8933. (prop_instance_get_starting_position, pos1, ":moveable_instance_id"),
  8934. (store_mul, ":target_movement", ":new_target", ":step_size"),
  8935. (try_begin),
  8936. (eq, ":winch_type", winch_type_platform),
  8937. (store_add, ":target_height", ":maximum_depth", ":target_movement"),
  8938. (val_clamp, ":target_height", ":maximum_depth", ":maximum_height"),
  8939. (position_set_z, pos1, ":target_height"),
  8940. (else_try),
  8941. (eq, ":winch_type", winch_type_portcullis),
  8942. (position_move_z, pos1, ":target_movement"),
  8943. (else_try),
  8944. (eq, ":winch_type", winch_type_sliding_door),
  8945. (position_move_x, pos1, ":target_movement"),
  8946. (else_try),
  8947. (position_rotate_x, pos1, ":target_movement"),
  8948. (try_end),
  8949. (prop_instance_animate_to_position, ":moveable_instance_id", pos1, ":animation_time"),
  8950. (try_begin),
  8951. (gt, ":direction", 0),
  8952. (assign, ":winch_rotation", -36000),
  8953. (else_try),
  8954. (eq, ":winch_type", winch_type_sliding_door),
  8955. (assign, ":winch_rotation", 36000),
  8956. (else_try),
  8957. (assign, ":winch_rotation", 72000),
  8958. (try_end),
  8959. (prop_instance_get_position, pos1, ":winch_instance_id"),
  8960. (prop_instance_rotate_to_position, ":winch_instance_id", pos1, ":animation_time", ":winch_rotation"),
  8961. ]),
  8962.  
  8963. ("cf_init_winch", # server: set initial positions for objects linked to winches
  8964. [(multiplayer_is_server),
  8965. (store_script_param, ":winch_instance_id", 1), # must be valid
  8966. (store_script_param, ":start_step", 2),
  8967. (store_script_param, ":step_size", 3),
  8968. (store_script_param, ":winch_type", 4), # constants starting with winch_type_
  8969.  
  8970. (scene_prop_get_slot, ":moveable_instance_id", ":winch_instance_id", slot_scene_prop_linked_scene_prop),
  8971. (ge, ":moveable_instance_id", 0),
  8972. (prop_instance_get_variation_id, ":initial_position", ":winch_instance_id"),
  8973. (val_and, ":initial_position", 0x1),
  8974. (try_begin),
  8975. (eq, ":winch_type", winch_type_drawbridge),
  8976. (eq, ":initial_position", 0x1),
  8977. (else_try),
  8978. (this_or_next|eq, ":winch_type", winch_type_portcullis),
  8979. (eq, ":winch_type", winch_type_sliding_door),
  8980. (neq, ":initial_position", 0x1),
  8981. (else_try),
  8982. (assign, ":initial_position", -1),
  8983. (try_end),
  8984. (try_begin),
  8985. (neq, ":initial_position", -1),
  8986. (scene_prop_set_slot, ":moveable_instance_id", slot_scene_prop_target_position, ":start_step"),
  8987. (prop_instance_get_starting_position, pos1, ":moveable_instance_id"),
  8988. (store_mul, ":target_movement", ":start_step", ":step_size"),
  8989. (try_begin),
  8990. (eq, ":winch_type", winch_type_portcullis),
  8991. (position_move_z, pos1, ":target_movement"),
  8992. (else_try),
  8993. (eq, ":winch_type", winch_type_sliding_door),
  8994. (position_move_x, pos1, ":target_movement"),
  8995. (else_try),
  8996. (position_rotate_x, pos1, ":target_movement"),
  8997. (try_end),
  8998. (prop_instance_set_position, ":moveable_instance_id", pos1),
  8999. (try_end),
  9000. ]),
  9001.  
  9002. ("cf_init_lift_platform", # server: calculate range of motion for a lift platform at mission start
  9003. [(multiplayer_is_server),
  9004. (store_script_param, ":platform_instance_id", 1), # must be valid
  9005.  
  9006. (scene_prop_get_slot, ":winch_1_instance_id", ":platform_instance_id", slot_scene_prop_linked_scene_prop_1),
  9007. (gt, ":winch_1_instance_id", 0),
  9008. (scene_prop_get_slot, ":winch_2_instance_id", ":platform_instance_id", slot_scene_prop_linked_scene_prop_2),
  9009. (gt, ":winch_2_instance_id", 0),
  9010. (set_fixed_point_multiplier, 100),
  9011. (prop_instance_get_starting_position, pos1, ":winch_1_instance_id"),
  9012. (prop_instance_get_starting_position, pos2, ":winch_2_instance_id"),
  9013. (position_get_z, ":height", pos1),
  9014. (position_get_z, ":depth", pos2),
  9015. (val_sub, ":height", 100),
  9016. (val_sub, ":depth", 100),
  9017. (try_begin), # swap the top and bottom values if needed
  9018. (gt, ":depth", ":height"),
  9019. (assign, ":temp", ":depth"),
  9020. (assign, ":depth", ":height"),
  9021. (assign, ":height", ":temp"),
  9022. (try_end),
  9023. (scene_prop_set_slot, ":platform_instance_id", slot_scene_prop_height, ":height"),
  9024. (scene_prop_set_slot, ":platform_instance_id", slot_scene_prop_width, ":depth"),
  9025. (prop_instance_get_starting_position, pos1, ":platform_instance_id"),
  9026. (position_set_z, pos1, ":depth"),
  9027. (prop_instance_set_position, ":platform_instance_id", pos1),
  9028. ]),
  9029.  
  9030. ("cf_use_inventory", # server: reply with inventory contents of a scene prop when requested by a player
  9031. [(store_script_param, ":agent_id", 1), # must be valid
  9032. (store_script_param, ":instance_id", 2), # must be valid
  9033. (store_script_param, ":probability_multiplier", 3), # used for lock picking if the scene prop is destructible and locked
  9034.  
  9035. (agent_get_player_id, ":player_id", ":agent_id"),
  9036. (player_is_active, ":player_id"),
  9037. (agent_is_alive, ":agent_id"),
  9038. (call_script, "script_agent_remove_empty_ammo_stacks", ":agent_id"),
  9039. (assign, ":fail", 0),
  9040. (try_begin),
  9041. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_full_hit_points, 0),
  9042. (else_try),
  9043. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  9044. (else_try),
  9045. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  9046. (eq, reg1, -1),
  9047. (else_try),
  9048. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  9049. (player_slot_eq, ":player_id", slot_player_has_faction_item_key, 1),
  9050. (else_try),
  9051. (call_script, "script_cf_pick_chest_lock", ":agent_id", ":instance_id", ":probability_multiplier"),
  9052. (else_try),
  9053. (assign, ":fail", 1),
  9054. (try_end),
  9055. (eq, ":fail", 0),
  9056. (agent_set_animation, ":agent_id", "anim_access_inventory"),
  9057. (scene_prop_get_slot, ":inventory_slot_end", ":instance_id", slot_scene_prop_inventory_count),
  9058. (gt, ":inventory_slot_end", 0),
  9059. (val_add, ":inventory_slot_end", slot_scene_prop_inventory_begin),
  9060. (assign, ":slot_range_begin", -1),
  9061. (scene_prop_get_slot, ":item_id", ":instance_id", slot_scene_prop_inventory_begin),
  9062. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_slot_end"),
  9063. (store_add, ":next_inventory_slot", ":inventory_slot", 1),
  9064. (try_begin),
  9065. (lt, ":next_inventory_slot", ":inventory_slot_end"),
  9066. (scene_prop_get_slot, ":next_item_id", ":instance_id", ":next_inventory_slot"),
  9067. (else_try),
  9068. (assign, ":next_item_id", -9999),
  9069. (try_end),
  9070. (try_begin), # if the next items are identical, wait to send one message for the full slot range
  9071. (eq, ":item_id", ":next_item_id"),
  9072. (try_begin),
  9073. (le, ":slot_range_begin", -1),
  9074. (assign, ":slot_range_begin", ":inventory_slot"),
  9075. (try_end),
  9076. (else_try),
  9077. (try_begin), # sending a group of identical items
  9078. (gt, ":slot_range_begin", -1),
  9079. (multiplayer_send_4_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", ":slot_range_begin", ":item_id", ":next_inventory_slot"),
  9080. (assign, ":slot_range_begin", -1),
  9081. (else_try), # else just send the single slot
  9082. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", ":inventory_slot", ":item_id"),
  9083. (try_end),
  9084. (try_end),
  9085. (assign, ":item_id", ":next_item_id"),
  9086. (try_end),
  9087. (multiplayer_send_int_to_player, ":player_id", server_event_show_inventory, ":instance_id"),
  9088. (player_set_slot, ":player_id", slot_player_accessing_instance_id, ":instance_id"),
  9089. (scene_prop_get_slot, ":inventory_unique_id", ":instance_id", slot_scene_prop_inventory_unique_id),
  9090. (player_set_slot, ":player_id", slot_player_accessing_unique_id, ":inventory_unique_id"),
  9091. ]),
  9092.  
  9093. ("transfer_inventory", # server: handle inventory transfers within and between scene props and their agent
  9094. [(store_script_param, ":player_id", 1), # must be valid
  9095. (store_script_param, ":instance_id", 2),
  9096. (store_script_param, ":from_slot", 3),
  9097. (store_script_param, ":to_slot", 4),
  9098. (store_script_param, ":item_id", 5),
  9099.  
  9100. (try_begin), # failures in this section will force disconnection from the scene prop, to stop receiving updates
  9101. (gt, ":instance_id", 0),
  9102. (player_get_agent_id, ":agent_id", ":player_id"),
  9103. (agent_is_active, ":agent_id"),
  9104. (agent_is_alive, ":agent_id"),
  9105. (prop_instance_is_valid, ":instance_id"),
  9106. (scene_prop_get_slot, ":inventory_unique_id", ":instance_id", slot_scene_prop_inventory_unique_id),
  9107. (player_slot_eq, ":player_id", slot_player_accessing_unique_id, ":inventory_unique_id"),
  9108. (scene_prop_get_slot, ":inventory_count", ":instance_id", slot_scene_prop_inventory_count),
  9109. (gt, ":inventory_count", 0),
  9110. (try_begin),
  9111. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_full_hit_points, 0),
  9112. (else_try),
  9113. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_unlocked, 1),
  9114. (else_try),
  9115. (call_script, "script_scene_prop_get_owning_faction", ":instance_id"),
  9116. (eq, reg1, -1),
  9117. (else_try),
  9118. (player_slot_eq, ":player_id", slot_player_faction_id, reg0),
  9119. (player_slot_eq, ":player_id", slot_player_has_faction_item_key, 1),
  9120. (else_try),
  9121. (assign, ":inventory_count", 0),
  9122. (try_end),
  9123. (gt, ":inventory_count", 0),
  9124. (scene_prop_get_slot, ":linked_scene_prop", ":instance_id", slot_scene_prop_linked_scene_prop),
  9125. (try_begin), # for horse carts, use the specialized distance check
  9126. (eq, ":linked_scene_prop", 0),
  9127. (neg|scene_prop_slot_eq, ":instance_id", slot_scene_prop_required_horse, 0),
  9128. (call_script, "script_cart_choose_action", ":agent_id", ":instance_id"),
  9129. (neq, reg0, 0),
  9130. (else_try), # for normal storage props
  9131. (agent_get_position, pos1, ":agent_id"),
  9132. (prop_instance_get_position, pos2, ":instance_id"),
  9133. (eq, ":linked_scene_prop", 0),
  9134. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9135. (le, ":sq_distance", sq(max_distance_to_use)),
  9136. (else_try), # for ships, check agent is on board
  9137. (gt, ":linked_scene_prop", 0),
  9138. (prop_instance_is_valid, ":linked_scene_prop"),
  9139. (neg|scene_prop_slot_eq, ":linked_scene_prop", slot_scene_prop_collision_kind, 0),
  9140. (set_fixed_point_multiplier, 100),
  9141. (position_transform_position_to_local, pos3, pos2, pos1),
  9142. (position_get_y, ":relative_y", pos3),
  9143. (is_between, ":relative_y", -500, 500),
  9144. (position_get_z, ":relative_z", pos3),
  9145. (is_between, ":relative_z", 0, 500),
  9146. (position_get_x, ":relative_x", pos3),
  9147. (scene_prop_get_slot, ":max_x", ":linked_scene_prop", slot_scene_prop_length),
  9148. (store_mul, ":min_x", ":max_x", -1),
  9149. (is_between, ":relative_x", ":min_x", ":max_x"),
  9150. (else_try),
  9151. (assign, ":inventory_count", 0),
  9152. (try_end),
  9153. (gt, ":inventory_count", 0),
  9154. (player_set_slot, ":player_id", slot_player_accessing_instance_id, ":instance_id"),
  9155. (try_begin), # for failures after this point, stay connected with the scene prop, to receive updates
  9156. (store_add, ":inventory_end", slot_scene_prop_inventory_begin, ":inventory_count"),
  9157. (this_or_next|is_between, ":from_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9158. (is_between, ":from_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_item_0 + ek_gloves + 1),
  9159. (this_or_next|is_between, ":to_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9160. (is_between, ":to_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_item_0 + ek_gloves + 1),
  9161. (scene_prop_slot_eq, ":instance_id", ":to_slot", 0),
  9162. (ge, ":item_id", all_items_begin),
  9163. (item_get_type, ":item_type", ":item_id"),
  9164. (try_begin), # checks for equipping items on the agent
  9165. (is_between, ":to_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_end),
  9166. (try_begin),
  9167. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9168. (store_add, ":correct_armor_slot", ":item_type", slot_scene_prop_inventory_item_0 + ek_head - itp_type_head_armor),
  9169. (eq, ":to_slot", ":correct_armor_slot"),
  9170. (else_try),
  9171. (neg|is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9172. (lt, ":to_slot", slot_scene_prop_inventory_item_0 + ek_item_3 + 1),
  9173. (else_try),
  9174. (assign, ":item_id", -1),
  9175. (try_end),
  9176. (try_begin),
  9177. (ge, ":item_id", all_items_begin),
  9178. (agent_get_troop_id, ":troop_id", ":agent_id"),
  9179. (call_script, "script_cf_check_troop_can_equip_item", ":troop_id", ":item_id", ":player_id"),
  9180. (else_try),
  9181. (assign, ":item_id", -1),
  9182. (try_end),
  9183. (else_try), # check that the item fits inside when storing in the inventory
  9184. (item_get_slot, ":length", ":item_id", slot_item_length),
  9185. (neg|scene_prop_slot_ge, ":instance_id", slot_scene_prop_inventory_max_length, ":length"),
  9186. (assign, ":item_id", -1),
  9187. (try_end),
  9188. (ge, ":item_id", all_items_begin),
  9189. (try_begin),
  9190. (this_or_next|eq, ":item_type", itp_type_arrows),
  9191. (this_or_next|eq, ":item_type", itp_type_bolts),
  9192. (this_or_next|eq, ":item_type", itp_type_thrown),
  9193. (eq, ":item_type", itp_type_crossbow),
  9194. (assign, ":item_ammo", 0),
  9195. (else_try),
  9196. (assign, ":item_ammo", -1),
  9197. (try_end),
  9198. (assign, ":neg_from_mod_slot", 0),
  9199. (try_begin), # remove items taken from the agent's equipment
  9200. (ge, ":from_slot", slot_scene_prop_inventory_item_0),
  9201. (store_add, ":from_equip_slot", ":from_slot", ek_item_0 - slot_scene_prop_inventory_item_0),
  9202. (agent_get_item_slot, ":equip_item_id", ":agent_id", ":from_equip_slot"),
  9203. (eq, ":equip_item_id", ":item_id"),
  9204. (try_begin),
  9205. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9206. (store_sub, ":no_item_id", ":item_type", itp_type_head_armor),
  9207. (val_add, ":no_item_id", "itm_no_head"),
  9208. (call_script, "script_change_armor", ":agent_id", ":no_item_id"),
  9209. (store_add, ":player_slot", ":from_slot", slot_player_equip_item_0 - slot_scene_prop_inventory_item_0),
  9210. (player_set_slot, ":player_id", ":player_slot", 0),
  9211. (else_try),
  9212. (try_begin),
  9213. (gt, ":item_ammo", -1),
  9214. (agent_get_ammo_for_slot, ":item_ammo", ":agent_id", ":from_equip_slot"),
  9215. (try_end),
  9216. (val_add, ":from_equip_slot", 1),
  9217. (agent_unequip_item, ":agent_id", ":item_id", ":from_equip_slot"),
  9218. (try_end),
  9219. (else_try), # removing items from the scene prop
  9220. (lt, ":from_slot", slot_scene_prop_inventory_item_0),
  9221. (scene_prop_slot_eq, ":instance_id", ":from_slot", ":item_id"),
  9222. (scene_prop_set_slot, ":instance_id", ":from_slot", 0),
  9223. (store_add, ":neg_from_mod_slot", ":from_slot", slot_scene_prop_inventory_mod_begin - slot_scene_prop_inventory_begin),
  9224. (val_mul, ":neg_from_mod_slot", -1), # negative numbers in the _mod slots means the item was removed
  9225. (try_begin),
  9226. (gt, ":item_ammo", -1),
  9227. (store_add, ":from_ammo_slot", ":from_slot", slot_scene_prop_inventory_ammo_begin - slot_scene_prop_inventory_begin),
  9228. (scene_prop_get_slot, ":item_ammo", ":instance_id", ":from_ammo_slot"),
  9229. (scene_prop_set_slot, ":instance_id", ":from_ammo_slot", 0),
  9230. (try_end),
  9231. (else_try),
  9232. (assign, ":item_id", -1),
  9233. (try_end),
  9234. (ge, ":item_id", all_items_begin),
  9235. (try_begin), # ignore empty ammo items (but not unloaded crossbows)
  9236. (eq, ":item_ammo", 0),
  9237. (neq, ":item_type", itp_type_crossbow),
  9238. (else_try),
  9239. (ge, ":to_slot", slot_scene_prop_inventory_item_0),
  9240. (try_begin),
  9241. (gt, ":item_ammo", -1), # add up current ammo before equipping the item
  9242. (try_for_range, ":check_equip_slot", ek_item_0, ek_item_3 + 1),
  9243. (agent_get_item_slot, ":check_item_id", ":agent_id", ":check_equip_slot"),
  9244. (eq, ":check_item_id", ":item_id"),
  9245. (agent_get_ammo_for_slot, ":check_ammo", ":agent_id", ":check_equip_slot"),
  9246. (val_add, ":item_ammo", ":check_ammo"),
  9247. (try_end),
  9248. (try_end),
  9249. (try_begin),
  9250. (is_between, ":item_type", itp_type_head_armor, itp_type_hand_armor + 1),
  9251. (call_script, "script_change_armor", ":agent_id", ":item_id"),
  9252. (store_add, ":player_slot", ":to_slot", slot_player_equip_item_0 - slot_scene_prop_inventory_item_0),
  9253. (player_set_slot, ":player_id", ":player_slot", ":item_id"),
  9254. (else_try),
  9255. (store_add, ":to_equip_slot", ":to_slot", ek_item_0 - slot_scene_prop_inventory_item_0 + 1),
  9256. (agent_equip_item, ":agent_id", ":item_id", ":to_equip_slot"),
  9257. (gt, ":item_ammo", -1),
  9258. (agent_set_ammo, ":agent_id", ":item_id", ":item_ammo"),
  9259. (try_end),
  9260. (else_try),
  9261. (scene_prop_set_slot, ":instance_id", ":to_slot", ":item_id"),
  9262. (try_begin),
  9263. (gt, ":item_ammo", -1),
  9264. (store_add, ":to_ammo_slot", ":to_slot", slot_scene_prop_inventory_ammo_begin - slot_scene_prop_inventory_begin),
  9265. (scene_prop_set_slot, ":instance_id", ":to_ammo_slot", ":item_ammo",),
  9266. (try_end),
  9267. (try_end),
  9268. (try_begin), # ignore empty ammo items
  9269. (eq, ":item_ammo", 0),
  9270. (neq, ":item_type", itp_type_crossbow),
  9271. (assign, ":to_mod_slot", -1),
  9272. (else_try),
  9273. (store_add, ":to_mod_slot", ":to_slot", slot_scene_prop_inventory_mod_begin - slot_scene_prop_inventory_begin),
  9274. (try_end),
  9275. (try_begin),
  9276. (ge, ":neg_from_mod_slot", 0), # items from the agent equipment
  9277. (multiplayer_send_3_int_to_player, ":player_id", server_event_scene_prop_set_slot, ":instance_id", ":to_mod_slot", ":item_id"),
  9278. (else_try), # items moved within the inventory
  9279. (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"),
  9280. (try_end),
  9281. (this_or_next|lt, ":from_slot", slot_scene_prop_inventory_item_0), # don't send updates to other players when just shuffling agent equipment
  9282. (lt, ":to_slot", slot_scene_prop_inventory_item_0),
  9283. (try_begin), # when equipped on this agent, remove from inventory view of other players
  9284. (ge, ":to_slot", slot_scene_prop_inventory_item_0),
  9285. (assign, ":to_mod_slot", -1),
  9286. (try_end),
  9287. (get_max_players, ":max_players"),
  9288. (try_for_range, ":other_player_id", 1, ":max_players"), # loop over all players currently looking at the same inventory
  9289. (player_is_active, ":other_player_id"),
  9290. (neq, ":other_player_id", ":player_id"),
  9291. (player_slot_eq, ":other_player_id", slot_player_accessing_instance_id, ":instance_id"),
  9292. (try_begin),
  9293. (ge, ":neg_from_mod_slot", 0),
  9294. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_scene_prop_set_slot, ":instance_id", ":to_mod_slot", ":item_id"),
  9295. (else_try),
  9296. (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"),
  9297. (try_end),
  9298. (try_end),
  9299. (scene_prop_get_slot, ":prune_time", ":instance_id", slot_scene_prop_prune_time),
  9300. (try_begin), # if the inventory is stored in a spawned item, remove it if all items are taken out
  9301. (gt, ":prune_time", 0),
  9302. (is_between, ":from_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9303. (is_between, ":to_slot", slot_scene_prop_inventory_item_0, slot_scene_prop_inventory_item_0 + ek_gloves + 1),
  9304. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_end"),
  9305. (scene_prop_get_slot, ":item_id", ":instance_id", ":inventory_slot"),
  9306. (ge, ":item_id", all_items_begin),
  9307. (assign, ":inventory_end", -1),
  9308. (try_end),
  9309. (neq, ":inventory_end", -1),
  9310. (scene_prop_set_prune_time, ":instance_id", 1),
  9311. (else_try), # otherwise extend the time it will be removed if that is soon
  9312. (store_mission_timer_a, ":time"),
  9313. (val_add, ":time", 60),
  9314. (gt, ":time", ":prune_time"),
  9315. (scene_prop_set_prune_time, ":instance_id", 60),
  9316. (scene_prop_set_slot, ":instance_id", slot_scene_prop_prune_time, ":time"),
  9317. (try_end),
  9318. (try_end),
  9319. (else_try),
  9320. (player_set_slot, ":player_id", slot_player_accessing_instance_id, 0),
  9321. (try_end),
  9322. ]),
  9323.  
  9324. ("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
  9325. [(store_script_param, ":agent_id", 1), # must be valid
  9326. (store_script_param, ":instance_id", 2), # must be valid
  9327.  
  9328. (assign, reg0, 0),
  9329. (set_fixed_point_multiplier, 100),
  9330. (prop_instance_get_position, pos1, ":instance_id"),
  9331. (agent_get_position, pos2, ":agent_id"),
  9332. (position_get_z, ":height", pos2),
  9333. (position_set_z, pos1, ":height"),
  9334. (scene_prop_get_slot, ":access_offset", ":instance_id", slot_scene_prop_width),
  9335. (assign, ":access_distance", ":access_offset"),
  9336. (val_abs, ":access_distance"), # use the positive value for a radius
  9337. (val_mul, ":access_distance", ":access_distance"), # squared
  9338. (val_div, ":access_distance", 50), # distance * 2 / 100
  9339. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9340. (try_begin), # if within range of the attach position (mesh origin)
  9341. (le, ":sq_distance", ":access_distance"),
  9342. (assign, reg0, 1),
  9343. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  9344. (eq, ":weapon", -1),
  9345. (agent_get_wielded_item, ":shield", ":agent_id", 1),
  9346. (eq, ":shield", -1),
  9347. (assign, reg0, -1),
  9348. (else_try), # if within range of the access position (the offset from the mesh origin)
  9349. (lt, reg0, 1),
  9350. (position_move_y, pos1, ":access_offset"),
  9351. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9352. (le, ":sq_distance", ":access_distance"),
  9353. (assign, reg0, 1),
  9354. (try_end),
  9355. ]),
  9356.  
  9357. ("cf_use_cart", # server: handle players trying to attach or access carts
  9358. [(store_script_param, ":agent_id", 1), # must be valid
  9359. (store_script_param, ":instance_id", 2), # must be valid
  9360. (store_script_param, ":action", 3), # from cart_choose_action: -1 = attach, 1 = access
  9361.  
  9362. (agent_get_player_id, ":player_id", ":agent_id"),
  9363. (player_is_active, ":player_id"),
  9364. (agent_is_alive, ":agent_id"),
  9365. (assign, ":fail", 0),
  9366. (try_begin),
  9367. (eq, ":action", 1),
  9368. (call_script, "script_cf_use_inventory", ":agent_id", ":instance_id", 0),
  9369. (else_try),
  9370. (eq, ":action", -1),
  9371. (scene_prop_get_slot, ":required_horse", ":instance_id", slot_scene_prop_required_horse),
  9372. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  9373. (try_begin), # if a horse is required, check
  9374. (ge, ":required_horse", 1),
  9375. (assign, ":attach_agent_id", ":horse_agent_id"),
  9376. (try_begin),
  9377. (gt, ":horse_agent_id", -1),
  9378. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  9379. (this_or_next|eq, ":required_horse", 1),
  9380. (eq, ":horse_item_id", ":required_horse"),
  9381. (else_try),
  9382. (assign, ":fail", 1),
  9383. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_not_riding_necessary_horse", preset_message_error),
  9384. (try_end),
  9385. (else_try), # if mounted but horse not required, disallow attaching hand carts
  9386. (gt, ":horse_agent_id", -1),
  9387. (assign, ":fail", 1),
  9388. (else_try), # hand carts
  9389. (assign, ":attach_agent_id", ":agent_id"),
  9390. (agent_get_troop_id, ":troop_id", ":agent_id"),
  9391. (store_skill_level, ":labouring", "skl_labouring", ":troop_id"),
  9392. (try_begin),
  9393. (lt, ":labouring", 1),
  9394. (assign, ":fail", 1),
  9395. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_craft_not_skilled", preset_message_error),
  9396. (try_end),
  9397. (try_end),
  9398. (eq, ":fail", 0),
  9399. (try_begin),
  9400. (call_script, "script_cf_attach_cart", ":attach_agent_id", ":instance_id", ":agent_id"),
  9401. (else_try),
  9402. (assign, ":fail", 1),
  9403. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_already_attached_cart", preset_message_error),
  9404. (try_end),
  9405. (else_try),
  9406. (assign, ":fail", 1),
  9407. (try_end),
  9408. (eq, ":fail", 0),
  9409. ]),
  9410.  
  9411. ("cf_attach_cart", # server: try attach or detach agent and cart
  9412. [(store_script_param, ":attach_agent_id", 1), # the human or horse agent being attached to, must be valid
  9413. (store_script_param, ":instance_id", 2), # must be valid
  9414. (store_script_param, ":agent_id", 3), # the player agent, must be valid
  9415.  
  9416. (agent_get_attached_scene_prop, ":attached_scene_prop", ":attach_agent_id"),
  9417. (assign, ":fail", 0),
  9418. (try_begin),
  9419. (eq, ":attached_scene_prop", -1),
  9420. (ge, ":instance_id", 0),
  9421. (scene_prop_get_slot, ":attached_to_agent", ":instance_id", slot_scene_prop_attached_to_agent),
  9422. (try_begin),
  9423. (agent_is_active, ":attached_to_agent"),
  9424. (agent_is_alive, ":attached_to_agent"),
  9425. (agent_get_attached_scene_prop, ":other_instance_id", ":attached_to_agent"),
  9426. (eq, ":other_instance_id", ":instance_id"),
  9427. (assign, ":fail", 1),
  9428. (else_try),
  9429. (scene_prop_set_slot, ":instance_id", slot_scene_prop_attached_to_agent, ":attach_agent_id"),
  9430. (assign, ":new_attached_scene_prop", ":instance_id"),
  9431. (agent_set_attached_scene_prop, ":attach_agent_id", ":new_attached_scene_prop"),
  9432. (try_end),
  9433. (else_try),
  9434. (gt, ":attached_scene_prop", -1),
  9435. (try_begin),
  9436. (eq, ":instance_id", -1),
  9437. (assign, ":instance_id", ":attached_scene_prop"),
  9438. (try_end),
  9439. (eq, ":attached_scene_prop", ":instance_id"),
  9440. (scene_prop_set_slot, ":instance_id", slot_scene_prop_attached_to_agent, -1),
  9441. (assign, ":new_attached_scene_prop", -1),
  9442. (agent_set_attached_scene_prop, ":attach_agent_id", ":new_attached_scene_prop"),
  9443. (call_script, "script_cart_set_detached_position", ":instance_id"),
  9444. (else_try),
  9445. (assign, ":fail", 1),
  9446. (try_end),
  9447. (eq, ":fail", 0),
  9448. (get_max_players, ":max_players"),
  9449. (try_for_range, ":player_id", 1, ":max_players"),
  9450. (player_is_active, ":player_id"),
  9451. (multiplayer_send_2_int_to_player, ":player_id", server_event_set_attached_scene_prop, ":attach_agent_id", ":new_attached_scene_prop"),
  9452. (try_end),
  9453. (try_begin),
  9454. (neq, ":attach_agent_id", ":agent_id"),
  9455. (call_script, "script_check_agent_horse_speed_factor", ":agent_id", ":attach_agent_id", 0),
  9456. (try_end),
  9457. ]),
  9458.  
  9459. ("cart_set_detached_position", # server: align cart to ground level when detached
  9460. [(store_script_param, ":instance_id", 1), # must be valid
  9461.  
  9462. (set_fixed_point_multiplier, 100),
  9463. (prop_instance_get_position, pos1, ":instance_id"),
  9464. (position_get_z, ":height", pos1),
  9465. (try_begin),
  9466. (gt, ":height", z_position_water_level),
  9467. (position_set_z_to_ground_level, pos1),
  9468. (position_get_z, ":height", pos1),
  9469. (gt, ":height", z_position_water_level),
  9470. (scene_prop_get_slot, ":detach_rotation", ":instance_id", slot_scene_prop_rotation),
  9471. (position_rotate_x, pos1, ":detach_rotation"),
  9472. (else_try), # float on water
  9473. (position_set_z, pos1, z_position_water_level),
  9474. (try_end),
  9475. (scene_prop_get_slot, ":detach_offset", ":instance_id", slot_scene_prop_position),
  9476. (position_move_z, pos1, ":detach_offset", 1),
  9477. (position_get_z, ":animation_time", pos1),
  9478. (val_sub, ":animation_time", ":height"),
  9479. (val_abs, ":animation_time"),
  9480. (try_begin),
  9481. (gt, ":animation_time", 100),
  9482. (val_div, ":animation_time", 2),
  9483. (try_end),
  9484. (val_max, ":animation_time", 50),
  9485. (prop_instance_animate_to_position, ":instance_id", pos1, ":animation_time"),
  9486. ]),
  9487.  
  9488. ("add_cart_to_list", # add each cart to a list when loading the scene for faster proximity checks
  9489. [(store_script_param, ":instance_id", 1),
  9490.  
  9491. (troop_get_slot, ":cart_count", "trp_cart_array", slot_array_count),
  9492. (val_add, ":cart_count", 1),
  9493. (troop_set_slot, "trp_cart_array", ":cart_count", ":instance_id"),
  9494. (troop_set_slot, "trp_cart_array", slot_array_count, ":cart_count"),
  9495. ]),
  9496.  
  9497. ("cf_rest", # server: handle players resting at beds
  9498. [(store_script_param, ":agent_id", 1), # must be valid
  9499. (store_script_param, ":target_horse", 2), # 0 = heal humans, 1 = heal horses
  9500. (store_script_param, ":heal_percent", 3), # percentage healed per use
  9501. (store_script_param, ":min_health_percent", 4), # minimum health percentage to be able to use this bed
  9502.  
  9503. (agent_get_player_id, ":player_id", ":agent_id"),
  9504. (player_is_active, ":player_id"),
  9505. (assign, ":fail", 0),
  9506. (try_begin),
  9507. (try_begin), # only require food for resting humans
  9508. (eq, ":target_horse", 0),
  9509. (assign, ":target_agent_id", ":agent_id"),
  9510. (agent_get_slot, ":food_amount", ":target_agent_id", slot_agent_food_amount),
  9511. (else_try),
  9512. (agent_get_horse, ":target_agent_id", ":agent_id"),
  9513. (assign, ":food_amount", max_food_amount),
  9514. (try_end),
  9515. (assign, ":error_string_id", "str_no_horse"),
  9516. (neq, ":target_agent_id", -1),
  9517. (store_agent_hit_points, ":health_percent", ":target_agent_id", 0),
  9518. (assign, ":error_string_id", "str_too_wounded_to_rest"),
  9519. (gt, ":health_percent", ":min_health_percent"),
  9520. (assign, ":error_string_id", "str_too_hungry_to_rest"),
  9521. (gt, ":food_amount", 0),
  9522. (try_begin),
  9523. (neq, ":heal_percent", 0),
  9524. (lt, ":health_percent", 100),
  9525. (val_min, ":heal_percent", ":food_amount"),
  9526. (val_add, ":health_percent", ":heal_percent"),
  9527. (val_min, ":health_percent", 100),
  9528. (agent_set_hit_points, ":target_agent_id" , ":health_percent", 0),
  9529. (try_begin),
  9530. (eq, ":target_horse", 0),
  9531. (agent_play_sound, ":target_agent_id", "snd_man_yawn"),
  9532. (val_sub, ":food_amount", ":heal_percent"),
  9533. (agent_set_slot, ":target_agent_id", slot_agent_food_amount, ":food_amount"),
  9534. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":target_agent_id", slot_agent_food_amount, ":food_amount"),
  9535. (else_try),
  9536. (agent_play_sound, ":target_agent_id", "snd_horse_snort"),
  9537. (try_end),
  9538. (try_end),
  9539. (else_try),
  9540. (assign, ":fail", 1),
  9541. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, ":error_string_id", preset_message_error),
  9542. (try_end),
  9543. (eq, ":fail", 0),
  9544. ]),
  9545.  
  9546. ("cf_clean_blood", # server: allow players to remove blood from their agent if healthy
  9547. [(store_script_param, ":agent_id", 1), # must be valid
  9548.  
  9549. (store_agent_hit_points, ":hit_points", ":agent_id", 0),
  9550. (gt, ":hit_points", 70),
  9551. (get_max_players, ":max_players"),
  9552. (try_for_range, ":player_id", 1, ":max_players"),
  9553. (player_is_active, ":player_id"),
  9554. (multiplayer_send_2_int_to_player, ":player_id", server_event_agent_equip_armor, ":agent_id", -1), # magic value to redraw all armor
  9555. (try_end),
  9556. ]),
  9557.  
  9558. ("agent_clean_blood", # clients: re-equip all visual armor meshes to remove blood
  9559. [(store_script_param, ":agent_id", 1), # must be valid
  9560.  
  9561. (try_for_range, ":equip_slot", ek_head, ek_gloves + 1),
  9562. (agent_get_item_slot, ":item_id", ":agent_id", ":equip_slot"),
  9563. (store_sub, ":invisible_item_id", ":equip_slot", ek_head),
  9564. (val_add, ":invisible_item_id", "itm_invisible_head"),
  9565. (agent_equip_item, ":agent_id", ":invisible_item_id"),
  9566. (try_begin),
  9567. (gt, ":item_id", -1),
  9568. (agent_equip_item, ":agent_id", ":item_id"),
  9569. (else_try),
  9570. (agent_unequip_item, ":agent_id", ":invisible_item_id"),
  9571. (try_end),
  9572. (try_end),
  9573. ]),
  9574.  
  9575. ("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
  9576. [(store_script_param, ":attacked_agent_id", 1), # must be valid
  9577. (store_script_param, ":attacker_agent_id", 2), # must be valid
  9578. (store_script_param, ":damage_dealt", 3),
  9579. (store_script_param, ":weapon_item_id", 4),
  9580.  
  9581. (assign, ":damage_result", ":damage_dealt"),
  9582. (try_begin),
  9583. (eq, ":weapon_item_id", "itm_surgeon_scalpel"),
  9584. (try_begin),
  9585. (agent_get_troop_id, ":attacker_troop_id", ":attacker_agent_id"),
  9586. (store_skill_level, ":skill_level", "skl_wound_treatment", ":attacker_troop_id"),
  9587. (gt, ":skill_level", 0),
  9588. (store_mul, ":healing_limit", ":skill_level", 5),
  9589. (val_add, ":healing_limit", 50),
  9590. (store_agent_hit_points, ":health_percent", ":attacked_agent_id", 0),
  9591. (try_begin),
  9592. (lt, ":health_percent", ":healing_limit"),
  9593. (store_mul, ":healing", ":skill_level", 2),
  9594. (val_add, ":healing", 2),
  9595. (val_add, ":health_percent", ":healing"),
  9596. (val_min, ":health_percent", ":healing_limit"),
  9597. (agent_set_hit_points, ":attacked_agent_id", ":health_percent", 0),
  9598. (try_end),
  9599. (assign, ":damage_result", 0),
  9600. (try_end),
  9601. (else_try),
  9602. (eq, ":weapon_item_id", "itm_admin_scalpel"),
  9603. (try_begin),
  9604. (agent_get_troop_id, ":attacker_troop_id", ":attacker_agent_id"),
  9605. (eq, ":attacker_troop_id", "trp_godlike_hero"),
  9606. (agent_set_hit_points, ":attacked_agent_id", 100, 0),
  9607. (assign, ":damage_result", 0),
  9608. (call_script, "script_cf_clean_blood", ":attacked_agent_id"),
  9609. (try_end),
  9610. (else_try),
  9611. (eq, ":weapon_item_id", "itm_healing_herb"),
  9612. (try_begin),
  9613. (agent_get_troop_id, ":attacker_troop_id", ":attacker_agent_id"),
  9614. (store_skill_level, ":skill_level", "skl_wound_treatment", ":attacker_troop_id"),
  9615. (gt, ":skill_level", 0),
  9616. (assign, ":damage_result", 0),
  9617. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", "itm_healing_herb", 1),
  9618. (agent_get_slot, ":poison", ":attacked_agent_id", slot_agent_poison_amount),
  9619. (val_sub, ":poison", 1),
  9620. (agent_set_slot, ":attacked_agent_id", slot_agent_poison_amount, ":poison"),
  9621. (try_end),
  9622. (else_try),
  9623. (eq, ":weapon_item_id", "itm_poisoned_dagger"),
  9624. (try_begin),
  9625. (gt, ":damage_dealt", 5),
  9626. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", "itm_poisoned_dagger", 1),
  9627. (agent_equip_item, ":attacker_agent_id", "itm_dagger"),
  9628. (agent_set_wielded_item, ":attacker_agent_id", "itm_dagger"),
  9629. (agent_get_slot, ":poison", ":attacked_agent_id", slot_agent_poison_amount),
  9630. (val_add, ":poison", 1),
  9631. (agent_set_slot, ":attacked_agent_id", slot_agent_poison_amount, ":poison"),
  9632. (agent_set_slot, ":attacked_agent_id", slot_agent_poisoner_agent_id, ":attacker_agent_id"),
  9633. (try_begin),
  9634. (agent_get_player_id, ":attacker_player_id", ":attacker_agent_id"),
  9635. (player_is_active, ":attacker_player_id"),
  9636. (player_get_unique_id, ":attacker_player_uid", ":attacker_player_id"),
  9637. (else_try),
  9638. (assign, ":attacker_player_uid", -1),
  9639. (try_end),
  9640. (agent_set_slot, ":attacked_agent_id", slot_agent_poisoner_player_uid, ":attacker_player_uid"),
  9641. (try_end),
  9642. (else_try),
  9643. (eq, ":weapon_item_id", "itm_thin_lance"),
  9644. (try_begin),
  9645. (gt, ":damage_dealt", 10),
  9646. (agent_get_horse, ":horse_agent_id", ":attacker_agent_id"),
  9647. (agent_is_active, ":horse_agent_id"),
  9648. (set_fixed_point_multiplier, 100),
  9649. (agent_get_speed, pos1, ":attacker_agent_id"),
  9650. (position_get_y, ":forward_speed", pos1),
  9651. (this_or_next|gt, ":forward_speed", 500),
  9652. (gt, ":damage_dealt", 40),
  9653. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", "itm_thin_lance", 1),
  9654. (agent_get_position, pos1, ":attacker_agent_id"),
  9655. (position_move_x, pos1, 50),
  9656. (set_spawn_position, pos1),
  9657. (spawn_item, "itm_broken_lance", 0, 60),
  9658. (agent_play_sound, ":attacker_agent_id", "snd_lance_break"),
  9659. (position_move_z, pos1, 50),
  9660. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  9661. (try_end),
  9662. (try_end),
  9663. (set_trigger_result, ":damage_result"),
  9664. ]),
  9665.  
  9666. ("cf_use_bucket", # server: fill the bucket if below water level
  9667. [(store_script_param, ":agent_id", 1), # must be valid
  9668.  
  9669. (position_move_z, pos1, -100),
  9670. (position_get_z, ":z_pos", pos1),
  9671. (lt, ":z_pos", 0),
  9672. (call_script, "script_cf_agent_consume_item", ":agent_id", "itm_bucket", 1),
  9673. (agent_equip_item, ":agent_id", "itm_water_bucket", reg0),
  9674. (agent_set_wielded_item, ":agent_id", "itm_water_bucket"),
  9675. ]),
  9676.  
  9677. ("move_fish_school", # server: move the fish school to a new position inside the water depth limits
  9678. [(store_script_param, ":instance_id", 1), # must be valid
  9679.  
  9680. (set_fixed_point_multiplier, 100),
  9681. (prop_instance_get_position, pos1, ":instance_id"),
  9682. (prop_instance_get_variation_id, ":maximum_depth", ":instance_id"),
  9683. (try_begin),
  9684. (le, ":maximum_depth", fish_school_minimum_depth / 100),
  9685. (assign, ":maximum_depth", 1000),
  9686. (else_try),
  9687. (val_mul, ":maximum_depth", 100),
  9688. (try_end),
  9689. (position_set_z, pos1, z_position_water_level),
  9690. (assign, ":closest_depth", 999999),
  9691. (get_scene_boundaries, pos5, pos6),
  9692. (store_random_in_range, ":distance", fish_school_min_move_distance, fish_school_max_move_distance),
  9693. (store_mul, ":negative_distance", ":distance", -1),
  9694. (store_random_in_range, ":initial_direction", 0, 4),
  9695. (store_add, ":loop_end", ":initial_direction", 4),
  9696. (try_for_range, ":direction", ":initial_direction", ":loop_end"),
  9697. (copy_position, pos2, pos1),
  9698. (val_mod, ":direction", 4),
  9699. (try_begin),
  9700. (eq, ":direction", 0),
  9701. (position_move_x, pos2, ":distance", 1),
  9702. (position_get_x, ":pos_x", pos2),
  9703. (position_get_x, ":max_x", pos6),
  9704. (lt, ":pos_x", ":max_x"),
  9705. (else_try),
  9706. (eq, ":direction", 1),
  9707. (position_move_x, pos2, ":negative_distance", 1),
  9708. (position_get_x, ":pos_x", pos2),
  9709. (position_get_x, ":min_x", pos5),
  9710. (gt, ":pos_x", ":min_x"),
  9711. (else_try),
  9712. (eq, ":direction", 2),
  9713. (position_move_y, pos2, ":distance", 1),
  9714. (position_get_y, ":pos_y", pos2),
  9715. (position_get_y, ":max_y", pos6),
  9716. (lt, ":pos_y", ":max_y"),
  9717. (else_try),
  9718. (eq, ":direction", 3),
  9719. (position_move_y, pos2, ":negative_distance", 1),
  9720. (position_get_y, ":pos_y", pos2),
  9721. (position_get_y, ":min_y", pos5),
  9722. (gt, ":pos_y", ":min_y"),
  9723. (else_try),
  9724. (assign, ":direction", -1),
  9725. (try_end),
  9726. (gt, ":direction", -1),
  9727. (position_get_distance_to_terrain, ":water_depth", pos2),
  9728. (try_begin),
  9729. (is_between, ":water_depth", fish_school_minimum_depth, ":maximum_depth"),
  9730. (assign, ":loop_end", -1),
  9731. (copy_position, pos3, pos2),
  9732. (else_try),
  9733. (val_sub, ":water_depth", ":maximum_depth"),
  9734. (val_abs, ":water_depth"),
  9735. (lt, ":water_depth", ":closest_depth"),
  9736. (assign, ":closest_depth", ":water_depth"),
  9737. (copy_position, pos3, pos2),
  9738. (try_end),
  9739. (try_end),
  9740. (try_begin),
  9741. (this_or_next|eq, ":loop_end", -1),
  9742. (lt, ":closest_depth", 999999),
  9743. (prop_instance_set_position, ":instance_id", pos3, 1),
  9744. (try_end),
  9745. (prop_instance_get_variation_id_2, ":maximum_count", ":instance_id"),
  9746. (try_begin),
  9747. (eq, ":maximum_count", 0),
  9748. (assign, ":maximum_count", 100),
  9749. (try_end),
  9750. (scene_prop_get_slot, ":fish_count", ":instance_id", slot_scene_prop_stock_count),
  9751. (try_begin),
  9752. (lt, ":fish_count", ":maximum_count"),
  9753. (store_random_in_range, ":adjust_fish", -2, 4),
  9754. (val_add, ":fish_count", ":adjust_fish"),
  9755. (val_max, ":fish_count", 0),
  9756. (scene_prop_set_slot, ":instance_id", slot_scene_prop_stock_count, ":fish_count"),
  9757. (try_end),
  9758. (try_begin),
  9759. (gt, ":fish_count", 0),
  9760. (store_random_in_range, ":random", 0, 20),
  9761. (gt, ":fish_count", ":random"),
  9762. (store_random_in_range, ":move_x", -500, 501),
  9763. (position_move_x, pos3, ":move_x"),
  9764. (store_random_in_range, ":move_y", -500, 501),
  9765. (position_move_y, pos3, ":move_y"),
  9766. (store_random_in_range, ":rotate_z", 0, 360),
  9767. (position_rotate_z, pos3, ":rotate_z"),
  9768. (position_set_z, pos3, -30, 1),
  9769. (particle_system_burst, "psys_fish_rise", pos3, 1),
  9770. (val_mul, ":random", 2),
  9771. (try_begin),
  9772. (gt, ":fish_count", ":random"),
  9773. (particle_system_burst, "psys_game_water_splash_1", pos3, 5),
  9774. (particle_system_burst, "psys_game_water_splash_2", pos3, 5),
  9775. (copy_position, pos0, pos3),
  9776. (call_script, "script_play_sound_at_position", "snd_jump_end_water"),
  9777. (try_end),
  9778. (try_end),
  9779. ]),
  9780.  
  9781. ("check_fishing_nets", # server: check all fishing nets to see if anything was caught
  9782. [
  9783. (set_fixed_point_multiplier, 100),
  9784. (scene_spawned_item_get_num_instances, ":net_num", "itm_fishing_net"),
  9785. (try_for_range, ":net_no", 0, ":net_num"),
  9786. (scene_spawned_item_get_instance, ":net_instance_id", "itm_fishing_net", ":net_no"),
  9787. (scene_prop_get_slot, ":placement_skill", ":net_instance_id", slot_scene_prop_position),
  9788. (gt, ":placement_skill", 0),
  9789. (prop_instance_get_position, pos1, ":net_instance_id"),
  9790. (position_get_z, ":height", pos1),
  9791. (lt, ":height", -100),
  9792. (copy_position, pos2, pos1),
  9793. (position_set_z, pos2, z_position_water_level),
  9794. (scene_prop_get_slot, ":linked_instance_id", ":net_instance_id", slot_scene_prop_linked_scene_prop),
  9795. (assign, ":school_instance_id", ":linked_instance_id"),
  9796. (scene_prop_get_num_instances, ":school_num", "spr_pw_fish_school"),
  9797. (store_add, ":loop_end", ":school_num", 1),
  9798. (try_for_range, ":school_no", 0, ":loop_end"), # find the closest school to the net
  9799. (gt, ":school_instance_id", 0),
  9800. (scene_prop_get_slot, ":fish_count", ":school_instance_id", slot_scene_prop_stock_count),
  9801. (gt, ":fish_count", 0),
  9802. (prop_instance_get_position, pos3, ":school_instance_id"),
  9803. (get_sq_distance_between_positions, ":sq_distance", pos2, pos3),
  9804. (lt, ":sq_distance", sq(max_distance_to_catch_fish)),
  9805. (scene_prop_set_slot, ":net_instance_id", slot_scene_prop_linked_scene_prop, ":school_instance_id"),
  9806. (assign, ":loop_end", -1),
  9807. (else_try),
  9808. (lt, ":school_no", ":school_num"),
  9809. (scene_prop_get_instance, ":school_instance_id", "spr_pw_fish_school", ":school_no"),
  9810. (eq, ":school_instance_id", ":linked_instance_id"),
  9811. (assign, ":school_instance_id", -1),
  9812. (try_end),
  9813. (try_begin),
  9814. (eq, ":loop_end", -1),
  9815. (store_sqrt, ":distance", ":sq_distance"),
  9816. (store_mul, ":fish_factor", ":fish_count", ":placement_skill"),
  9817. (store_random_in_range, ":random", 0, ":distance"),
  9818. (lt, ":random", ":fish_factor"),
  9819. (store_random_in_range, ":move_x", -50, 51),
  9820. (position_move_x, pos1, ":move_x"),
  9821. (position_move_y, pos1, -15),
  9822. (position_get_z, ":height", pos1),
  9823. (val_abs, ":height"),
  9824. (val_sub, ":height", 30),
  9825. (val_min, ":height", 176),
  9826. (store_random_in_range, ":move_z", 50, ":height"),
  9827. (position_move_z, pos1, ":move_z"),
  9828. (set_spawn_position, pos1),
  9829. (spawn_item, "itm_fish", 0, fish_spawn_time),
  9830. (prop_instance_set_position, reg0, pos1),
  9831. (val_sub, ":fish_count", 1),
  9832. (scene_prop_set_slot, ":school_instance_id", slot_scene_prop_stock_count, ":fish_count"),
  9833. (try_end),
  9834. (try_end),
  9835. ]),
  9836.  
  9837. ("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
  9838. [(multiplayer_is_server),
  9839. (store_script_param, ":agent_id", 1), # must be valid
  9840.  
  9841. (set_fixed_point_multiplier, 100),
  9842. (position_get_z, ":z_pos", pos1),
  9843. (lt, ":z_pos", z_position_water_level),
  9844. (agent_get_troop_id, ":troop_id", ":agent_id"),
  9845. (store_skill_level, ":labouring", "skl_labouring", ":troop_id"),
  9846. (gt, ":labouring", 0),
  9847. (agent_get_player_id, ":player_id", ":agent_id"),
  9848. (player_is_active, ":player_id"),
  9849. (agent_get_slot, ":last_fish_instance_id", ":agent_id", slot_agent_fishing_last_school),
  9850. (try_begin), # first check the last fishing school used, to save time
  9851. (gt, ":last_fish_instance_id", -1),
  9852. (prop_instance_get_position, pos2, ":last_fish_instance_id"),
  9853. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9854. (lt, ":sq_distance", sq(max_distance_to_catch_fish)),
  9855. (assign, ":num_instances", -1),
  9856. (assign, ":fish_instance_id", ":last_fish_instance_id"),
  9857. (else_try), # else check all other schools
  9858. (scene_prop_get_num_instances, ":num_instances", "spr_pw_fish_school"),
  9859. (try_for_range, ":instance_no", 0, ":num_instances"),
  9860. (scene_prop_get_instance, ":fish_instance_id", "spr_pw_fish_school", ":instance_no"),
  9861. (scene_prop_slot_ge, ":fish_instance_id", slot_scene_prop_stock_count, 1),
  9862. (neq, ":fish_instance_id", ":last_fish_instance_id"),
  9863. (prop_instance_get_position, pos2, ":fish_instance_id"),
  9864. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  9865. (lt, ":sq_distance", sq(max_distance_to_catch_fish)),
  9866. (assign, ":num_instances", -1),
  9867. (agent_set_slot, ":agent_id", slot_agent_fishing_last_school, ":fish_instance_id"),
  9868. (try_end),
  9869. (gt, ":num_instances", -1),
  9870. (agent_set_slot, ":agent_id", slot_agent_fishing_last_school, -1),
  9871. (try_end),
  9872. (eq, ":num_instances", -1),
  9873. (store_sqrt, ":distance", ":sq_distance"),
  9874. (val_add, ":distance", 1000),
  9875. (store_random_in_range, ":success", 0, ":distance"),
  9876. (val_mul, ":labouring", 100),
  9877. (lt, ":success", ":labouring"),
  9878. (scene_prop_get_slot, ":fish_count", ":fish_instance_id", slot_scene_prop_stock_count),
  9879. (gt, ":fish_count", 0),
  9880. (val_sub, ":fish_count", 1),
  9881. (scene_prop_set_slot, ":fish_instance_id", slot_scene_prop_stock_count, ":fish_count"),
  9882. (position_get_rotation_around_z, ":rotation", pos1),
  9883. (init_position, pos2),
  9884. (position_copy_rotation, pos1, pos2),
  9885. (val_sub, ":rotation", 90),
  9886. (position_rotate_z, pos1, ":rotation"),
  9887. (set_spawn_position, pos1),
  9888. (spawn_item, "itm_fish", 0, fish_spawn_time),
  9889. (prop_instance_set_position, reg0, pos1),
  9890. (particle_system_burst, "psys_game_water_splash_2", pos1, 10),
  9891. (agent_play_sound, ":agent_id", "snd_jump_begin_water"),
  9892. ]),
  9893.  
  9894. ("cf_eat_food", # server: handle players consuming food items #ALTERED BY RAMARAUNT
  9895. [(multiplayer_is_server),
  9896. (store_script_param, ":agent_id", 1), # must be valid
  9897. (store_script_param, ":item_id", 2),
  9898.  
  9899. (agent_is_alive, ":agent_id"),
  9900. (agent_get_action_dir, ":direction", ":agent_id"),
  9901. (eq, ":direction", 0),
  9902. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  9903. (item_get_slot, ":food", ":item_id", slot_item_resource_amount),
  9904. (try_begin),
  9905. (gt, ":food", 1),
  9906. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  9907. (lt, ":food_amount", max_food_amount),
  9908. (val_add, ":food_amount", ":food"),
  9909. (val_min, ":food_amount", max_food_amount),
  9910. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  9911. (agent_get_player_id, ":player_id", ":agent_id"),
  9912. (player_is_active, ":player_id"),
  9913. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  9914. (else_try),
  9915. (le, ":food", 1),
  9916. (agent_get_slot, ":poison", ":agent_id", slot_agent_poison_amount),
  9917. (val_add, ":poison", 1),
  9918. (agent_set_slot, ":agent_id", slot_agent_poison_amount, ":poison"),
  9919. (agent_set_slot, ":agent_id", slot_agent_poisoner_agent_id, ":agent_id"),
  9920. (try_end),
  9921. (try_begin),
  9922. (eq, ":item_id", "itm_milk_bucket"),
  9923. (agent_equip_item, ":agent_id", "itm_bucket"),
  9924. (try_end),
  9925. ]),
  9926.  
  9927. ("check_agent_health", # server: check for armor encumbrance, poison, and passive healing effects
  9928. [(store_script_param, ":agent_id", 1), # must be valid
  9929.  
  9930. (try_begin),
  9931. (agent_is_alive, ":agent_id"),
  9932. (agent_get_slot, ":armor_speed_factor", ":agent_id", slot_agent_armor_speed_factor),
  9933. (try_begin),
  9934. (is_between, ":armor_speed_factor", 20, reduction_factor_base),
  9935. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  9936. (eq, ":horse_agent_id", -1),
  9937. (set_fixed_point_multiplier, 100),
  9938. (agent_get_speed, pos1, ":agent_id"),
  9939. (position_get_y, ":speed", pos1),
  9940. (gt, ":speed", 10),
  9941. (store_random_in_range, ":pause", 0, ":armor_speed_factor"),
  9942. (gt, ":pause", 20),
  9943. (agent_set_animation, ":agent_id", "anim_pause_encumbered"),
  9944. (try_end),
  9945. (agent_get_slot, ":poison_amount", ":agent_id", slot_agent_poison_amount),
  9946. (try_begin),
  9947. (gt, ":poison_amount", 0),
  9948. (store_mul, ":damage", ":poison_amount", 6),
  9949. (val_min, ":damage", 10),
  9950. (store_agent_hit_points, ":hit_points", ":agent_id", 1),
  9951. (val_sub, ":hit_points", ":damage"),
  9952. (agent_set_hit_points, ":agent_id", ":hit_points", 1),
  9953. (try_begin),
  9954. (le, ":hit_points", 0),
  9955. (agent_get_slot, ":poisoner_agent_id", ":agent_id", slot_agent_poisoner_agent_id),
  9956. (try_begin),
  9957. (gt, ":poisoner_agent_id", -1),
  9958. (agent_is_active, ":poisoner_agent_id"),
  9959. (agent_get_slot, ":poisoner_player_uid", ":agent_id", slot_agent_poisoner_player_uid),
  9960. (try_begin),
  9961. (gt, ":poisoner_player_uid", -1),
  9962. (agent_get_player_id, ":poisoner_player_id", ":poisoner_agent_id"),
  9963. (player_is_active, ":poisoner_player_id"),
  9964. (player_get_unique_id, ":poisoner_check_uid", ":poisoner_player_id"),
  9965. (eq, ":poisoner_check_uid", ":poisoner_player_uid"),
  9966. (assign, ":poisoner_player_uid", -1),
  9967. (try_end),
  9968. (eq, ":poisoner_player_uid", -1),
  9969. (else_try),
  9970. (assign, ":poisoner_agent_id", ":agent_id"),
  9971. (try_end),
  9972. (agent_deliver_damage_to_agent, ":poisoner_agent_id", ":agent_id", 10),
  9973. (try_end),
  9974. (try_end),
  9975. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  9976. (try_begin),
  9977. (gt, ":food_amount", 1),
  9978. (store_agent_hit_points, ":hit_points", ":agent_id", 0),
  9979. (lt, ":hit_points", 100),
  9980. (agent_get_troop_id, ":troop_id", ":agent_id"),
  9981. (troop_get_slot, ":min_health_percentage", ":troop_id", slot_troop_spawn_health_percent),
  9982. (val_min, ":min_health_percentage", 50),
  9983. (ge, ":hit_points", ":min_health_percentage"),
  9984. (val_sub, ":food_amount", 2),
  9985. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  9986. (store_agent_hit_points, ":hit_points", ":agent_id", 1),
  9987. (val_add, ":hit_points", 1),
  9988. (agent_set_hit_points, ":agent_id", ":hit_points", 1),
  9989. (store_mod, ":remainder", ":food_amount", 3),
  9990. (eq, ":remainder", 0), # only send food bar updates to the player's client about every 5% used
  9991. (agent_get_player_id, ":player_id", ":agent_id"),
  9992. (player_is_active, ":player_id"),
  9993. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  9994. (else_try),
  9995. (gt, ":food_amount", 1),
  9996. (val_sub, ":food_amount", 2),
  9997. (agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  9998. (agent_get_player_id, ":player_id", ":agent_id"),
  9999. (player_is_active, ":player_id"),
  10000. (multiplayer_send_3_int_to_player, ":player_id", server_event_agent_set_slot, ":agent_id", slot_agent_food_amount, ":food_amount"),
  10001. (try_end),
  10002. (try_begin), #RAMARAUNT ADD HUNGER
  10003. (agent_get_slot, ":food_amount", ":agent_id", slot_agent_food_amount),
  10004. (le, ":food_amount", 1),
  10005. (agent_get_player_id, ":player_id", ":agent_id"),
  10006. (player_is_active, ":player_id"),
  10007. (store_agent_hit_points, ":hit_points", ":agent_id", 0),
  10008. (val_sub, ":hit_points", 3),
  10009. (agent_set_hit_points, ":agent_id", ":hit_points", 0),
  10010. (try_end),
  10011. (try_end),
  10012. ]),
  10013.  
  10014. ("check_kill_excess_animals", # server: kill random herd animals when the herd animal limit setting is exceeded
  10015. [
  10016. (try_begin),
  10017. (multiplayer_is_server),
  10018. (assign, ":copied_herd_animal_count", "$g_herd_animal_count"),
  10019. (try_for_agents, ":agent_id"),
  10020. (gt, ":copied_herd_animal_count", "$g_max_herd_animal_count"),
  10021. (agent_slot_ge, ":agent_id", slot_agent_animal_birth_time, 1),
  10022. (agent_is_alive, ":agent_id"),
  10023. (neg|agent_is_human, ":agent_id"),
  10024. (remove_agent, ":agent_id"),
  10025. (val_sub, ":copied_herd_animal_count", 1),
  10026. (try_end),
  10027. (try_end),
  10028. ]),
  10029.  
  10030. ("check_animal_killed", # server: when an animal is killed, play death sounds, spawn carcass if a herd animal, storing meat and hide counts
  10031. [(store_script_param, ":dead_agent_id", 1), # must be valid
  10032. (store_script_param, ":killer_agent_id", 2),
  10033.  
  10034. (try_begin),
  10035. (multiplayer_is_server),
  10036. (agent_get_item_id, ":horse_item_id", ":dead_agent_id"),
  10037. (gt, ":horse_item_id", -1),
  10038. (try_begin),
  10039. (item_slot_eq, ":horse_item_id", slot_item_animal_adult_item_id, 0),
  10040. (agent_play_sound, ":dead_agent_id", "snd_horse_neigh"),
  10041. (else_try),
  10042. (val_sub, "$g_herd_animal_count", 1),
  10043. (store_mission_timer_a, "$g_time_last_herd_animal_disappeared"),
  10044. (val_add, "$g_time_last_herd_animal_disappeared", "$g_spawn_item_prune_time"),
  10045. (item_get_slot, ":death_sound", ":horse_item_id", slot_item_animal_death_sound),
  10046. (try_begin),
  10047. (gt, ":death_sound", 0),
  10048. (agent_play_sound, ":dead_agent_id", ":death_sound"),
  10049. (try_end),
  10050. (call_script, "script_animal_remove_from_herd", ":dead_agent_id", -1),
  10051. (item_get_slot, ":meat_count", ":horse_item_id", slot_item_animal_meat_count),
  10052. (item_get_slot, ":hide_count", ":horse_item_id", slot_item_animal_hide_count),
  10053. (try_begin),
  10054. (agent_is_active, ":killer_agent_id"),
  10055. (agent_get_wielded_item, ":wielded_item_id", ":killer_agent_id", 0),
  10056. (try_begin),
  10057. (this_or_next|le, ":wielded_item_id", -1),
  10058. (neg|item_slot_eq, ":wielded_item_id", slot_item_class, item_class_knife),
  10059. (val_sub, ":meat_count", 1),
  10060. (val_sub, ":hide_count", 2),
  10061. (try_end),
  10062. (agent_get_troop_id, ":troop_id", ":killer_agent_id"),
  10063. (store_skill_level, ":butchering_skill", "skl_herding", ":troop_id"),
  10064. (store_proficiency_level, ":weapon_skill", ":troop_id", wpt_one_handed_weapon),
  10065. (try_begin),
  10066. (lt, ":butchering_skill", 1),
  10067. (lt, ":weapon_skill", 90),
  10068. (val_sub, ":meat_count", 1),
  10069. (val_sub, ":hide_count", 1),
  10070. (try_end),
  10071. (else_try),
  10072. (val_div, ":meat_count", 2),
  10073. (val_div, ":hide_count", 2),
  10074. (try_end),
  10075. (agent_get_slot, ":food_count", ":dead_agent_id", slot_agent_animal_food),
  10076. (val_clamp, ":food_count", -2, 2),
  10077. (val_add, ":meat_count", ":food_count"),
  10078. (agent_get_position, pos1, ":dead_agent_id"),
  10079. (set_spawn_position, pos1),
  10080. (spawn_item, "itm_animal_carcass", 0, "$g_spawn_item_prune_time"),
  10081. (prop_instance_set_position, reg0, pos1),
  10082. (agent_set_slot, ":dead_agent_id", slot_agent_animal_carcass_instance_id, reg0),
  10083. (scene_prop_set_slot, reg0, slot_animal_carcass_meat_count, ":meat_count"),
  10084. (scene_prop_set_slot, reg0, slot_animal_carcass_hide_count, ":hide_count"),
  10085. (try_end),
  10086. (try_end),
  10087. ]),
  10088.  
  10089. ("cf_use_butchering_knife", # server: check for nearby animal carcasses for the agent to butcher
  10090. [(store_script_param, ":agent_id", 1), # must be valid
  10091.  
  10092. (assign, ":found", 0),
  10093. (agent_get_slot, ":carcass_instance_id", ":agent_id", slot_agent_hunting_last_carcass),
  10094. (try_begin), # first check the last carcass used, to save time
  10095. (prop_instance_is_valid, ":carcass_instance_id"),
  10096. (this_or_next|scene_prop_slot_ge, ":carcass_instance_id", slot_animal_carcass_meat_count, 1),
  10097. (scene_prop_slot_ge, ":carcass_instance_id", slot_animal_carcass_hide_count, 1),
  10098. (prop_instance_get_position, pos2, ":carcass_instance_id"),
  10099. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10100. (lt, ":sq_distance", sq(max_distance_to_use)),
  10101. (assign, ":found", 1),
  10102. (else_try), # otherwise check all other carcasses
  10103. (agent_get_player_id, ":player_id", ":agent_id"),
  10104. (player_is_active, ":player_id"),
  10105. (store_mission_timer_a, ":time"),
  10106. (lt, ":time", "$g_time_last_herd_animal_disappeared"),
  10107. (player_get_slot, ":last_action_time", ":player_id", slot_player_last_action_time),
  10108. (store_sub, ":interval", ":time", ":last_action_time"),
  10109. (ge, ":interval", carcass_search_min_interval),
  10110. (player_set_slot, ":player_id", slot_player_last_action_time, ":time"),
  10111. (scene_spawned_item_get_num_instances, ":carcass_count", "itm_animal_carcass"),
  10112. (try_for_range, ":other_carcass_no", 0, ":carcass_count"),
  10113. (scene_spawned_item_get_instance, ":other_carcass_instance_id", "itm_animal_carcass", ":other_carcass_no"),
  10114. (this_or_next|scene_prop_slot_ge, ":other_carcass_instance_id", slot_animal_carcass_meat_count, 1),
  10115. (scene_prop_slot_ge, ":other_carcass_instance_id", slot_animal_carcass_hide_count, 1),
  10116. (prop_instance_get_position, pos2, ":other_carcass_instance_id"),
  10117. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10118. (lt, ":sq_distance", sq(max_distance_to_use)),
  10119. (assign, ":carcass_count", -1),
  10120. (assign, ":found", 1),
  10121. (assign, ":carcass_instance_id", ":other_carcass_instance_id"),
  10122. (agent_set_slot, ":agent_id", slot_agent_hunting_last_carcass, ":other_carcass_instance_id"),
  10123. (try_end),
  10124. (try_begin),
  10125. (eq, ":found", 0),
  10126. (agent_set_slot, ":agent_id", slot_agent_hunting_last_carcass, -1),
  10127. (try_end),
  10128. (try_end),
  10129. (eq, ":found", 1),
  10130. (scene_prop_get_slot, ":hide_count", ":carcass_instance_id", slot_animal_carcass_hide_count),
  10131. (try_begin),
  10132. (gt, ":hide_count", 0),
  10133. (val_sub, ":hide_count", 1),
  10134. (scene_prop_set_slot, ":carcass_instance_id", slot_animal_carcass_hide_count, ":hide_count"),
  10135. (call_script, "script_set_random_spawn_position", 50),
  10136. (spawn_item, "itm_raw_hide", 0, "$g_spawn_item_prune_time"),
  10137. (else_try),
  10138. (scene_prop_get_slot, ":meat_count", ":carcass_instance_id", slot_animal_carcass_meat_count),
  10139. (gt, ":meat_count", 0),
  10140. (val_sub, ":meat_count", 1),
  10141. (scene_prop_set_slot, ":carcass_instance_id", slot_animal_carcass_meat_count, ":meat_count"),
  10142. (call_script, "script_set_random_spawn_position", 50),
  10143. (spawn_item, "itm_raw_meat", 0, "$g_spawn_item_prune_time"),
  10144. (try_end),
  10145. (try_begin),
  10146. (le, ":hide_count", 0),
  10147. (le, ":meat_count", 0),
  10148. (scene_prop_set_prune_time, ":carcass_instance_id", 1),
  10149. (try_end),
  10150. ]),
  10151.  
  10152. ("cf_animal_add_to_herd", # server: try find a free space for an animal in a herd
  10153. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10154. (store_script_param, ":herd_manager", 2), # must be a valid instance id
  10155. (store_script_param, ":adult_item_id", 3),
  10156.  
  10157. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  10158. (assign, ":free_slot", -1),
  10159. (assign, ":found_herd", 0),
  10160. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  10161. (try_for_range, ":herd_slot", 0, ":loop_end"),
  10162. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  10163. (agent_is_active, ":herd_agent_id"),
  10164. (agent_slot_eq, ":herd_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  10165. (agent_get_item_id, ":herd_item_id", ":herd_agent_id"),
  10166. (gt, ":herd_item_id", -1),
  10167. (item_slot_eq, ":herd_item_id", slot_item_animal_adult_item_id, ":adult_item_id"),
  10168. (agent_get_position, pos50, ":herd_agent_id"),
  10169. (get_sq_distance_between_positions, ":sq_distance", pos1, pos50),
  10170. (try_begin),
  10171. (le, ":sq_distance", sq(max_distance_to_include_in_herd)),
  10172. (assign, ":found_herd", 1),
  10173. (else_try),
  10174. (assign, ":loop_end", -1),
  10175. (try_end),
  10176. (else_try),
  10177. (scene_prop_set_slot, ":herd_manager", ":herd_slot", -1),
  10178. (eq, ":free_slot", -1),
  10179. (assign, ":free_slot", ":herd_slot"),
  10180. (try_end),
  10181. (eq, ":found_herd", 1),
  10182. (gt, ":free_slot", -1),
  10183. (scene_prop_set_slot, ":herd_manager", ":free_slot", ":animal_agent_id"),
  10184. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  10185. (scene_prop_set_prune_time, ":herd_manager", 999999),
  10186. ]),
  10187.  
  10188. ("animal_add_to_nearby_herd", # server: try add the animal to the herd or another nearby, otherwise spawn a new herd manager
  10189. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10190. (store_script_param, ":herd_manager", 2),
  10191.  
  10192. (try_begin),
  10193. (agent_is_active, ":animal_agent_id"),
  10194. (agent_get_position, pos1, ":animal_agent_id"),
  10195. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10196. (gt, ":animal_item_id", -1),
  10197. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  10198. (gt, ":adult_item_id", 0),
  10199. (agent_get_slot, ":old_herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10200. (try_begin),
  10201. (prop_instance_is_valid, ":herd_manager"),
  10202. (call_script, "script_cf_animal_add_to_herd", ":animal_agent_id", ":herd_manager", ":adult_item_id"),
  10203. (else_try),
  10204. (assign, ":checked_herd_manager", ":herd_manager"),
  10205. (scene_spawned_item_get_num_instances, ":herds_end", "itm_animal_herd_manager"),
  10206. (try_for_range, ":herd_no", 0, ":herds_end"),
  10207. (scene_spawned_item_get_instance, ":herd_manager", "itm_animal_herd_manager", ":herd_no"),
  10208. (neq, ":herd_manager", ":checked_herd_manager"),
  10209. (call_script, "script_cf_animal_add_to_herd", ":animal_agent_id", ":herd_manager", ":adult_item_id"),
  10210. (assign, ":herds_end", -1),
  10211. (try_end),
  10212. (eq, ":herds_end", -1),
  10213. (else_try),
  10214. (set_fixed_point_multiplier, 100),
  10215. (init_position, pos0),
  10216. (position_set_z, pos0, -5000),
  10217. (set_spawn_position, pos0),
  10218. (spawn_item, "itm_animal_herd_manager", 0, 999999),
  10219. (assign, ":herd_manager", reg0),
  10220. (prop_instance_set_position, ":herd_manager", pos1, 1),
  10221. (scene_prop_set_slot, ":herd_manager", 0, ":animal_agent_id"),
  10222. (scene_prop_set_slot, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  10223. (item_get_slot, ":loop_end", ":animal_item_id", slot_item_animal_max_in_herd),
  10224. (try_for_range, ":herd_slot", 1, ":loop_end"),
  10225. (scene_prop_set_slot, ":herd_manager", ":herd_slot", -1),
  10226. (try_end),
  10227. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  10228. (try_end),
  10229. (try_begin),
  10230. (gt, ":old_herd_manager", -1),
  10231. (neq, ":herd_manager", ":old_herd_manager"),
  10232. (call_script, "script_animal_remove_from_herd", ":animal_agent_id", ":old_herd_manager"),
  10233. (try_end),
  10234. (try_end),
  10235. ]),
  10236.  
  10237. ("animal_remove_from_herd", # server: remove the animal from the herd manager, if valid
  10238. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10239. (store_script_param, ":herd_manager", 2),
  10240.  
  10241. (try_begin),
  10242. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10243. (gt, ":animal_item_id", -1),
  10244. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  10245. (gt, ":adult_item_id", 0),
  10246. (try_begin),
  10247. (le, ":herd_manager", -1),
  10248. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10249. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, -1),
  10250. (try_end),
  10251. (prop_instance_is_valid, ":herd_manager"),
  10252. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  10253. (item_get_slot, ":loop_end", ":animal_item_id", slot_item_animal_max_in_herd),
  10254. (try_for_range, ":herd_slot", 0, ":loop_end"),
  10255. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  10256. (eq, ":herd_agent_id", ":animal_agent_id"),
  10257. (scene_prop_set_slot, ":herd_manager", ":herd_slot", -1),
  10258. (assign, ":loop_end", -1),
  10259. (try_end),
  10260. (try_end),
  10261. ]),
  10262.  
  10263. ("cf_spawn_herd_animal", # server: spawn an animal and add to a nearby herd
  10264. [(store_script_param, ":animal_item_id", 1),
  10265. (store_script_param, ":herd_manager", 2),
  10266.  
  10267. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  10268. (gt, ":adult_item_id", 0),
  10269. (val_add, "$g_herd_animal_count", 1),
  10270. (set_spawn_position, pos1),
  10271. (spawn_horse, ":animal_item_id"),
  10272. (assign, ":animal_agent_id", reg0),
  10273. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, -1),
  10274. (agent_set_slot, ":animal_agent_id", slot_agent_animal_carcass_instance_id, -1),
  10275. (call_script, "script_animal_add_to_nearby_herd", ":animal_agent_id", ":herd_manager"),
  10276. (store_mission_timer_a, ":time"),
  10277. (try_begin),
  10278. (eq, ":animal_item_id", ":adult_item_id"),
  10279. (item_get_slot, ":grow_time", ":animal_item_id", slot_item_animal_grow_time),
  10280. (val_sub, ":time", ":grow_time"),
  10281. (try_end),
  10282. (val_max, ":time", 1),
  10283. (agent_set_slot, ":animal_agent_id", slot_agent_animal_birth_time, ":time"),
  10284. ]),
  10285.  
  10286. ("cf_can_spawn_herd_animal", # server: check whether a player can spawn a new herd animal
  10287. [(store_script_param, ":agent_id", 1), # must be valid
  10288.  
  10289. (agent_get_player_id, ":player_id", ":agent_id"),
  10290. (player_is_active, ":player_id"),
  10291. (try_begin),
  10292. (ge, "$g_herd_animal_count", "$g_max_herd_animal_count"),
  10293. (multiplayer_send_2_int_to_player, ":player_id", server_event_preset_message, "str_herd_animal_limit_reached", preset_message_error),
  10294. (try_end),
  10295. (lt, "$g_herd_animal_count", "$g_max_herd_animal_count"),
  10296. ]),
  10297.  
  10298. ("animal_get_age", # server: reg0 = the seconds since the animal was born as a child, or extrapolated for spawned adults
  10299. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10300.  
  10301. (agent_get_slot, ":birth_time", ":animal_agent_id", slot_agent_animal_birth_time),
  10302. (store_mission_timer_a, ":age"),
  10303. (val_sub, ":age", ":birth_time"),
  10304. (val_div, ":age", 60),
  10305. (assign, reg0, ":age"),
  10306. ]),
  10307.  
  10308. ("animal_check_grow", # server: check if the animal should grow into an adult or birth a child; reg0 = the animal agent id
  10309. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10310.  
  10311. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10312. (store_mission_timer_a, ":time"),
  10313. (try_begin),
  10314. (item_slot_eq, ":animal_item_id", slot_item_animal_child_item_id, ":animal_item_id"),
  10315. (agent_get_slot, ":grow_time", ":animal_agent_id", slot_agent_animal_grow_time),
  10316. (try_begin),
  10317. (le, ":grow_time", 0),
  10318. (item_get_slot, ":grow_time", ":animal_item_id", slot_item_animal_grow_time),
  10319. (agent_get_slot, ":birth_time", ":animal_agent_id", slot_agent_animal_birth_time),
  10320. (val_add, ":grow_time", ":birth_time"),
  10321. (agent_set_slot, ":animal_agent_id", slot_agent_animal_grow_time, ":grow_time"),
  10322. (try_end),
  10323. (ge, ":time", ":grow_time"),
  10324. (agent_set_slot, ":animal_agent_id", slot_agent_animal_grow_time, 0),
  10325. (item_get_slot, ":adult_item_id", ":animal_item_id", slot_item_animal_adult_item_id),
  10326. (agent_get_position, pos1, ":animal_agent_id"),
  10327. (set_spawn_position, pos1),
  10328. (spawn_horse, ":adult_item_id"),
  10329. (assign, ":adult_agent_id", reg0),
  10330. (store_agent_hit_points, ":hit_points", ":animal_agent_id", 1),
  10331. (agent_set_hit_points, ":adult_agent_id", ":hit_points", 1),
  10332. (try_for_range, ":slot", 0, slot_agent_animal_end),
  10333. (agent_get_slot, ":value", ":animal_agent_id", ":slot"),
  10334. (agent_set_slot, ":adult_agent_id", ":slot", ":value"),
  10335. (try_end),
  10336. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10337. (agent_set_slot, ":animal_agent_id", slot_agent_animal_herd_manager, -1),
  10338. (try_begin), # try add the new adult to the herd replacing the child
  10339. (prop_instance_is_valid, ":herd_manager"),
  10340. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":adult_item_id"),
  10341. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  10342. (try_for_range, ":herd_slot", 0, ":loop_end"),
  10343. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  10344. (eq, ":herd_agent_id", ":animal_agent_id"),
  10345. (scene_prop_set_slot, ":herd_manager", ":herd_slot", ":adult_agent_id"),
  10346. (agent_set_slot, ":adult_agent_id", slot_agent_animal_herd_manager, ":herd_manager"),
  10347. (assign, ":loop_end", -1),
  10348. (try_end),
  10349. (eq, ":loop_end", -1),
  10350. (else_try),
  10351. (call_script, "script_animal_add_to_nearby_herd", ":adult_agent_id", -1),
  10352. (try_end),
  10353. (agent_fade_out, ":animal_agent_id"),
  10354. (assign, ":animal_agent_id", ":adult_agent_id"),
  10355. (else_try),
  10356. (item_slot_eq, ":animal_item_id", slot_item_animal_adult_item_id, ":animal_item_id"),
  10357. (lt, "$g_herd_animal_count", "$g_max_herd_animal_count"),
  10358. (agent_get_slot, ":reproduce_time", ":animal_agent_id", slot_agent_animal_grow_time),
  10359. (this_or_next|le, ":reproduce_time", 0),
  10360. (ge, ":time", ":reproduce_time"),
  10361. (try_begin), # wait one cycle after growing to adult before reproducing
  10362. (gt, ":reproduce_time", 0),
  10363. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10364. (try_begin),
  10365. (prop_instance_is_valid, ":herd_manager"),
  10366. (scene_prop_slot_eq, ":herd_manager", slot_animal_herd_manager_adult_item_id, ":animal_item_id"),
  10367. (item_get_slot, ":loop_end", ":animal_item_id", slot_item_animal_max_in_herd),
  10368. (try_for_range, ":herd_slot", 0, ":loop_end"), # verify that there is at least one other adult in the herd
  10369. (scene_prop_get_slot, ":other_animal_agent_id", ":herd_manager", ":herd_slot"),
  10370. (neq, ":other_animal_agent_id", ":animal_agent_id"),
  10371. (agent_is_active, ":other_animal_agent_id"),
  10372. (agent_is_alive, ":other_animal_agent_id"),
  10373. (agent_get_item_id, ":other_animal_item_id", ":other_animal_agent_id"),
  10374. (eq, ":other_animal_item_id", ":animal_item_id"),
  10375. (assign, ":loop_end", -1),
  10376. (try_end),
  10377. (eq, ":loop_end", -1),
  10378. (item_get_slot, ":child_item_id", ":animal_item_id", slot_item_animal_child_item_id),
  10379. (agent_get_position, pos1, ":animal_agent_id"),
  10380. (call_script, "script_set_random_spawn_position", 50),
  10381. (copy_position, pos1, pos10),
  10382. (call_script, "script_cf_spawn_herd_animal", ":child_item_id", ":herd_manager"),
  10383. (try_end),
  10384. (try_end),
  10385. (item_get_slot, ":max_reproduce_time", ":animal_item_id", slot_item_animal_grow_time),
  10386. (store_div, ":reproduce_time", ":reproduce_time", 2),
  10387. (val_mul, ":max_reproduce_time", 2),
  10388. (store_random_in_range, ":reproduce_time", ":reproduce_time", ":max_reproduce_time"),
  10389. (val_add, ":reproduce_time", ":time"),
  10390. (agent_set_slot, ":animal_agent_id", slot_agent_animal_grow_time, ":reproduce_time"),
  10391. (try_end),
  10392. (assign, reg0, ":animal_agent_id"),
  10393. ]),
  10394.  
  10395. ("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
  10396. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10397. (store_script_param, ":leader_agent_id", 2), # must be valid
  10398.  
  10399. (set_fixed_point_multiplier, 100),
  10400. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10401. (assign, ":herd_is_starving", 0),
  10402. (try_begin), # for the leader, check the actual distance moved since last time
  10403. (eq, ":animal_agent_id", ":leader_agent_id"),
  10404. (agent_get_position, pos1, ":animal_agent_id"),
  10405. (store_random_in_range, ":random_angle", -30, 30),
  10406. (prop_instance_get_position, pos6, ":herd_manager"),
  10407. (get_sq_distance_between_positions, ":sq_distance_moved", pos1, pos6),
  10408. (try_begin), # if the distance is insufficient, turn around to try avoid a possible obstruction
  10409. (le, ":sq_distance_moved", sq(500)),
  10410. (assign, ":herd_is_starving", 1),
  10411. (val_add, ":random_angle", 180),
  10412. (else_try),
  10413. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  10414. (val_abs, ":terrain_distance"),
  10415. (ge, ":terrain_distance", 100),
  10416. (assign, ":herd_is_starving", 1),
  10417. (try_end),
  10418. (scene_prop_set_slot, ":herd_manager", slot_animal_herd_manager_starving, ":herd_is_starving"),
  10419. (prop_instance_set_position, ":herd_manager", pos1, 1),
  10420. (else_try),
  10421. (agent_get_scripted_destination, pos1, ":leader_agent_id"),
  10422. (store_random_in_range, ":random_angle", -180, 180),
  10423. (scene_prop_get_slot, ":herd_is_starving", ":herd_manager", slot_animal_herd_manager_starving),
  10424. (try_end),
  10425. (agent_get_slot, ":times_stuck", ":animal_agent_id", slot_agent_animal_times_stuck),
  10426. (agent_get_slot, ":food_amount", ":animal_agent_id", slot_agent_animal_food),
  10427. (try_begin),
  10428. (this_or_next|eq, ":herd_is_starving", 1),
  10429. (ge, ":times_stuck", 5),
  10430. (store_random_in_range, ":starve_chance", 0, 100),
  10431. (lt, ":starve_chance", 50),
  10432. (val_sub, ":food_amount", 1),
  10433. (agent_set_slot, ":animal_agent_id", slot_agent_animal_food, ":food_amount"),
  10434. (lt, ":food_amount", 0),
  10435. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10436. (item_get_slot, ":death_sound", ":animal_item_id", slot_item_animal_death_sound),
  10437. (try_begin),
  10438. (gt, ":death_sound", 0),
  10439. (agent_play_sound, ":animal_agent_id", ":death_sound"),
  10440. (try_end),
  10441. (item_get_slot, ":starvation_meat_loss", ":animal_item_id", slot_item_animal_meat_count),
  10442. (val_mul, ":starvation_meat_loss", -1),
  10443. (val_sub, ":starvation_meat_loss", 3),
  10444. (lt, ":food_amount", ":starvation_meat_loss"),
  10445. (remove_agent, ":animal_agent_id"),
  10446. (assign, ":animal_agent_id", -1),
  10447. (else_try),
  10448. (eq, ":herd_is_starving", 0),
  10449. (call_script, "script_animal_check_grow", ":animal_agent_id"),
  10450. (assign, ":animal_agent_id", reg0),
  10451. (lt, ":food_amount", 0),
  10452. (val_add, ":food_amount", 1),
  10453. (agent_set_slot, ":animal_agent_id", slot_agent_animal_food, ":food_amount"),
  10454. (try_end),
  10455. (try_begin),
  10456. (neq, ":animal_agent_id", -1),
  10457. (get_scene_boundaries, pos8, pos9),
  10458. (position_get_x, ":scene_min_x", pos8),
  10459. (position_get_y, ":scene_min_y", pos8),
  10460. (position_get_x, ":scene_max_x", pos9),
  10461. (position_get_y, ":scene_max_y", pos9),
  10462. (assign, ":loop_end", 10),
  10463. (try_for_range, ":unused", 0, ":loop_end"), # test multiple different distances and angles diverging from the current heading
  10464. (copy_position, pos2, pos1),
  10465. (position_rotate_z, pos2, ":random_angle"),
  10466. (try_begin),
  10467. (eq, ":animal_agent_id", ":leader_agent_id"),
  10468. (store_random_in_range, ":random_distance", 1500, 2000),
  10469. (else_try),
  10470. (store_random_in_range, ":random_distance", 100, 1000),
  10471. (try_end),
  10472. (position_move_y, pos2, ":random_distance"),
  10473. (copy_position, pos3, pos2),
  10474. (position_set_z, pos3, 0),
  10475. (position_get_distance_to_terrain, ":water_depth", pos3),
  10476. (try_begin), # avoid water and scene boundaries
  10477. (lt, ":water_depth", z_position_water_level * -1),
  10478. (assign, ":continue", 1),
  10479. (try_begin),
  10480. (position_get_x, ":agent_x", pos2),
  10481. (is_between, ":agent_x", ":scene_min_x", ":scene_max_x"),
  10482. (position_get_y, ":agent_y", pos2),
  10483. (is_between, ":agent_y", ":scene_min_y", ":scene_max_y"),
  10484. (else_try),
  10485. (val_add, ":random_angle", 180),
  10486. (assign, ":continue", 0),
  10487. (try_end),
  10488. (eq, ":continue", 1),
  10489. (position_get_distance_to_terrain, ":distance_to_terrain", pos2),
  10490. (val_mul, ":distance_to_terrain", -1),
  10491. (position_move_z, pos2, ":distance_to_terrain"),
  10492. (try_begin),
  10493. (eq, ":animal_agent_id", ":leader_agent_id"),
  10494. (eq, ":times_stuck", 0), # unless the animal didn't move last time, avoid trying to move to a position without clear line of sight
  10495. (copy_position, pos4, pos1),
  10496. (copy_position, pos5, pos2),
  10497. (position_move_z, pos4, 100, 1),
  10498. (position_move_x, pos4, 50),
  10499. (position_move_z, pos5, 100, 1),
  10500. (neg|position_has_line_of_sight_to_position, pos4, pos5),
  10501. (assign, ":continue", 0),
  10502. (try_end),
  10503. (eq, ":continue", 1),
  10504. (store_random_in_range, ":speed", 10, 20),
  10505. (agent_set_speed_limit, ":animal_agent_id", ":speed"),
  10506. (agent_set_scripted_destination, ":animal_agent_id", pos2, 1),
  10507. (assign, ":loop_end", -1),
  10508. (else_try),
  10509. (store_random_in_range, ":random", 0, 45),
  10510. (try_begin),
  10511. (lt, ":random_angle", 0),
  10512. (val_mul, ":random", -1),
  10513. (try_end),
  10514. (val_add, ":random_angle", ":random"),
  10515. (try_end),
  10516. (try_end),
  10517. (try_begin),
  10518. (neq, ":loop_end", -1),
  10519. (val_add, ":times_stuck", 1),
  10520. (else_try),
  10521. (assign, ":times_stuck", 0),
  10522. (try_end),
  10523. (agent_set_slot, ":animal_agent_id", slot_agent_animal_times_stuck, ":times_stuck"),
  10524. (try_end),
  10525. ]),
  10526.  
  10527. ("animal_hit", # server: handle animal reactions to being hit by various tools and weapons; the damage result is set for ti_on_agent_hit
  10528. [(store_script_param, ":animal_agent_id", 1), # must be valid
  10529. (store_script_param, ":attacker_agent_id", 2), # must be valid
  10530. (store_script_param, ":damage_dealt", 3),
  10531. (store_script_param, ":weapon_item_id", 4),
  10532.  
  10533. (assign, ":damage_result", ":damage_dealt"),
  10534. (agent_get_troop_id, ":troop_id", ":attacker_agent_id"),
  10535. (store_skill_level, ":herding_skill", "skl_herding", ":troop_id"),
  10536. (try_begin),
  10537. (ge, ":herding_skill", 1),
  10538. (ge, ":weapon_item_id", all_items_begin),
  10539. (item_get_slot, ":item_class", ":weapon_item_id", slot_item_class),
  10540. (try_begin),
  10541. (is_between, ":item_class", item_class_herding_calm, item_class_herding_rouse + 1),
  10542. (assign, ":damage_result", 0),
  10543. (agent_get_position, pos1, ":animal_agent_id"),
  10544. (try_begin), # move the animal in the oppisite direction from the hitting agent, with a random angle variation depending on skill and wildness
  10545. (eq, ":item_class", item_class_herding_rouse),
  10546. (set_fixed_point_multiplier, 100),
  10547. (agent_get_position, pos2, ":attacker_agent_id"),
  10548. (position_transform_position_to_local, pos3, pos2, pos1),
  10549. (position_get_x, ":relative_x", pos3),
  10550. (position_get_y, ":relative_y", pos3),
  10551. (store_atan2, ":angle", ":relative_x", ":relative_y"),
  10552. (convert_from_fixed_point, ":angle"),
  10553. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10554. (item_get_slot, ":wildness", ":animal_item_id", slot_item_animal_wildness),
  10555. (try_begin),
  10556. (gt, ":wildness", 0),
  10557. (store_mul, ":min_angle", ":wildness", -10),
  10558. (store_mul, ":max_angle", ":wildness", 10),
  10559. (store_random_in_range, ":random_angle", ":min_angle", ":max_angle"),
  10560. (val_div, ":random_angle", ":herding_skill"),
  10561. (val_add, ":angle", ":random_angle"),
  10562. (store_div, ":random_scare_limit", 400, ":herding_skill"),
  10563. (val_mul, ":random_scare_limit", ":wildness"),
  10564. (store_random_in_range, ":distance", 0, ":random_scare_limit"),
  10565. (else_try),
  10566. (assign, ":distance", 0),
  10567. (try_end),
  10568. (val_mul, ":angle", -1),
  10569. (position_copy_rotation, pos1, pos2),
  10570. (position_rotate_z, pos1, ":angle"),
  10571. (val_add, ":distance", 500),
  10572. (store_mul, ":damage_component", ":damage_dealt", 10),
  10573. (val_add, ":distance", ":damage_component"),
  10574. (agent_get_action_dir, ":attack_type", ":attacker_agent_id"),
  10575. (try_begin),
  10576. (eq, ":attack_type", 3),
  10577. (val_mul, ":distance", 2),
  10578. (try_end),
  10579. (position_move_y, pos1, ":distance"),
  10580. (store_random_in_range, ":speed", 10, 20),
  10581. (val_add, ":speed", ":herding_skill"),
  10582. (agent_set_speed_limit, ":animal_agent_id", ":speed"),
  10583. (try_end),
  10584. (agent_set_scripted_destination, ":animal_agent_id", pos1, 0),
  10585. (agent_force_rethink, ":animal_agent_id"),
  10586. (agent_set_slot, ":animal_agent_id", slot_agent_horse_last_rider, -1),
  10587. (try_begin),
  10588. (eq, ":item_class", item_class_herding_calm),
  10589. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10590. (call_script, "script_animal_add_to_nearby_herd", ":animal_agent_id", ":herd_manager"),
  10591. (else_try), # more likely with higher herding skill: move some other animals in the herd with the target
  10592. (eq, ":item_class", item_class_herding_rouse),
  10593. (assign, ":found_leader", 0),
  10594. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10595. (try_begin),
  10596. (prop_instance_is_valid, ":herd_manager"),
  10597. (scene_prop_get_slot, ":adult_item_id", ":herd_manager", slot_animal_herd_manager_adult_item_id),
  10598. (ge, ":adult_item_id", all_items_begin),
  10599. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  10600. (try_for_range, ":herd_slot", 0, ":loop_end"),
  10601. (store_random_in_range, ":random_move", ":herding_skill", 21),
  10602. (ge, ":random_move", 10),
  10603. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  10604. (neq, ":herd_agent_id", ":animal_agent_id"),
  10605. (agent_is_active, ":herd_agent_id"),
  10606. (agent_is_alive, ":herd_agent_id"),
  10607. (copy_position, pos4, pos1),
  10608. (store_random_in_range, ":random_angle", 0, 360),
  10609. (position_rotate_z, pos4, ":random_angle"),
  10610. (store_random_in_range, ":random_distance", 100, 1000),
  10611. (position_move_y, pos4, ":random_distance"),
  10612. (agent_set_speed_limit, ":herd_agent_id", ":speed"),
  10613. (agent_set_scripted_destination, ":herd_agent_id", pos4, 0),
  10614. (eq, ":found_leader", 0),
  10615. (assign, ":found_leader", 1),
  10616. (agent_get_slot, ":move_time", ":herd_agent_id", slot_agent_animal_move_time),
  10617. (gt, ":move_time", 0),
  10618. (store_random_in_range, ":extra_time", 10, 21),
  10619. (val_add, ":move_time", ":extra_time"),
  10620. (agent_set_slot, ":herd_agent_id", slot_agent_animal_move_time, ":move_time"),
  10621. (try_end),
  10622. (try_end),
  10623. (try_end),
  10624. (try_end),
  10625. (eq, ":damage_result", 0),
  10626. (else_try),
  10627. (eq, ":weapon_item_id", "itm_wheat_sheaf"),
  10628. (call_script, "script_cf_agent_consume_item", ":attacker_agent_id", ":weapon_item_id", 1),
  10629. (agent_get_slot, ":food", ":animal_agent_id", slot_agent_animal_food),
  10630. (val_add, ":food", 5),
  10631. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10632. (item_get_slot, ":food_capacity", ":animal_item_id", slot_item_animal_meat_count),
  10633. (val_mul, ":food_capacity", 2),
  10634. (val_min, ":food", ":food_capacity"),
  10635. (agent_set_slot, ":animal_agent_id", slot_agent_animal_food, ":food"),
  10636. (assign, ":damage_result", 0),
  10637. (else_try), # if enough damage is dealt with other weapons, check the whole herd for reactions
  10638. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10639. (item_get_slot, ":wildness", ":animal_item_id", slot_item_animal_wildness),
  10640. (store_random_in_range, ":minimum_startle_damage", 1, 10),
  10641. (val_sub, ":minimum_startle_damage", ":wildness"),
  10642. (ge, ":damage_dealt", ":minimum_startle_damage"),
  10643. (call_script, "script_animal_react_to_attack", ":attacker_agent_id", ":animal_agent_id", ":damage_dealt"),
  10644. (agent_get_slot, ":herd_manager", ":animal_agent_id", slot_agent_animal_herd_manager),
  10645. (try_begin),
  10646. (prop_instance_is_valid, ":herd_manager"),
  10647. (assign, ":found_leader", 0),
  10648. (scene_prop_get_slot, ":adult_item_id", ":herd_manager", slot_animal_herd_manager_adult_item_id),
  10649. (ge, ":adult_item_id", all_items_begin),
  10650. (item_get_slot, ":loop_end", ":adult_item_id", slot_item_animal_max_in_herd),
  10651. (try_for_range, ":herd_slot", 0, ":loop_end"),
  10652. (scene_prop_get_slot, ":herd_agent_id", ":herd_manager", ":herd_slot"),
  10653. (agent_is_active, ":herd_agent_id"),
  10654. (agent_is_alive, ":herd_agent_id"),
  10655. (call_script, "script_animal_react_to_attack", ":attacker_agent_id", ":herd_agent_id", ":damage_dealt"),
  10656. (eq, ":found_leader", 0),
  10657. (assign, ":found_leader", 1),
  10658. (agent_get_slot, ":move_time", ":herd_agent_id", slot_agent_animal_move_time),
  10659. (gt, ":move_time", 0),
  10660. (store_random_in_range, ":extra_time", 10, 21),
  10661. (val_add, ":move_time", ":extra_time"),
  10662. (agent_set_slot, ":herd_agent_id", slot_agent_animal_move_time, ":move_time"),
  10663. (try_end),
  10664. (try_end),
  10665. (try_end),
  10666. (set_trigger_result, ":damage_result"),
  10667. ]),
  10668.  
  10669. ("animal_react_to_attack", # server: handle specific animal reactions to being attacked, whether to charge or flee
  10670. [(store_script_param, ":attacker_agent_id", 1), # must be valid
  10671. (store_script_param, ":animal_agent_id", 2), # must be valid
  10672. (store_script_param, ":damage_dealt", 3),
  10673.  
  10674. (agent_get_item_id, ":animal_item_id", ":animal_agent_id"),
  10675. (try_begin),
  10676. (gt, ":animal_item_id", -1),
  10677. (set_fixed_point_multiplier, 100),
  10678. (agent_get_position, pos1, ":animal_agent_id"),
  10679. (agent_get_position, pos2, ":attacker_agent_id"),
  10680. (position_transform_position_to_local, pos3, pos2, pos1),
  10681. (position_normalize_origin, ":distance_to_animal", pos3),
  10682. (lt, ":distance_to_animal", max_distance_to_include_in_herd),
  10683. (item_get_slot, ":reaction", ":animal_item_id", slot_item_animal_attack_reaction),
  10684. (position_get_x, ":relative_x", pos3),
  10685. (position_get_y, ":relative_y", pos3),
  10686. (store_atan2, ":angle", ":relative_x", ":relative_y"),
  10687. (convert_from_fixed_point, ":angle"),
  10688. (val_mul, ":angle", -1),
  10689. (try_begin),
  10690. (eq, ":reaction", animal_reaction_charge),
  10691. (store_random_in_range, ":distance", 500, 700), # move past the targeted agent, so the animal charges through at speed
  10692. (try_begin),
  10693. (lt, ":distance_to_animal", 200),
  10694. (position_copy_rotation, pos1, pos2),
  10695. (else_try),
  10696. (copy_position, pos1, pos2),
  10697. (val_add, ":angle", 180),
  10698. (try_end),
  10699. (position_rotate_z, pos1, ":angle"),
  10700. (assign, ":speed", 100),
  10701. (else_try),
  10702. (eq, ":reaction", animal_reaction_flee),
  10703. (store_random_in_range, ":random_angle", -70, 71),
  10704. (position_copy_rotation, pos1, pos2),
  10705. (val_add, ":angle", ":random_angle"),
  10706. (position_rotate_z, pos1, ":angle"),
  10707. (store_agent_hit_points, ":max_multiplier", ":animal_agent_id", 0),
  10708. (store_sub, ":min_multiplier", ":max_multiplier", 50),
  10709. (assign, ":speed_limit", ":max_multiplier"),
  10710. (val_clamp, ":max_multiplier", 50, 100),
  10711. (val_clamp, ":min_multiplier", 25, 50),
  10712. (val_clamp, ":speed_limit", 25, 100),
  10713. (store_random_in_range, ":random_multiplier", ":min_multiplier", ":max_multiplier"),
  10714. (assign, ":distance", ":damage_dealt"),
  10715. (val_max, ":distance", 10),
  10716. (val_mul, ":distance", ":random_multiplier"),
  10717. (item_get_slot, ":wildness", ":animal_item_id", slot_item_animal_wildness),
  10718. (try_begin),
  10719. (gt, ":wildness", 0),
  10720. (store_mul, ":extra_distance", ":distance", ":wildness"),
  10721. (val_div, ":extra_distance", 10),
  10722. (val_add, ":distance", ":extra_distance"),
  10723. (try_end),
  10724. (val_max, ":wildness", 1),
  10725. (store_random_in_range, ":speed", ":wildness", 10),
  10726. (val_mul, ":speed", ":damage_dealt"),
  10727. (val_max, ":speed", ":speed_limit"),
  10728. (try_end),
  10729. (position_move_y, pos1, ":distance"),
  10730. (agent_set_speed_limit, ":animal_agent_id", ":speed"),
  10731. (agent_set_scripted_destination, ":animal_agent_id", pos1, 1),
  10732. (agent_force_rethink, ":animal_agent_id"),
  10733. (try_end),
  10734. ]),
  10735.  
  10736. ("check_agent_horse_speed_factor", # server: adjust riding speed for water, horse health, and the agent being overloaded by weapons or armor
  10737. [(store_script_param, ":agent_id", 1), # must be valid
  10738. (store_script_param, ":horse_agent_id", 2), # must be valid
  10739. (store_script_param, ":under_water", 3), # 1 if the horse is below water level
  10740.  
  10741. (store_agent_hit_points, ":speed_factor", ":horse_agent_id", 0), # horse speed corresponds to health
  10742. (try_begin), # underwater or attached to a cart, speed is clamped down below 50%
  10743. (agent_get_attached_scene_prop, ":attached_spr", ":horse_agent_id"),
  10744. (this_or_next|ge, ":under_water", 1),
  10745. (neq, ":attached_spr", -1),
  10746. (val_clamp, ":speed_factor", 20, 50),
  10747. (else_try), # otherwise, speed reduction for health is between 100% - 50%
  10748. (val_add, ":speed_factor", 50),
  10749. (val_min, ":speed_factor", 100),
  10750. (try_end),
  10751. (agent_get_slot, ":rider_speed_factor", ":agent_id", slot_agent_armor_speed_factor),
  10752. (agent_get_slot, ":weapon_speed_factor", ":agent_id", slot_agent_weapon_speed_factor),
  10753. (val_add, ":rider_speed_factor", ":weapon_speed_factor"),
  10754. (try_begin), # if the agent is using weapons or armor they don't meet requirements for, reduce the speed further
  10755. (gt, ":rider_speed_factor", 0),
  10756. (store_sub, ":rider_speed_factor", reduction_factor_base, ":rider_speed_factor"),
  10757. (val_div, ":rider_speed_factor", 2),
  10758. (val_min, ":speed_factor", ":rider_speed_factor"),
  10759. (val_max, ":speed_factor", 0),
  10760. (try_end),
  10761. (agent_set_horse_speed_factor, ":agent_id", ":speed_factor"),
  10762. (try_begin), # drop couchable lances if unusable, since the different attack method won't be detected by the normal check
  10763. (agent_slot_eq, ":agent_id", slot_agent_cannot_attack, 1),
  10764. (agent_get_wielded_item, ":item_id", ":agent_id", 0),
  10765. (neq, ":item_id", -1),
  10766. (item_slot_eq, ":item_id", slot_item_couchable, 1),
  10767. (call_script, "script_cf_agent_consume_item", ":agent_id", ":item_id", 1),
  10768. (agent_get_position, pos1, ":agent_id"),
  10769. (set_spawn_position, pos1),
  10770. (spawn_item, ":item_id", 0, "$g_spawn_item_prune_time"),
  10771. (try_end),
  10772. ]),
  10773.  
  10774. ("check_remove_lost_horse", # server: remove horses that have strayed away from their last rider for a long time, to reduce server load
  10775. [(store_script_param, ":horse_agent_id", 1), # must be valid
  10776.  
  10777. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  10778. (try_begin),
  10779. (le, ":horse_item_id", -1),
  10780. (else_try),
  10781. (neg|item_slot_eq, ":horse_item_id", slot_item_animal_adult_item_id, 0),
  10782. (else_try),
  10783. (agent_get_slot, ":last_rider", ":horse_agent_id", slot_agent_horse_last_rider),
  10784. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  10785. (gt, ":rider_agent_id", -1),
  10786. (try_begin),
  10787. (neq, ":last_rider", ":rider_agent_id"),
  10788. (agent_set_slot, ":horse_agent_id", slot_agent_horse_last_rider, ":rider_agent_id"),
  10789. (try_end),
  10790. (call_script, "script_check_agent_horse_speed_factor", ":rider_agent_id", ":horse_agent_id", 0),
  10791. (else_try), # don't remove horses with carts attached
  10792. (agent_get_attached_scene_prop, ":attached_instance_id", ":horse_agent_id"),
  10793. (prop_instance_is_valid, ":attached_instance_id"),
  10794. (else_try),
  10795. (gt, ":last_rider", -1),
  10796. (try_begin),
  10797. (agent_is_active, ":last_rider"),
  10798. (agent_is_alive, ":last_rider"),
  10799. (agent_get_position, pos1, ":last_rider"),
  10800. (agent_get_position, pos2, ":horse_agent_id"),
  10801. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  10802. (le, ":sq_distance", sq(max_distance_horse_rider)),
  10803. (else_try),
  10804. (agent_set_slot, ":horse_agent_id", slot_agent_horse_last_rider, -1),
  10805. (agent_is_in_special_mode, ":horse_agent_id"),
  10806. (agent_clear_scripted_mode, ":horse_agent_id"),
  10807. (agent_force_rethink, ":horse_agent_id"),
  10808. (try_end),
  10809. (else_try), # negative last rider values count up the amount of checks while strayed
  10810. (le, ":last_rider", -20),
  10811. (store_item_value, ":horse_value", ":horse_item_id"),
  10812. (assign, ":kill", 1),
  10813. (try_begin),
  10814. (ge, ":horse_value", 5000),
  10815. (gt, ":last_rider", -60),
  10816. (assign, ":kill", 0),
  10817. (else_try),
  10818. (ge, ":horse_value", 2000),
  10819. (gt, ":last_rider", -40),
  10820. (assign, ":kill", 0),
  10821. (try_end),
  10822. (eq, ":kill", 1),
  10823. (agent_fade_out, ":horse_agent_id"),
  10824. (else_try),
  10825. (val_sub, ":last_rider", 1),
  10826. (agent_set_slot, ":horse_agent_id", slot_agent_horse_last_rider, ":last_rider"),
  10827. (try_end),
  10828. ]),
  10829.  
  10830. ("check_agent_drowning", # server: check whether the agent's mouth is below water level, dealing damage after a length of time
  10831. [(store_script_param, ":agent_id", 1), # must be valid
  10832.  
  10833. (try_begin),
  10834. (agent_is_alive, ":agent_id"),
  10835. (agent_get_troop_id, ":troop_id", ":agent_id"),
  10836. (neq, ":troop_id", "trp_godlike_hero"),
  10837. (agent_get_item_id, ":horse_item_id", ":agent_id"),
  10838. (neq, ":horse_item_id", "itm_admin_horse"),
  10839. (agent_get_position, pos1, ":agent_id"),
  10840. (agent_get_slot, ":drowning_count", ":agent_id", slot_agent_drowning_count),
  10841. (agent_get_horse, ":horse_agent_id", ":agent_id"),
  10842. (assign, ":drown_height", -192),
  10843. (set_fixed_point_multiplier, 100),
  10844. (position_get_z, ":height", pos1),
  10845. (try_begin), # adjust for the angle of a horses's body making the head higher or lower
  10846. (gt, ":horse_item_id", -1),
  10847. (copy_position, pos2, pos1),
  10848. (position_move_y, pos2, 50),
  10849. (position_move_z, pos2, -200, 1),
  10850. (position_set_z_to_ground_level, pos2),
  10851. (position_get_z, ":horse_height", pos2),
  10852. (store_sub, ":horse_height_difference", ":horse_height", ":height"),
  10853. (val_abs, ":horse_height_difference"),
  10854. (lt, ":horse_height_difference", 100),
  10855. (assign, ":height", ":horse_height"),
  10856. (else_try), # if a rider, add the approximate height of the horse
  10857. (gt, ":horse_agent_id", -1),
  10858. (assign, ":drown_height", -275),
  10859. (else_try),
  10860. (agent_get_crouch_mode, ":is_crouched", ":agent_id"),
  10861. (eq, ":is_crouched", 1),
  10862. (assign, ":drown_height", -127),
  10863. (try_end),
  10864. (try_begin),
  10865. (le, ":height", ":drown_height"),
  10866. (assign, ":under_water", 1),
  10867. (agent_get_speed, pos4, ":agent_id"),
  10868. (position_get_y, ":forwards_speed", pos4),
  10869. (val_abs, ":forwards_speed"),
  10870. (val_div, ":forwards_speed", 200),
  10871. (val_add, ":forwards_speed", 1),
  10872. (val_add, ":drowning_count", ":forwards_speed"), # drown more quickly at higher speed
  10873. (agent_set_slot, ":agent_id", slot_agent_drowning_count, ":drowning_count"),
  10874. (store_sub, ":damage", ":drowning_count", 2),
  10875. (agent_get_troop_id, ":troop_id", ":agent_id"),
  10876. (store_skill_level, ":sailing_skill", "skl_sailing", ":troop_id"),
  10877. (val_div, ":sailing_skill", 4),
  10878. (val_sub, ":damage", ":sailing_skill"),
  10879. (try_begin),
  10880. (gt, ":damage", 1),
  10881. (val_mul, ":damage", ":damage"),
  10882. (try_begin),
  10883. (eq, "$g_full_respawn_health", 0),
  10884. (val_mul, ":damage", 2),
  10885. (try_end),
  10886. (store_agent_hit_points, ":original_hit_points", ":agent_id", 1),
  10887. (store_sub, ":hit_points", ":original_hit_points", ":damage"),
  10888. (agent_deliver_damage_to_agent, ":agent_id", ":agent_id", 5),
  10889. (agent_set_hit_points, ":agent_id", ":hit_points", 1),
  10890. (try_begin),
  10891. (gt, ":original_hit_points", 5),
  10892. (try_begin),
  10893. (agent_is_human, ":agent_id"),
  10894. (agent_get_player_id, ":player_id", ":agent_id"),
  10895. (try_begin),
  10896. (player_is_active, ":player_id"),
  10897. (player_get_gender, ":gender", ":player_id"),
  10898. (eq, ":gender", tf_female),
  10899. (agent_play_sound, ":agent_id", "snd_woman_drown"),
  10900. (else_try),
  10901. (agent_play_sound, ":agent_id", "snd_man_drown"),
  10902. (try_end),
  10903. (else_try),
  10904. (item_slot_eq, ":horse_item_id", slot_item_animal_adult_item_id, 0),
  10905. (agent_play_sound, ":agent_id", "snd_horse_low_whinny"),
  10906. (try_end),
  10907. (try_end),
  10908. (try_end),
  10909. (else_try),
  10910. (assign, ":under_water", 0),
  10911. (gt, ":drowning_count", 0),
  10912. (agent_set_slot, ":agent_id", slot_agent_drowning_count, 0),
  10913. (try_begin),
  10914. (agent_is_human, ":agent_id"),
  10915. (agent_play_sound, ":agent_id", "snd_man_cough"),
  10916. (else_try),
  10917. (agent_play_sound, ":agent_id", "snd_horse_snort"),
  10918. (try_end),
  10919. (try_end),
  10920. (try_begin),
  10921. (neq, ":horse_agent_id", -1),
  10922. (call_script, "script_check_agent_horse_speed_factor", ":agent_id", ":horse_agent_id", ":under_water"),
  10923. (try_end),
  10924. (try_end),
  10925. ]),
  10926.  
  10927. ("setup_ship", # server: spawn the necessary parts for a ship at mission start
  10928. [(store_script_param, ":hull_instance_id", 1), # must be valid
  10929.  
  10930. (troop_get_slot, ":ship_array_count", "trp_ship_array", 0),
  10931. (val_add, ":ship_array_count", 1),
  10932. (troop_set_slot, "trp_ship_array", ":ship_array_count", ":hull_instance_id"),
  10933. (troop_set_slot, "trp_ship_array", 0, ":ship_array_count"),
  10934. (try_begin),
  10935. (multiplayer_is_server),
  10936. (neq, "$g_edit_scene", 1),
  10937. (store_script_param, ":sail_scene_prop_id", 2),
  10938. (store_script_param, ":sail_off_scene_prop_id", 3),
  10939. (store_script_param, ":ramp_scene_prop_id", 4),
  10940. (store_script_param, ":hold_scene_prop_id", 5),
  10941. (prop_instance_get_position, pos1, ":hull_instance_id"),
  10942. (try_begin),
  10943. (gt, ":sail_scene_prop_id", -1),
  10944. (copy_position, pos2, pos1),
  10945. (position_set_z, pos2, z_position_to_hide_object),
  10946. (set_spawn_position, pos2),
  10947. (spawn_scene_prop, ":sail_scene_prop_id"),
  10948. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail, reg0),
  10949. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  10950. (else_try),
  10951. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail, -1),
  10952. (try_end),
  10953. (try_begin),
  10954. (gt, ":sail_off_scene_prop_id", -1),
  10955. (set_spawn_position, pos1),
  10956. (spawn_scene_prop, ":sail_off_scene_prop_id"),
  10957. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail_off, reg0),
  10958. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  10959. (else_try),
  10960. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_sail_off, -1),
  10961. (try_end),
  10962. (try_begin),
  10963. (gt, ":ramp_scene_prop_id", -1),
  10964. (prop_instance_get_variation_id, ":ramp_start_position", ":hull_instance_id"),
  10965. (try_begin),
  10966. (gt, ":ramp_start_position", 1),
  10967. (assign, ":ramp_start_position", -1),
  10968. (try_end),
  10969. (call_script, "script_ship_get_ramp_relative_position", ":ramp_start_position", 1),
  10970. (position_transform_position_to_parent, pos2, pos1, pos30),
  10971. (set_spawn_position, pos2),
  10972. (spawn_scene_prop, ":ramp_scene_prop_id"),
  10973. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_ramp, reg0),
  10974. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  10975. (scene_prop_set_slot, reg0, slot_scene_prop_position, ":ramp_start_position"),
  10976. (else_try),
  10977. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_ramp, -1),
  10978. (try_end),
  10979. (try_begin),
  10980. (gt, ":hold_scene_prop_id", -1),
  10981. (set_spawn_position, pos1),
  10982. (spawn_scene_prop, ":hold_scene_prop_id"),
  10983. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_hold, reg0),
  10984. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":hull_instance_id"),
  10985. (else_try),
  10986. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_linked_hold, -1),
  10987. (try_end),
  10988. (scene_prop_get_slot, ":cd_scene_prop_id", ":hull_instance_id", slot_scene_prop_collision_kind),
  10989. (try_begin),
  10990. (gt, ":cd_scene_prop_id", -1),
  10991. (scene_prop_get_num_instances, ":num_instances", ":cd_scene_prop_id"),
  10992. (lt, ":num_instances", 2),
  10993. (init_position, pos1),
  10994. (position_set_z, pos1, z_position_to_hide_object),
  10995. (set_spawn_position, pos1),
  10996. (spawn_scene_prop, ":cd_scene_prop_id"),
  10997. (spawn_scene_prop, ":cd_scene_prop_id"),
  10998. (try_end),
  10999. (try_end),
  11000. ]),
  11001.  
  11002. ("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_
  11003. [(store_script_param, ":agent_id", 1), # must be valid
  11004. (store_script_param, ":instance_id", 2), # must be valid
  11005.  
  11006. (assign, ":station", ship_station_not_on_ship),
  11007. (try_begin),
  11008. (agent_is_active, ":agent_id"),
  11009. (agent_is_alive, ":agent_id"),
  11010. (scene_prop_has_agent_on_it, ":instance_id", ":agent_id"),
  11011. (assign, ":station", ship_station_none),
  11012. (prop_instance_get_position, pos1, ":instance_id"),
  11013. (agent_get_position, pos20, ":agent_id"),
  11014. (position_transform_position_to_local, pos21, pos1, pos20),
  11015. (set_fixed_point_multiplier, 100),
  11016. (position_get_x, ":x_pos", pos21),
  11017. (position_get_y, ":y_pos", pos21),
  11018. (position_get_z, ":z_pos", pos21),
  11019. (is_between, ":y_pos", -150, 150),
  11020. (try_begin),
  11021. (is_between, ":x_pos", -50, 250),
  11022. (assign, ":station", ship_station_mast),
  11023. (else_try),
  11024. (scene_prop_get_slot, ":hull_length", ":instance_id", slot_scene_prop_length),
  11025. (val_mul, ":hull_length", -1),
  11026. (lt, ":x_pos", ":hull_length"),
  11027. (lt, ":z_pos", 500),
  11028. (assign, ":station", ship_station_rudder),
  11029. (try_end),
  11030. (try_end),
  11031. (assign, reg0, ":station"),
  11032. ]),
  11033.  
  11034. ("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
  11035. [(store_script_param, ":ramp_target", 1), # 0 = middle, -1 = left, 1 = right
  11036. (store_script_param, ":match_ground", 2), # 1 = try to angle the ramp down so the end meets ground level
  11037.  
  11038. (init_position, pos30),
  11039. (try_begin),
  11040. (position_move_x, pos30, 200),
  11041. (try_begin),
  11042. (eq, ":ramp_target", 0),
  11043. (position_move_z, pos30, 220),
  11044. (position_rotate_y, pos30, -3),
  11045. (else_try),
  11046. (position_move_z, pos30, 305),
  11047. (copy_position, pos31, pos30),
  11048. (try_begin),
  11049. (gt, ":ramp_target", 0),
  11050. (position_move_y, pos30, 500),
  11051. (position_move_y, pos31, 1250),
  11052. (position_rotate_z, pos30, 90),
  11053. (else_try),
  11054. (position_move_y, pos30, -500),
  11055. (position_move_y, pos31, -1250),
  11056. (position_rotate_z, pos30, -90),
  11057. (try_end),
  11058. (try_begin),
  11059. (eq, ":match_ground", 1),
  11060. (position_transform_position_to_parent, pos32, pos1, pos31),
  11061. (position_move_z, pos32, 500),
  11062. (set_fixed_point_multiplier, 100),
  11063. (position_get_distance_to_ground_level, ":ground_clearance", pos32),
  11064. (val_sub, ":ground_clearance", 500),
  11065. (lt, ":ground_clearance", 750),
  11066. (assign, ":clearance_ramp", ":ground_clearance"),
  11067. (val_abs, ":clearance_ramp"),
  11068. (convert_to_fixed_point, ":clearance_ramp"),
  11069. (val_div, ":clearance_ramp", 750),
  11070. (store_asin, ":ramp_angle", ":clearance_ramp"),
  11071. (convert_from_fixed_point, ":ramp_angle"),
  11072. (val_min, ":ramp_angle", 50),
  11073. (try_begin),
  11074. (lt, ":ground_clearance", 0),
  11075. (val_mul, ":ramp_angle", -1),
  11076. (try_end),
  11077. (position_rotate_y, pos30, ":ramp_angle"),
  11078. (try_end),
  11079. (try_end),
  11080. (try_end),
  11081. ]),
  11082.  
  11083. ("use_ship_ramp", # server: move a ship's ramp to a different position, based on the relative position of the agent to the ramp
  11084. [(store_script_param, ":agent_id", 1), # must be valid
  11085. (store_script_param, ":instance_id", 2), # must be valid
  11086.  
  11087. (prop_instance_get_position, pos1, ":instance_id"),
  11088. (agent_get_position, pos2, ":agent_id"),
  11089. (scene_prop_get_slot, ":hull_instance_id", ":instance_id", slot_scene_prop_linked_scene_prop),
  11090. (scene_prop_get_slot, ":ramp_position", ":instance_id", slot_scene_prop_target_position),
  11091. (assign, ":ramp_target", ":ramp_position"),
  11092. (try_begin),
  11093. (eq, ":ramp_position", 0),
  11094. (position_transform_position_to_local, pos3, pos1, pos2),
  11095. (position_get_y, ":y_pos", pos3),
  11096. (try_begin),
  11097. (lt, ":y_pos", 0),
  11098. (assign, ":ramp_target", 1),
  11099. (else_try),
  11100. (assign, ":ramp_target", -1),
  11101. (try_end),
  11102. (else_try), # don't allow agents off the ship to withdraw the ramp
  11103. (scene_prop_has_agent_on_it, ":hull_instance_id", ":agent_id"),
  11104. (assign, ":ramp_target", 0),
  11105. (try_end),
  11106. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, ":ramp_target"),
  11107. ]),
  11108.  
  11109. ("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
  11110. [(store_script_param, ":agent_id", 1), # must be valid
  11111. (store_script_param, ":instance_id", 2), # must be valid
  11112.  
  11113. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  11114. (set_fixed_point_multiplier, 100),
  11115. (prop_instance_get_position, pos1, ":instance_id"),
  11116. (agent_get_position, pos2, ":agent_id"),
  11117. (position_transform_position_to_local, pos3, pos1, pos2),
  11118. (position_get_x, ":relative_x", pos3),
  11119. (scene_prop_get_slot, ":hull_length", ":instance_id", slot_scene_prop_length),
  11120. (store_mul, ":neg_hull_length", ":hull_length", -1),
  11121. (is_between, ":relative_x", ":neg_hull_length", ":hull_length"),
  11122. (position_get_y, ":relative_y", pos3),
  11123. (scene_prop_get_slot, ":hull_width", ":instance_id", slot_scene_prop_width),
  11124. (store_mul, ":neg_hull_width", ":hull_width", -1),
  11125. (neg|is_between, ":relative_y", ":neg_hull_width", ":hull_width"),
  11126. (store_add, ":climb_width", ":hull_width", 300),
  11127. (store_mul, ":neg_climb_width", ":climb_width", -1),
  11128. (is_between, ":relative_y", ":neg_climb_width", ":climb_width"),
  11129. (try_begin),
  11130. (multiplayer_is_server),
  11131. (try_begin),
  11132. (gt, ":relative_y", 0),
  11133. (position_set_y, pos3, ":hull_width"),
  11134. (else_try),
  11135. (position_set_y, pos3, ":neg_hull_width"),
  11136. (try_end),
  11137. (position_set_z, pos3, 300),
  11138. (position_transform_position_to_parent, pos4, pos1, pos3),
  11139. (agent_set_position, ":agent_id", pos4),
  11140. (try_end),
  11141. ]),
  11142.  
  11143. ("cf_client_check_control_ship", # clients: check for keys pressed when at the correct areas of a ship, sending the commands to the server
  11144. [
  11145. (multiplayer_get_my_player, ":my_player_id"),
  11146. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  11147. (agent_is_active, ":my_agent_id"),
  11148. (agent_is_alive, ":my_agent_id"),
  11149. (troop_get_slot, ":ship_array_count", "trp_ship_array", 0),
  11150. (store_add, ":ship_array_end", ":ship_array_count", 1),
  11151. (assign, ":climb_instance_id", -1),
  11152. (try_for_range, ":ship_no", 1, ":ship_array_end"),
  11153. (troop_get_slot, ":hull_instance_id", "trp_ship_array", ":ship_no"),
  11154. (call_script, "script_agent_get_ship_station", ":my_agent_id", ":hull_instance_id"),
  11155. (try_begin),
  11156. (eq, reg0, ship_station_not_on_ship),
  11157. (key_clicked, key_up),
  11158. (call_script, "script_cf_check_ship_climb_side", ":my_agent_id", ":hull_instance_id"),
  11159. (assign, ":climb_instance_id", ":hull_instance_id"),
  11160. (try_end),
  11161. (gt, reg0, ship_station_not_on_ship),
  11162. (assign, ":station", reg0),
  11163. (assign, ":forwards", 0),
  11164. (assign, ":rotation", 0),
  11165. (assign, ":fail", 0),
  11166. (try_begin),
  11167. (eq, ":station", ship_station_mast),
  11168. (try_begin),
  11169. (key_clicked, key_up),
  11170. (assign, ":forwards", 1),
  11171. (else_try),
  11172. (key_clicked, key_down),
  11173. (assign, ":forwards", -1),
  11174. (try_end),
  11175. (else_try),
  11176. (eq, ":station", ship_station_rudder),
  11177. (try_begin),
  11178. (key_clicked, key_left),
  11179. (assign, ":rotation", 1),
  11180. (else_try),
  11181. (key_clicked, key_right),
  11182. (assign, ":rotation", -1),
  11183. (try_end),
  11184. (else_try),
  11185. (assign, ":fail", 1),
  11186. (call_script, "script_preset_message", "str_not_at_mast_or_rudder", preset_message_error, 0, 0),
  11187. (try_end),
  11188. (eq, ":fail", 0),
  11189. (multiplayer_send_3_int_to_server, client_event_control_scene_prop, ":hull_instance_id", ":forwards", ":rotation"),
  11190. (assign, ":ship_array_end", -1),
  11191. (try_end),
  11192. (try_begin),
  11193. (neq, ":ship_array_end", -1),
  11194. (neq, ":climb_instance_id", -1),
  11195. (multiplayer_send_2_int_to_server, client_event_control_scene_prop, ":climb_instance_id", 1),
  11196. (try_end),
  11197. (eq, ":ship_array_end", -1),
  11198. ]),
  11199.  
  11200. ("cf_control_ship", # server: handle player requests to control a ship
  11201. [(store_script_param, ":player_id", 1),
  11202. (store_script_param, ":instance_id", 2), # must be valid
  11203. (store_script_param, ":forwards", 3),
  11204. (store_script_param, ":rotation", 4),
  11205.  
  11206. (val_clamp, ":forwards", -1, 2),
  11207. (val_clamp, ":rotation", -1, 2),
  11208. (player_is_active, ":player_id"),
  11209. (player_get_agent_id, ":agent_id", ":player_id"),
  11210. (agent_is_alive, ":agent_id"),
  11211. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  11212. (try_begin),
  11213. (call_script, "script_agent_get_ship_station", ":agent_id", ":instance_id"),
  11214. (try_begin),
  11215. (eq, reg0, ship_station_not_on_ship),
  11216. (eq, ":forwards", 1),
  11217. (call_script, "script_cf_check_ship_climb_side", ":agent_id", ":instance_id"),
  11218. (try_end),
  11219. (gt, reg0, ship_station_not_on_ship),
  11220. (assign, ":station", reg0),
  11221. (try_begin),
  11222. (eq, ":station", ship_station_mast),
  11223. (try_begin),
  11224. (neq, ":forwards", 0),
  11225. (scene_prop_get_slot, ":current_forwards", ":instance_id", slot_scene_prop_target_position),
  11226. (val_add, ":current_forwards", ":forwards"),
  11227. (scene_prop_get_slot, ":speed_limit", ":instance_id", slot_scene_prop_speed_limit),
  11228. (val_clamp, ":current_forwards", -1, ":speed_limit"),
  11229. (agent_get_troop_id, ":troop_id", ":agent_id"),
  11230. (store_skill_level, ":sailing_skill", "skl_sailing", ":troop_id"),
  11231. (val_max, ":sailing_skill", 1),
  11232. (ge, ":sailing_skill", ":current_forwards"),
  11233. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, ":current_forwards"),
  11234. (try_end),
  11235. (else_try),
  11236. (eq, ":station", ship_station_rudder),
  11237. (scene_prop_set_slot, ":instance_id", slot_scene_prop_controlling_agent, ":agent_id"),
  11238. (try_begin),
  11239. (eq, ":rotation", 0),
  11240. (eq, ":forwards", 0),
  11241. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_rotation, 0),
  11242. (else_try),
  11243. (scene_prop_get_slot, ":current_rotation", ":instance_id", slot_scene_prop_target_rotation),
  11244. (val_add, ":current_rotation", ":rotation"),
  11245. (val_clamp, ":current_rotation", -ship_rotation_maximum, ship_rotation_maximum + 1),
  11246. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_rotation, ":current_rotation"),
  11247. (try_end),
  11248. (try_end),
  11249. (try_end),
  11250. (gt, reg0, ship_station_not_on_ship),
  11251. ]),
  11252.  
  11253. ("move_ship", # server: animate movement of all ship parts together, also handling collision detection
  11254. [(store_script_param, ":hull_instance_id", 1), # must be valid
  11255.  
  11256. (scene_prop_get_slot, ":ramp_instance_id", ":hull_instance_id", slot_scene_prop_linked_ramp),
  11257. (scene_prop_get_slot, ":forwards", ":hull_instance_id", slot_scene_prop_position),
  11258. (scene_prop_get_slot, ":target_forwards", ":hull_instance_id", slot_scene_prop_target_position),
  11259. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_position, ":target_forwards"),
  11260. (try_begin),
  11261. (neq, ":forwards", 0), # ship is moving
  11262. (set_fixed_point_multiplier, 100),
  11263. (prop_instance_get_position, pos1, ":hull_instance_id"),
  11264. (assign, ":crashed", 0),
  11265. (scene_prop_get_slot, ":cd_scene_prop_id", ":hull_instance_id", slot_scene_prop_collision_kind),
  11266. (scene_prop_get_instance, ":cd_instance_id", ":cd_scene_prop_id", 0),
  11267. (prop_instance_set_position, ":cd_instance_id", pos1, 1),
  11268. (init_position, pos4),
  11269. (position_set_z, pos4, z_position_to_hide_object),
  11270. (troop_get_slot, ":ship_array_end", "trp_ship_array", 0),
  11271. (val_add, ":ship_array_end", 1),
  11272. (try_for_range, ":ship_array_slot", 1, ":ship_array_end"), # check collision with other ships
  11273. (troop_get_slot, ":other_hull_instance_id", "trp_ship_array", ":ship_array_slot"),
  11274. (neq, ":other_hull_instance_id", ":hull_instance_id"),
  11275. (scene_prop_get_slot, ":other_forwards", ":other_hull_instance_id", slot_scene_prop_position),
  11276. (assign, ":continue", 1),
  11277. (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)
  11278. (eq, ":other_forwards", 0),
  11279. (else_try),
  11280. (gt, ":ship_array_slot", "$g_loop_ship_to_check"),
  11281. (else_try),
  11282. (assign, ":continue", 0),
  11283. (try_end),
  11284. (eq, ":continue", 1),
  11285. (scene_prop_get_slot, ":other_cd_scene_prop_id", ":other_hull_instance_id", slot_scene_prop_collision_kind),
  11286. (scene_prop_get_instance, ":other_cd_instance_id", ":other_cd_scene_prop_id", 1), # use primitive collision detecting meshes
  11287. (prop_instance_get_position, pos2, ":other_hull_instance_id"),
  11288. (prop_instance_set_position, ":other_cd_instance_id", pos2, 1),
  11289. (try_begin),
  11290. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":other_cd_instance_id"),
  11291. (copy_position, pos2, pos1),
  11292. (scene_prop_get_slot, ":speed_limit", ":hull_instance_id", slot_scene_prop_speed_limit),
  11293. (store_mul, ":max_distance", ":speed_limit", ship_forwards_multiplier),
  11294. (try_begin),
  11295. (le, ":forwards", -1),
  11296. (val_mul, ":max_distance", -1),
  11297. (try_end),
  11298. (position_move_x, pos2, ":max_distance"),
  11299. (prop_instance_set_position, ":cd_instance_id", pos2, 1),
  11300. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":other_cd_instance_id"),
  11301. (assign, ":crashed", 1),
  11302. (assign, ":ship_array_end", -1),
  11303. (try_end),
  11304. (prop_instance_set_position, ":other_cd_instance_id", pos4, 1),
  11305. (try_end),
  11306. (try_begin),
  11307. (eq, ":crashed", 0),
  11308. (troop_get_slot, ":collision_props_count", "trp_ship_array", slot_ship_array_collision_props_count),
  11309. (store_add, ":collision_props_end", slot_ship_array_collision_props_begin, ":collision_props_count"),
  11310. (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
  11311. (troop_get_slot, ":collision_instance_id", "trp_ship_array", ":collision_prop_slot"),
  11312. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":collision_instance_id"),
  11313. (copy_position, pos2, pos1),
  11314. (scene_prop_get_slot, ":speed_limit", ":hull_instance_id", slot_scene_prop_speed_limit),
  11315. (store_mul, ":max_distance", ":speed_limit", ship_forwards_multiplier),
  11316. (try_begin),
  11317. (le, ":forwards", -1),
  11318. (val_mul, ":max_distance", -1),
  11319. (try_end),
  11320. (position_move_x, pos2, ":max_distance"),
  11321. (prop_instance_set_position, ":cd_instance_id", pos2, 1),
  11322. (prop_instance_intersects_with_prop_instance, ":cd_instance_id", ":collision_instance_id"),
  11323. (assign, ":crashed", 1),
  11324. (assign, ":collision_props_end", -1),
  11325. (try_end),
  11326. (try_end),
  11327. (prop_instance_set_position, ":cd_instance_id", pos4, 1),
  11328. (scene_prop_get_slot, ":ship_length", ":hull_instance_id", slot_scene_prop_length),
  11329. (init_position, pos4),
  11330. (try_begin),
  11331. (gt, ":forwards", 0),
  11332. (position_move_x, pos4, ":ship_length"),
  11333. (else_try),
  11334. (val_mul, ":ship_length", -1),
  11335. (position_move_x, pos4, ":ship_length"),
  11336. (try_end),
  11337. (position_transform_position_to_parent, pos5, pos1, pos4),
  11338. (try_begin), # check collision with the terrain
  11339. (eq, ":crashed", 0),
  11340. (copy_position, pos6, pos5),
  11341. (position_get_distance_to_terrain, ":ground_clearance", pos6),
  11342. (scene_prop_get_slot, ":hull_clearance", ":hull_instance_id", slot_scene_prop_height),
  11343. (gt, ":ground_clearance", ":hull_clearance"),
  11344. (else_try),
  11345. (assign, ":crashed", 1),
  11346. (gt, ":forwards", 1), # don't apply any terrain collision damage at the slowest speed
  11347. (copy_position, pos3, pos1),
  11348. (copy_position, pos1, pos5),
  11349. (store_sub, ":damage", ":forwards", 1),
  11350. (val_mul, ":damage", ":damage"),
  11351. (val_mul, ":damage", 100),
  11352. (try_begin),
  11353. (call_script, "script_cf_damage_ship", ":hull_instance_id", ":damage", 0, 1),
  11354. (eq, ":ship_array_end", -1),
  11355. (call_script, "script_cf_damage_ship", ":other_hull_instance_id", ":damage", 0, 1),
  11356. (try_end),
  11357. (copy_position, pos1, pos3),
  11358. (try_end),
  11359. (try_begin),
  11360. (eq, ":crashed", 0), # stop without damage at the scene boundaries
  11361. (get_scene_boundaries, pos7, pos8),
  11362. (position_get_x, ":hull_end_x", pos5),
  11363. (position_get_x, ":scene_min_x", pos7),
  11364. (gt, ":hull_end_x", ":scene_min_x"),
  11365. (position_get_y, ":hull_end_y", pos5),
  11366. (position_get_y, ":scene_min_y", pos7),
  11367. (gt, ":hull_end_y", ":scene_min_y"),
  11368. (position_get_x, ":scene_max_x", pos8),
  11369. (lt, ":hull_end_x", ":scene_max_x"),
  11370. (position_get_y, ":scene_max_y", pos8),
  11371. (lt, ":hull_end_y", ":scene_max_y"),
  11372. (else_try),
  11373. (assign, ":crashed", 1),
  11374. (try_end),
  11375. (try_begin),
  11376. (eq, ":crashed", 1),
  11377. (assign, ":target_forwards", 0),
  11378. (assign, ":forwards", 0),
  11379. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_position, 0),
  11380. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_position, 0),
  11381. (copy_position, pos3, pos1),
  11382. (else_try),
  11383. (init_position, pos2),
  11384. (store_mul, ":distance", ":forwards", ship_forwards_multiplier),
  11385. (position_move_x, pos2, ":distance"),
  11386. (scene_prop_get_slot, ":rotation", ":hull_instance_id", slot_scene_prop_target_rotation),
  11387. (try_begin),
  11388. (neq, ":rotation", 0),
  11389. (scene_prop_get_slot, ":agent_id", ":hull_instance_id", slot_scene_prop_controlling_agent),
  11390. (call_script, "script_agent_get_ship_station", ":agent_id", ":hull_instance_id"),
  11391. (try_begin), # only keep the rudder setting while the steering agent stays there
  11392. (neq, reg0, ship_station_rudder),
  11393. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_rotation, 0),
  11394. (try_end),
  11395. (eq, reg0, ship_station_rudder),
  11396. (assign, ":forwards_multiplier", ":forwards"),
  11397. (val_abs, ":forwards_multiplier"),
  11398. (store_mul, ":move_sideways", ":rotation", ":forwards_multiplier"),
  11399. (position_move_y, pos2, ":move_sideways"),
  11400. (store_mul, ":fore_side_ratio", ":move_sideways", ship_rotation_multiplier),
  11401. (convert_to_fixed_point, ":fore_side_ratio"),
  11402. (val_div, ":fore_side_ratio", ":distance"),
  11403. (val_abs, ":fore_side_ratio"),
  11404. (store_atan, ":rotate_angle", ":fore_side_ratio"),
  11405. (convert_from_fixed_point, ":rotate_angle"),
  11406. (try_begin), # the rotation was converted to positive for the trigonometry calculations, convert it back if necessary
  11407. (this_or_next|is_between, 0, ":rotation", ":forwards"),
  11408. (is_between, 0, ":forwards", ":rotation"),
  11409. (val_mul, ":rotate_angle", -1),
  11410. (try_end),
  11411. (position_rotate_z, pos2, ":rotate_angle"),
  11412. (try_end),
  11413. (position_transform_position_to_parent, pos3, pos1, pos2),
  11414. (prop_instance_animate_to_position, ":hull_instance_id", pos3, 100),
  11415. (scene_prop_get_slot, ":hold_instance_id", ":hull_instance_id", slot_scene_prop_linked_hold),
  11416. (try_begin),
  11417. (neq, ":hold_instance_id", -1),
  11418. (prop_instance_animate_to_position, ":hold_instance_id", pos3, 100),
  11419. (try_end),
  11420. (try_end),
  11421. (try_begin),
  11422. (gt, ":target_forwards", 0),
  11423. (scene_prop_get_slot, ":active_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail),
  11424. (scene_prop_get_slot, ":inactive_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail_off),
  11425. (else_try),
  11426. (scene_prop_get_slot, ":active_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail_off),
  11427. (scene_prop_get_slot, ":inactive_sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail),
  11428. (try_end),
  11429. (try_begin),
  11430. (neq, ":active_sail_instance_id", -1),
  11431. (prop_instance_set_position, ":active_sail_instance_id", pos1),
  11432. (eq, ":crashed", 0),
  11433. (prop_instance_enable_physics, ":active_sail_instance_id", 1),
  11434. (prop_instance_animate_to_position, ":active_sail_instance_id", pos3, 100),
  11435. (try_end),
  11436. (try_begin),
  11437. (neq, ":inactive_sail_instance_id", -1),
  11438. (neg|scene_prop_slot_eq, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  11439. (init_position, pos4),
  11440. (position_set_z, pos4, z_position_to_hide_object),
  11441. (prop_instance_stop_animating, ":inactive_sail_instance_id"),
  11442. (prop_instance_set_position, ":inactive_sail_instance_id", pos4),
  11443. (prop_instance_enable_physics, ":inactive_sail_instance_id", 0),
  11444. (try_end),
  11445. (try_end),
  11446. (try_begin), # animate the ramp if necessary, even if the ship is not moving
  11447. (neq, ":ramp_instance_id", -1),
  11448. (scene_prop_get_slot, ":ramp_target", ":ramp_instance_id", slot_scene_prop_target_position),
  11449. (assign, ":continue", 1),
  11450. (try_begin),
  11451. (neq, ":forwards", 0),
  11452. (assign, ":match_ground", 0),
  11453. (else_try),
  11454. (scene_prop_get_slot, ":ramp_position", ":ramp_instance_id", slot_scene_prop_position),
  11455. (neq, ":ramp_position", ":ramp_target"),
  11456. (prop_instance_get_position, pos3, ":hull_instance_id"),
  11457. (assign, ":match_ground", 1),
  11458. (else_try),
  11459. (assign, ":continue", 0),
  11460. (try_end),
  11461. (eq, ":continue", 1),
  11462. (call_script, "script_ship_get_ramp_relative_position", ":ramp_target", ":match_ground"),
  11463. (position_transform_position_to_parent, pos5, pos3, pos30),
  11464. (prop_instance_animate_to_position, ":ramp_instance_id", pos5, 100),
  11465. (scene_prop_set_slot, ":ramp_instance_id", slot_scene_prop_position, ":ramp_target"),
  11466. (try_end),
  11467. ]),
  11468.  
  11469. ("animate_ship_parts", # server: animate the ship parts together to pos20
  11470. [(store_script_param, ":instance_id", 1), # must be valid
  11471. (store_script_param, ":animation_time", 2),
  11472.  
  11473. (set_fixed_point_multiplier, 100),
  11474. (prop_instance_get_position, pos22, ":instance_id"),
  11475. (prop_instance_animate_to_position, ":instance_id", pos20, ":animation_time"),
  11476. (copy_position, pos21, pos20),
  11477. (position_set_z, pos21, z_position_to_hide_object),
  11478. (scene_prop_get_slot, ":sail_instance_id", ":instance_id", slot_scene_prop_linked_sail),
  11479. (try_begin),
  11480. (neq, ":sail_instance_id", -1),
  11481. (prop_instance_enable_physics, ":sail_instance_id", 0),
  11482. (prop_instance_stop_animating, ":sail_instance_id"),
  11483. (prop_instance_animate_to_position, ":sail_instance_id", pos21, ":animation_time"),
  11484. (try_end),
  11485. (scene_prop_get_slot, ":sail_off_instance_id", ":instance_id", slot_scene_prop_linked_sail_off),
  11486. (try_begin),
  11487. (neq, ":sail_off_instance_id", -1),
  11488. (prop_instance_stop_animating, ":sail_off_instance_id"),
  11489. (prop_instance_set_position, ":sail_off_instance_id", pos22),
  11490. (prop_instance_enable_physics, ":sail_off_instance_id", 1),
  11491. (prop_instance_animate_to_position, ":sail_off_instance_id", pos20, ":animation_time"),
  11492. (try_end),
  11493. (scene_prop_get_slot, ":ramp_instance_id", ":instance_id", slot_scene_prop_linked_ramp),
  11494. (try_begin),
  11495. (neq, ":ramp_instance_id", -1),
  11496. (prop_instance_animate_to_position, ":ramp_instance_id", pos20, ":animation_time"),
  11497. (try_end),
  11498. (scene_prop_get_slot, ":hold_instance_id", ":instance_id", slot_scene_prop_linked_hold),
  11499. (try_begin),
  11500. (neq, ":hold_instance_id", -1),
  11501. (prop_instance_animate_to_position, ":hold_instance_id", pos20, ":animation_time"),
  11502. (try_end),
  11503. ]),
  11504.  
  11505. ("cf_damage_ship", # server: apply damage or repairs to the ship, whether from an agent or from crashing
  11506. [(multiplayer_is_server),
  11507. (store_script_param, ":instance_id", 1), # must be valid
  11508. (store_script_param, ":hit_damage", 2),
  11509. (store_script_param, ":full_hit_points", 3),
  11510. (store_script_param, ":script_damage", 4), # 0 = called from ti_on_scene_prop_hit, 1 = apply the damage manually
  11511.  
  11512. (try_begin),
  11513. (eq, ":script_damage", 1),
  11514. (assign, ":agent_id", -1),
  11515. (else_try),
  11516. (set_fixed_point_multiplier, 1),
  11517. (position_get_x, ":agent_id", pos2), # expects agent id in pos2.x from ti_on_scene_prop_hit
  11518. (try_end),
  11519. (set_fixed_point_multiplier, 100),
  11520. (call_script, "script_cf_hit_repairable_scene_prop", ":instance_id", ":hit_damage", ":full_hit_points", item_class_wood, ":agent_id", 1, ":script_damage"),
  11521. (assign, ":result", reg0),
  11522. (assign, ":hit_points", reg1),
  11523. (try_begin),
  11524. (eq, ":result", repairable_hit),
  11525. (try_begin),
  11526. (eq, ":script_damage", 1),
  11527. (particle_system_burst, "psys_dummy_smoke_big", pos1, 2),
  11528. (particle_system_burst, "psys_dummy_straw_big", pos1, 2),
  11529. (copy_position, pos0, pos1),
  11530. (call_script, "script_play_sound_at_position", "snd_damage_ship"),
  11531. (else_try),
  11532. (particle_system_burst, "psys_dummy_straw", pos1, 10),
  11533. (call_script, "script_hit_scene_prop_play_sound", ":agent_id", ":instance_id", "snd_cut_wood"),
  11534. (try_end),
  11535. (else_try),
  11536. (eq, ":result", repairable_destroyed),
  11537. (prop_instance_get_position, pos20, ":instance_id"),
  11538. (position_get_distance_to_ground_level, ":sinking_time", pos20),
  11539. (position_set_z_to_ground_level, pos20),
  11540. (position_rotate_x, pos20, 40),
  11541. (val_mul, ":sinking_time", 2),
  11542. (call_script, "script_animate_ship_parts", ":instance_id", ":sinking_time"),
  11543. (store_mission_timer_a, ":time"),
  11544. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  11545. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state_time, ":time"),
  11546. (scene_prop_set_slot, ":instance_id", slot_scene_prop_position, 0),
  11547. (scene_prop_set_slot, ":instance_id", slot_scene_prop_target_position, 0),
  11548. (call_script, "script_scene_prop_play_sound", ":instance_id", "snd_cut_wood_break"),
  11549. (else_try),
  11550. (eq, ":result", repairable_repairing),
  11551. (agent_play_sound, ":agent_id", "snd_repair_wood"),
  11552. (try_begin),
  11553. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  11554. (gt, ":hit_points", 1000), # raise a sunken ship when repaired to over 1000 hit points, to then be used or further repaired
  11555. (scene_prop_set_slot, ":instance_id", slot_scene_prop_state, scene_prop_state_regenerating),
  11556. (prop_instance_get_position, pos20, ":instance_id"),
  11557. (prop_instance_get_starting_position, pos21, ":instance_id"),
  11558. (position_get_z, ":sunk_z", pos20),
  11559. (position_get_z, ":floating_z", pos21),
  11560. (position_set_z, pos20, ":floating_z"),
  11561. (position_get_rotation_around_z, ":z_angle", pos20),
  11562. (init_position, pos22),
  11563. (position_copy_rotation, pos20, pos22),
  11564. (position_rotate_z, pos20, ":z_angle"),
  11565. (store_sub, ":ground_distance", ":floating_z", ":sunk_z"),
  11566. (call_script, "script_animate_ship_parts", ":instance_id", ":ground_distance"),
  11567. (try_end),
  11568. (try_end),
  11569. ]),
  11570.  
  11571. ("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
  11572. [
  11573. (set_fixed_point_multiplier, 100),
  11574. (assign, ":current_index", slot_ship_array_collision_props_begin),
  11575. (assign, ":count", 0),
  11576. (try_for_range, ":instance_id", 0, max_scene_prop_instance_id),
  11577. (prop_instance_is_valid, ":instance_id"),
  11578. (prop_instance_get_position, pos1, ":instance_id"),
  11579. (position_get_z, ":prop_height", pos1),
  11580. (le, ":prop_height", 500),
  11581. (position_set_z, pos1, 0),
  11582. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  11583. (gt, ":terrain_distance", -500),
  11584. (this_or_next|gt, ":terrain_distance", 0),
  11585. (le, ":prop_height", 0),
  11586. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_collision_kind, 0),
  11587. (troop_set_slot, "trp_ship_array", ":current_index", ":instance_id"),
  11588. (val_add, ":current_index", 1),
  11589. (try_end),
  11590. (store_sub, ":count", ":current_index", slot_ship_array_collision_props_begin),
  11591. (troop_set_slot, "trp_ship_array", slot_ship_array_collision_props_count, ":count"),
  11592. ]),
  11593.  
  11594. ("setup_ferry", # server: at mission start, calculate angle, positions, and movement distances for the ferry boat
  11595. [(store_script_param, ":instance_id", 1), # must be valid
  11596. (store_script_param, ":winch_scene_prop_id", 2),
  11597.  
  11598. (scene_prop_get_slot, ":platform_1_instance_id", ":instance_id", slot_scene_prop_linked_platform_1),
  11599. (scene_prop_get_slot, ":platform_2_instance_id", ":instance_id", slot_scene_prop_linked_platform_2),
  11600. (try_begin),
  11601. (gt, ":platform_1_instance_id", 0),
  11602. (gt, ":platform_2_instance_id", 0),
  11603. (set_fixed_point_multiplier, 100),
  11604. (prop_instance_get_position, pos1, ":platform_1_instance_id"),
  11605. (prop_instance_get_position, pos2, ":platform_2_instance_id"),
  11606. (position_set_z, pos1, 0),
  11607. (position_set_z, pos2, 0),
  11608. (scene_prop_get_slot, ":length", ":instance_id", slot_scene_prop_length),
  11609. (get_distance_between_positions, ":max_distance", pos1, pos2),
  11610. (val_sub, ":max_distance", ":length"),
  11611. (val_sub, ":max_distance", ":length"),
  11612. (scene_prop_set_slot, ":instance_id", slot_scene_prop_max_distance, ":max_distance"),
  11613. (scene_prop_get_slot, ":move_distance", ":instance_id", slot_scene_prop_speed_limit),
  11614. (store_div, ":max_position", ":max_distance", ":move_distance"),
  11615. (store_mod, ":remainder", ":max_distance", ":move_distance"),
  11616. (try_begin),
  11617. (gt, ":remainder", 20),
  11618. (val_add, ":max_position", 1),
  11619. (try_end),
  11620. (val_add, ":max_position", 1),
  11621. (scene_prop_set_slot, ":instance_id", slot_scene_prop_max_position, ":max_position"),
  11622. (set_fixed_point_multiplier, 1000000), # line up the ferry boat pointing exactly between platforms
  11623. (position_transform_position_to_local, pos3, pos1, pos2),
  11624. (position_get_x, ":relative_x", pos3),
  11625. (position_get_y, ":relative_y", pos3),
  11626. (store_atan2, ":angle", ":relative_x", ":relative_y"),
  11627. (val_mul, ":angle", -1),
  11628. (position_rotate_x_floating, pos1, 90 * 1000000), # hack to emulate missing position_rotate_z_floating operation
  11629. (position_rotate_y_floating, pos1, ":angle"),
  11630. (position_rotate_x_floating, pos1, -90 * 1000000),
  11631. (set_fixed_point_multiplier, 100),
  11632. (position_move_y, pos1, ":length"),
  11633. (prop_instance_set_position, ":instance_id", pos1),
  11634. (scene_prop_get_slot, ":winch_height", ":instance_id", slot_scene_prop_height),
  11635. (position_move_z, pos1, ":winch_height"),
  11636. (set_spawn_position, pos1),
  11637. (spawn_scene_prop, ":winch_scene_prop_id"),
  11638. (scene_prop_set_slot, reg0, slot_scene_prop_linked_scene_prop, ":instance_id"),
  11639. (scene_prop_set_slot, ":instance_id", slot_scene_prop_linked_ferry_winch, reg0),
  11640. (scene_prop_set_slot, ":instance_id", slot_scene_prop_controlling_agent, -1),
  11641. (try_end),
  11642. ]),
  11643.  
  11644. ("cf_use_ferry_winch", # server: handle players controlling a ferry boat
  11645. [(store_script_param, ":agent_id", 1), # must be valid
  11646. (store_script_param, ":winch_instance_id", 2), # must be valid
  11647. (store_script_param, ":is_platform", 3), # 0 = winch with full control, 1 = platform only allowing pulling the boat towards it
  11648.  
  11649. (agent_get_player_id, ":player_id", ":agent_id"),
  11650. (player_is_active, ":player_id"),
  11651. (agent_is_alive, ":agent_id"),
  11652. (scene_prop_get_slot, ":ferry_instance_id", ":winch_instance_id", slot_scene_prop_linked_scene_prop),
  11653. (gt, ":ferry_instance_id", 0),
  11654. (set_fixed_point_multiplier, 100),
  11655. (assign, ":direction", 0),
  11656. (try_begin),
  11657. (eq, ":is_platform", 0),
  11658. (prop_instance_get_position, pos1, ":ferry_instance_id"),
  11659. (agent_get_position, pos2, ":agent_id"),
  11660. (position_transform_position_to_local, pos3, pos1, pos2),
  11661. (position_get_y, ":relative_y_position", pos3),
  11662. (try_begin),
  11663. (ge, ":relative_y_position", 0),
  11664. (assign, ":direction", -1),
  11665. (else_try),
  11666. (assign, ":direction", 1),
  11667. (try_end),
  11668. (scene_prop_set_slot, ":ferry_instance_id", slot_scene_prop_controlling_agent, ":agent_id"),
  11669. (else_try),
  11670. (assign, ":platform_instance_id", ":winch_instance_id"),
  11671. (scene_prop_get_slot, ":winch_instance_id", ":ferry_instance_id", slot_scene_prop_linked_ferry_winch),
  11672. (scene_prop_get_slot, ":controlling_agent_id", ":ferry_instance_id", slot_scene_prop_controlling_agent),
  11673. (try_begin), # don't allow pulling from the platforms if the previously controlling agent is still on board
  11674. (neq, ":controlling_agent_id", ":agent_id"),
  11675. (agent_is_active, ":controlling_agent_id"),
  11676. (agent_is_alive, ":controlling_agent_id"),
  11677. (scene_prop_has_agent_on_it, ":ferry_instance_id", ":controlling_agent_id"),
  11678. (multiplayer_send_int_to_player, ":player_id", server_event_play_sound, "snd_failure"),
  11679. (assign, ":is_platform", -1),
  11680. (else_try),
  11681. (scene_prop_set_slot, ":ferry_instance_id", slot_scene_prop_controlling_agent, -1),
  11682. (try_end),
  11683. (neq, ":is_platform", -1),
  11684. (scene_prop_get_slot, ":platform_1_instance_id", ":ferry_instance_id", slot_scene_prop_linked_platform_1),
  11685. (try_begin),
  11686. (eq, ":platform_instance_id", ":platform_1_instance_id"),
  11687. (assign, ":direction", -1),
  11688. (else_try),
  11689. (scene_prop_get_slot, ":platform_2_instance_id", ":ferry_instance_id", slot_scene_prop_linked_platform_2),
  11690. (eq, ":platform_instance_id", ":platform_2_instance_id"),
  11691. (assign, ":direction", 1),
  11692. (try_end),
  11693. (try_end),
  11694. (neq, ":direction", 0),
  11695. (scene_prop_get_slot, ":current_target", ":ferry_instance_id", slot_scene_prop_target_position),
  11696. (scene_prop_get_slot, ":max_position", ":ferry_instance_id", slot_scene_prop_max_position),
  11697. (val_add, ":current_target", ":direction"),
  11698. (is_between, ":current_target", 0, ":max_position"),
  11699. (store_sub, ":last_position", ":max_position"),
  11700. (scene_prop_get_slot, ":move_distance", ":ferry_instance_id", slot_scene_prop_speed_limit),
  11701. (scene_prop_get_slot, ":max_distance", ":ferry_instance_id", slot_scene_prop_max_distance),
  11702. (try_begin),
  11703. (eq, ":current_target", ":last_position"),
  11704. (assign, ":total_distance", ":max_distance"),
  11705. (else_try), # calculate the total distance from the start to avoid accumulating errors
  11706. (store_mul, ":total_distance", ":current_target", ":move_distance"),
  11707. (val_clamp, ":total_distance", 0, ":max_distance"),
  11708. (try_end),
  11709. (prop_instance_get_starting_position, pos1, ":winch_instance_id"),
  11710. (position_set_z, pos1, 0),
  11711. (position_move_y, pos1, ":total_distance"),
  11712. (prop_instance_stop_animating, ":ferry_instance_id"),
  11713. (prop_instance_get_position, pos5, ":ferry_instance_id"),
  11714. (prop_instance_set_position, ":ferry_instance_id", pos1, 1),
  11715. (assign, ":crashed", 0),
  11716. (init_position, pos4),
  11717. (position_set_z, pos4, z_position_to_hide_object),
  11718. (troop_get_slot, ":ship_array_end", "trp_ship_array", 0),
  11719. (val_add, ":ship_array_end", slot_ship_array_begin),
  11720. (try_for_range, ":ship_array_slot", slot_ship_array_begin, ":ship_array_end"), # check for collision with all ships
  11721. (troop_get_slot, ":other_hull_instance_id", "trp_ship_array", ":ship_array_slot"),
  11722. (scene_prop_get_slot, ":other_cd_scene_prop_id", ":other_hull_instance_id", slot_scene_prop_collision_kind),
  11723. (scene_prop_get_instance, ":other_cd_instance_id", ":other_cd_scene_prop_id", 1),
  11724. (prop_instance_get_position, pos2, ":other_hull_instance_id"),
  11725. (prop_instance_set_position, ":other_cd_instance_id", pos2, 1),
  11726. (try_begin),
  11727. (prop_instance_intersects_with_prop_instance, ":ferry_instance_id", ":other_cd_instance_id"),
  11728. (assign, ":crashed", 1),
  11729. (assign, ":ship_array_end", -1),
  11730. (call_script, "script_scene_prop_play_sound", ":ferry_instance_id", "snd_cut_wood_break"),
  11731. (try_end),
  11732. (prop_instance_set_position, ":other_cd_instance_id", pos4, 1),
  11733. (try_end),
  11734. (prop_instance_set_position, ":ferry_instance_id", pos5, 1),
  11735. (eq, ":crashed", 0),
  11736. (scene_prop_set_slot, ":ferry_instance_id", slot_scene_prop_target_position, ":current_target"),
  11737. (prop_instance_animate_to_position, ":ferry_instance_id", pos1, 200),
  11738. (scene_prop_get_slot, ":winch_height", ":ferry_instance_id", slot_scene_prop_height),
  11739. (position_move_z, pos1, ":winch_height"),
  11740. (try_begin),
  11741. (gt, ":direction", 0),
  11742. (assign, ":winch_rotation", -72000),
  11743. (else_try),
  11744. (assign, ":winch_rotation", 72000),
  11745. (try_end),
  11746. (prop_instance_stop_animating, ":winch_instance_id"),
  11747. (prop_instance_rotate_to_position, ":winch_instance_id", pos1, 200, ":winch_rotation"),
  11748. ]),
  11749.  
  11750. ("cf_turn_windmill_fans", # clients: make windmill fans rotate, only visually
  11751. [(store_script_param_1, ":fan_no"),
  11752.  
  11753. (scene_prop_get_instance, ":instance_id", "spr_windmill_fan_turning", ":fan_no"),
  11754. (prop_instance_get_position, pos1, ":instance_id"),
  11755. (position_rotate_y, pos1, 45),
  11756. (prop_instance_animate_to_position, ":instance_id", pos1, 450),
  11757. (val_add, ":fan_no", 1),
  11758. (call_script, "script_cf_turn_windmill_fans", ":fan_no"),
  11759. ]),
  11760.  
  11761. ("scene_set_day_time", # clients: at mission start, set the time of day, skybox, and haze from scene prop values
  11762. [
  11763. (try_begin),
  11764. (scene_prop_get_instance, ":instance_id", "spr_pw_scene_day_time", 0),
  11765. (prop_instance_get_variation_id, ":day_time", ":instance_id"),
  11766. (val_min, ":day_time", 23),
  11767. (else_try),
  11768. (assign, ":day_time", 12),
  11769. (try_end),
  11770. (scene_set_day_time, ":day_time"),
  11771. (try_begin),
  11772. (scene_prop_get_instance, ":instance_id", "spr_pw_scene_cloud_haze", 0),
  11773. (prop_instance_get_variation_id, ":cloud", ":instance_id"),
  11774. (val_min, ":cloud", 100),
  11775. (set_global_cloud_amount, ":cloud"),
  11776. (prop_instance_get_variation_id_2, ":haze", ":instance_id"),
  11777. (val_min, ":haze", 100),
  11778. (set_global_haze_amount, ":haze"),
  11779. (try_end),
  11780. ]),
  11781.  
  11782. ("scene_adjust_weather_situation", # server: periodically adjust the position and intensity of weather systems in the scene
  11783. [
  11784. (set_fixed_point_multiplier, 100),
  11785. (store_random_in_range, ":squall", "$g_weather_volatility", 100),
  11786. (try_begin), # adjust wind direction and strength, if it exists in the scene
  11787. (scene_prop_get_instance, ":wind_instance_id", "spr_pw_scene_wind_direction", 0),
  11788. (prop_instance_get_position, pos1, ":wind_instance_id"),
  11789. (position_get_z, ":wind_strength", pos1),
  11790. (store_random_in_range, ":strength_change", -2000, 2000),
  11791. (store_random_in_range, ":angle_change", -30, 30),
  11792. (store_random_in_range, ":change_duration", loop_weather_adjust_interval * 200, loop_weather_adjust_interval * 800),
  11793. (try_begin),
  11794. (ge, ":squall", 90),
  11795. (val_mul, ":strength_change", 3),
  11796. (val_mul, ":angle_change", 3),
  11797. (val_div, ":change_duration", 3),
  11798. (try_end),
  11799. (store_add, ":next_wind_strength", ":strength_change"),
  11800. (prop_instance_get_variation_id, ":min_wind_strength", ":wind_instance_id"),
  11801. (val_mul, ":min_wind_strength", 100),
  11802. (val_max, ":next_wind_strength", ":min_wind_strength"),
  11803. (prop_instance_get_variation_id_2, ":max_wind_strength", ":wind_instance_id"),
  11804. (val_mul, ":max_wind_strength", 100),
  11805. (val_min, ":next_wind_strength", ":max_wind_strength"),
  11806. (copy_position, pos2, pos1),
  11807. (position_rotate_z, pos2, ":angle_change"),
  11808. (position_set_z, pos2, ":next_wind_strength"),
  11809. (prop_instance_stop_animating, ":wind_instance_id"),
  11810. (prop_instance_animate_to_position, ":wind_instance_id", pos2, ":change_duration"),
  11811. (else_try),
  11812. (assign, ":wind_strength", 0),
  11813. (init_position, pos1),
  11814. (try_end),
  11815. (get_scene_boundaries, pos8, pos9),
  11816. (position_get_x, ":scene_min_x", pos8),
  11817. (position_get_x, ":scene_max_x", pos9),
  11818. (position_get_y, ":scene_min_y", pos8),
  11819. (position_get_y, ":scene_max_y", pos9),
  11820. (scene_prop_get_num_instances, ":num_instances", "spr_pw_scene_precipitation"),
  11821. (try_for_range, ":instance_no", 0, ":num_instances"),
  11822. (scene_prop_get_instance, ":precipitation_instance_id", "spr_pw_scene_precipitation", ":instance_no"),
  11823. (prop_instance_get_position, pos2, ":precipitation_instance_id"),
  11824. (try_begin), # move precipitation with the current wind
  11825. (gt, ":wind_strength", 0),
  11826. (position_copy_rotation, pos2, pos1),
  11827. (position_get_x, ":current_x", pos2),
  11828. (position_get_y, ":current_y", pos2),
  11829. (try_begin), # check for precipitation areas moving off the scene edge
  11830. (is_between, ":current_x", ":scene_min_x", ":scene_max_x"),
  11831. (is_between, ":current_y", ":scene_min_y", ":scene_max_y"),
  11832. (position_move_y, pos2, ":wind_strength"),
  11833. (position_get_x, ":target_x", pos2),
  11834. (position_get_y, ":target_y", pos2),
  11835. (try_begin), # when targeting to move off the edge, stop at the edge and fade out
  11836. (lt, ":target_x", ":scene_min_x"),
  11837. (store_sub, ":target_x", ":scene_min_x", 2),
  11838. (position_set_z, pos2, 0),
  11839. (else_try),
  11840. (ge, ":target_x", ":scene_max_x"),
  11841. (store_add, ":target_x", ":scene_max_x", 2),
  11842. (position_set_z, pos2, 0),
  11843. (try_end),
  11844. (try_begin),
  11845. (lt, ":target_y", ":scene_min_y"),
  11846. (store_sub, ":target_y", ":scene_min_y", 2),
  11847. (position_set_z, pos2, 0),
  11848. (else_try),
  11849. (ge, ":target_y", ":scene_max_y"),
  11850. (store_add, ":target_y", ":scene_max_y", 2),
  11851. (position_set_z, pos2, 0),
  11852. (try_end),
  11853. (position_set_x, pos2, ":target_x"),
  11854. (position_set_y, pos2, ":target_y"),
  11855. (else_try), # when already at the edge, wrap around to the opposite side and fade in
  11856. (position_set_z, pos2, 0),
  11857. (try_begin),
  11858. (lt, ":current_x", ":scene_min_x"),
  11859. (val_sub, ":scene_max_x", 1), # bring inside scene for next check
  11860. (position_set_x, pos2, ":scene_max_x"),
  11861. (else_try),
  11862. (ge, ":current_x", ":scene_max_x"),
  11863. (position_set_x, pos2, ":scene_min_x"),
  11864. (try_end),
  11865. (try_begin),
  11866. (lt, ":current_y", ":scene_min_y"),
  11867. (val_sub, ":scene_max_y", 1), # bring inside scene for next check
  11868. (position_set_y, pos2, ":scene_max_y"),
  11869. (else_try),
  11870. (ge, ":current_y", ":scene_max_y"),
  11871. (position_set_y, pos2, ":scene_min_y"),
  11872. (try_end),
  11873. (prop_instance_stop_animating, ":precipitation_instance_id"),
  11874. (prop_instance_set_position, ":precipitation_instance_id", pos2),
  11875. (try_end),
  11876. (try_end),
  11877. (position_get_z, ":precipitation_intensity", pos2),
  11878. (prop_instance_get_variation_id, ":min_precipitation_intensity", ":precipitation_instance_id"),
  11879. (val_mul, ":min_precipitation_intensity", 100),
  11880. (prop_instance_get_variation_id_2, ":max_precipitation_intensity", ":precipitation_instance_id"),
  11881. (val_mul, ":max_precipitation_intensity", 100),
  11882. (scene_prop_get_slot, ":intensity_acceleration", ":precipitation_instance_id", slot_scene_prop_target_rotation),
  11883. (try_begin), # if the weather is controlled by an administrator, force it to be fine or precipitating
  11884. (eq, "$g_force_weather", 0),
  11885. (assign, ":precipitation_intensity", 0),
  11886. (else_try),
  11887. (eq, "$g_force_weather", 1),
  11888. (assign, ":precipitation_intensity", 10000),
  11889. (else_try), # or if dynamic, change the acceleration of the precipitation intensity so it doesn't just fluctuate over a small range
  11890. (try_begin),
  11891. (this_or_next|ge, ":precipitation_intensity", ":max_precipitation_intensity"),
  11892. (gt, ":intensity_acceleration", 1000),
  11893. (store_random_in_range, ":intensity_acceleration_change", -200, 0),
  11894. (else_try),
  11895. (this_or_next|le, ":precipitation_intensity", ":min_precipitation_intensity"),
  11896. (lt, ":intensity_acceleration", -1500),
  11897. (store_random_in_range, ":intensity_acceleration_change", 0, 201),
  11898. (else_try),
  11899. (store_random_in_range, ":intensity_acceleration_change", -200, 201),
  11900. (try_end),
  11901. (try_begin),
  11902. (gt, ":squall", 90),
  11903. (val_mul, ":intensity_acceleration_change", 3),
  11904. (try_end),
  11905. (val_add, ":intensity_acceleration", ":intensity_acceleration_change"),
  11906. (scene_prop_set_slot, ":precipitation_instance_id", slot_scene_prop_target_rotation, ":intensity_acceleration"),
  11907. (val_add, ":precipitation_intensity", ":intensity_acceleration"),
  11908. (val_max, ":precipitation_intensity", ":min_precipitation_intensity"),
  11909. (val_min, ":precipitation_intensity", ":max_precipitation_intensity"),
  11910. (try_end),
  11911. (position_set_z, pos2, ":precipitation_intensity"),
  11912. (prop_instance_stop_animating, ":precipitation_instance_id"),
  11913. (prop_instance_animate_to_position, ":precipitation_instance_id", pos2, loop_weather_adjust_interval * 100),
  11914. (try_end),
  11915. ]),
  11916.  
  11917. ("cf_adjust_weather_effects", # clients: recalculate the weather effects that should be currently happening, based on view position
  11918. [
  11919. (set_fixed_point_multiplier, 100),
  11920. (assign, "$g_current_precipitation_intensity", 0),
  11921. (mission_cam_get_position, pos1),
  11922. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  11923. (gt, ":terrain_distance", -100), # if underground, don't display precipitation
  11924. (scene_prop_get_num_instances, ":num_instances", "spr_pw_scene_precipitation"),
  11925. (try_for_range, ":instance_no", 0, ":num_instances"), # calculate overall intensity from all nearby precipitation systems
  11926. (scene_prop_get_instance, ":instance_id", "spr_pw_scene_precipitation", ":instance_no"),
  11927. (prop_instance_get_position, pos2, ":instance_id"),
  11928. (position_get_z, ":intensity", pos2),
  11929. (gt, ":intensity", 0),
  11930. (position_get_z, ":view_height", pos1),
  11931. (position_set_z, pos2, ":view_height"),
  11932. (get_distance_between_positions, ":distance", pos1, pos2),
  11933. (prop_instance_get_scale, pos3, ":instance_id"),
  11934. (position_get_scale_x, ":precipitation_width", pos3),
  11935. (val_mul, ":precipitation_width", 100),
  11936. (lt, ":distance", ":precipitation_width"),
  11937. (store_sub, ":intensity_reduction", ":precipitation_width", ":distance"),
  11938. (val_mul, ":intensity_reduction", 200),
  11939. (val_div, ":intensity_reduction", ":precipitation_width"),
  11940. (try_begin),
  11941. (lt, ":intensity_reduction", 100),
  11942. (val_mul, ":intensity", ":intensity_reduction"),
  11943. (val_div, ":intensity", 100),
  11944. (try_end),
  11945. (val_div, ":intensity", 100),
  11946. (val_max, "$g_current_precipitation_intensity", ":intensity"),
  11947. (try_end),
  11948. (try_begin), # change from rain to snow when above the set level
  11949. (scene_prop_get_instance, ":snow_level_instance_id", "spr_pw_scene_snow_level", 0),
  11950. (prop_instance_get_position, pos2, ":snow_level_instance_id"),
  11951. (position_get_z, ":camera_height", pos1),
  11952. (position_get_z, ":snow_level_height", pos2),
  11953. (ge, ":camera_height", ":snow_level_height"),
  11954. (assign, "$g_current_precipitation_particles", "psys_dynamic_snow"),
  11955. (else_try),
  11956. (assign, "$g_current_precipitation_particles", "psys_dynamic_rain"),
  11957. (try_end),
  11958. (try_begin), # play rain sound if heavy enough (volume flags do not seem to work in the play_sound operation)
  11959. (eq, "$g_current_precipitation_particles", "psys_dynamic_rain"),
  11960. (ge, "$g_current_precipitation_intensity", 50),
  11961. (try_begin),
  11962. (eq, "$g_rain_sound_channel", -1),
  11963. (play_sound, "snd_rain"),
  11964. (store_last_sound_channel, "$g_rain_sound_channel"),
  11965. (try_end),
  11966. (else_try), # otherwise stop rain sound
  11967. (this_or_next|lt, "$g_current_precipitation_intensity", 50),
  11968. (eq, "$g_current_precipitation_particles", "psys_dynamic_snow"),
  11969. (neq, "$g_rain_sound_channel", -1),
  11970. (stop_sound_channel, "$g_rain_sound_channel"),
  11971. (assign, "$g_rain_sound_channel", -1),
  11972. (try_end),
  11973. (try_begin), # get scene fog color and distance
  11974. (scene_prop_get_instance, ":fog_instance_id", "spr_pw_scene_fog", 0),
  11975. (set_fixed_point_multiplier, 10),
  11976. (prop_instance_get_position, pos2, ":fog_instance_id"),
  11977. (position_get_z, "$g_target_fog_distance", pos2),
  11978. (val_max, "$g_target_fog_distance", 1),
  11979. (set_fixed_point_multiplier, 0xFF * 200),
  11980. (prop_instance_get_scale, pos3, ":fog_instance_id"),
  11981. (position_get_scale_x, "$g_target_fog_red", pos3),
  11982. (position_get_scale_y, "$g_target_fog_green", pos3),
  11983. (position_get_scale_z, "$g_target_fog_blue", pos3),
  11984. (else_try),
  11985. (assign, "$g_target_fog_distance", 10000),
  11986. (assign, "$g_target_fog_red", 140 * 200),
  11987. (assign, "$g_target_fog_green", 162 * 200),
  11988. (assign, "$g_target_fog_blue", 173 * 200),
  11989. (try_end), # darken fog in heavy precipitation
  11990. (set_fixed_point_multiplier, 100),
  11991. (store_add, ":intensity_darken", "$g_current_precipitation_intensity", 200),
  11992. (val_clamp, ":intensity_darken", 200, 301),
  11993. (val_div, "$g_target_fog_red", ":intensity_darken"),
  11994. (val_div, "$g_target_fog_green", ":intensity_darken"),
  11995. (val_div, "$g_target_fog_blue", ":intensity_darken"),
  11996. (store_sub, ":precipitation_fog_distance", 100, "$g_current_precipitation_intensity"),
  11997. (convert_to_fixed_point, ":precipitation_fog_distance"),
  11998. (store_pow, ":precipitation_fog_distance", ":precipitation_fog_distance", 400),
  11999. (val_div, ":precipitation_fog_distance", 5000000),
  12000. (val_add, ":precipitation_fog_distance", 20),
  12001. (val_min, "$g_target_fog_distance", ":precipitation_fog_distance"),
  12002. ]),
  12003.  
  12004. ("cf_render_weather_effects", # clients: emit weather particle systems and set fog
  12005. [
  12006. (set_fixed_point_multiplier, 100),
  12007. (try_begin), # emit precipitation blocks which are not under cover
  12008. (eq, "$g_disable_rain_snow_particles", 0),
  12009. (ge, "$g_current_precipitation_intensity", 20),
  12010. (gt, "$g_current_precipitation_particles", 0),
  12011. (mission_cam_get_position, pos1),
  12012. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  12013. (gt, ":terrain_distance", -100),
  12014. (position_get_z, ":height", pos1),
  12015. (gt, ":height", z_position_water_level - 100),
  12016. (init_position, pos2),
  12017. (position_copy_origin, pos2, pos1),
  12018. (position_get_rotation_around_z, ":z_rotation", pos1),
  12019. (position_rotate_z, pos2, ":z_rotation"),
  12020. (position_move_x, pos2, -1600),
  12021. (position_move_y, pos2, 2000),
  12022. (try_for_range, reg1, -4, 5),
  12023. (try_for_range, reg2, -4, 5),
  12024. (copy_position, pos3, pos2),
  12025. (position_set_z, pos3, 100000),
  12026. (copy_position, pos4, pos2),
  12027. (try_begin),
  12028. (position_set_z_to_ground_level, pos4),
  12029. (position_move_z, pos4, 100, 1),
  12030. (position_has_line_of_sight_to_position, pos4, pos3),
  12031. (position_get_z, ":above_ground_height", pos4),
  12032. (position_get_z, ":view_height", pos2),
  12033. (try_begin),
  12034. (gt, ":above_ground_height", ":view_height"),
  12035. (position_move_z, pos4, 1000, 1),
  12036. (else_try),
  12037. (val_add, ":view_height", 1000),
  12038. (position_set_z, pos4, ":view_height"),
  12039. (try_end),
  12040. (particle_system_burst, "$g_current_precipitation_particles", pos4, "$g_current_precipitation_intensity"),
  12041. (else_try),
  12042. (try_end),
  12043. (position_move_x, pos2, 400),
  12044. (try_end),
  12045. (position_move_x, pos2, -3600),
  12046. (position_move_y, pos2, -400),
  12047. (try_end),
  12048. (try_end),
  12049. (try_begin),
  12050. (gt, "$g_target_fog_distance", 0),
  12051. (try_begin), # reset the color immediately when fog is cleared
  12052. (ge, "$g_current_fog_distance", 2000),
  12053. (assign, "$g_current_fog_red", 0),
  12054. (assign, "$g_current_fog_green", 0),
  12055. (assign, "$g_current_fog_blue", 0),
  12056. (try_end),
  12057. (try_begin), # for long distances, clear the fog
  12058. (ge, "$g_target_fog_distance", 2000),
  12059. (ge, "$g_current_fog_distance", 2000),
  12060. (set_fog_distance, 0, 0),
  12061. (else_try),
  12062. (le, "$g_current_fog_distance", 0),
  12063. (assign, "$g_current_fog_distance", "$g_target_fog_distance"),
  12064. (else_try), # otherwise smoothly interpolate fog color and distance
  12065. (neq, "$g_current_fog_distance", "$g_target_fog_distance"),
  12066. (store_sub, ":merge_amount", "$g_current_fog_distance", "$g_target_fog_distance"),
  12067. (val_abs, ":merge_amount"),
  12068. (val_div, ":merge_amount", 10),
  12069. (val_clamp, ":merge_amount", 1, 51),
  12070. (try_begin),
  12071. (gt, "$g_current_fog_distance", "$g_target_fog_distance"),
  12072. (val_sub, "$g_current_fog_distance", ":merge_amount"),
  12073. (val_max, "$g_current_fog_distance", "$g_target_fog_distance"),
  12074. (else_try),
  12075. (lt, "$g_current_fog_distance", "$g_target_fog_distance"),
  12076. (val_add, "$g_current_fog_distance", ":merge_amount"),
  12077. (val_min, "$g_current_fog_distance", "$g_target_fog_distance"),
  12078. (try_end),
  12079. (try_end),
  12080. (try_begin),
  12081. (eq, "$g_current_fog_red", 0),
  12082. (assign, "$g_current_fog_red", "$g_target_fog_red"),
  12083. (else_try),
  12084. (gt, "$g_current_fog_red", "$g_target_fog_red"),
  12085. (val_sub, "$g_current_fog_red", 1),
  12086. (else_try),
  12087. (lt, "$g_current_fog_red", "$g_target_fog_red"),
  12088. (val_add, "$g_current_fog_red", 1),
  12089. (try_end),
  12090. (try_begin),
  12091. (eq, "$g_current_fog_green", 0),
  12092. (assign, "$g_current_fog_green", "$g_target_fog_green"),
  12093. (else_try),
  12094. (gt, "$g_current_fog_green", "$g_target_fog_green"),
  12095. (val_sub, "$g_current_fog_green", 1),
  12096. (else_try),
  12097. (lt, "$g_current_fog_green", "$g_target_fog_green"),
  12098. (val_add, "$g_current_fog_green", 1),
  12099. (try_end),
  12100. (try_begin),
  12101. (eq, "$g_current_fog_blue", 0),
  12102. (assign, "$g_current_fog_blue", "$g_target_fog_blue"),
  12103. (else_try),
  12104. (gt, "$g_current_fog_blue", "$g_target_fog_blue"),
  12105. (val_sub, "$g_current_fog_blue", 1),
  12106. (else_try),
  12107. (lt, "$g_current_fog_blue", "$g_target_fog_blue"),
  12108. (val_add, "$g_current_fog_blue", 1),
  12109. (try_end),
  12110. (store_mul, ":red", "$g_current_fog_red", 0x10000),
  12111. (store_mul, ":green", "$g_current_fog_green", 0x100),
  12112. (store_or, ":fog_color", ":red", ":green"),
  12113. (val_or, ":fog_color", "$g_current_fog_blue"),
  12114. (set_fog_distance, "$g_current_fog_distance", ":fog_color"),
  12115. (try_end),
  12116. ]),
  12117.  
  12118. ("cf_play_scene_ambient_sound", # clients: check if an ambient sound emitter scene prop should be played
  12119. [(store_script_param, ":instance_id", 1), # must be valid
  12120.  
  12121. (prop_instance_get_variation_id_2, ":probability", ":instance_id"),
  12122. (le, ":probability", 100),
  12123. (prop_instance_get_variation_id, ":sound_id", ":instance_id"),
  12124. (val_add, ":sound_id", ambient_sounds_begin),
  12125. (is_between, ":sound_id", ambient_sounds_begin, ambient_sounds_end),
  12126. (store_random_in_range, ":random", 0, 100),
  12127. (lt, ":random", ":probability"),
  12128. (mission_cam_get_position, pos1),
  12129. (prop_instance_get_position, pos2, ":instance_id"),
  12130. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  12131. (lt, ":sq_distance", sq(max_distance_to_play_sound)),
  12132. (play_sound_at_position, ":sound_id", pos2, sf_vol_15|sf_priority_7),
  12133. ]),
  12134.  
  12135. ("music_set_situation", # clients: check if the music type should be changed for a different situation
  12136. [
  12137. (multiplayer_get_my_player, ":player_id"),
  12138. (try_begin),
  12139. (player_is_active, ":player_id"),
  12140. (player_get_slot, ":faction_id", ":player_id", slot_player_faction_id),
  12141. (else_try),
  12142. (assign, ":faction_id", "fac_commoners"),
  12143. (try_end),
  12144. (assign, ":situation", mtf_sit_travel),
  12145. (try_begin),
  12146. (gt, "$g_recent_nearby_deaths_factor", 100),
  12147. (assign, ":situation", mtf_sit_fight),
  12148. (else_try),
  12149. (mission_cam_get_position, pos1),
  12150. (ge, ":faction_id", castle_factions_begin),
  12151. (call_script, "script_cf_find_closest_scene_prop", "spr_pw_castle_capture_point", sq(10000)),
  12152. (call_script, "script_scene_prop_get_owning_faction", reg0),
  12153. (gt, reg1, -1),
  12154. (assign, ":nearby_castle_faction_id", reg0),
  12155. (try_begin),
  12156. (eq, ":nearby_castle_faction_id", ":faction_id"), # nearest to one of the player faction's castles
  12157. (assign, ":peaceful_loop_end", factions_end),
  12158. (try_for_range, ":other_faction_id", castle_factions_begin, ":peaceful_loop_end"),
  12159. (neq, ":other_faction_id", ":faction_id"),
  12160. (faction_slot_eq, ":other_faction_id", slot_faction_is_active, 1),
  12161. (call_script, "script_cf_factions_are_hostile", ":faction_id", ":other_faction_id"),
  12162. (get_max_players, ":max_players"),
  12163. (try_for_range, ":other_player_id", 1, ":max_players"),
  12164. (player_is_active, ":other_player_id"),
  12165. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":other_faction_id"),
  12166. (assign, ":max_players", -1),
  12167. (try_end),
  12168. (eq, ":max_players", -1),
  12169. (assign, ":peaceful_loop_end", 0),
  12170. (try_end),
  12171. (try_begin),
  12172. (eq, ":peaceful_loop_end", 0), # the player's faction is hostile to another occupied faction, not at peace
  12173. (assign, ":situation", mtf_sit_ambushed),
  12174. (else_try),
  12175. (assign, ":situation", mtf_sit_tavern),
  12176. (try_end),
  12177. (else_try),
  12178. (faction_slot_eq, ":nearby_castle_faction_id", slot_faction_is_active, 1),
  12179. (call_script, "script_cf_factions_are_hostile", ":faction_id", ":nearby_castle_faction_id"),
  12180. (get_max_players, ":max_players"),
  12181. (try_for_range, ":other_player_id", 1, ":max_players"),
  12182. (player_is_active, ":other_player_id"),
  12183. (player_slot_eq, ":other_player_id", slot_player_faction_id, ":nearby_castle_faction_id"),
  12184. (assign, ":max_players", -1),
  12185. (try_end),
  12186. (eq, ":max_players", -1), # nearest to a castle occupied by a hostile faction
  12187. (assign, ":situation", mtf_sit_siege),
  12188. (else_try),
  12189. (assign, ":situation", mtf_sit_town),
  12190. (try_end),
  12191. (else_try),
  12192. (set_fixed_point_multiplier, 100),
  12193. (position_get_distance_to_terrain, ":terrain_distance", pos1),
  12194. (position_get_distance_to_ground_level, ":ground_distance", pos1),
  12195. (store_sub, ":difference", ":terrain_distance", ":ground_distance"),
  12196. (val_abs, ":difference"),
  12197. (gt, ":difference", 50), # mission camera is not directly above terrain, probably in a town or building
  12198. (try_begin),
  12199. (player_is_active, ":player_id"),
  12200. (player_get_agent_id, ":agent_id", ":player_id"),
  12201. (agent_is_active, ":agent_id"),
  12202. (agent_is_alive, ":agent_id"),
  12203. (this_or_next|agent_has_item_equipped, ":agent_id", "itm_lock_pick"),
  12204. (agent_has_item_equipped, ":agent_id", "itm_poisoned_dagger"),
  12205. (assign, ":situation", mtf_sit_town_infiltrate),
  12206. (else_try),
  12207. (call_script, "script_cf_find_closest_scene_prop", "spr_pw_process_tavern", sq(1000)),
  12208. (assign, ":situation", mtf_sit_tavern),
  12209. (else_try),
  12210. (assign, ":situation", mtf_sit_town),
  12211. (try_end),
  12212. (try_end),
  12213. (music_set_situation, ":situation"),
  12214. (val_div, "$g_recent_nearby_deaths_factor", 3),
  12215. (val_mul, "$g_recent_nearby_deaths_factor", 2),
  12216. ]),
  12217.  
  12218. ("check_spawn_bots", # server: check if more testing bots should be spawned
  12219. [(store_script_param, ":dead_agent_id", 1),
  12220.  
  12221. (try_begin),
  12222. (multiplayer_is_server),
  12223. (try_begin),
  12224. (le, ":dead_agent_id", -1),
  12225. (store_sub, ":bots_to_spawn", "$g_bot_count", "$g_spawned_bot_count"),
  12226. (val_max, "$g_spawned_bot_count", "$g_bot_count"),
  12227. (else_try),
  12228. (assign, ":bots_to_spawn", 0),
  12229. (agent_is_human, ":dead_agent_id"),
  12230. (agent_get_player_id, ":player_id", ":dead_agent_id"),
  12231. (neg|player_is_active, ":player_id"),
  12232. (try_begin),
  12233. (le, "$g_spawned_bot_count", "$g_bot_count"),
  12234. (assign, ":bots_to_spawn", 1),
  12235. (else_try),
  12236. (val_sub, "$g_spawned_bot_count", 1),
  12237. (try_end),
  12238. (try_end),
  12239. (ge, ":bots_to_spawn", 1),
  12240. (store_current_scene, ":current_scene"),
  12241. (modify_visitors_at_site, ":current_scene"),
  12242. (try_for_range, ":unused", 0, ":bots_to_spawn"),
  12243. (store_random_in_range, ":entry_point", 0, 5),
  12244. (store_random_in_range, ":troop_id", playable_troops_begin, "trp_godlike_hero"),
  12245. (add_visitors_to_current_scene, ":entry_point", ":troop_id", 1, 0, -1),
  12246. (try_end),
  12247. (try_end),
  12248. ]),
  12249.  
  12250. ("cf_client_agent_is_inactive", # clients: try to check that the agent is not moving or fighting
  12251. [
  12252. (assign, ":action", 0),
  12253. (multiplayer_get_my_player, ":player_id"),
  12254. (try_begin),
  12255. (player_is_active, ":player_id"),
  12256. (player_get_agent_id, ":agent_id", ":player_id"),
  12257. (agent_is_active, ":agent_id"),
  12258. (agent_is_alive, ":agent_id"),
  12259. (agent_get_speed, pos1, ":agent_id"),
  12260. (position_get_x, ":action", pos1),
  12261. (eq, ":action", 0),
  12262. (position_get_y, ":action", pos1),
  12263. (eq, ":action", 0),
  12264. (agent_get_defend_action, ":action", ":agent_id"),
  12265. (try_end),
  12266. (eq, ":action", 0),
  12267. ]),
  12268.  
  12269. ("show_welcome_message", # clients: display the server welcome and game information messages
  12270. [
  12271. (str_store_welcome_message, s10),
  12272. (store_add, ":name_string_id", lazy.sub(game_type_names_begin, game_type_mission_templates_begin), "$g_game_type"),
  12273. (str_store_string, s11, ":name_string_id"),
  12274. (store_add, ":info_string_id", lazy.sub(game_type_info_strings_begin, game_type_mission_templates_begin), "$g_game_type"),
  12275. (str_store_string, s12, ":info_string_id"),
  12276. (call_script, "script_preset_message", "str_pw_welcome", preset_message_read_object, "str_join_game", 0),
  12277. ]),
  12278.  
  12279. ("request_poll", # server: handle requests for polls from players
  12280. [(store_script_param, ":poll_type", 1), # constants starting with poll_type_
  12281. (store_script_param, ":requester_player_id", 2),
  12282. (store_script_param, ":value_1", 3),
  12283.  
  12284. (try_begin),
  12285. (player_is_active, ":requester_player_id"),
  12286. (assign, ":value_2", -1),
  12287. (assign, ":gold_cost", 0),
  12288. (assign, ":poll_faction_id", factions_end),
  12289. (assign, ":poll_error", 0),
  12290. (try_begin), # ensure a global poll is not running
  12291. (neg|faction_slot_eq, factions_end, slot_faction_poll_end_time, 0),
  12292. (assign, ":poll_error", poll_result_existing),
  12293. (else_try), # for a new global poll, ensure that a faction poll is not running
  12294. (neq, ":poll_type", poll_type_faction_lord),
  12295. (try_for_range, ":other_faction_id", factions_begin, factions_end),
  12296. (neg|faction_slot_eq, ":other_faction_id", slot_faction_poll_end_time, 0),
  12297. (assign, ":poll_error", poll_result_existing),
  12298. (try_end),
  12299. (eq, ":poll_error", poll_result_existing),
  12300. (else_try),
  12301. (eq, ":poll_type", poll_type_change_scene),
  12302. (eq, "$g_scenes_voteable", 1),
  12303. (is_between, ":value_1", scenes_begin, scenes_end),
  12304. (assign, ":gold_cost", poll_cost_change_scene),
  12305. (store_sub, ":scene_name_id", ":value_1", scenes_begin),
  12306. (val_add, ":scene_name_id", scene_names_begin),
  12307. (str_store_string, s1, ":scene_name_id"),
  12308. (str_store_string, s0, "str_poll_change_scene"),
  12309. (else_try),
  12310. (this_or_next|eq, ":poll_type", poll_type_kick_player),
  12311. (eq, ":poll_type", poll_type_ban_player),
  12312. (neq, ":value_1", ":requester_player_id"),
  12313. (player_is_active, ":value_1"),
  12314. (neg|player_is_admin, ":value_1"),
  12315. (assign, ":log_string_id", -1),
  12316. (try_begin),
  12317. (eq, ":poll_type", poll_type_kick_player),
  12318. (eq, "$g_kick_voteable", 1),
  12319. (assign, ":gold_cost", poll_cost_kick_player),
  12320. (assign, ":log_string_id", "str_poll_kick_player"),
  12321. (else_try),
  12322. (eq, "$g_ban_voteable", 1),
  12323. (assign, ":gold_cost", poll_cost_ban_player),
  12324. (assign, ":log_string_id", "str_poll_ban_player"),
  12325. (try_end),
  12326. (gt, ":log_string_id", -1),
  12327. (str_store_player_username, s1, ":value_1"),
  12328. #(store_script_param, ":value_2", 4),
  12329. (str_store_string, s0, ":log_string_id"),
  12330. (else_try),
  12331. (eq, ":poll_type", poll_type_faction_lord),
  12332. (player_is_active, ":value_1"),
  12333. (player_get_slot, ":poll_faction_id", ":requester_player_id", slot_player_faction_id),
  12334. (try_begin), # ensure that the player is not voting for themself and the faction is not locked
  12335. (neq, ":value_1", ":requester_player_id"),
  12336. (faction_slot_eq, ":poll_faction_id", slot_faction_is_locked, 0),
  12337. (else_try), # but allow admins to override the last conditions
  12338. (player_is_admin, ":requester_player_id"),
  12339. (player_slot_eq, ":requester_player_id", slot_player_admin_no_factions, 0),
  12340. (else_try),
  12341. (assign, ":poll_error", poll_result_invalid),
  12342. (try_end),
  12343. (eq, ":poll_error", 0),
  12344. (assign, ":poll_error", poll_result_existing),
  12345. (faction_slot_eq, ":poll_faction_id", slot_faction_poll_end_time, 0),
  12346. (assign, ":poll_error", 0),
  12347. (is_between, ":poll_faction_id", castle_factions_begin, factions_end),
  12348. (player_slot_eq, ":value_1", slot_player_faction_id, ":poll_faction_id"),
  12349. (assign, ":gold_cost", poll_cost_faction_lord),
  12350. (str_store_player_username, s1, ":value_1"),
  12351. (str_store_faction_name, s2, ":poll_faction_id"),
  12352. (str_store_string, s0, "str_poll_faction_lord"),
  12353. (else_try),
  12354. (eq, ":poll_error", 0),
  12355. (assign, ":poll_error", poll_result_invalid),
  12356. (try_end),
  12357. (try_begin),
  12358. (neq, ":poll_error", 0),
  12359. (multiplayer_send_int_to_player, ":requester_player_id", server_event_show_poll, ":poll_error"),
  12360. (try_end),
  12361. (eq, ":poll_error", 0),
  12362. (call_script, "script_cf_check_enough_gold", ":requester_player_id", ":gold_cost"),
  12363. (call_script, "script_player_adjust_gold", ":requester_player_id", ":gold_cost", -1),
  12364. (assign, ":voter_count", 0),
  12365. (get_max_players, ":max_players"),
  12366. (try_for_range, ":player_id", 1, ":max_players"),
  12367. (player_is_active, ":player_id"),
  12368. (this_or_next|eq, ":poll_faction_id", factions_end),
  12369. (player_slot_eq, ":player_id", slot_player_faction_id, ":poll_faction_id"),
  12370. (player_slot_eq, ":player_id", slot_player_poll_faction_id, 0),
  12371. (player_set_slot, ":player_id", slot_player_poll_faction_id, ":poll_faction_id"),
  12372. (try_begin),
  12373. (eq, ":value_2", -1),
  12374. (multiplayer_send_3_int_to_player, ":player_id", server_event_show_poll, ":poll_type", ":requester_player_id", ":value_1"),
  12375. (else_try),
  12376. (multiplayer_send_4_int_to_player, ":player_id", server_event_show_poll, ":poll_type", ":requester_player_id", ":value_1", ":value_2"),
  12377. (try_end),
  12378. (val_add, ":voter_count", 1),
  12379. (try_end),
  12380. (gt, ":voter_count", 0),
  12381. (str_store_player_username, s3, ":requester_player_id"),
  12382. (server_add_message_to_log, "str_poll_log"),
  12383. (store_mission_timer_a, ":end_time"),
  12384. (val_add, ":end_time", poll_time_duration),
  12385. (faction_set_slot, ":poll_faction_id", slot_faction_poll_end_time, ":end_time"),
  12386. (faction_set_slot, ":poll_faction_id", slot_faction_poll_voter_count, ":voter_count"),
  12387. (faction_set_slot, ":poll_faction_id", slot_faction_poll_yes_votes, 0),
  12388. (faction_set_slot, ":poll_faction_id", slot_faction_poll_no_votes, 0),
  12389. (faction_set_slot, ":poll_faction_id", slot_faction_poll_type, ":poll_type"),
  12390. (faction_set_slot, ":poll_faction_id", slot_faction_poll_value_1, ":value_1"),
  12391. (faction_set_slot, ":poll_faction_id", slot_faction_poll_value_2, ":value_2"),
  12392. (try_begin), # save target player information in case they disconnect before the poll ends
  12393. (this_or_next|eq, ":poll_type", poll_type_kick_player),
  12394. (eq, ":poll_type", poll_type_faction_lord),
  12395. (player_get_unique_id, ":unique_id", ":value_1"),
  12396. (faction_set_slot, ":poll_faction_id", slot_faction_poll_target_unique_id, ":unique_id"),
  12397. (else_try),
  12398. (eq, ":poll_type", poll_type_ban_player),
  12399. (save_ban_info_of_player, ":value_1"),
  12400. (try_end),
  12401. (try_end),
  12402. ]),
  12403.  
  12404. ("show_poll", # clients: handle showing polls or poll results
  12405. [(store_script_param, ":poll_type", 1), # constants starting with poll_type_ and poll_result_
  12406.  
  12407. (try_begin),
  12408. (ge, ":poll_type", 0),
  12409. (assign, "$g_poll_type", ":poll_type"),
  12410. (store_script_param, "$g_poll_requester_player_id", 2),
  12411. (store_script_param, "$g_poll_value_1", 3),
  12412. (store_mission_timer_a, "$g_poll_end_time"),
  12413. (val_add, "$g_poll_end_time", poll_time_duration),
  12414. (start_presentation, "prsnt_show_poll"),
  12415. (else_try),
  12416. (eq, ":poll_type", poll_result_existing),
  12417. (display_message, "str_poll_existing", poll_result_color),
  12418. (else_try),
  12419. (eq, ":poll_type", poll_result_invalid),
  12420. (display_message, "str_poll_invalid", poll_result_color),
  12421. (else_try),
  12422. (try_begin),
  12423. (is_presentation_active, "prsnt_show_poll"),
  12424. (assign, "$g_hide_poll", 1),
  12425. (try_end),
  12426. (eq, ":poll_type", poll_result_no),
  12427. (display_message, "str_poll_result_no", poll_result_color),
  12428. (else_try),
  12429. (eq, ":poll_type", poll_result_yes),
  12430. (display_message, "str_poll_result_yes", poll_result_color),
  12431. (else_try),
  12432. (eq, ":poll_type", poll_result_admin_no),
  12433. (display_message, "str_poll_result_admin_no", poll_result_color),
  12434. (else_try),
  12435. (eq, ":poll_type", poll_result_admin_yes),
  12436. (display_message, "str_poll_result_admin_yes", poll_result_color),
  12437. (try_end),
  12438. ]),
  12439.  
  12440. ("poll_vote", # server: handle player votes for polls
  12441. [(store_script_param, ":player_id", 1), # must be valid
  12442. (store_script_param, ":vote", 2),
  12443.  
  12444. (try_begin),
  12445. (player_get_slot, ":poll_faction_id", ":player_id", slot_player_poll_faction_id),
  12446. (gt, ":poll_faction_id", 0),
  12447. (player_set_slot, ":player_id", slot_player_poll_faction_id, 0), # prevent the player voting again
  12448. (ge, ":poll_faction_id", castle_factions_begin),
  12449. (le, ":poll_faction_id", factions_end),
  12450. (faction_slot_ge, ":poll_faction_id", slot_faction_poll_end_time, 1),
  12451. (assign, ":remove_vote", 0),
  12452. (try_begin),
  12453. (neq, ":poll_faction_id", factions_end),
  12454. (neg|player_slot_eq, ":player_id", slot_player_faction_id, ":poll_faction_id"),
  12455. (assign, ":remove_vote", 1), # remove vote if the player was not in the faction at the start of the poll
  12456. (else_try),
  12457. (eq, ":vote", poll_vote_abstain),
  12458. (assign, ":remove_vote", 1),
  12459. (try_end),
  12460. (try_begin),
  12461. (eq, ":remove_vote", 1),
  12462. (faction_get_slot, ":voter_count", ":poll_faction_id", slot_faction_poll_voter_count),
  12463. (val_sub, ":voter_count", 1),
  12464. (faction_set_slot, ":poll_faction_id", slot_faction_poll_voter_count, ":voter_count"),
  12465. (try_end),
  12466. (eq, ":remove_vote", 0),
  12467. (try_begin),
  12468. (eq, ":vote", poll_vote_no),
  12469. (faction_get_slot, ":no_votes", ":poll_faction_id", slot_faction_poll_no_votes),
  12470. (val_add, ":no_votes", 1),
  12471. (faction_set_slot, ":poll_faction_id", slot_faction_poll_no_votes, ":no_votes"),
  12472. (else_try),
  12473. (eq, ":vote", poll_vote_yes),
  12474. (faction_get_slot, ":yes_votes", ":poll_faction_id", slot_faction_poll_yes_votes),
  12475. (val_add, ":yes_votes", 1),
  12476. (faction_set_slot, ":poll_faction_id", slot_faction_poll_yes_votes, ":yes_votes"),
  12477. (else_try),
  12478. (assign, ":poll_result", 0),
  12479. (try_begin),
  12480. (eq, ":vote", poll_vote_admin_no),
  12481. (assign, ":poll_result", poll_result_admin_no),
  12482. (else_try),
  12483. (eq, ":vote", poll_vote_admin_yes),
  12484. (assign, ":poll_result", poll_result_admin_yes),
  12485. (try_end),
  12486. (neq, ":poll_result", 0),
  12487. (player_is_admin, ":player_id"),
  12488. (player_slot_eq, ":player_id", slot_player_admin_no_override_poll, 0),
  12489. (faction_set_slot, ":poll_faction_id", slot_faction_poll_end_time, 0),
  12490. (call_script, "script_apply_poll_consequences", ":poll_faction_id", ":poll_result"),
  12491. (try_end),
  12492. (try_end),
  12493. ]),
  12494.  
  12495. ("check_polls_ended", # server: check all factions for polls that have ended
  12496. [
  12497. (store_mission_timer_a, ":current_time"),
  12498. (store_add, ":factions_end", factions_end, 1),
  12499. (try_for_range, ":poll_faction_id", castle_factions_begin, ":factions_end"),
  12500. (faction_get_slot, ":end_time", ":poll_faction_id", slot_faction_poll_end_time),
  12501. (ge, ":end_time", 1),
  12502. (faction_get_slot, ":voter_count", ":poll_faction_id", slot_faction_poll_voter_count),
  12503. (faction_get_slot, ":yes_votes", ":poll_faction_id", slot_faction_poll_yes_votes),
  12504. (faction_get_slot, ":no_votes", ":poll_faction_id", slot_faction_poll_no_votes),
  12505. (store_add, ":received_votes", ":yes_votes", ":no_votes"),
  12506. (this_or_next|ge, ":received_votes", ":voter_count"),
  12507. (ge, ":current_time", ":end_time"),
  12508. (faction_set_slot, ":poll_faction_id", slot_faction_poll_end_time, 0),
  12509. (store_sub, ":abstain_votes", ":voter_count", ":received_votes"),
  12510. (val_mul, ":abstain_votes", 3),
  12511. (val_div, ":abstain_votes", 10),
  12512. (store_add, ":total_votes", ":received_votes", ":abstain_votes"),
  12513. (val_max, ":total_votes", 1),
  12514. (store_mul, ":vote_ratio", ":yes_votes", 100),
  12515. (val_div, ":vote_ratio", ":total_votes"),
  12516. (try_begin),
  12517. (ge, ":vote_ratio", "$g_valid_vote_ratio"),
  12518. (assign, ":poll_result", poll_result_yes),
  12519. (else_try),
  12520. (assign, ":poll_result", poll_result_no),
  12521. (try_end),
  12522. (call_script, "script_apply_poll_consequences", ":poll_faction_id", ":poll_result"),
  12523. (try_end),
  12524. ]),
  12525.  
  12526. ("apply_poll_consequences", # server: try to apply the poll consequences, displaying the result to voters
  12527. [(store_script_param, ":poll_faction_id", 1),
  12528. (store_script_param, ":poll_result", 2), # constants starting with poll_result_
  12529.  
  12530. (faction_get_slot, ":poll_type", ":poll_faction_id", slot_faction_poll_type),
  12531. (faction_get_slot, ":value_1", ":poll_faction_id", slot_faction_poll_value_1),
  12532. (try_begin),
  12533. (this_or_next|eq, ":poll_result", poll_result_yes),
  12534. (eq, ":poll_result", poll_result_admin_yes),
  12535. (this_or_next|eq, ":poll_type", poll_type_kick_player),
  12536. (eq, ":poll_type", poll_type_faction_lord),
  12537. (player_is_active, ":value_1"),
  12538. (player_get_unique_id, ":check_unique_id", ":value_1"),
  12539. (faction_get_slot, ":target_unique_id", ":poll_faction_id", slot_faction_poll_target_unique_id),
  12540. (else_try),
  12541. (assign, ":check_unique_id", -1),
  12542. (assign, ":target_unique_id", -1),
  12543. (try_end),
  12544. (get_max_players, ":max_players"),
  12545. (try_for_range, ":player_id", 1, ":max_players"),
  12546. (player_is_active, ":player_id"),
  12547. (this_or_next|eq, ":poll_faction_id", factions_end),
  12548. (player_slot_eq, ":player_id", slot_player_faction_id, ":poll_faction_id"),
  12549. (player_set_slot, ":player_id", slot_player_poll_faction_id, 0),
  12550. (multiplayer_send_int_to_player, ":player_id", server_event_show_poll, ":poll_result"),
  12551. (neq, ":check_unique_id", ":target_unique_id"),
  12552. (player_get_unique_id, ":check_unique_id", ":value_1"),
  12553. (eq, ":check_unique_id", ":target_unique_id"),
  12554. (assign, ":value_1", ":player_id"),
  12555. (try_end),
  12556. (try_begin),
  12557. (neq, ":poll_result", poll_result_yes),
  12558. (neq, ":poll_result", poll_result_admin_yes),
  12559. (else_try),
  12560. (eq, ":poll_type", poll_type_change_scene),
  12561. (assign, "$g_next_scene", ":value_1"),
  12562. (else_try),
  12563. (eq, ":poll_type", poll_type_kick_player),
  12564. (player_is_active, ":value_1"),
  12565. (eq, ":check_unique_id", ":target_unique_id"),
  12566. (kick_player, ":value_1"),
  12567. (else_try),
  12568. (eq, ":poll_type", poll_type_ban_player),
  12569. (ban_player_using_saved_ban_info),
  12570. (else_try),
  12571. (eq, ":poll_type", poll_type_faction_lord),
  12572. (this_or_next|neg|player_is_active, ":value_1"),
  12573. (eq, ":check_unique_id", ":target_unique_id"),
  12574. (call_script, "script_cf_faction_set_lord", ":value_1", ":target_unique_id", ":poll_faction_id"),
  12575. (try_end),
  12576. ]),
  12577.  
  12578. ("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
  12579. [
  12580. (set_fixed_point_multiplier, 1000),
  12581. (multiplayer_get_my_player, ":my_player_id"),
  12582. (player_get_agent_id, ":my_agent_id", ":my_player_id"),
  12583. (assign, ":closest_score", int(math.sqrt(select_agent_max_x * select_agent_max_x + select_agent_max_y * select_agent_max_y))),
  12584. (convert_to_fixed_point, ":closest_score"),
  12585. (assign, "$g_target_agent_id", -1),
  12586. (mission_cam_get_position, pos1),
  12587. (try_for_agents, ":agent_id"),
  12588. (agent_is_human, ":agent_id"),
  12589. (agent_set_slot, ":agent_id", slot_agent_is_targeted, 0),
  12590. (neq, ":agent_id", ":my_agent_id"),
  12591. (agent_get_item_slot, ":body_item_id", ":agent_id", ek_body),
  12592. (neq, ":body_item_id", "itm_invisible_body"),
  12593. (agent_get_position, pos2, ":agent_id"),
  12594. (position_move_z, pos2, 160),
  12595. (agent_get_horse, ":horse", ":agent_id"),
  12596. (try_begin),
  12597. (ge, ":horse", 0),
  12598. (position_move_z, pos2, 80),
  12599. (try_end),
  12600. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  12601. (le, ":sq_distance", sq(max_distance_to_see_labels)),
  12602. (position_has_line_of_sight_to_position, pos1, pos2),
  12603. (position_get_screen_projection, pos3, pos2),
  12604. (position_get_x, ":x_pos", pos3),
  12605. (val_sub, ":x_pos", presentation_max_x / 2),
  12606. (val_abs, ":x_pos"),
  12607. (lt, ":x_pos", select_agent_max_x),
  12608. (position_get_y, ":y_pos", pos3),
  12609. (val_sub, ":y_pos", presentation_max_y / 2),
  12610. (val_abs, ":y_pos"),
  12611. (lt, ":y_pos", select_agent_max_y),
  12612. (val_mul, ":x_pos", ":x_pos"),
  12613. (val_mul, ":y_pos", ":y_pos"),
  12614. (store_add, ":score", ":x_pos", ":y_pos"),
  12615. (convert_to_fixed_point, ":score"),
  12616. (store_sqrt, ":score", ":score"),
  12617. (lt, ":score", ":closest_score"),
  12618. (assign, ":closest_score", ":score"),
  12619. (assign, "$g_target_agent_id", ":agent_id"),
  12620. (try_end),
  12621. (try_begin),
  12622. (gt, "$g_target_agent_id", -1),
  12623. (agent_get_position, pos2, "$g_target_agent_id"),
  12624. (particle_system_burst, "psys_target_agent", pos2, 1),
  12625. (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
  12626. (agent_get_player_id, ":target_player_id", "$g_target_agent_id"),
  12627. (try_begin),
  12628. (player_is_active, ":target_player_id"),
  12629. (assign, "$g_target_player_id", ":target_player_id"),
  12630. (assign, "$g_target_player_overlay_id", -1),
  12631. (player_set_slot, "$g_target_player_id", slot_player_list_button_id, -1),
  12632. (try_end),
  12633. (try_begin),
  12634. (neg|is_presentation_active, "prsnt_target_agent_name"),
  12635. (start_presentation, "prsnt_target_agent_name"),
  12636. (try_end),
  12637. (else_try),
  12638. (player_is_active, "$g_target_player_id"),
  12639. (player_slot_eq, "$g_target_player_id", slot_player_list_button_id, -1),
  12640. (assign, "$g_target_player_id", -1),
  12641. (try_end),
  12642. (set_fixed_point_multiplier, 100),
  12643. ]),
  12644.  
  12645. ("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
  12646. [
  12647. (set_fixed_point_multiplier, 1000),
  12648. (multiplayer_get_my_player, ":player_id"),
  12649. (try_begin),
  12650. (player_is_active, ":player_id"),
  12651. (player_get_agent_id, ":agent_id", ":player_id"),
  12652. (agent_is_active, ":agent_id"),
  12653. (agent_is_alive, ":agent_id"),
  12654. (assign, ":closest_score", int(math.sqrt(select_agent_max_x * select_agent_max_x + select_agent_max_y * select_agent_max_y))),
  12655. (convert_to_fixed_point, ":closest_score"),
  12656. (assign, "$g_target_corpse_instance_id", -1),
  12657. (mission_cam_get_position, pos1),
  12658. (scene_spawned_item_get_num_instances, ":corpse_count", "itm_agent_corpse"),
  12659. (try_for_range, ":corpse_no", 0, ":corpse_count"),
  12660. (scene_spawned_item_get_instance, ":corpse_instance_id", "itm_agent_corpse", ":corpse_no"),
  12661. (scene_prop_set_slot, ":corpse_instance_id", slot_scene_prop_inventory_targeted, 0),
  12662. (prop_instance_get_position, pos2, ":corpse_instance_id"),
  12663. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  12664. (le, ":sq_distance", sq(max_distance_to_see_labels)),
  12665. (position_get_screen_projection, pos3, pos2),
  12666. (position_get_x, ":x_pos", pos3),
  12667. (val_sub, ":x_pos", presentation_max_x / 2),
  12668. (val_abs, ":x_pos"),
  12669. (lt, ":x_pos", select_agent_max_x),
  12670. (position_get_y, ":y_pos", pos3),
  12671. (val_sub, ":y_pos", presentation_max_y / 2),
  12672. (val_abs, ":y_pos"),
  12673. (lt, ":y_pos", select_agent_max_y),
  12674. (val_mul, ":x_pos", ":x_pos"),
  12675. (val_mul, ":y_pos", ":y_pos"),
  12676. (store_add, ":score", ":x_pos", ":y_pos"),
  12677. (convert_to_fixed_point, ":score"),
  12678. (store_sqrt, ":score", ":score"),
  12679. (lt, ":score", ":closest_score"),
  12680. (assign, ":closest_score", ":score"),
  12681. (assign, "$g_target_corpse_instance_id", ":corpse_instance_id"),
  12682. (try_end),
  12683. (try_begin),
  12684. (gt, "$g_target_corpse_instance_id", -1),
  12685. (prop_instance_get_position, pos2, "$g_target_corpse_instance_id"),
  12686. (particle_system_burst, "psys_target_agent", pos2, 1),
  12687. (scene_prop_set_slot, "$g_target_corpse_instance_id", slot_scene_prop_inventory_targeted, 1),
  12688. (try_end),
  12689. (try_end),
  12690. (set_fixed_point_multiplier, 100),
  12691. ]),
  12692.  
  12693. ("loot_target_corpse", # clients: request to loot the currently targeted corpse
  12694. [
  12695. (try_begin),
  12696. (prop_instance_is_valid, "$g_target_corpse_instance_id"),
  12697. (scene_prop_slot_eq, "$g_target_corpse_instance_id", slot_scene_prop_inventory_targeted, 1),
  12698. (multiplayer_get_my_player, ":player_id"),
  12699. (player_is_active, ":player_id"),
  12700. (player_get_agent_id, ":agent_id", ":player_id"),
  12701. (agent_is_active, ":agent_id"),
  12702. (agent_is_alive, ":agent_id"),
  12703. (agent_get_position, pos1, ":agent_id"),
  12704. (prop_instance_get_position, pos2, "$g_target_corpse_instance_id"),
  12705. (get_sq_distance_between_positions, ":sq_distance", pos1, pos2),
  12706. (try_begin),
  12707. (le, ":sq_distance", sq(max_distance_to_loot)),
  12708. (scene_prop_set_slot, "$g_target_corpse_instance_id", slot_scene_prop_inventory_count, corpse_inventory_slots),
  12709. (scene_prop_set_slot, "$g_target_corpse_instance_id", slot_scene_prop_inventory_max_length, corpse_inventory_max_length),
  12710. (multiplayer_send_2_int_to_server, client_event_agent_loot_armor, "$g_target_corpse_instance_id"),
  12711. (else_try),
  12712. (call_script, "script_preset_message", "str_too_far_away_loot", preset_message_error, 0, 0),
  12713. (try_end),
  12714. (try_end),
  12715. ]),
  12716.  
  12717. ("cf_admin_action", # server: check player requests to use admin tools, applying if successful
  12718. [(store_script_param, ":admin_action", 1), # constants starting with admin_action_
  12719. (store_script_param, ":admin_player_id", 2), # must be valid
  12720. (store_script_param, ":target_player_id", 3), # either the target player id or 0 for no target
  12721.  
  12722. (player_is_admin, ":admin_player_id"),
  12723. (this_or_next|eq, ":target_player_id", 0),
  12724. (player_is_active, ":target_player_id"),
  12725. (try_begin),
  12726. (eq, ":admin_action", admin_action_kick_player),
  12727. (player_slot_eq, ":admin_player_id", slot_player_admin_no_kick, 0),
  12728. (kick_player, ":target_player_id"),
  12729. (else_try),
  12730. (eq, ":admin_action", admin_action_ban_player_temp),
  12731. (player_slot_eq, ":admin_player_id", slot_player_admin_no_temporary_ban, 0),
  12732. (ban_player, ":target_player_id", 1, ":admin_player_id"),
  12733. (else_try),
  12734. (eq, ":admin_action", admin_action_ban_player_perm),
  12735. (player_slot_eq, ":admin_player_id", slot_player_admin_no_permanent_ban, 0),
  12736. (ban_player, ":target_player_id", 0, ":admin_player_id"),
  12737. (else_try),
  12738. (eq, ":admin_action", admin_action_mute_player),
  12739. (player_slot_eq, ":admin_player_id", slot_player_admin_no_mute, 0),
  12740. (player_get_is_muted, ":is_muted", ":target_player_id"),
  12741. (try_begin),
  12742. (eq, ":is_muted", 0),
  12743. (assign, ":is_muted", 1),
  12744. (else_try),
  12745. (assign, ":is_muted", 0),
  12746. (try_end),
  12747. (player_set_is_muted, ":target_player_id", ":is_muted", 1),
  12748. (else_try),
  12749. (player_get_agent_id, ":admin_agent_id", ":admin_player_id"),
  12750. (neq, ":target_player_id", 0),
  12751. (player_get_agent_id, ":target_agent_id", ":target_player_id"),
  12752. (agent_is_active, ":target_agent_id"),
  12753. (try_begin), # beginning of tools that target another agent
  12754. (eq, ":admin_action", admin_action_kill_player),
  12755. (player_slot_eq, ":admin_player_id", slot_player_admin_no_kill_fade, 0),
  12756. (agent_deliver_damage_to_agent, ":target_agent_id", ":target_agent_id", 500),
  12757. (else_try),
  12758. (eq, ":admin_action", admin_action_fade_player_out),
  12759. (player_slot_eq, ":admin_player_id", slot_player_admin_no_kill_fade, 0),
  12760. (agent_fade_out, ":target_agent_id"),
  12761. (try_for_range, ":player_equip_slot", slot_player_equip_item_0, slot_player_equip_end),
  12762. (player_set_slot, ":target_player_id", ":player_equip_slot", 0),
  12763. (try_end),
  12764. (agent_get_slot, ":freeze_instance_id", ":target_agent_id", slot_agent_freeze_instance_id),
  12765. (try_begin),
  12766. (gt, ":freeze_instance_id", -1),
  12767. (call_script, "script_remove_scene_prop", ":freeze_instance_id"),
  12768. (agent_set_slot, ":target_agent_id", slot_agent_freeze_instance_id, -1),
  12769. (try_end),
  12770. (player_set_slot, ":target_player_id", slot_player_spawn_state, player_spawn_state_dead),
  12771. (else_try),
  12772. (eq, ":admin_action", admin_action_freeze_player),
  12773. (player_slot_eq, ":admin_player_id", slot_player_admin_no_freeze, 0),
  12774. (agent_get_horse, ":horse_agent_id", ":target_agent_id"),
  12775. (agent_get_slot, ":freeze_instance_id", ":target_agent_id", slot_agent_freeze_instance_id),
  12776. (try_begin),
  12777. (gt, ":freeze_instance_id", -1),
  12778. (call_script, "script_remove_scene_prop", ":freeze_instance_id"),
  12779. (agent_set_slot, ":target_agent_id", slot_agent_freeze_instance_id, -1),
  12780. (agent_set_speed_modifier, ":target_agent_id", 100),
  12781. (try_begin),
  12782. (gt, ":horse_agent_id", -1),
  12783. (agent_set_speed_modifier, ":horse_agent_id", 100),
  12784. (try_end),
  12785. (else_try),
  12786. (try_begin),
  12787. (gt, ":horse_agent_id", -1),
  12788. (assign, ":freeze_scene_prop_id", "spr_code_freeze_horse_agent"),
  12789. (agent_set_speed_modifier, ":horse_agent_id", 0),
  12790. (else_try),
  12791. (assign, ":freeze_scene_prop_id", "spr_code_freeze_agent"),
  12792. (try_end),
  12793. (agent_get_position, pos1, ":target_agent_id"),
  12794. (call_script, "script_reuse_or_spawn_scene_prop", ":freeze_scene_prop_id"),
  12795. (prop_instance_set_position, reg0, pos1),
  12796. (agent_set_slot, ":target_agent_id", slot_agent_freeze_instance_id, reg0),
  12797. (agent_set_speed_modifier, ":target_agent_id", 0),
  12798. (try_end),
  12799. (else_try),
  12800. (player_slot_eq, ":admin_player_id", slot_player_admin_no_teleport_self, 0),
  12801. (this_or_next|eq, ":admin_action", admin_action_teleport_to_player),
  12802. (eq, ":admin_action", admin_action_teleport_behind_player),
  12803. (agent_is_active, ":admin_agent_id"),
  12804. (try_begin),
  12805. (eq, ":admin_action", admin_action_teleport_to_player),
  12806. (agent_get_position, pos1, ":target_agent_id"),
  12807. (position_move_y, pos1, 100),
  12808. (else_try),
  12809. (eq, ":admin_action", admin_action_teleport_behind_player),
  12810. (agent_get_position, pos1, ":target_agent_id"),
  12811. (position_move_y, pos1, -200),
  12812. (try_end),
  12813. (agent_set_position, ":admin_agent_id", pos1),
  12814. (else_try),
  12815. (assign, ":admin_action", -1),
  12816. (try_end), # end of tools that target another agent
  12817. (else_try),
  12818. (player_slot_eq, ":admin_player_id", slot_player_admin_no_teleport_self, 0),
  12819. (eq, ":admin_action", admin_action_teleport_forwards),
  12820. (agent_is_active, ":admin_agent_id"),
  12821. (agent_get_position, pos1, ":admin_agent_id"),
  12822. (position_move_y, pos1, 300),
  12823. (position_move_z, pos1, 100),
  12824. (agent_set_position, ":admin_agent_id", pos1),
  12825. (else_try),
  12826. (player_slot_eq, ":admin_player_id", slot_player_admin_no_admin_items, 0),
  12827. (try_begin),
  12828. (eq, ":admin_action", admin_action_get_armor),
  12829. (troop_set_slot, "trp_temp_array", slot_player_equip_head, "itm_black_helmet"),
  12830. (troop_set_slot, "trp_temp_array", slot_player_equip_body, "itm_black_armor"),
  12831. (troop_set_slot, "trp_temp_array", slot_player_equip_foot, "itm_black_greaves"),
  12832. (troop_set_slot, "trp_temp_array", slot_player_equip_gloves, "itm_gauntlets"),
  12833. (else_try),
  12834. (eq, ":admin_action", admin_action_get_invisible),
  12835. (troop_set_slot, "trp_temp_array", slot_player_equip_head, "itm_invisible_head"),
  12836. (troop_set_slot, "trp_temp_array", slot_player_equip_body, "itm_invisible_body"),
  12837. (troop_set_slot, "trp_temp_array", slot_player_equip_foot, "itm_invisible_foot"),
  12838. (troop_set_slot, "trp_temp_array", slot_player_equip_gloves, "itm_invisible_hand"),
  12839. (else_try),
  12840. (troop_set_slot, "trp_temp_array", slot_player_equip_body, 0),
  12841. (try_end),
  12842. (neg|troop_slot_eq, "trp_temp_array", slot_player_equip_body, 0),
  12843. (agent_is_active, ":admin_agent_id"),
  12844. (agent_get_item_slot, ":equipped_item_id", ":admin_agent_id", ek_body),
  12845. (try_begin), # if the admin body armor selected is already equipped, return the previous armor
  12846. (troop_slot_eq, "trp_temp_array", slot_player_equip_body, ":equipped_item_id"),
  12847. (try_for_range, ":slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  12848. (player_get_slot, ":item_id", ":target_player_id", ":slot"),
  12849. (try_begin),
  12850. (neq, ":item_id", -1),
  12851. (val_abs, ":item_id"),
  12852. (ge, ":item_id", all_items_begin),
  12853. (else_try),
  12854. (store_sub, ":item_id", ":slot", slot_player_equip_head),
  12855. (val_add, ":item_id", "itm_no_head"),
  12856. (try_end),
  12857. (troop_set_slot, "trp_temp_array", ":slot", ":item_id"),
  12858. (try_end),
  12859. (else_try),
  12860. (eq, ":admin_action", admin_action_get_invisible),
  12861. (agent_equip_item, ":admin_agent_id", "itm_invisible_sword"),
  12862. (try_end),
  12863. (try_for_range, ":slot", slot_player_equip_head, slot_player_equip_gloves + 1),
  12864. (troop_get_slot, ":item_id", "trp_temp_array", ":slot"),
  12865. (call_script, "script_change_armor", ":admin_agent_id", ":item_id"),
  12866. (try_end),
  12867. (else_try),
  12868. (eq, ":admin_action", admin_action_refill_health),
  12869. (player_slot_eq, ":admin_player_id", slot_player_admin_no_heal_self, 0),
  12870. (agent_is_active, ":admin_agent_id"),
  12871. (agent_set_hit_points, ":admin_agent_id", 100, 0),
  12872. (call_script, "script_cf_clean_blood", ":admin_agent_id"),
  12873. (else_try),
  12874. (eq, ":admin_action", admin_action_become_godlike),
  12875. (player_slot_eq, ":admin_player_id", slot_player_admin_no_godlike_troop, 0),
  12876. (agent_is_active, ":admin_agent_id"),
  12877. (player_get_troop_id, ":troop_id", ":admin_player_id"),
  12878. (try_begin), # if the admin is already using the godlike hero, return to the previous troop
  12879. (eq, ":troop_id", "trp_godlike_hero"),
  12880. (player_get_slot, ":new_troop_id", ":admin_player_id", slot_player_non_lord_troop_id),
  12881. (try_begin),
  12882. (neg|is_between, ":new_troop_id", playable_troops_begin, playable_troops_end),
  12883. (assign, ":new_troop_id", playable_troops_begin),
  12884. (player_set_slot, ":admin_player_id", slot_player_non_lord_troop_id, playable_troops_begin),
  12885. (try_end),
  12886. (else_try),
  12887. (player_set_slot, ":admin_player_id", slot_player_non_lord_troop_id, ":troop_id"),
  12888. (assign, ":new_troop_id", "trp_godlike_hero"),
  12889. (try_end),
  12890. (player_set_troop_id, ":admin_player_id", ":new_troop_id"),
  12891. (agent_set_hit_points, ":admin_agent_id", 100, 0),
  12892. (call_script, "script_player_add_equipped_items", ":admin_player_id", ":new_troop_id"),
  12893. (call_script, "script_player_add_spawn_items", ":admin_player_id", 1),
  12894. (call_script, "script_player_respawn_in_place", ":admin_player_id"),
  12895. (else_try),
  12896. (eq, ":admin_action", admin_action_get_horse),
  12897. (player_slot_eq, ":admin_player_id", slot_player_admin_no_admin_items, 0),
  12898. (agent_is_active, ":admin_agent_id"),
  12899. (agent_get_position, pos1, ":admin_agent_id"),
  12900. (position_move_x, pos1, 50),
  12901. (position_set_z_to_ground_level, pos1),
  12902. (set_spawn_position, pos1),
  12903. (spawn_horse, "itm_admin_horse"),
  12904. (else_try),
  12905. (eq, ":admin_action", admin_action_remove_horses),
  12906. (player_slot_eq, ":admin_player_id", slot_player_admin_no_admin_items, 0),
  12907. (try_for_agents, ":horse_agent_id"),
  12908. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  12909. (eq, ":horse_item_id", "itm_admin_horse"),
  12910. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  12911. (try_begin),
  12912. (neg|agent_is_active, ":rider_agent_id"),
  12913. (agent_fade_out, ":horse_agent_id"),
  12914. (else_try),
  12915. (agent_get_player_id, ":rider_player_id", ":rider_agent_id"),
  12916. (player_is_active, ":rider_player_id", ":rider_agent_id"),
  12917. (player_is_admin, ":rider_player_id"),
  12918. (else_try),
  12919. (try_begin),
  12920. (agent_is_active, ":admin_agent_id"),
  12921. (assign, ":killer_agent_id", ":admin_agent_id"),
  12922. (else_try),
  12923. (assign, ":killer_agent_id", ":horse_agent_id"),
  12924. (try_end),
  12925. (agent_deliver_damage_to_agent, ":killer_agent_id", ":horse_agent_id", 1000),
  12926. (agent_fade_out, ":horse_agent_id"),
  12927. (try_end),
  12928. (try_end),
  12929. (else_try),
  12930. (eq, ":admin_action", admin_action_remove_stray_horses),
  12931. (player_slot_eq, ":admin_player_id", slot_player_admin_no_animals, 0),
  12932. (try_for_agents, ":horse_agent_id"),
  12933. (agent_get_item_id, ":horse_item_id", ":horse_agent_id"),
  12934. (gt, ":horse_item_id", -1),
  12935. (agent_get_rider, ":rider_agent_id", ":horse_agent_id"),
  12936. (neg|agent_is_active, ":rider_agent_id"),
  12937. (neg|agent_slot_ge, ":horse_agent_id", slot_agent_horse_last_rider, 0),
  12938. (agent_slot_eq, ":horse_agent_id", slot_agent_animal_herd_manager, -1),
  12939. (agent_get_attached_scene_prop, ":attached_instance_id", ":horse_agent_id"),
  12940. (neg|prop_instance_is_valid, ":attached_instance_id"),
  12941. (agent_fade_out, ":horse_agent_id"),
  12942. (try_end),
  12943. (else_try),
  12944. (eq, ":admin_action", admin_action_teleport_to_ships),
  12945. (player_slot_eq, ":admin_player_id", slot_player_admin_no_ships, 0),
  12946. (agent_is_active, ":admin_agent_id"),
  12947. (troop_get_slot, ":loop_end", "trp_ship_array", slot_ship_array_count),
  12948. (gt, ":loop_end", 0),
  12949. (val_add, ":loop_end", slot_ship_array_begin),
  12950. (player_get_slot, ":target_ship_slot", ":admin_player_id", slot_player_teleport_to_ship_no),
  12951. (try_for_range, ":unused", slot_ship_array_begin, ":loop_end"),
  12952. (val_add, ":target_ship_slot", 1),
  12953. (try_begin),
  12954. (neg|is_between, ":target_ship_slot", slot_ship_array_begin, ":loop_end"),
  12955. (assign, ":target_ship_slot", slot_ship_array_begin),
  12956. (try_end),
  12957. (troop_get_slot, ":instance_id", "trp_ship_array", ":target_ship_slot"),
  12958. (scene_prop_slot_eq, ":instance_id", slot_scene_prop_state, scene_prop_state_active),
  12959. (assign, ":loop_end", -1),
  12960. (try_end),
  12961. (try_begin),
  12962. (eq, ":loop_end", -1),
  12963. (prop_instance_get_position, pos1, ":instance_id"),
  12964. (position_move_z, pos1, 500, 1),
  12965. (agent_set_position, ":admin_agent_id", pos1),
  12966. (player_set_slot, ":admin_player_id", slot_player_teleport_to_ship_no, ":target_ship_slot"),
  12967. (try_end),
  12968. (else_try),
  12969. (eq, ":admin_action", admin_action_reset_ships),
  12970. (player_slot_eq, ":admin_player_id", slot_player_admin_no_ships, 0),
  12971. (troop_get_slot, ":ship_array_count", "trp_ship_array", slot_ship_array_count),
  12972. (gt, ":ship_array_count", 0),
  12973. (store_add, ":loop_end", slot_ship_array_begin, ":ship_array_count"),
  12974. (try_for_range, ":ship_slot", slot_ship_array_begin, ":loop_end"),
  12975. (troop_get_slot, ":hull_instance_id", "trp_ship_array", ":ship_slot"),
  12976. (assign, ":reset", 0),
  12977. (try_begin), # reset all destroyed ships
  12978. (scene_prop_slot_eq, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_destroyed),
  12979. (assign, ":reset", 1),
  12980. (else_try), # and also any that the admin is standing on
  12981. (agent_is_active, ":admin_agent_id"),
  12982. (scene_prop_has_agent_on_it, ":hull_instance_id", ":admin_agent_id"),
  12983. (assign, ":reset", 2),
  12984. (try_end),
  12985. (gt, ":reset", 0),
  12986. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_state, scene_prop_state_active),
  12987. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_position, 0),
  12988. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_position, 0),
  12989. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_rotation, 0),
  12990. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_target_rotation, 0),
  12991. (scene_prop_get_slot, ":hit_points", ":hull_instance_id", slot_scene_prop_full_hit_points),
  12992. (scene_prop_set_hit_points, ":hull_instance_id", ":hit_points"),
  12993. (scene_prop_set_slot, ":hull_instance_id", slot_scene_prop_next_resource_hp, ":hit_points"),
  12994. (prop_instance_get_starting_position, pos1, ":hull_instance_id"),
  12995. (prop_instance_stop_animating, ":hull_instance_id"),
  12996. (prop_instance_set_position, ":hull_instance_id", pos1),
  12997. (scene_prop_get_slot, ":sail_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail),
  12998. (try_begin),
  12999. (gt, ":sail_instance_id", -1),
  13000. (prop_instance_stop_animating, ":sail_instance_id"),
  13001. (set_fixed_point_multiplier, 100),
  13002. (init_position, pos2),
  13003. (position_set_z, pos2, z_position_to_hide_object),
  13004. (prop_instance_set_position, ":sail_instance_id", pos2),
  13005. (try_end),
  13006. (scene_prop_get_slot, ":sail_off_instance_id", ":hull_instance_id", slot_scene_prop_linked_sail_off),
  13007. (try_begin),
  13008. (gt, ":sail_off_instance_id", -1),
  13009. (prop_instance_stop_animating, ":sail_off_instance_id"),
  13010. (prop_instance_set_position, ":sail_off_instance_id", pos1),
  13011. (try_end),
  13012. (scene_prop_get_slot, ":ramp_instance_id", ":hull_instance_id", slot_scene_prop_linked_ramp),
  13013. (try_begin),
  13014. (gt, ":ramp_instance_id", -1),
  13015. (prop_instance_stop_animating, ":ramp_instance_id"),
  13016. (prop_instance_get_variation_id, ":ramp_start_position", ":hull_instance_id"),
  13017. (try_begin),
  13018. (gt, ":ramp_start_position", 1),
  13019. (assign, ":ramp_start_position", -1),
  13020. (try_end),
  13021. (call_script, "script_ship_get_ramp_relative_position", ":ramp_start_position", 1),
  13022. (position_transform_position_to_parent, pos2, pos1, pos30),
  13023. (prop_instance_set_position, ":ramp_instance_id", pos2),
  13024. (try_end),
  13025. (try_begin),
  13026. (scene_prop_get_slot, ":hold_instance_id", ":hull_instance_id", slot_scene_prop_linked_hold),
  13027. (gt, ":hold_instance_id", -1),
  13028. (prop_instance_stop_animating, ":hold_instance_id"),
  13029. (prop_instance_set_position, ":hold_instance_id", pos1),
  13030. (eq, ":reset", 1),
  13031. (scene_prop_get_slot, ":inventory_slot_end", ":hold_instance_id", slot_scene_prop_inventory_count),
  13032. (gt, ":inventory_slot_end", 0),
  13033. (val_add, ":inventory_slot_end", slot_scene_prop_inventory_begin),
  13034. (try_for_range, ":inventory_slot", slot_scene_prop_inventory_begin, ":inventory_slot_end"),
  13035. (scene_prop_set_slot, ":hold_instance_id", ":inventory_slot", 0),
  13036. (try_end),
  13037. (try_end),
  13038. (try_begin),
  13039. (eq, ":reset", 2),
  13040. (entry_point_get_position, pos2, 0),
  13041. (agent_set_position, ":admin_agent_id", pos2),
  13042. (try_end),
  13043. (try_end),
  13044. (else_try),
  13045. (eq, ":admin_action", admin_action_lock_faction),
  13046. (player_slot_eq, ":admin_player_id", slot_player_admin_no_factions, 0),
  13047. (player_get_slot, ":faction_id", ":admin_player_id", slot_player_faction_id),
  13048. (is_between, ":faction_id", castle_factions_begin, factions_end),
  13049. (faction_get_slot, ":locked", ":faction_id", slot_faction_is_locked),
  13050. (try_begin),
  13051. (eq, ":locked", 0),
  13052. (assign, ":locked", 1),
  13053. (str_clear, s4),
  13054. (else_try),
  13055. (assign, ":locked", 0),
  13056. (str_store_string, s4, "str_un"),
  13057. (try_end),
  13058. (faction_set_slot, ":faction_id", slot_faction_is_locked, ":locked"),
  13059. (get_max_players, ":max_players"),
  13060. (try_for_range, ":other_player_id", 1, ":max_players"),
  13061. (player_is_active, ":other_player_id"),
  13062. (multiplayer_send_3_int_to_player, ":other_player_id", server_event_faction_set_slot, ":faction_id", slot_faction_is_locked, ":locked"),
  13063. (try_end),
  13064. (str_store_faction_name, s5, ":faction_id"),
  13065. (else_try),
  13066. (assign, ":admin_action", -1),
  13067. (try_end),
  13068. (gt, ":admin_action", -1),
  13069. (store_add, ":log_string_id", admin_action_log_strings_begin, ":admin_action"),
  13070. (str_store_string, s3, ":log_string_id"),
  13071. (player_get_unique_id, reg0, ":admin_player_id"),
  13072. (str_store_player_username, s0, ":admin_player_id"),
  13073. (try_begin),
  13074. (neq, ":target_player_id", 0),
  13075. (neq, ":target_player_id", ":admin_player_id"),
  13076. (player_get_unique_id, reg1, ":target_player_id"),
  13077. (str_store_player_username, s1, ":target_player_id"),
  13078. (assign, ":log_string_id", "str_log_admin_target_player"),
  13079. (else_try),
  13080. (assign, ":log_string_id", "str_log_admin_target_self"),
  13081. (try_end),
  13082. (server_add_message_to_log, ":log_string_id"),
  13083. ]),
  13084.  
  13085. ("cf_faction_admin_action", # server: check player requests to use faction lord tools, applying if successful
  13086. [(store_script_param, ":action", 1), # constants starting with faction_admin_action_
  13087. (store_script_param, ":sender_player_id", 2), # must be valid
  13088. (store_script_param, ":value_1", 3),
  13089.  
  13090. (player_get_slot, ":faction_id", ":sender_player_id", slot_player_faction_id),
  13091. (player_get_unique_id, ":unique_id", ":sender_player_id"),
  13092. (faction_slot_eq, ":faction_id", slot_faction_lord_player_uid, ":unique_id"),
  13093. (assign, ":fail", 0),
  13094. (try_begin),
  13095. (eq, ":action", faction_admin_action_change_banner),
  13096. (is_between, ":value_1", banner_meshes_begin, banner_meshes_end),
  13097. (assign, ":loop_end", factions_end),
  13098. (try_for_range, ":other_faction_id", factions_begin, ":loop_end"), # ensure that the banner is not currently in use by another faction
  13099. (faction_slot_eq, ":other_faction_id", slot_faction_banner_mesh, ":value_1"),
  13100. (faction_slot_eq, ":other_faction_id", slot_faction_is_active, 1),
  13101. (assign, ":loop_end", -1),
  13102. (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"),
  13103. (try_end),
  13104. (neq, ":loop_end", -1),
  13105. (call_script, "script_cf_check_enough_gold", ":sender_player_id", faction_cost_change_banner),
  13106. (call_script, "script_player_adjust_gold", ":sender_player_id", faction_cost_change_banner, -1),
  13107. (faction_set_slot, ":faction_id", slot_faction_banner_mesh, ":value_1"),
  13108. (get_max_players, ":max_players"),
  13109. (try_for_range, ":player_id", 1, ":max_players"),
  13110. (player_is_active, ":player_id"),
  13111. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", slot_faction_banner_mesh, ":value_1"),
  13112. (try_end),
  13113. (call_script, "script_redraw_castle_banners", redraw_faction_banners, ":faction_id"),
  13114. (else_try),
  13115. (this_or_next|eq, ":action", faction_admin_action_kick_player),
  13116. (eq, ":action", faction_admin_action_outlaw_player),
  13117. (player_is_active, ":value_1"),
  13118. (player_slot_eq, ":value_1", slot_player_faction_id, ":faction_id"),
  13119. (neq, ":value_1", ":sender_player_id"),
  13120. (faction_slot_eq, ":faction_id", slot_faction_poll_end_time, 0),
  13121. (assign, ":continue", 1),
  13122. (try_begin),
  13123. (eq, ":action", faction_admin_action_kick_player),
  13124. (assign, ":cost", faction_cost_kick_player),
  13125. (else_try),
  13126. (assign, ":cost", faction_cost_outlaw_player),
  13127. (player_get_slot, ":outlaw_rating", ":value_1", slot_player_outlaw_rating),
  13128. (le, ":outlaw_rating", 0),
  13129. (assign, ":continue", 0),
  13130. (try_end),
  13131. (eq, ":continue", 1),
  13132. (try_begin),
  13133. (player_slot_eq, ":value_1", slot_player_last_faction_kicked_from, ":faction_id"),
  13134. (else_try),
  13135. (call_script, "script_cf_check_enough_gold", ":sender_player_id", ":cost"),
  13136. (call_script, "script_player_adjust_gold", ":sender_player_id", ":cost", -1),
  13137. (else_try),
  13138. (assign, ":continue", 0),
  13139. (try_end),
  13140. (eq, ":continue", 1),
  13141. (player_set_troop_id, ":value_1", "trp_peasant"),
  13142. (try_begin),
  13143. (eq, ":action", faction_admin_action_kick_player),
  13144. (call_script, "script_change_faction", ":value_1", "fac_commoners", change_faction_type_no_respawn),
  13145. (else_try),
  13146. (call_script, "script_player_change_check_outlaw_rating", ":value_1", outlaw_rating_for_lord_outlawed, 1),
  13147. (try_end),
  13148. (player_set_slot, ":value_1", slot_player_last_faction_kicked_from, ":faction_id"),
  13149. (else_try),
  13150. (eq, ":action", faction_admin_action_mute_player),
  13151. (player_is_active, ":value_1"),
  13152. (player_slot_eq, ":value_1", slot_player_faction_id, ":faction_id"),
  13153. (try_begin),
  13154. (player_slot_eq, ":value_1", slot_player_faction_chat_muted, 0),
  13155. (faction_slot_eq, ":faction_id", slot_faction_poll_end_time, 0),
  13156. (assign, ":is_muted", 1),
  13157. (else_try),
  13158. (assign, ":is_muted", 0),
  13159. (try_end),
  13160. (player_set_slot, ":value_1", slot_player_faction_chat_muted, ":is_muted"),
  13161. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_player_set_slot, ":value_1", slot_player_faction_chat_muted, ":is_muted"),
  13162. (else_try),
  13163. (assign, ":key_slot", -1),
  13164. (try_begin),
  13165. (eq, ":action", faction_admin_action_toggle_player_door_key),
  13166. (assign, ":key_slot", slot_player_has_faction_door_key),
  13167. (else_try),
  13168. (eq, ":action", faction_admin_action_toggle_player_money_key),
  13169. (assign, ":key_slot", slot_player_has_faction_money_key),
  13170. (else_try),
  13171. (eq, ":action", faction_admin_action_toggle_player_item_key),
  13172. (assign, ":key_slot", slot_player_has_faction_item_key),
  13173. (else_try),
  13174. (eq, ":action", faction_admin_action_toggle_player_announce),
  13175. (assign, ":key_slot", slot_player_can_faction_announce),
  13176. (try_end),
  13177. (gt, ":key_slot", -1),
  13178. (player_is_active, ":value_1"),
  13179. (player_slot_eq, ":value_1", slot_player_faction_id, ":faction_id"),
  13180. (try_begin),
  13181. (player_slot_eq, ":value_1", ":key_slot", 0),
  13182. (assign, ":has_key", 1),
  13183. (else_try),
  13184. (assign, ":has_key", 0),
  13185. (try_end),
  13186. (player_set_slot, ":value_1", ":key_slot", ":has_key"),
  13187. (multiplayer_send_3_int_to_player, ":sender_player_id", server_event_player_set_slot, ":value_1", ":key_slot", ":has_key"),
  13188. (else_try),
  13189. (assign, ":new_relation", -1),
  13190. (try_begin),
  13191. (eq, ":action", faction_admin_action_set_relation_hostile),
  13192. (assign, ":new_relation", 0),
  13193. (else_try),
  13194. (eq, ":action", faction_admin_action_set_relation_peaceful),
  13195. (assign, ":new_relation", 1),
  13196. (try_end),
  13197. (gt, ":new_relation", -1),
  13198. (is_between, ":value_1", castle_factions_begin, factions_end),
  13199. (faction_slot_eq, ":value_1", slot_faction_is_active, 1),
  13200. (store_add, ":relation_slot", slot_faction_relations_begin, ":value_1"),
  13201. (faction_get_slot, ":previous_relation", ":faction_id", ":relation_slot"),
  13202. (faction_set_slot, ":faction_id", ":relation_slot", ":new_relation"),
  13203. (call_script, "script_display_faction_relation_change", ":faction_id", ":value_1", ":previous_relation", ":new_relation"),
  13204. (get_max_players, ":max_players"),
  13205. (try_for_range, ":player_id", 1, ":max_players"),
  13206. (player_is_active, ":player_id"),
  13207. (multiplayer_send_3_int_to_player, ":player_id", server_event_faction_set_slot, ":faction_id", ":relation_slot", ":new_relation"),
  13208. (try_end),
  13209. (else_try),
  13210. (assign, ":fail", 1),
  13211. (try_end),
  13212. (eq, ":fail", 0),
  13213. ]),
  13214.  
  13215. ("initialize_animation_menu_strings", # set up the starting and ending string ids for the animation menu
  13216. [
  13217. (troop_set_slot, "trp_animation_menu_strings", 0, "str_menu_guestures"), # offset 0 is for the main menu to select sub menus
  13218. (troop_set_slot, "trp_animation_menu_strings", 0 + animation_menu_end_offset, "str_anim_cheer"),
  13219. (troop_set_slot, "trp_animation_menu_strings", 1, "str_anim_cheer"),
  13220. (troop_set_slot, "trp_animation_menu_strings", 1 + animation_menu_end_offset, "str_anim_away_vile_beggar"),
  13221. (troop_set_slot, "trp_animation_menu_strings", 2, "str_anim_away_vile_beggar"),
  13222. (troop_set_slot, "trp_animation_menu_strings", 2 + animation_menu_end_offset, "str_anim_war_cry"),
  13223. (troop_set_slot, "trp_animation_menu_strings", 3, "str_anim_war_cry"),
  13224. (troop_set_slot, "trp_animation_menu_strings", 3 + animation_menu_end_offset, "str_anim_stand_and_deliver"),
  13225. (troop_set_slot, "trp_animation_menu_strings", 4, "str_anim_stand_and_deliver"),
  13226. (troop_set_slot, "trp_animation_menu_strings", 4 + animation_menu_end_offset, "str_log_animation"),
  13227. ]),
  13228.  
  13229. ("initialize_animation_durations", []), # copies animation durations in milliseconds from module_animations.py to slots of trp_animation_durations
  13230.  
  13231. ])
  13232.  
  13233. first_animation_menu_entry = True
  13234. # Define an animation and / or sound for triggering from the animation menu. See the recognized parameters in the script below.
  13235. def animation_menu_entry(string_id, **kwargs):
  13236. result = [(else_try), (eq, ":string_id", string_id)]
  13237. global first_animation_menu_entry
  13238. if first_animation_menu_entry:
  13239. result = result[1:]
  13240. first_animation_menu_entry = False
  13241. for name in kwargs:
  13242. value = kwargs[name]
  13243. if not isinstance(value, basestring):
  13244. value = int(value)
  13245. result.append((assign, ":" + name, value))
  13246. return lazy.block(result)
  13247.  
  13248. scripts.extend([
  13249.  
  13250. ("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
  13251. [(store_script_param, ":player_id", 1), # must be valid
  13252. (store_script_param, ":string_id", 2),
  13253. (store_script_param, ":only_test", 3), # if 1, the level of tests passed is returned in reg0
  13254.  
  13255. (assign, ":test_passed", 0),
  13256. (try_begin),
  13257. (player_get_is_muted, ":is_muted", ":player_id"),
  13258. (this_or_next|eq, ":is_muted", 0),
  13259. (neg|multiplayer_is_server),
  13260. (player_get_agent_id, ":agent_id", ":player_id"),
  13261. (agent_is_active, ":agent_id"),
  13262. (agent_is_alive, ":agent_id"),
  13263. (store_mission_timer_a_msec, ":time_ms"),
  13264. (agent_get_slot, ":end_time_ms", ":agent_id", slot_agent_animation_end_time_ms),
  13265. (gt, ":time_ms", ":end_time_ms"),
  13266. (agent_get_slot, ":recent_animations_delay_ms", ":agent_id", slot_agent_recent_animations_delay_ms),
  13267. (try_begin),
  13268. (is_between, ":string_id", animation_strings_begin, animation_strings_end),
  13269. (agent_slot_eq, ":agent_id", slot_agent_last_animation_string_id, ":string_id"),
  13270. (else_try),
  13271. (val_sub, ":recent_animations_delay_ms", 5000),
  13272. (try_end),
  13273. (store_add, ":delayed_time_ms", ":recent_animations_delay_ms", ":end_time_ms"),
  13274. (gt, ":time_ms", ":delayed_time_ms"),
  13275. (assign, ":test_passed", 1),
  13276.  
  13277. (assign, ":animation", -1), # optional agent animation played
  13278. (assign, ":woman_alt_animation", -1), # optional alternate animation played if the agent is a woman.
  13279. (assign, ":upper_body_only", 1), # 0 = override the full body movement animations, 1 = override the upper body parts only
  13280. (assign, ":sound", -1), # optional sound to play for men or women
  13281. (assign, ":man_sound", -1), # optional sound to play only for men
  13282. (assign, ":woman_sound", -1), # optional sound to play only for women
  13283. (assign, ":duration_ms", 0), # duration in milliseconds: animations are set automatically, but this should be set when only playing a sound
  13284. (assign, ":prevent_if_wielding", 0), # 1 = prevent this animation from being triggered if the agent is wielding any items
  13285. (assign, ":prevent_if_moving", 0), # 1 = prevent this animation from being triggered if the agent is moving
  13286. (assign, ":add_to_chat", 0), # display the animation string in the local chat for near the player
  13287. (try_begin), # the first script parameter is the name string id, which must be in the appropriate section of module_strings.py
  13288. animation_menu_entry("str_anim_cheer", animation="anim_cheer", man_sound="snd_man_victory"),
  13289. animation_menu_entry("str_anim_clap", animation="anim_man_clap", woman_alt_animation="anim_woman_clap", prevent_if_wielding=1),
  13290. animation_menu_entry("str_anim_raise_sword", animation="anim_pose_raise_sword"),
  13291. animation_menu_entry("str_anim_hands_on_hips", animation="anim_pose_hands_on_hips", prevent_if_wielding=1, prevent_if_moving=1),
  13292. animation_menu_entry("str_anim_arms_crossed", animation="anim_pose_arms_crossed", prevent_if_wielding=1, prevent_if_moving=1),
  13293. animation_menu_entry("str_anim_stand_still", animation="anim_stand_lord", woman_alt_animation="anim_stand_lady", prevent_if_moving=1),
  13294. animation_menu_entry("str_anim_away_vile_beggar", man_sound="snd_away_vile_beggar", duration_ms=2100, add_to_chat=1),
  13295. animation_menu_entry("str_anim_my_lord", man_sound="snd_my_lord", duration_ms=700, add_to_chat=1),
  13296. animation_menu_entry("str_anim_almost_harvesting_season", man_sound="snd_almost_harvesting_season", duration_ms=1900, add_to_chat=1),
  13297. animation_menu_entry("str_anim_whats_this_then", man_sound="snd_whats_this_then", duration_ms=1300, add_to_chat=1),
  13298. 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),
  13299. animation_menu_entry("str_anim_we_ride_to_war", man_sound="snd_we_ride_to_war", duration_ms=2600, add_to_chat=1),
  13300. animation_menu_entry("str_anim_less_talking_more_raiding", man_sound="snd_less_talking_more_raiding", duration_ms=1900, add_to_chat=1),
  13301. animation_menu_entry("str_anim_you_there_stop", man_sound="snd_you_there_stop", duration_ms=1700, add_to_chat=1),
  13302. animation_menu_entry("str_anim_war_cry", man_sound="snd_man_warcry", woman_sound="snd_woman_yell", duration_ms=2100),
  13303. 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),
  13304. 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),
  13305. animation_menu_entry("str_anim_drink_from_your_skull", man_sound="snd_drink_from_your_skull", duration_ms=1800, add_to_chat=1),
  13306. 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),
  13307. animation_menu_entry("str_anim_nice_head_on_shoulders", man_sound="snd_nice_head_on_shoulders", duration_ms=2400, add_to_chat=1),
  13308. animation_menu_entry("str_anim_hunt_you_down", man_sound="snd_hunt_you_down", duration_ms=2100, add_to_chat=1),
  13309. 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),
  13310. animation_menu_entry("str_anim_stand_and_deliver", man_sound="snd_stand_and_deliver", duration_ms=1500, add_to_chat=1),
  13311. 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),
  13312. 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),
  13313. animation_menu_entry("str_anim_word_about_purse_belongings", man_sound="snd_word_about_purse_belongings", duration_ms=3800, add_to_chat=1),
  13314. 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),
  13315. animation_menu_entry("str_anim_everything_has_a_price", man_sound="snd_everything_has_a_price", duration_ms=3100, add_to_chat=1),
  13316. animation_menu_entry("str_anim_slit_your_throat", man_sound="snd_slit_your_throat", duration_ms=2400, add_to_chat=1),
  13317. (else_try),
  13318. (assign, ":string_id", -1),
  13319. (try_end),
  13320. (gt, ":string_id", -1),
  13321.  
  13322. (player_get_gender, ":gender", ":player_id"),
  13323. (try_begin),
  13324. (eq, ":gender", tf_female),
  13325. (gt, ":woman_alt_animation", -1),
  13326. (assign, ":animation", ":woman_alt_animation"),
  13327. (try_end),
  13328. (player_get_agent_id, ":agent_id", ":player_id"),
  13329. (try_begin),
  13330. (eq, ":prevent_if_wielding", 1),
  13331. (agent_get_wielded_item, ":weapon", ":agent_id", 0),
  13332. (agent_get_wielded_item, ":shield", ":agent_id", 0),
  13333. (this_or_next|neq, ":weapon", -1),
  13334. (neq, ":shield", -1),
  13335. (assign, ":animation", -1),
  13336. (try_end),
  13337. (try_begin),
  13338. (eq, ":prevent_if_moving", 1),
  13339. (set_fixed_point_multiplier, 100),
  13340. (agent_get_speed, pos0, ":agent_id"),
  13341. (position_get_y, ":forwards_speed", pos0),
  13342. (position_get_x, ":sideways_speed", pos0),
  13343. (this_or_next|gt, ":forwards_speed", 10),
  13344. (gt, ":sideways_speed", 10),
  13345. (assign, ":animation", -1),
  13346. (try_end),
  13347. (try_begin),
  13348. (eq, ":gender", tf_male),
  13349. (gt, ":man_sound", -1),
  13350. (assign, ":sound", ":man_sound"),
  13351. (else_try),
  13352. (eq, ":gender", tf_female),
  13353. (gt, ":woman_sound", -1),
  13354. (assign, ":sound", ":woman_sound"),
  13355. (try_end),
  13356. (this_or_next|gt, ":animation", -1),
  13357. (this_or_next|gt, ":sound", -1),
  13358. (eq, ":add_to_chat", 1),
  13359. (assign, ":test_passed", 2),
  13360. (eq, ":only_test", 0),
  13361. (try_begin),
  13362. (multiplayer_is_server),
  13363. (str_store_player_username, s1, ":player_id"),
  13364. (str_store_string, s0, ":string_id"),
  13365. (server_add_message_to_log, "str_log_animation"),
  13366. (try_begin),
  13367. (eq, ":add_to_chat", 1),
  13368. (get_max_players, ":max_players"),
  13369. (agent_get_position, pos0, ":agent_id"),
  13370. (try_for_range, ":other_player_id", 1, ":max_players"),
  13371. (player_is_active, ":other_player_id"),
  13372. (try_begin),
  13373. (eq, ":player_id", ":other_player_id"),
  13374. (else_try),
  13375. (player_get_agent_id, ":other_agent_id", ":other_player_id"),
  13376. (agent_is_active, ":other_agent_id"),
  13377. (agent_is_alive, ":other_agent_id"),
  13378. (agent_get_position, pos1, ":other_agent_id"),
  13379. (get_sq_distance_between_positions, ":distance", pos0, pos1),
  13380. (le, ":distance", sq(max_distance_local_animation)),
  13381. (else_try),
  13382. (assign, ":other_player_id", -1),
  13383. (try_end),
  13384. (neq, ":other_player_id", -1),
  13385. (multiplayer_send_2_int_to_player, ":other_player_id", server_event_local_animation, ":player_id", ":string_id"),
  13386. (try_end),
  13387. (try_end),
  13388. (try_begin),
  13389. (gt, ":animation", -1),
  13390. (agent_set_animation, ":agent_id", ":animation", ":upper_body_only"),
  13391. (try_end),
  13392. (try_begin),
  13393. (gt, ":sound", -1),
  13394. (agent_play_sound, ":agent_id", ":sound"),
  13395. (try_end),
  13396. (try_end),
  13397. (try_begin),
  13398. (gt, ":animation", -1),
  13399. (eq, ":duration_ms", 0),
  13400. (troop_get_slot, ":duration_ms", "trp_animation_durations", ":animation"),
  13401. (try_end),
  13402. (store_add, ":next_end_time_ms", ":time_ms", ":duration_ms"),
  13403. (store_sub, ":next_animation_delay_ms", ":time_ms", ":end_time_ms"),
  13404. (try_begin),
  13405. (lt, ":next_animation_delay_ms", 40000),
  13406. (store_sub, ":next_animation_delay_ms", 10000, ":next_animation_delay_ms"),
  13407. (val_div, ":next_animation_delay_ms", 2),
  13408. (agent_get_slot, ":last_animation_delay_ms", ":agent_id", slot_agent_recent_animations_delay_ms),
  13409. (val_add, ":next_animation_delay_ms", ":last_animation_delay_ms"),
  13410. (val_max, ":next_animation_delay_ms", 0),
  13411. (else_try),
  13412. (assign, ":next_animation_delay_ms", 0),
  13413. (try_end),
  13414. (agent_set_slot, ":agent_id", slot_agent_animation_end_time_ms, ":next_end_time_ms"),
  13415. (agent_set_slot, ":agent_id", slot_agent_last_animation_string_id, ":string_id"),
  13416. (agent_set_slot, ":agent_id", slot_agent_recent_animations_delay_ms, ":next_animation_delay_ms"),
  13417. (try_begin),
  13418. (neg|multiplayer_is_server),
  13419. (multiplayer_send_int_to_server, client_event_request_animation, ":string_id"),
  13420. (else_try),
  13421. (store_sub, ":excessive_repetition_damage", ":next_animation_delay_ms", 12000),
  13422. (gt, ":excessive_repetition_damage", 0),
  13423. (store_agent_hit_points, ":hit_points", ":agent_id", 0),
  13424. (gt, ":hit_points", 0),
  13425. (val_div, ":excessive_repetition_damage", 1000),
  13426. (val_sub, ":hit_points", ":excessive_repetition_damage"),
  13427. (agent_set_hit_points, ":agent_id", ":hit_points", 0),
  13428. (try_end),
  13429. (assign, ":test_passed", 3),
  13430. (try_end),
  13431. (assign, reg0, ":test_passed"),
  13432. (this_or_next|ge, ":test_passed", 3),
  13433. (neq, ":only_test", 0),
  13434. ]),
  13435.  
  13436. ])
  13437.  
  13438. # Fill a chest's inventory slot with a set load out of items at mission start.
  13439. # 'load_out_id' is the value 2 of the scene prop set in the scene editor.
  13440. # 'item_lists' is the rest of the parameters passed as lists: multiple lists passed are treated as alternate load outs to be randomly selected.
  13441. def chest_load_out(load_out_id, *item_lists):
  13442. result = [(eq, ":load_out_id", load_out_id)]
  13443. if len(item_lists) > 1:
  13444. result.extend([(store_random_in_range, ":random", 0, len(item_lists)),
  13445. (try_begin)])
  13446. for i, item_list in enumerate(item_lists):
  13447. result.append((eq, ":random", i))
  13448. result.extend((scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_begin + j, item_id)
  13449. for j, item_id in enumerate(item_list))
  13450. result.append((else_try))
  13451. result[-1] = (try_end)
  13452. else:
  13453. result.extend((scene_prop_set_slot, ":instance_id", slot_scene_prop_inventory_begin + i, item_id)
  13454. for i, item_id in enumerate(item_lists[0]))
  13455. result.append((else_try))
  13456. return lazy.block(result)
  13457.  
  13458. scripts.extend([
  13459.  
  13460. ("scene_fill_chests_starting_inventory",
  13461. [
  13462. (call_script, "script_chests_fill_starting_inventory", "spr_pw_item_chest_a"),
  13463. (call_script, "script_chests_fill_starting_inventory", "spr_pw_item_chest_b"),
  13464. (call_script, "script_chests_fill_starting_inventory", "spr_pw_item_chest_invisible"),
  13465. ]),
  13466.  
  13467. ("chests_fill_starting_inventory",
  13468. [(store_script_param, ":scene_prop_id", 1),
  13469.  
  13470. (scene_prop_get_num_instances, ":num_instances", ":scene_prop_id"),
  13471. (try_for_range, ":instance_no", 0, ":num_instances"),
  13472. (scene_prop_get_instance, ":instance_id", ":scene_prop_id", ":instance_no"),
  13473. (prop_instance_get_variation_id_2, ":load_out_id", ":instance_id"),
  13474. (gt, ":load_out_id", 0),
  13475. (try_begin),
  13476.  
  13477. chest_load_out(1, ["itm_bread"] * 3, ["itm_bread"] * 5, ["itm_cooked_fish"] * 4, ["itm_cooked_meat"] * 2),
  13478. chest_load_out(2, ["itm_bread"] * 10, ["itm_bread"] * 16, ["itm_cooked_fish"] * 7, ["itm_cooked_meat"] * 6, ["itm_carrot"] * 3),
  13479. chest_load_out(3, ["itm_bread"] * 5 + ["itm_cooked_fish"] * 5 + ["itm_cooked_meat"] * 5 + ["itm_meat_pie"] * 3,
  13480. ["itm_meat_pie"] * 4 + ["itm_cooked_fish"] * 6 + ["itm_cooked_meat"] * 2 + ["itm_bread"] * 10,
  13481. ["itm_grapes"] * 10 + ["itm_salted_fish"] * 3 + ["itm_salted_meat"] * 4 + ["itm_bread"] * 7),
  13482. chest_load_out(4, ["itm_beer_cask"] + ["itm_cooked_meat"] * 5, ["itm_bread"] * 23,
  13483. ["itm_beer_cask"] + ["itm_cooked_meat"] * 7, ["itm_bread"] * 15,
  13484. ["itm_beer_cask"] * 2 + ["itm_cooked_meat"] * 8, ["itm_bread"] * 17),
  13485. chest_load_out(5, ["itm_wine_barrel"] * 2 + ["itm_cooked_fish"] * 7, ["itm_bread"] * 12,
  13486. ["itm_wine_barrel"] + ["itm_cooked_meat"] * 4, ["itm_bread"] * 13,
  13487. ["itm_wine_barrel"] * 2 + ["itm_cooked_meat"] * 4 + ["itm_cooked_fish"] * 5 + ["itm_bread"] * 8),
  13488.  
  13489. 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"]),
  13490. 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"]),
  13491. chest_load_out(12, ["itm_tabard", "itm_hide_boots"] * 3, ["itm_black_robe", "itm_wrapping_boots"] * 5, ["itm_rough_tunic", "itm_wrapping_boots"] * 4),
  13492. chest_load_out(13, ["itm_tabard", "itm_ankle_boots", "itm_pelt_coat", "itm_hide_boots", "itm_rawhide_coat", "itm_fur_coat", "itm_butchering_knife"],
  13493. ["itm_black_robe", "itm_friar_robe", "itm_friar_sandals", "itm_fur_coat", "itm_wrapping_boots", "itm_hunter_boots", "itm_fishing_spear"],
  13494. ["itm_rough_tunic", "itm_wrapping_boots", "itm_leather_apron", "itm_hide_boots", "itm_coarse_tunic", "itm_coarse_tunic", "itm_cleaver"]),
  13495. chest_load_out(14, ["itm_rich_outfit", "itm_hide_boots", "itm_fur_coat", "itm_nomad_boots", "itm_lyre"], ["itm_priest_robe", "itm_priest_leggings"],
  13496. ["itm_friar_robe", "itm_friar_sandals"] * 3, ["itm_courtly_outfit", "itm_ankle_boots", "itm_lute"], ["itm_nobleman_outfit", "itm_khergit_leather_boots", "itm_die"]),
  13497. chest_load_out(15, ["itm_fur_hat", "itm_fur_coat", "itm_nomad_boots"] * 3, ["itm_priest_coif", "itm_priest_robe", "itm_priest_leggings"] * 2,
  13498. ["itm_friar_robe", "itm_friar_sandals"] * 7, ["itm_nobleman_outfit", "itm_khergit_leather_boots", "itm_courtly_outfit", "itm_ankle_boots", "itm_leather_gloves"],
  13499. ["itm_surgeon_coif", "itm_surgeon_coat", "itm_blue_hose"] * 2, ["itm_leather_jacket", "itm_khergit_leather_boots", "itm_leather_gloves"] * 2),
  13500. 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"],
  13501. ["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"],
  13502. ["itm_surgeon_coif", "itm_surgeon_coat", "itm_blue_hose", "itm_surgeon_scalpel"], ["itm_leather_jacket", "itm_khergit_leather_boots", "itm_herding_crook"] * 3),
  13503. chest_load_out(17, ["itm_leather_apron", "itm_nomad_boots"] * 5 + ["itm_bucket", "itm_scythe", "itm_woodcutter_axe", "itm_butchering_knife", "itm_broom"],
  13504. ["itm_coarse_tunic", "itm_wrapping_boots"] * 6 + ["itm_sickle", "itm_bucket", "itm_mining_pick", "itm_fishing_net", "itm_cleaver", "itm_knife"],
  13505. ["itm_tunic_with_green_cape", "itm_nomad_boots"] * 4 + ["itm_small_mining_pick", "itm_herding_crook", "itm_butchering_knife", "itm_sickle"]),
  13506. chest_load_out(18, ["itm_coarse_tunic", "itm_nomad_boots", "itm_knife"], ["itm_leather_jacket", "itm_khergit_leather_boots", "itm_lock_pick"],
  13507. ["itm_coarse_tunic", "itm_wrapping_boots", "itm_club"] + ["itm_broom"] * 6, ["itm_pilgrim_hood", "itm_pilgrim_disguise", "itm_wrapping_boots", "itm_quarter_staff"],
  13508. ["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"]),
  13509.  
  13510. chest_load_out(20, ["itm_nordic_veteran_archer_helmet", "itm_leather_jerkin", "itm_hide_boots", "itm_sword_viking_b_small",
  13511. "itm_nordic_footman_helmet", "itm_byrnie", "itm_leather_boots", "itm_one_handed_battle_axe_a",
  13512. "itm_nordic_fighter_helmet", "itm_mail_hauberk", "itm_leather_boots", "itm_leather_gloves", "itm_sword_viking_a_long",
  13513. "itm_nordic_warlord_helmet", "itm_banded_armor", "itm_mail_boots", "itm_scale_gauntlets", "itm_shortened_voulge"],
  13514. ["itm_nordic_footman_helmet", "itm_leather_jerkin", "itm_leather_boots", "itm_leather_gloves", "itm_sword_viking_c"] * 3,
  13515. ["itm_nordic_archer_helmet", "itm_leather_armor", "itm_hunter_boots", "itm_one_handed_war_axe_b"] * 2 +
  13516. ["itm_nordic_fighter_helmet", "itm_byrnie", "itm_splinted_leather_greaves", "itm_leather_gloves",] * 2 + ["itm_one_handed_battle_axe_b", "itm_two_handed_axe"]),
  13517. chest_load_out(21, ["itm_vaegir_fur_helmet", "itm_leather_vest_plain", "itm_hide_boots", "itm_scimitar",
  13518. "itm_vaegir_spiked_helmet", "itm_lamellar_vest", "itm_mail_chausses", "itm_leather_gloves", "itm_scimitar_b",
  13519. "itm_vaegir_noble_helmet", "itm_lamellar_armor", "itm_mail_boots", "itm_scale_gauntlets", "itm_bardiche"],
  13520. ["itm_vaegir_lamellar_helmet", "itm_studded_leather_coat", "itm_leather_boots", "itm_leather_gloves", "itm_khergit_sword_d"] * 3,
  13521. ["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"]),
  13522. chest_load_out(22, ["itm_mail_coif", "itm_arena_armor", "itm_mail_chausses", "itm_mail_mittens", "itm_sword_medieval_c_long"] * 4,
  13523. ["itm_skullcap", "itm_red_gambeson", "itm_splinted_greaves", "itm_winged_mace"] * 4,
  13524. ["itm_segmented_helmet", "itm_padded_leather", "itm_leather_boots", "itm_leather_gloves"] * 4 + ["itm_club_with_spike_head", "itm_long_hafted_spiked_mace"] * 2,
  13525. ["itm_flat_topped_helmet", "itm_haubergeon", "itm_mail_chausses", "itm_mail_mittens", "itm_military_cleaver_c"] * 4),
  13526. chest_load_out(23, ["itm_leather_cap", "itm_leather_vest_plain", "itm_nomad_boots", "itm_sword_medieval_a"] * 3,
  13527. ["itm_leather_steppe_cap_a", "itm_khergit_armor", "itm_khergit_leather_boots", "itm_mace_4"] * 3,
  13528. ["itm_skullcap", "itm_red_gambeson", "itm_leather_boots"] * 3 + ["itm_military_pick", "itm_military_hammer", "itm_military_sickle"]),
  13529.  
  13530. chest_load_out(30, ["itm_khergit_lady_hat_b", "itm_khergit_lady_dress_b", "itm_khergit_leather_boots", "itm_knife", "itm_bread"],
  13531. ["itm_khergit_lady_hat", "itm_khergit_lady_dress", "itm_khergit_leather_boots", "itm_knife", "itm_cooked_fish"]),
  13532. chest_load_out(31, ["itm_sarranid_head_cloth", "itm_sarranid_lady_dress", "itm_woolen_hose", "itm_sickle", "itm_bread"],
  13533. ["itm_sarranid_head_cloth_b", "itm_sarranid_lady_dress_b", "itm_woolen_hose", "itm_bucket", "itm_grapes"]),
  13534. chest_load_out(32, ["itm_bride_crown", "itm_bride_dress", "itm_bride_shoes"]),
  13535. chest_load_out(33, ["itm_lady_dress_ruby", "itm_lady_dress_green", "itm_lady_dress_blue", "itm_wimple_a", "itm_wimple_b", "itm_barbette"],
  13536. ["itm_dress", "itm_blue_dress", "itm_peasant_dress", "itm_woolen_dress", "itm_ladys_hood"],
  13537. ["itm_sarranid_common_dress", "itm_sarranid_felt_head_cloth", "itm_sarranid_common_dress_b", "itm_sarranid_felt_head_cloth_b"]),
  13538.  
  13539. chest_load_out(99, ["itm_great_helmet", "itm_plate_armor", "itm_plate_boots", "itm_gauntlets", "itm_steel_shield", "itm_morningstar"],
  13540. ["itm_winged_great_helmet", "itm_cuir_bouilli", "itm_iron_greaves", "itm_lamellar_gauntlets", "itm_bec_de_corbin_a"],
  13541. ["itm_full_helm", "itm_scale_armor", "itm_iron_greaves", "itm_scale_gauntlets", "itm_two_handed_cleaver"],
  13542. ["itm_vaegir_mask", "itm_vaegir_elite_armor", "itm_mail_boots", "itm_scale_gauntlets", "itm_two_handed_battle_axe"],
  13543. ["itm_bishop_helm", "itm_bishop_armor", "itm_bishop_chausses", "itm_bishop_gloves", "itm_bishop_mitre", "itm_bishop_crosier"]),
  13544.  
  13545. (assign, reg0, ":load_out_id"),
  13546. (display_message, "str_error_load_out_id_reg0_not_defined"),
  13547. (try_end),
  13548. (try_end),
  13549. ]),
  13550.  
  13551. ])
Add Comment
Please, Sign In to add comment