########################################################################
##################### FIRES WEAPON BASED ON STATS ######################
########################################################################
("fire_auto_weapon",[
(this_or_next|multiplayer_is_server),
(neg|game_in_multiplayer_mode),
(store_script_param, ":shooter_agent", 1),
(store_script_param, ":shooter_weapon", 2),
(store_script_param, ":shooter_ammo", 3),
(item_get_slot, ":auto_accuracy", ":shooter_weapon", slot_item_accuracy),
(store_sub, ":inaccuracy", 100, ":auto_accuracy"),
###################### CALCULATE AGENT INACCURACY #######################
(agent_get_troop_id, ":shooter_troop", ":shooter_agent"),
(store_proficiency_level, ":firing_skill", ":shooter_troop", wpt_firearm),
(store_sub, ":firing_disability", 500, ":firing_skill"),
(val_div, ":firing_disability", 10),
############################# CALCULATE WANDER ##########################
(item_get_slot, ":weapon_recoil", ":shooter_weapon", slot_item_auto_recoil),
(val_mul, ":weapon_recoil", 5),
(agent_get_slot, ":wander", ":shooter_agent", slot_agent_firearm_wander),
(val_add, ":wander", ":weapon_recoil"),
(store_mul, ":max_recoil", ":weapon_recoil", 10),
(val_min, ":wander", ":max_recoil"),
(agent_set_slot, ":shooter_agent", slot_agent_firearm_wander, ":wander"),
(agent_get_animation, ":cur_anim", ":shooter_agent", 0),
################# INCREASE INACCURACY DUE TO MOVEMENT ###################
(try_begin),
(is_between, ":cur_anim", "anim_run_forward", "anim_stand_to_crouch"),
(val_mul, ":wander", 2),
(try_end),
################### INCREASE INACCURACY DUE TO JUMP #####################
(try_begin),
(is_between, ":cur_anim", "anim_jump", "anim_stand_unarmed"),
(val_mul, ":wander", 3),
(try_end),
################# DECREASE INACCURACY DUE TO CROUCH #####################
# (try_begin),
# (this_or_next|eq, ":cur_anim", "anim_crouch_to_stand"),
# (eq, ":cur_anim", "anim_stand_to_crouch"),
# (val_mul, ":wander", 2),
# (val_div, ":wander", 3),
# (try_end),
################## DECREASE INACCURACY DUE TO PRONE #####################
# (try_begin),
# (this_or_next|eq, ":cur_anim", "anim_stand_to_prone"),
# (eq, ":cur_anim", "anim_prone_to_stand"),
# (val_div, ":wander", 2),
# (try_end),
(val_mul, ":wander", ":firing_disability"),
(val_div, ":wander", 1000),
(store_add, ":slot_wander", ":inaccuracy", ":wander"),
(agent_set_slot, ":shooter_agent", slot_agent_spread, ":slot_wander"),
################ SEND DATA NEEDED FOR PRSNT TO CLIENTS ##################
(try_begin),
(game_in_multiplayer_mode),
(neg|agent_is_non_player, ":shooter_agent"),
(agent_get_player_id, ":shooter_player", ":shooter_agent"),
(multiplayer_send_int_to_player, ":shooter_player", multiplayer_event_autofire, ":slot_wander"),
(try_end),
(item_get_slot, ":velocity", ":shooter_weapon", slot_item_shoot_speed),
(item_get_slot, ":shotgun", ":shooter_weapon", slot_item_auto_shotgun),
############# RAISE POS TO EYE LEVEL & MOVE TO END OF GUN ###############
(agent_get_look_position, pos1, ":shooter_agent"),
(position_move_z, pos1, 165, 0),
(position_move_y, pos1, 50, 0),
#################### SOUNDS AND PARTICLES PLAY HERE #####################
(item_get_slot, ":sound_id", ":shooter_weapon", slot_item_sound),
(agent_play_sound, ":shooter_agent", ":sound_id"),
#(particle_system_burst, "psys_gun_flash", pos1, 10),
############ GET INITIAL RANDOMIZED BULLET ANGLE ROTATION ###############
(store_random_in_range, ":y_rotation", 0, 360),
(position_rotate_y, pos1, ":y_rotation"),
(try_begin),
############ IF NOT SHOTGUN SPAWN BULLET WITH INACCURACY ################
(eq, ":shotgun", 0),
(val_add, ":inaccuracy", ":wander"),
(store_random_in_range, "
_inaccuracy", 0, ":inaccuracy"),
(set_fixed_point_multiplier, 10),
(position_rotate_x_floating, pos1, "
_inaccuracy"),
(set_fixed_point_multiplier, 1),
(add_missile, ":shooter_agent", pos1, ":velocity", ":shooter_weapon", ":shooter_ammo"),
(else_try),
############## IF SHOTGUN ROTATE X WITH WITH INACCURACY #################
(store_random_in_range, ":wander_movement", 0, ":wander"),
(set_fixed_point_multiplier, 10),
(position_rotate_x_floating, pos1, ":wander_movement"),
############# REPEAT FOR EACH PROJECTILE DEFINED BY ITEM ################
(try_for_range, ":repeat", 0, ":shotgun"),
(set_fixed_point_multiplier, 10),
(copy_position, pos2, pos1),
################ ROTATES EACH PROJECTILE INTO SECTORS ###################
(store_div, ":y_rotation", 360, ":shotgun"),
(val_mul, ":y_rotation", ":repeat"),
(position_rotate_y, pos2, ":y_rotation"),
############ SPAWN PROJECTILE WITH RANDOMIZED INACCURACY ################
(store_random_in_range, "
_inaccuracy", 0, ":inaccuracy"),
(position_rotate_x_floating, pos2, "
_inaccuracy"),
(set_fixed_point_multiplier, 1),
(add_missile, ":shooter_agent", pos2, ":velocity", ":shooter_weapon", ":shooter_ammo"),
(try_end),
(try_end),
]),