diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 9f4068e8450f..6f075e1dc9d2 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -71,6 +71,7 @@ var/num_specialists = 0 var/num_tl = 0 var/count = 0 //Current # in the squad + var/list/ftl_list = list() // list of marines with the actual FTL role var/list/marines_list = list() // list of mobs (or name, not always a mob ref) in that squad. var/mob/living/carbon/human/overwatch_officer = null //Who's overwatching this squad? @@ -409,6 +410,7 @@ assignment = JOB_SQUAD_TEAM_LEADER num_tl++ M.important_radio_channels += radio_freq + ftl_list += M if(JOB_SQUAD_SMARTGUN) assignment = JOB_SQUAD_SMARTGUN num_smartgun++ @@ -523,6 +525,7 @@ num_smartgun-- if(JOB_SQUAD_TEAM_LEADER) num_tl-- + ftl_list -= M if(JOB_SQUAD_LEADER) num_leaders-- diff --git a/code/modules/defenses/planted_flag.dm b/code/modules/defenses/planted_flag.dm index fac725047fa9..cb64245a4708 100644 --- a/code/modules/defenses/planted_flag.dm +++ b/code/modules/defenses/planted_flag.dm @@ -88,8 +88,8 @@ QDEL_NULL(range_bounds) /obj/structure/machinery/defenses/planted_flag/proc/apply_buff_to_player(mob/living/carbon/human/H) - H.activate_order_buff(COMMAND_ORDER_HOLD, buff_intensity, 1.5 SECONDS) - H.activate_order_buff(COMMAND_ORDER_FOCUS, buff_intensity, 1.5 SECONDS) + H.affected_by_orders(COMMAND_ORDER_HOLD, buff_intensity) + H.affected_by_orders(COMMAND_ORDER_FOCUS, buff_intensity) /obj/structure/machinery/defenses/planted_flag/range name = "extended JIMA planted flag" @@ -111,9 +111,9 @@ defense_type = "Warbanner" /obj/structure/machinery/defenses/planted_flag/warbanner/apply_buff_to_player(mob/living/carbon/human/H) - H.activate_order_buff(COMMAND_ORDER_HOLD, buff_intensity, 5 SECONDS) - H.activate_order_buff(COMMAND_ORDER_FOCUS, buff_intensity, 5 SECONDS) - H.activate_order_buff(COMMAND_ORDER_MOVE, buff_intensity, 5 SECONDS) + H.affected_by_orders(COMMAND_ORDER_HOLD, buff_intensity) + H.affected_by_orders(COMMAND_ORDER_FOCUS, buff_intensity) + H.affected_by_orders(COMMAND_ORDER_MOVE, buff_intensity) /obj/item/storage/backpack/jima name = "JIMA frame mount" @@ -153,8 +153,8 @@ if(!(H.get_target_lock(M.faction_group))) continue - H.activate_order_buff(COMMAND_ORDER_MOVE, buff_intensity, 3 SECONDS) - H.activate_order_buff(COMMAND_ORDER_FOCUS, buff_intensity, 3 SECONDS) + H.affected_by_orders(COMMAND_ORDER_MOVE, buff_intensity) + H.affected_by_orders(COMMAND_ORDER_FOCUS, buff_intensity) #undef PLANTED_FLAG_BUFF #undef PLANTED_FLAG_RANGE diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm index 502dd77a063d..90222bb47cd3 100644 --- a/code/modules/mob/living/carbon/human/human_abilities.dm +++ b/code/modules/mob/living/carbon/human/human_abilities.dm @@ -23,14 +23,13 @@ if(!ishuman(owner)) return var/mob/living/carbon/human/H = owner + if(H.current_aura) + for(var/datum/action/human_action/issue_order/order_button in H.actions) + order_button.button.icon_state = "template" + if(H.current_aura != order_type) + button.icon_state = "template_on" H.issue_order(order_type) -/datum/action/human_action/issue_order/action_cooldown_check() - if(!ishuman(owner)) - return FALSE - var/mob/living/carbon/human/H = owner - return !H.command_aura_available - /datum/action/human_action/issue_order/move name = "Issue Order - Move" action_icon_state = "order_move" diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 5c685cc3acac..59bbb5c1458b 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -408,7 +408,7 @@ This function restores all limbs. permanent_kill = FALSE, mob/firer = null, force = FALSE ) if(protection_aura && damage > 0) - damage = round(damage * ((ORDER_HOLD_CALC_LEVEL - protection_aura) / ORDER_HOLD_CALC_LEVEL)) + damage = round(damage * ((ORDER_HOLD_CALC_LEVEL - protection_aura * 0.5) / ORDER_HOLD_CALC_LEVEL)) //Handle other types of damage if(damage < 0 || (damagetype != BRUTE) && (damagetype != BURN)) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 989ee52fa63c..c036f4006570 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -93,11 +93,13 @@ var/chem_effect_flags = 0 var/chem_effect_reset_time = 8 - var/command_aura_available = TRUE // Whether or not you can issue an order + //var/command_aura_available = TRUE // Whether or not you can issue an order + var/current_aura = null //The aura we're currently emitting + var/aura_strength = 0 //Strenght of the aura we're emitting - var/mobility_aura_count = 0 //Used to track how many auras are affecting the human - var/protection_aura_count = 0 - var/marksman_aura_count = 0 + var/mobility_aura_new = 0 //Used to track how many auras are affecting the human + var/protection_aura_new = 0 + var/marksman_aura_new = 0 var/mobility_aura = 0 var/protection_aura = 0 var/marksman_aura = 0 diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index e4ed65107f03..ce3bd10b6bc4 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -76,7 +76,7 @@ . += max(0, G.slowdown - wear_slowdown_reduction) if(mobility_aura && . >= 1.5) - . = max(. - (0.1 + 0.1 * mobility_aura), 1.5) + . = max(. - (0.1 + 0.05 * mobility_aura), 1.5) if(superslowed) . += HUMAN_SUPERSLOWED_AMOUNT diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d64e5d1bfde0..600f72df9bbb 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -44,6 +44,9 @@ handle_organs() handle_blood() + //Orders + handle_orders() + //Random events (vomiting etc) if(!stat && getToxLoss() >= 45 && nutrition > 20) vomit() diff --git a/code/modules/mob/living/carbon/human/life/handle_orders.dm b/code/modules/mob/living/carbon/human/life/handle_orders.dm new file mode 100644 index 000000000000..9db15345c9e6 --- /dev/null +++ b/code/modules/mob/living/carbon/human/life/handle_orders.dm @@ -0,0 +1,38 @@ +/mob/living/carbon/human/proc/handle_orders() + + var/aura_center = null + if(current_aura) + aura_center = src + + if((src.job == JOB_SQUAD_LEADER || HAS_TRAIT(src, TRAIT_SOURCE_SQUAD_LEADER)) && src.assigned_squad && src.assigned_squad.num_tl) //If the guy giving orders is leading a squad with FTLs we need them to act as beacons + for(var/mob/living/carbon/human/marine in src.assigned_squad.ftl_list) + marine.handle_ftl_orders(marine) + + if(aura_strength > 0) + for(var/mob/living/carbon/human/H as anything in GLOB.alive_human_list) + if(H.faction != faction || H.z != z || get_dist(aura_center, H) > COMMAND_ORDER_RANGE) + continue + H.affected_by_orders(current_aura, aura_strength) + + if(mobility_aura != mobility_aura_new || protection_aura != protection_aura_new || marksman_aura != marksman_aura_new) + mobility_aura = mobility_aura_new + protection_aura = protection_aura_new + marksman_aura = marksman_aura_new + hud_set_order() + + mobility_aura_new = 0 + protection_aura_new = 0 + marksman_aura_new = 0 + +/mob/living/carbon/human/proc/affected_by_orders(order, strength) + switch(order) + if(COMMAND_ORDER_MOVE) + if(strength > mobility_aura_new) + mobility_aura_new = Clamp(mobility_aura, strength, ORDER_MOVE_MAX_LEVEL) + if(COMMAND_ORDER_HOLD) + if(strength > protection_aura_new) + protection_aura_new = Clamp(protection_aura, strength, ORDER_HOLD_MAX_LEVEL) + pain.apply_pain_reduction(protection_aura * PAIN_REDUCTION_AURA) + if(COMMAND_ORDER_FOCUS) + if(strength > marksman_aura_new) + marksman_aura_new = Clamp(marksman_aura, strength, ORDER_FOCUS_MAX_LEVEL) diff --git a/code/modules/mob/living/carbon/human/powers/issue_order.dm b/code/modules/mob/living/carbon/human/powers/issue_order.dm index 775c4f645516..e8e02cde076e 100644 --- a/code/modules/mob/living/carbon/human/powers/issue_order.dm +++ b/code/modules/mob/living/carbon/human/powers/issue_order.dm @@ -7,10 +7,6 @@ to_chat(src, SPAN_WARNING("You cannot give an order in your current state.")) return - if(!command_aura_available) - to_chat(src, SPAN_WARNING("You have recently given an order. Calm down.")) - return - if(!skills) return FALSE var/order_level = skills.get_skill_level(SKILL_LEADERSHIP) @@ -18,44 +14,51 @@ order_level = SKILL_LEAD_TRAINED if(!order) - order = tgui_input_list(src, "Choose an order", "Order to send", list(COMMAND_ORDER_MOVE, COMMAND_ORDER_HOLD, COMMAND_ORDER_FOCUS, "help", "cancel")) - if(order == "help") - to_chat(src, SPAN_NOTICE("
Orders give a buff to nearby soldiers for a short period of time, followed by a cooldown, as follows:
Move - Increased mobility and chance to dodge projectiles.
Hold - Increased resistance to pain and combat wounds.
Focus - Increased gun accuracy and effective range.
")) + if(current_aura) + deactivate_order_buff(current_aura) + current_aura = null + visible_message(SPAN_WARNING("\The [src] stops issueing orders."), \ + SPAN_WARNING("You stop issueing orders."), null, 5) return - if(order == "cancel") - return - - if(!command_aura_available) - to_chat(src, SPAN_WARNING("You have recently given an order. Calm down.")) - return - - command_aura_available = FALSE - var/command_aura_strength = order_level - var/command_aura_duration = (order_level + 1) * 10 SECONDS - - var/turf/T = get_turf(src) - for(var/mob/living/carbon/human/H in range(COMMAND_ORDER_RANGE, T)) - if(H.stat == DEAD) - continue - H.activate_order_buff(order, command_aura_strength, command_aura_duration) - - if(loc != T) //if we were inside something, the range() missed us. - activate_order_buff(order, command_aura_strength, command_aura_duration) - - for(var/datum/action/A in actions) - A.update_button_icon() - - // 1min cooldown on orders - addtimer(CALLBACK(src, PROC_REF(make_aura_available)), COMMAND_ORDER_COOLDOWN) - - visible_message(SPAN_BOLDNOTICE("[src] gives an order to [order]!"), SPAN_BOLDNOTICE("You give an order to [order]!")) - -/mob/living/carbon/human/proc/make_aura_available() - to_chat(src, SPAN_NOTICE("You can issue an order again.")) - command_aura_available = TRUE - for(var/datum/action/A in actions) - A.update_button_icon() + else + order = tgui_input_list(src, "Choose an order", "Order to send", list(COMMAND_ORDER_MOVE, COMMAND_ORDER_HOLD, COMMAND_ORDER_FOCUS, "help", "cancel")) + if(order == "help") + to_chat(src, SPAN_NOTICE("
Orders give a buff to nearby soldiers for a short period of time, followed by a cooldown, as follows:
Move - Increased mobility and chance to dodge projectiles.
Hold - Increased resistance to pain and combat wounds.
Focus - Increased gun accuracy and effective range.
")) + return + if(order == "cancel") + return + + if(order) + if(current_aura == order) + visible_message(SPAN_BOLDNOTICE("[src] whitdraws their order to [order]!"), SPAN_BOLDNOTICE("You withdraw your order to [order]!")) + deactivate_order_buff(current_aura) + current_aura = null + order = null + else + deactivate_order_buff(current_aura) + visible_message(SPAN_BOLDNOTICE("[src] gives an order to [order]!"), SPAN_BOLDNOTICE("You give an order to [order]!")) + aura_strength = order_level + current_aura = order + + handle_orders(current_aura, aura_strength) + +/mob/living/carbon/human/proc/handle_ftl_orders() + if(!assigned_squad) + return + var/mob/living/carbon/human/squad_lead = assigned_squad.squad_leader + if(!squad_lead || !squad_lead.current_aura || squad_lead.loc.z != loc.z) + if(current_aura && !squad_lead.current_aura) + to_chat(src, SPAN_BOLDNOTICE("Your radio goes quiet. The Squad Leader is no longer giving orders.")) + aura_strength = 0 + current_aura = null + else + if(current_aura != squad_lead.current_aura) + to_chat(src, SPAN_BOLDNOTICE("Your orders have changed. The Squad Leader has other plans.")) + aura_strength = squad_lead.aura_strength + current_aura = squad_lead.current_aura + handle_orders(current_aura, aura_strength) + hud_set_order() /mob/living/carbon/human/verb/issue_order_verb() set name = "Issue Order" @@ -64,49 +67,14 @@ issue_order() - -/mob/living/carbon/human/proc/activate_order_buff(order, strength, duration) - if(!order || !strength) - return - - switch(order) - if(COMMAND_ORDER_MOVE) - mobility_aura_count++ - mobility_aura = Clamp(mobility_aura, strength, ORDER_MOVE_MAX_LEVEL) - if(COMMAND_ORDER_HOLD) - protection_aura_count++ - protection_aura = Clamp(protection_aura, strength, ORDER_HOLD_MAX_LEVEL) - pain.apply_pain_reduction(protection_aura * PAIN_REDUCTION_AURA) - if(COMMAND_ORDER_FOCUS) - marksman_aura_count++ - marksman_aura = Clamp(marksman_aura, strength, ORDER_FOCUS_MAX_LEVEL) - - hud_set_order() - - if(duration) - addtimer(CALLBACK(src, PROC_REF(deactivate_order_buff), order), duration) - - /mob/living/carbon/human/proc/deactivate_order_buff(order) switch(order) if(COMMAND_ORDER_MOVE) - if(mobility_aura_count > 1) - mobility_aura_count-- - else - mobility_aura_count = 0 - mobility_aura = 0 + mobility_aura_new = 0 if(COMMAND_ORDER_HOLD) - if(protection_aura_count > 1) - protection_aura_count-- - else - pain.reset_pain_reduction() - protection_aura_count = 0 - protection_aura = 0 + pain.reset_pain_reduction() + protection_aura_new = 0 if(COMMAND_ORDER_FOCUS) - if(marksman_aura_count > 1) - marksman_aura_count-- - else - marksman_aura_count = 0 - marksman_aura = 0 + marksman_aura_new = 0 hud_set_order() diff --git a/colonialmarines.dme b/colonialmarines.dme index 304d5221ddd3..eebbb05e7c6a 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1772,6 +1772,7 @@ #include "code\modules\mob\living\carbon\human\life\handle_environment.dm" #include "code\modules\mob\living\carbon\human\life\handle_fire.dm" #include "code\modules\mob\living\carbon\human\life\handle_grabbed.dm" +#include "code\modules\mob\living\carbon\human\life\handle_orders.dm" #include "code\modules\mob\living\carbon\human\life\handle_organs.dm" #include "code\modules\mob\living\carbon\human\life\handle_pulse.dm" #include "code\modules\mob\living\carbon\human\life\handle_regular_hud_updates.dm" diff --git a/icons/mob/hud/actions.dmi b/icons/mob/hud/actions.dmi index 4d0697733207..043ac4b93ce9 100644 Binary files a/icons/mob/hud/actions.dmi and b/icons/mob/hud/actions.dmi differ