diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index 94428ba7d9b3..0f04006859e9 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -241,8 +241,16 @@ GLOBAL_LIST_INIT(whitelist_hierarchy, list(WHITELIST_NORMAL, WHITELIST_COUNCIL,
#define FACTION_LIST_MARINE list(FACTION_MARINE)
#define FACTION_LIST_HUMANOID list(FACTION_MARINE, FACTION_PMC, FACTION_WY, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_MARSHAL, FACTION_UPP, FACTION_FREELANCER, FACTION_SURVIVOR, FACTION_NEUTRAL, FACTION_COLONIST, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_YAUTJA, FACTION_ZOMBIE, FACTION_TWE)
-#define FACTION_LIST_ERT list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_MARSHAL, FACTION_TWE)
+#define FACTION_LIST_ERT list(FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO)
#define FACTION_LIST_WY list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY)
+#define FACTION_LIST_UPP list(FACTION_UPP)
+#define FACTION_LIST_CLF list(FACTION_CLF)
+#define FACTION_LIST_TWE list(FACTION_TWE)
+#define FACTION_LIST_FREELANCER list(FACTION_FREELANCER)
+#define FACTION_LIST_CONTRACTOR list(FACTION_CONTRACTOR)
+#define FACTION_LIST_MERCENARY list(FACTION_MERCENARY)
+#define FACTION_LIST_MARSHAL list(FACTION_MARSHAL)
+#define FACTION_LIST_DUTCH list(FACTION_DUTCH)
#define FACTION_LIST_MARINE_WY list(FACTION_MARINE, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY)
#define FACTION_LIST_MARINE_UPP list(FACTION_MARINE, FACTION_UPP)
#define FACTION_LIST_MARINE_TWE list(FACTION_MARINE, FACTION_TWE)
diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm
index 50aec8845dd0..e2ebffe55959 100644
--- a/code/controllers/subsystem/minimap.dm
+++ b/code/controllers/subsystem/minimap.dm
@@ -1,3 +1,6 @@
+#define CANVAS_COOLDOWN_TIME 4 MINUTES
+#define FLATTEN_MAP_COOLDOWN_TIME 3 MINUTES
+
/**
* # Minimaps subsystem
*
@@ -438,11 +441,11 @@ SUBSYSTEM_DEF(minimaps)
if(faction == FACTION_MARINE)
if(!COOLDOWN_FINISHED(GLOB, uscm_flatten_map_icon_cooldown))
return FALSE
- COOLDOWN_START(GLOB, uscm_flatten_map_icon_cooldown, flatten_map_cooldown_time)
+ COOLDOWN_START(GLOB, uscm_flatten_map_icon_cooldown, FLATTEN_MAP_COOLDOWN_TIME)
else if(faction == XENO_HIVE_NORMAL)
if(!COOLDOWN_FINISHED(GLOB, xeno_flatten_map_icon_cooldown))
return FALSE
- COOLDOWN_START(GLOB, xeno_flatten_map_icon_cooldown, flatten_map_cooldown_time)
+ COOLDOWN_START(GLOB, xeno_flatten_map_icon_cooldown, FLATTEN_MAP_COOLDOWN_TIME)
else
return FALSE
@@ -500,6 +503,8 @@ SUBSYSTEM_DEF(minimaps)
qdel(svg_store_overlay)
debug_log("SVG coordinates for [faction] are not implemented!")
+#define can_draw(faction, user) ((faction == FACTION_MARINE && skillcheck(user, SKILL_LEADERSHIP, SKILL_LEAD_EXPERT)) || (faction == XENO_HIVE_NORMAL && isqueen(user)))
+
/datum/controller/subsystem/minimaps/proc/fetch_tacmap_datum(zlevel, flags)
var/hash = "[zlevel]-[flags]"
if(hashed_tacmaps[hash])
@@ -625,9 +630,6 @@ SUBSYSTEM_DEF(minimaps)
var/toolbar_color_selection = "black"
var/toolbar_updated_selection = "black"
- var/canvas_cooldown_time = 4 MINUTES
- var/flatten_map_cooldown_time = 3 MINUTES
-
/// boolean value to keep track if the canvas has been updated or not, the value is used in tgui state.
var/updated_canvas = FALSE
/// current flattend map
@@ -740,7 +742,6 @@ SUBSYSTEM_DEF(minimaps)
else
data["canvasCooldown"] = max(GLOB.uscm_canvas_cooldown - world.time, 0)
- data["nextCanvasTime"] = canvas_cooldown_time
data["updatedCanvas"] = updated_canvas
data["lastUpdateTime"] = last_update_time
@@ -750,6 +751,7 @@ SUBSYSTEM_DEF(minimaps)
/datum/tacmap/ui_static_data(mob/user)
var/list/data = list()
+
data["mapRef"] = map_holder?.map_ref
data["canDraw"] = FALSE
data["canViewTacmap"] = TRUE
@@ -761,6 +763,7 @@ SUBSYSTEM_DEF(minimaps)
/datum/tacmap/drawing/ui_static_data(mob/user)
var/list/data = list()
+ data["canvasCooldownDuration"] = CANVAS_COOLDOWN_TIME
data["mapRef"] = map_holder?.map_ref
data["canDraw"] = FALSE
data["mapFallback"] = wiki_map_fallback
@@ -773,7 +776,7 @@ SUBSYSTEM_DEF(minimaps)
data["canViewTacmap"] = is_xeno
data["canViewCanvas"] = faction == FACTION_MARINE || faction == XENO_HIVE_NORMAL
- if(faction == FACTION_MARINE && skillcheck(user, SKILL_LEADERSHIP, SKILL_LEAD_EXPERT) || faction == XENO_HIVE_NORMAL && isqueen(user))
+ if(can_draw(faction, user))
data["canDraw"] = TRUE
data["canViewTacmap"] = TRUE
@@ -781,6 +784,8 @@ SUBSYSTEM_DEF(minimaps)
/datum/tacmap/drawing/status_tab_view/ui_static_data(mob/user)
var/list/data = list()
+
+ data["canvasCooldownDuration"] = CANVAS_COOLDOWN_TIME
data["mapFallback"] = wiki_map_fallback
data["canDraw"] = FALSE
data["canViewTacmap"] = FALSE
@@ -791,6 +796,8 @@ SUBSYSTEM_DEF(minimaps)
/datum/tacmap/drawing/status_tab_view/xeno/ui_static_data(mob/user)
var/list/data = list()
+
+ data["canvasCooldownDuration"] = CANVAS_COOLDOWN_TIME
data["mapFallback"] = wiki_map_fallback
data["canDraw"] = FALSE
data["canViewTacmap"] = FALSE
@@ -814,16 +821,21 @@ SUBSYSTEM_DEF(minimaps)
var/mob/user = ui.user
var/mob/living/carbon/xenomorph/xeno = user
var/faction = istype(xeno) ? xeno.hivenumber : user.faction
- if(faction == FACTION_NEUTRAL && isobserver(user))
+ var/is_observer = isobserver(user)
+ if(faction == FACTION_NEUTRAL && is_observer)
faction = allowed_flags == MINIMAP_FLAG_XENO ? XENO_HIVE_NORMAL : FACTION_MARINE
+ var/drawing_allowed = !is_observer && can_draw(faction, user)
- switch (action)
- if ("menuSelect")
+ switch(action)
+ if("menuSelect")
if(params["selection"] != "new canvas")
if(updated_canvas)
updated_canvas = FALSE
toolbar_updated_selection = toolbar_color_selection // doing this if it == canvas can cause a latency issue with the stroke.
else
+ if(!drawing_allowed)
+ msg_admin_niche("[key_name(user)] made an unauthorized attempt to 'menuSelect' the 'new canvas' panel of the [faction] tacmap!")
+ return FALSE
distribute_current_map_png(faction)
last_update_time = world.time
// An attempt to get the image to load on first try in the interface, but doesn't seem always reliable
@@ -832,60 +844,68 @@ SUBSYSTEM_DEF(minimaps)
old_map = get_tacmap_data_png(faction)
current_svg = get_tacmap_data_svg(faction)
- if ("updateCanvas")
- // forces state change, this will export the svg.
+ if("updateCanvas")
toolbar_updated_selection = "export"
updated_canvas = TRUE
action_queue_change += 1
- if ("clearCanvas")
+ if("clearCanvas")
toolbar_updated_selection = "clear"
updated_canvas = FALSE
action_queue_change += 1
- if ("undoChange")
+ if("undoChange")
toolbar_updated_selection = "undo"
updated_canvas = FALSE
action_queue_change += 1
- if ("selectColor")
+ if("selectColor")
var/newColor = params["color"]
if(newColor)
toolbar_color_selection = newColor
toolbar_updated_selection = newColor
action_queue_change += 1
- if ("onDraw")
+ if("onDraw")
updated_canvas = FALSE
- if ("selectAnnouncement")
+ if("selectAnnouncement")
+ if(!drawing_allowed)
+ msg_admin_niche("[key_name(user)] made an unauthorized attempt to 'selectAnnouncement' the [faction] tacmap!")
+ return FALSE
+
if(!istype(params["image"], /list)) // potentially very serious?
return FALSE
+ var/cooldown_satisfied = FALSE
if(faction == FACTION_MARINE)
- GLOB.uscm_flat_tacmap_data += new_current_map
+ cooldown_satisfied = COOLDOWN_FINISHED(GLOB, uscm_canvas_cooldown)
else if(faction == XENO_HIVE_NORMAL)
- GLOB.xeno_flat_tacmap_data += new_current_map
-
- store_current_svg_coords(faction, params["image"], user)
- current_svg = get_tacmap_data_svg(faction)
- old_map = get_tacmap_data_png(faction)
+ cooldown_satisfied = COOLDOWN_FINISHED(GLOB, xeno_canvas_cooldown)
+ if(!cooldown_satisfied)
+ msg_admin_niche("[key_name(user)] attempted to 'selectAnnouncement' the [faction] tacmap while it is still on cooldown!")
+ return FALSE
if(faction == FACTION_MARINE)
- COOLDOWN_START(GLOB, uscm_canvas_cooldown, canvas_cooldown_time)
- var/mob/living/carbon/human/human_leader = user
+ GLOB.uscm_flat_tacmap_data += new_current_map
+ COOLDOWN_START(GLOB, uscm_canvas_cooldown, CANVAS_COOLDOWN_TIME)
for(var/datum/squad/current_squad in GLOB.RoleAuthority.squads)
current_squad.send_maptext("Tactical map update in progress...", "Tactical Map:")
+ var/mob/living/carbon/human/human_leader = user
human_leader.visible_message(SPAN_BOLDNOTICE("Tactical map update in progress..."))
playsound_client(human_leader.client, "sound/effects/sos-morse-code.ogg")
notify_ghosts(header = "Tactical Map", message = "The USCM tactical map has been updated.", ghost_sound = "sound/effects/sos-morse-code.ogg", notify_volume = 80, action = NOTIFY_USCM_TACMAP, enter_link = "uscm_tacmap=1", enter_text = "View", source = owner)
-
else if(faction == XENO_HIVE_NORMAL)
- var/mutable_appearance/appearance = mutable_appearance(icon('icons/mob/hud/actions_xeno.dmi'), "toggle_queen_zoom")
- COOLDOWN_START(GLOB, xeno_canvas_cooldown, canvas_cooldown_time)
+ GLOB.xeno_flat_tacmap_data += new_current_map
+ COOLDOWN_START(GLOB, xeno_canvas_cooldown, CANVAS_COOLDOWN_TIME)
xeno_maptext("The Queen has updated our hive mind map", "We sense something unusual...", faction)
+ var/mutable_appearance/appearance = mutable_appearance(icon('icons/mob/hud/actions_xeno.dmi'), "toggle_queen_zoom")
notify_ghosts(header = "Tactical Map", message = "The Xenomorph tactical map has been updated.", ghost_sound = "sound/voice/alien_distantroar_3.ogg", notify_volume = 50, action = NOTIFY_XENO_TACMAP, enter_link = "xeno_tacmap=1", enter_text = "View", source = user, alert_overlay = appearance)
+ store_current_svg_coords(faction, params["image"], user)
+ current_svg = get_tacmap_data_svg(faction)
+ old_map = get_tacmap_data_png(faction)
+
toolbar_updated_selection = toolbar_color_selection
message_admins("[key_name(user)] has updated the tactical map for [faction].")
updated_canvas = FALSE
@@ -995,3 +1015,7 @@ SUBSYSTEM_DEF(minimaps)
if(XENO_HIVE_RENEGADE)
return MINIMAP_FLAG_XENO_RENEGADE
return 0
+
+#undef CANVAS_COOLDOWN_TIME
+#undef FLATTEN_MAP_COOLDOWN_TIME
+#undef can_draw
diff --git a/code/game/objects/items/reagent_containers/food/drinks.dm b/code/game/objects/items/reagent_containers/food/drinks.dm
index 9f88990e5350..db83723bc8df 100644
--- a/code/game/objects/items/reagent_containers/food/drinks.dm
+++ b/code/game/objects/items/reagent_containers/food/drinks.dm
@@ -23,6 +23,10 @@
to_chat(user, SPAN_DANGER("The [src.name] is empty!"))
return FALSE
+ if(HAS_TRAIT(M, TRAIT_CANNOT_EAT))
+ to_chat(user, SPAN_DANGER("[user == M ? "You are" : "[M] is"] unable to drink!"))
+ return FALSE
+
if(M == user)
to_chat(M, SPAN_NOTICE(" You swallow a gulp from \the [src]."))
if(reagents.total_volume)
diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm
index 0a1d0e8aad07..927501286f13 100644
--- a/code/game/objects/items/reagent_containers/food/snacks.dm
+++ b/code/game/objects/items/reagent_containers/food/snacks.dm
@@ -42,7 +42,7 @@
..()
if (world.time <= user.next_move)
- return
+ return FALSE
attack(user, user, "head")//zone does not matter
user.next_move += attack_speed
@@ -51,24 +51,24 @@
to_chat(user, SPAN_DANGER("None of [src] left, oh no!"))
M.drop_inv_item_on_ground(src) //so icons update :[
qdel(src)
- return 0
+ return FALSE
if(package)
to_chat(M, SPAN_WARNING("How do you expect to eat this with the package still on?"))
- return 0
+ return FALSE
if(istype(M, /mob/living/carbon))
var/mob/living/carbon/C = M
var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25)
if(fullness > NUTRITION_HIGH && world.time < C.overeat_cooldown)
to_chat(user, SPAN_WARNING("[user == M ? "You" : "They"] don't feel like eating more right now."))
- return
+ return FALSE
if(issynth(C))
fullness = 200 //Synths never get full
if(HAS_TRAIT(M, TRAIT_CANNOT_EAT)) //Do not feed the Working Joes
to_chat(user, SPAN_DANGER("[user == M ? "You are" : "[M] is"] unable to eat!"))
- return
+ return FALSE
if(fullness > NUTRITION_HIGH)
C.overeat_cooldown = world.time + OVEREAT_TIME
@@ -120,9 +120,9 @@
reagents.trans_to_ingest(M, reagents.total_volume)
bitecount++
On_Consume(M)
- return 1
+ return TRUE
- return 0
+ return FALSE
/obj/item/reagent_container/food/snacks/afterattack(obj/target, mob/user, proximity)
return ..()
diff --git a/code/modules/decorators/christmas.dm b/code/modules/decorators/christmas.dm
index 5c4126510056..6d3f52ffc0f6 100644
--- a/code/modules/decorators/christmas.dm
+++ b/code/modules/decorators/christmas.dm
@@ -51,6 +51,7 @@
helmet.icon_override = 'icons/mob/humans/onmob/head_0.dmi'
helmet.flags_inv_hide = HIDEEARS|HIDEALLHAIR
helmet.flags_marine_helmet = NO_FLAGS
+ helmet.flags_atom |= NO_SNOW_TYPE|NO_NAME_OVERRIDE
if(prob(50))
helmet.icon_state = "santa_hat_red"
else
diff --git a/code/modules/gear_presets/contractor.dm b/code/modules/gear_presets/contractor.dm
index ea77fe4a4d0f..896771d26aca 100644
--- a/code/modules/gear_presets/contractor.dm
+++ b/code/modules/gear_presets/contractor.dm
@@ -4,7 +4,7 @@
rank = JOB_CONTRACTOR
idtype = /obj/item/card/id/data
faction = FACTION_CONTRACTOR
- faction_group = FACTION_LIST_ERT
+ faction_group = list(FACTION_CONTRACTOR)
languages = list(LANGUAGE_ENGLISH, LANGUAGE_SPANISH, LANGUAGE_RUSSIAN)
var/human_versus_human = FALSE
var/headset_type = /obj/item/device/radio/headset/distress/contractor
diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm
index 5fe27c5e5167..50496cef31c5 100644
--- a/code/modules/mob/dead/observer/orbit.dm
+++ b/code/modules/mob/dead/observer/orbit.dm
@@ -53,6 +53,15 @@
var/list/survivors = list()
var/list/xenos = list()
var/list/ert_members = list()
+ var/list/upp = list()
+ var/list/clf = list()
+ var/list/wy = list()
+ var/list/twe = list()
+ var/list/freelancer = list()
+ var/list/contractor = list()
+ var/list/mercenary = list()
+ var/list/dutch = list()
+ var/list/marshal = list()
var/list/synthetics = list()
var/list/predators = list()
var/list/animals = list()
@@ -132,12 +141,30 @@
if(SSticker.mode.is_in_endgame == TRUE && !is_mainship_level(M.z) && !(human.faction in FACTION_LIST_ERT))
escaped += list(serialized)
+ else if(human.faction in FACTION_LIST_WY)
+ wy += list(serialized)
else if(issynth(human) && !isinfiltratorsynthetic(human))
synthetics += list(serialized)
else if(isyautja(human))
predators += list(serialized)
else if(human.faction in FACTION_LIST_ERT)
ert_members += list(serialized)
+ else if(human.faction in FACTION_LIST_UPP)
+ upp += list(serialized)
+ else if(human.faction in FACTION_LIST_CLF)
+ clf += list(serialized)
+ else if(human.faction in FACTION_LIST_TWE)
+ twe += list(serialized)
+ else if(human.faction in FACTION_LIST_FREELANCER)
+ freelancer += list(serialized)
+ else if(human.faction in FACTION_LIST_CONTRACTOR)
+ contractor += list(serialized)
+ else if(human.faction in FACTION_LIST_MERCENARY)
+ mercenary += list(serialized)
+ else if(human.faction in FACTION_LIST_MARSHAL)
+ marshal += list(serialized)
+ else if(human.faction in FACTION_LIST_DUTCH)
+ dutch += list(serialized)
else if(human.faction in FACTION_LIST_MARINE)
marines += list(serialized)
else if(issurvivorjob(human.job))
@@ -156,6 +183,15 @@
data["survivors"] = survivors
data["xenos"] = xenos
data["ert_members"] = ert_members
+ data["upp"] = upp
+ data["clf"] = clf
+ data["wy"] = wy
+ data["twe"] = twe
+ data["freelancer"] = freelancer
+ data["contractor"] = contractor
+ data["mercenary"] = mercenary
+ data["dutch"] = dutch
+ data["marshal"] = marshal
data["synthetics"] = synthetics
data["predators"] = predators
data["animals"] = animals
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm
index ea1c734d9482..e7f72e7e013e 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm
@@ -13,7 +13,7 @@
macro_path = /datum/action/xeno_action/verb/verb_acid_lance
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 190
+ xeno_cooldown = 19 SECONDS
// Config
var/stack_time = 10
@@ -96,7 +96,7 @@
macro_path = /datum/action/xeno_action/verb/verb_boiler_trap
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_1
- xeno_cooldown = 205
+ xeno_cooldown = 20.5 SECONDS
/// Config
var/trap_ttl = 100
@@ -112,7 +112,7 @@
macro_path = /datum/action/xeno_action/verb/verb_acid_mine
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 55
+ xeno_cooldown = 5.5 SECONDS
var/empowered = FALSE
@@ -127,7 +127,7 @@
macro_path = /datum/action/xeno_action/verb/verb_acid_shotgun
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_3
- xeno_cooldown = 130
+ xeno_cooldown = 13 SECONDS
var/ammo_type = /datum/ammo/xeno/acid_shotgun
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm
index 87f58df34472..4691d70321c3 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm
@@ -39,7 +39,7 @@
macro_path = /datum/action/xeno_action/verb/verb_crusher_stomp
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 180
+ xeno_cooldown = 18 SECONDS
plasma_cost = 30
var/damage = 65
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm
index 3949e4ac9b80..22d5f4b57aa2 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm
@@ -18,7 +18,7 @@
macro_path = /datum/action/xeno_action/verb/verb_headbutt
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 40
+ xeno_cooldown = 4 SECONDS
/datum/action/xeno_action/onclick/tail_sweep
name = "Tail Sweep"
@@ -28,7 +28,7 @@
action_type = XENO_ACTION_ACTIVATE
ability_primacy = XENO_PRIMARY_ACTION_3
plasma_cost = 10
- xeno_cooldown = 110
+ xeno_cooldown = 11 SECONDS
/datum/action/xeno_action/activable/fortify
name = "Fortify"
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm
index 91bda707ec45..ee1fed3094a7 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm
@@ -5,7 +5,7 @@
macro_path = /datum/action/xeno_action/verb/verb_pounce
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_1
- xeno_cooldown = 30
+ xeno_cooldown = 3 SECONDS
plasma_cost = 0
// Config options
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm
index 2facee1edc9d..fd525701b12d 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm
@@ -2,7 +2,7 @@
macro_path = /datum/action/xeno_action/verb/verb_pounce
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_1
- xeno_cooldown = 60
+ xeno_cooldown = 6 SECONDS
plasma_cost = 20
// Config options
@@ -70,7 +70,7 @@
macro_path = /datum/action/xeno_action/verb/verb_crippling_strike
ability_primacy = XENO_PRIMARY_ACTION_3
action_type = XENO_ACTION_ACTIVATE
- xeno_cooldown = 100
+ xeno_cooldown = 10 SECONDS
plasma_cost = 20
var/buff_duration = 50
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
index 11317bed9af1..7327454ab74e 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
@@ -25,7 +25,7 @@
macro_path = /datum/action/xeno_action/verb/verb_dash
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 110
+ xeno_cooldown = 11 SECONDS
plasma_cost = 50
// Config options
@@ -51,7 +51,7 @@
macro_path = /datum/action/xeno_action/verb/verb_cleave
ability_primacy = XENO_PRIMARY_ACTION_3
action_type = XENO_ACTION_CLICK
- xeno_cooldown = 120
+ xeno_cooldown = 12 SECONDS
// Root config
var/root_duration_unbuffed = 1 SECONDS
@@ -138,7 +138,7 @@
macro_path = /datum/action/xeno_action/verb/verb_oppressor_punch
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 100
+ xeno_cooldown = 10 SECONDS
plasma_cost = 55
// Configurables
@@ -164,7 +164,7 @@
macro_path = /datum/action/xeno_action/verb/verb_crush
ability_primacy = XENO_PRIMARY_ACTION_3
action_type = XENO_ACTION_CLICK
- xeno_cooldown = 130
+ xeno_cooldown = 13 SECONDS
plasma_cost = 80
// Config
@@ -180,7 +180,7 @@
macro_path = /datum/action/xeno_action/verb/verb_prae_impale
ability_primacy = XENO_PRIMARY_ACTION_1
action_type = XENO_ACTION_CLICK
- xeno_cooldown = 130
+ xeno_cooldown = 13 SECONDS
plasma_cost = 80
/datum/action/xeno_action/onclick/prae_dodge
@@ -191,7 +191,7 @@
ability_primacy = XENO_PRIMARY_ACTION_2
action_type = XENO_ACTION_CLICK
plasma_cost = 200
- xeno_cooldown = 190
+ xeno_cooldown = 19 SECONDS
// Config
var/duration = 70
@@ -204,7 +204,7 @@
macro_path = /datum/action/xeno_action/verb/verb_prae_tail_trip
ability_primacy = XENO_PRIMARY_ACTION_3
action_type = XENO_ACTION_CLICK
- xeno_cooldown = 130
+ xeno_cooldown = 13 SECONDS
plasma_cost = 30
// Config
@@ -224,7 +224,7 @@
macro_path = /datum/action/xeno_action/verb/verb_dash
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 100
+ xeno_cooldown = 10 SECONDS
plasma_cost = 40
// Config options
@@ -255,7 +255,7 @@
ability_primacy = XENO_PRIMARY_ACTION_4
plasma_cost = 80
- xeno_cooldown = 100
+ xeno_cooldown = 10 SECONDS
// Configurable options
spray_type = ACID_SPRAY_LINE
@@ -270,7 +270,7 @@
/datum/action/xeno_action/activable/spray_acid/prae_warden
ability_primacy = XENO_PRIMARY_ACTION_2
plasma_cost = 130
- xeno_cooldown = 130
+ xeno_cooldown = 13 SECONDS
// Configurable options
@@ -288,7 +288,7 @@
// todo: macro
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_3
- xeno_cooldown = 100
+ xeno_cooldown = 10 SECONDS
plasma_cost = 100
// Config
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm
index 4f9c5f298637..3744fb7823e8 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm
@@ -136,7 +136,7 @@
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
plasma_cost = 0
- xeno_cooldown = 100
+ xeno_cooldown = 10 SECONDS
// Config
var/shard_cost = 75
@@ -150,7 +150,7 @@
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_3
plasma_cost = 0
- xeno_cooldown = 300
+ xeno_cooldown = 30 SECONDS
// Config values
var/shard_cost = 50
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm
index 510f161d8a86..2880dd15eb5a 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm
@@ -5,7 +5,7 @@
macro_path = /datum/action/xeno_action/verb/verb_pounce
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_1
- xeno_cooldown = 30
+ xeno_cooldown = 3 SECONDS
plasma_cost = 0
// Config options
@@ -28,7 +28,7 @@
macro_path = /datum/action/xeno_action/verb/verb_runner_bonespurs
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 110
+ xeno_cooldown = 11 SECONDS
plasma_cost = 0
var/ammo_type = /datum/ammo/xeno/bone_chips/spread/runner_skillshot
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm
index abc1e43bfccd..20febc22c4a4 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm
@@ -34,7 +34,7 @@
action_type = XENO_ACTION_CLICK
plasma_cost = 50
- xeno_cooldown = 80
+ xeno_cooldown = 8 SECONDS
// Configurable options
spray_type = ACID_SPRAY_LINE // Enum for the shape of spray to do
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm
index 2c16477c1414..4f40e1914540 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm
@@ -6,7 +6,7 @@
macro_path = /datum/action/xeno_action/verb/verb_fling
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_3
- xeno_cooldown = 60
+ xeno_cooldown = 6 SECONDS
// Configurables
var/fling_distance = 4
@@ -22,7 +22,7 @@
macro_path = /datum/action/xeno_action/verb/verb_lunge
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
- xeno_cooldown = 100
+ xeno_cooldown = 10 SECONDS
// Configurables
var/grab_range = 4
@@ -36,7 +36,7 @@
macro_path = /datum/action/xeno_action/verb/verb_punch
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_1
- xeno_cooldown = 45
+ xeno_cooldown = 4.5 SECONDS
// Configurables
var/base_damage = 25
diff --git a/html/changelogs/AutoChangeLog-pr-5058.yml b/html/changelogs/AutoChangeLog-pr-5058.yml
new file mode 100644
index 000000000000..6edfaed15ce4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5058.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Factions are now properly separated in the observe menu as a ghost."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-5160.yml b/html/changelogs/AutoChangeLog-pr-5160.yml
deleted file mode 100644
index 730a2bc41181..000000000000
--- a/html/changelogs/AutoChangeLog-pr-5160.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Birdtalon"
-delete-after: True
-changes:
- - bugfix: "Lurker can tail jab over ledges and window frames."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-5241.yml b/html/changelogs/AutoChangeLog-pr-5241.yml
new file mode 100644
index 000000000000..acb4b1887337
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5241.yml
@@ -0,0 +1,4 @@
+author: "InsaneRed"
+delete-after: True
+changes:
+ - code_imp: "Converts xenomorph cooldowns into SECONDS"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-5250.yml b/html/changelogs/AutoChangeLog-pr-5250.yml
deleted file mode 100644
index a2229e1fa453..000000000000
--- a/html/changelogs/AutoChangeLog-pr-5250.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Drathek"
-delete-after: True
-changes:
- - imageadd: "Update weeded warrior sprites to be compatible with knight strain sprite"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-5259.yml b/html/changelogs/AutoChangeLog-pr-5259.yml
new file mode 100644
index 000000000000..037aa676912b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5259.yml
@@ -0,0 +1,4 @@
+author: "Ben10083"
+delete-after: True
+changes:
+ - rscdel: " Working Joes can no longer drink"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-5268.yml b/html/changelogs/AutoChangeLog-pr-5268.yml
new file mode 100644
index 000000000000..1bed5f11b860
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5268.yml
@@ -0,0 +1,4 @@
+author: "fira"
+delete-after: True
+changes:
+ - bugfix: "Fix Xmas helmets getting overriden by map camouflage."
\ No newline at end of file
diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml
index b0bde6fe0753..2e420ea0d778 100644
--- a/html/changelogs/archive/2023-12.yml
+++ b/html/changelogs/archive/2023-12.yml
@@ -403,3 +403,8 @@
realforest2001:
- maptweak: Various doors around the Almayer will now close their opposites for
better security.
+2023-12-21:
+ Birdtalon:
+ - bugfix: Lurker can tail jab over ledges and window frames.
+ Drathek:
+ - imageadd: Update weeded warrior sprites to be compatible with knight strain sprite
diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx
index 83dfe3b361b2..899947e1bec9 100644
--- a/tgui/packages/tgui/interfaces/Orbit/index.tsx
+++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx
@@ -118,6 +118,15 @@ const ObservableContent = (props, context) => {
survivors = [],
xenos = [],
ert_members = [],
+ upp = [],
+ clf = [],
+ wy = [],
+ twe = [],
+ freelancer = [],
+ mercenary = [],
+ contractor = [],
+ dutch = [],
+ marshal = [],
synthetics = [],
predators = [],
animals = [],
@@ -145,6 +154,43 @@ const ObservableContent = (props, context) => {
section={synthetics}
title="Synthetics"
/>
+
+
+
+
+
+
+
+
+
diff --git a/tgui/packages/tgui/interfaces/Orbit/types.ts b/tgui/packages/tgui/interfaces/Orbit/types.ts
index 3fe11af8e625..afbed5b16468 100644
--- a/tgui/packages/tgui/interfaces/Orbit/types.ts
+++ b/tgui/packages/tgui/interfaces/Orbit/types.ts
@@ -7,6 +7,15 @@ export type OrbitData = {
survivors: Observable[];
xenos: Observable[];
ert_members: Observable[];
+ upp: Observable[];
+ twe: Observable[];
+ clf: Observable[];
+ wy: Observable[];
+ freelancer: Observable[];
+ contractor: Observable[];
+ mercenary: Observable[];
+ dutch: Observable[];
+ marshal: Observable[];
synthetics: Observable[];
predators: Observable[];
animals: Observable[];
diff --git a/tgui/packages/tgui/interfaces/TacticalMap.tsx b/tgui/packages/tgui/interfaces/TacticalMap.tsx
index 92996038719f..0888212a83fb 100644
--- a/tgui/packages/tgui/interfaces/TacticalMap.tsx
+++ b/tgui/packages/tgui/interfaces/TacticalMap.tsx
@@ -23,7 +23,7 @@ interface TacMapProps {
mapRef: string;
currentMenu: string;
lastUpdateTime: any;
- nextCanvasTime: any;
+ canvasCooldownDuration: any;
canvasCooldown: any;
exportedTacMapImage: any;
tacmapReady: number;
@@ -192,7 +192,7 @@ const OldMapPanel = (props, context) => {
const DrawMapPanel = (props, context) => {
const { data, act } = useBackend(context);
- const timeLeftPct = data.canvasCooldown / data.nextCanvasTime;
+ const timeLeftPct = data.canvasCooldown / data.canvasCooldownDuration;
const canUpdate = data.canvasCooldown <= 0 && !data.updatedCanvas;
const handleTacMapExport = (image: any) => {