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