diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm
index 6a9e9f1d4623..6617c5aafcee 100644
--- a/code/__DEFINES/__game.dm
+++ b/code/__DEFINES/__game.dm
@@ -78,6 +78,8 @@
#define SEE_INVISIBLE_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
#define INVISIBILITY_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
+#define HIDE_INVISIBLE_OBSERVER 59 // define for when we want to hide all observer mobs.
+
#define INVISIBILITY_OBSERVER 60
#define SEE_INVISIBLE_OBSERVER 60
diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm
index 59e4c7710992..1e72f51a8d60 100644
--- a/code/__HELPERS/logging.dm
+++ b/code/__HELPERS/logging.dm
@@ -125,11 +125,11 @@ GLOBAL_VAR_INIT(log_end, world.system_type == UNIX ? ascii2text(13) : "")
GLOB.STUI.admin.Add("\[[time]]OVERWATCH: [text]")
GLOB.STUI.processing |= STUI_LOG_ADMIN
-/proc/log_idmod(obj/item/card/id/target_id, msg)
+/proc/log_idmod(obj/item/card/id/target_id, msg, changer)
var/time = time_stamp()
if (CONFIG_GET(flag/log_idmod))
- WRITE_LOG(GLOB.world_game_log, "ID MOD: [msg]")
- LOG_REDIS("idmod", "\[[time]\] [msg]")
+ WRITE_LOG(GLOB.world_game_log, "ID MOD: ([changer]) [msg]")
+ LOG_REDIS("idmod", "\[[time]\] ([changer]) [msg]")
target_id.modification_log += "\[[time]]: [msg]"
/proc/log_vote(text)
diff --git a/code/datums/ammo/bullet/revolver.dm b/code/datums/ammo/bullet/revolver.dm
index 0688e615378e..def0a8e31952 100644
--- a/code/datums/ammo/bullet/revolver.dm
+++ b/code/datums/ammo/bullet/revolver.dm
@@ -7,14 +7,13 @@
/datum/ammo/bullet/revolver
name = "revolver bullet"
headshot_state = HEADSHOT_OVERLAY_MEDIUM
-
- damage = 55
+ damage = 72
penetration = ARMOR_PENETRATION_TIER_1
accuracy = HIT_ACCURACY_TIER_1
/datum/ammo/bullet/revolver/marksman
name = "marksman revolver bullet"
-
+ damage = 55
shrapnel_chance = 0
damage_falloff = 0
accurate_range = 12
diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm
index 8a6d2fd2c8c2..1e0dedf5dd05 100644
--- a/code/datums/skills/uscm.dm
+++ b/code/datums/skills/uscm.dm
@@ -292,6 +292,7 @@ COMMAND STAFF
SKILL_LEADERSHIP = SKILL_LEAD_EXPERT,
SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED,
SKILL_MEDICAL = SKILL_MEDICAL_MEDIC,
+ SKILL_SURGERY = SKILL_SURGERY_NOVICE,
SKILL_POLICE = SKILL_POLICE_FLASH,
SKILL_FIREMAN = SKILL_FIREMAN_TRAINED,
SKILL_VEHICLE = SKILL_VEHICLE_SMALL,
diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm
index f18957a22d82..05f110ec1a0c 100644
--- a/code/game/machinery/ARES/ARES_procs.dm
+++ b/code/game/machinery/ARES/ARES_procs.dm
@@ -165,11 +165,11 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
var/datum/ares_datacore/datacore = GLOB.ares_datacore
datacore.records_bioscan.Add(new /datum/ares_record/bioscan(title, input))
-/proc/log_ares_bombardment(user_name, ob_name, coordinates)
+/proc/log_ares_bombardment(user_name, ob_name, message)
if(!ares_can_log())
return FALSE
var/datum/ares_datacore/datacore = GLOB.ares_datacore
- datacore.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user_name))
+ datacore.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, message, user_name))
/proc/log_ares_announcement(title, message)
if(!ares_can_log())
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index 3fa96ca0bc3a..4b68b397116e 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -105,15 +105,28 @@
to_chat(user, SPAN_WARNING("You need a better grip to do that!"))
return
- if(victim.abiotic(1))
+ if(victim.abiotic(TRUE))
to_chat(user, SPAN_WARNING("Subject may not have abiotic items on."))
return
user.visible_message(SPAN_DANGER("[user] starts to put [victim] into the gibber!"))
add_fingerprint(user)
+ ///If synth is getting gibbed, we will 'soft gib' them, but this is still pretty LRP so let admin know.
+ if(issynth(victim) && ishuman_strict(user) && !occupant)
+ var/turf/turf_ref = get_turf(user)
+ var/area/area = get_area(user)
+ message_admins("ALERT: [user] ([user.key]) is trying to shove [victim] in a gibber! (They are a synth, so this will delimb them) ([victim.key]) in [area.name] [ADMIN_JMP(turf_ref)]")
+ log_attack("[key_name(user)] tried to delimb [victim] using a gibber ([victim.key]) in [area.name]")
+ to_chat(user, SPAN_DANGER("What are you doing..."))
+ if(do_after(user, 30 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE && grabbed && grabbed.grabbed_thing && !occupant))
+ user.visible_message(SPAN_DANGER("[user] stuffs [victim] into the gibber!"))
+ victim.forceMove(src)
+ occupant = victim
+ update_icon()
+
///If someone's being LRP and doing funny chef shit, this lets admins know. This *shouldn't* flag preds, though.
- if(ishuman(victim) && ishuman_strict(user) && !occupant)
+ else if(ishuman(victim) && ishuman_strict(user) && !occupant)
var/turf/turf_ref = get_turf(user)
var/area/area = get_area(user)
message_admins("ALERT: [user] ([user.key]) is trying to gib [victim] ([victim.key]) in [area.name] [ADMIN_JMP(turf_ref)]")
@@ -142,18 +155,23 @@
add_fingerprint(usr)
return
-/obj/structure/machinery/gibber/proc/go_out()
+/obj/structure/machinery/gibber/proc/go_out(launch = FALSE)
if (!occupant)
- return
+ return FALSE
for(var/obj/O in src)
O.forceMove(loc)
if (occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
occupant.forceMove(loc)
+ if(launch)
+ // yeet them out of the gibber
+ visible_message(SPAN_DANGER("[occupant] suddenly is launched out of the [src]!"))
+ var/turf/Tx = locate(x - 3, y, z)
+ occupant.throw_atom(Tx, 3, SPEED_FAST, src, TRUE)
occupant = null
update_icon()
- return
+ return TRUE
/obj/structure/machinery/gibber/proc/startgibbing(mob/user as mob)
@@ -162,13 +180,18 @@
if(!occupant)
visible_message(SPAN_DANGER("You hear a loud metallic grinding sound."))
return
+ var/synthetic = issynth(occupant)
use_power(1000)
- visible_message(SPAN_DANGER("You hear a loud squelchy grinding sound."))
- operating = 1
+ if(synthetic)
+ visible_message(SPAN_BOLDWARNING("[src] begins to emitt sparks out the top as a banging noise can be heard!"), SPAN_BOLDWARNING("You hear a myriad of loud bangs!"))
+ else
+ visible_message(SPAN_DANGER("You hear a loud squelchy grinding sound."))
+ operating = TRUE
update_icon()
var/totalslabs = 2
+
var/obj/item/reagent_container/food/snacks/meat/meat_template = /obj/item/reagent_container/food/snacks/meat/monkey
if(istype(occupant, /mob/living/carbon/xenomorph))
var/mob/living/carbon/xenomorph/X = occupant
@@ -186,6 +209,35 @@
meat_template = /obj/item/reagent_container/food/snacks/meat/human
totalslabs = 3
+ // Synths only get delimbed from this. 1 meat per limb
+ if(synthetic)
+ meat_template = /obj/item/reagent_container/food/snacks/meat/synthmeat/synthflesh
+ totalslabs = 0
+ var/mob/living/carbon/human/victim = occupant
+
+ // Remove all limbs to allow synth to park closer at the supermarket
+ var/obj/limb/limb
+
+ if(victim.has_limb("l_leg"))
+ limb = victim.get_limb("r_leg")
+ totalslabs += 1
+ limb.droplimb(FALSE, TRUE, "gibber")
+
+ if(victim.has_limb("l_leg"))
+ limb = victim.get_limb("l_leg")
+ totalslabs += 1
+ limb.droplimb(FALSE, TRUE, "gibber")
+
+ if(victim.has_limb("r_arm"))
+ limb = victim.get_limb("r_arm")
+ totalslabs += 1
+ limb.droplimb(FALSE, TRUE, "gibber")
+
+ if(victim.has_limb("l_arm"))
+ limb = victim.get_limb("l_arm")
+ totalslabs += 1
+ limb.droplimb(FALSE, TRUE, "gibber")
+
var/obj/item/reagent_container/food/snacks/meat/allmeat[totalslabs]
for(var/i in 1 to totalslabs)
var/obj/item/reagent_container/food/snacks/meat/newmeat
@@ -194,26 +246,38 @@
newmeat.name = newmeat.made_from_player + newmeat.name
allmeat[i] = newmeat
- if(src.occupant.client) // Gibbed a cow with a client in it? log that shit
- src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [key_name(user)]"
+ // Synths wont die to this (on it's own at least), dont log as a gib
+ if(synthetic)
+ if(occupant.client) // Log still
+ occupant.attack_log += "\[[time_stamp()]\] Was delimbed by [key_name(user)]"
+ user.attack_log += "\[[time_stamp()]\] delimbed [key_name(occupant)]"
+ msg_admin_attack("[key_name(user)] delimbed [key_name(occupant)] with a gibber in [user.loc.name]([user.x], [user.y], [user.z]).", user.x, user.y, user.z)
+ continue
+
+ if(occupant.client) // Gibbed a cow with a client in it? log that shit
+ occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [key_name(user)]"
user.attack_log += "\[[time_stamp()]\] Gibbed [key_name(occupant)]"
msg_admin_attack("[key_name(user)] gibbed [key_name(occupant)] in [user.loc.name] ([user.x], [user.y], [user.z]).", user.x, user.y, user.z)
- src.occupant.death(create_cause_data("gibber", user), TRUE)
- src.occupant.ghostize()
+ occupant.death(create_cause_data("gibber", user), TRUE)
+ occupant.ghostize()
- QDEL_NULL(occupant)
+ if(synthetic)
+ to_chat(occupant, SPAN_HIGHDANGER("You can detect your limbs being ripped off your body, but it begins to malfunction as it reaches your torso!"))
+ addtimer(CALLBACK(src, PROC_REF(create_gibs), totalslabs, allmeat), gibtime)
+ addtimer(CALLBACK(src, PROC_REF(go_out), TRUE), gibtime)
+ return
- addtimer(CALLBACK(src, PROC_REF(create_gibs), totalslabs, allmeat), gibtime)
+ QDEL_NULL(occupant)
/obj/structure/machinery/gibber/proc/create_gibs(totalslabs, list/obj/item/reagent_container/food/snacks/allmeat)
playsound(loc, 'sound/effects/splat.ogg', 25, 1)
operating = FALSE
+ var/turf/Tx = locate(x - 1, y, z)
for (var/i in 1 to totalslabs)
var/obj/item/meatslab = allmeat[i]
- var/turf/Tx = locate(x - i, y, z)
meatslab.forceMove(loc)
- meatslab.throw_atom(Tx, i, SPEED_FAST, src)
+ meatslab.throw_atom(Tx, 1, SPEED_FAST, src)
if (!Tx.density)
if(istype(meatslab, /obj/item/reagent_container/food/snacks/meat/xenomeat))
new /obj/effect/decal/cleanable/blood/gibs/xeno(Tx)
diff --git a/code/game/objects/effects/effect_system/foam.dm b/code/game/objects/effects/effect_system/foam.dm
index 525cb8c731a9..7a06fa50619c 100644
--- a/code/game/objects/effects/effect_system/foam.dm
+++ b/code/game/objects/effects/effect_system/foam.dm
@@ -20,6 +20,7 @@
var/expand = 1
animate_movement = 0
var/metal = FOAM_NOT_METAL
+ var/time_to_solidify = 4 SECONDS
/obj/effect/particle_effect/foam/Initialize(mapload, ismetal=0)
@@ -28,7 +29,7 @@
metal = ismetal
playsound(src, 'sound/effects/bubbles2.ogg', 25, 1, 5)
addtimer(CALLBACK(src, PROC_REF(foam_react)), 3 + metal*3)
- addtimer(CALLBACK(src, PROC_REF(foam_metal_final_react)), 40)
+ addtimer(CALLBACK(src, PROC_REF(foam_metal_final_react)), time_to_solidify)
/obj/effect/particle_effect/foam/proc/foam_react()
process()
diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm
index b79e50b453cc..6e3869f563a4 100644
--- a/code/game/objects/effects/effect_system/smoke.dm
+++ b/code/game/objects/effects/effect_system/smoke.dm
@@ -240,9 +240,9 @@
if(isyautja(M) || isxeno(M))
burn_damage *= xeno_yautja_reduction
+ var/reagent = new /datum/reagent/napalm/ut()
M.burn_skin(burn_damage)
- M.adjust_fire_stacks(applied_fire_stacks)
- M.fire_reagent = new /datum/reagent/napalm/ut()
+ M.adjust_fire_stacks(applied_fire_stacks, reagent)
M.IgniteMob()
M.updatehealth()
diff --git a/code/game/objects/items/reagent_containers/food/snacks/meat.dm b/code/game/objects/items/reagent_containers/food/snacks/meat.dm
index f68f488f268d..f541986112e5 100644
--- a/code/game/objects/items/reagent_containers/food/snacks/meat.dm
+++ b/code/game/objects/items/reagent_containers/food/snacks/meat.dm
@@ -28,7 +28,8 @@
name = "synthetic meat"
desc = "A synthetic slab of flesh."
-/obj/item/reagent_container/food/snacks/meat/synthmeat/synthflesh //meat made from synthetics. Slightly toxic
+/// Meat made from synthetics. Slightly toxic
+/obj/item/reagent_container/food/snacks/meat/synthmeat/synthflesh
name = "synthetic flesh"
desc = "A slab of artificial, inorganic 'flesh' that resembles human meat. Probably came from a synth."
icon_state = "synthmeat"
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index ce02cdb59e20..84298faaa3a1 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -543,27 +543,28 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
log_ahelp(id, "Defer", "Deferred to mentors by [usr.key]", null, usr.ckey)
Close(silent = TRUE)
-/datum/admin_help/proc/mark_ticket()
+/datum/admin_help/proc/mark_ticket(mob/marking_admin)
+ var/mob/user = marking_admin || usr
if(marked_admin)
- if(marked_admin == usr.ckey)
+ if(marked_admin == user.ckey)
unmark_ticket()
return
- to_chat(usr, SPAN_WARNING("This ticket has already been marked by [marked_admin]."))
- var/unmark_option = tgui_alert(usr, "This message has been marked by [marked_admin]. Do you want to override?", "Marked Ticket", list("Overwrite Mark", "Unmark", "Cancel"))
+ to_chat(user, SPAN_WARNING("This ticket has already been marked by [marked_admin]."))
+ var/unmark_option = tgui_alert(user, "This message has been marked by [marked_admin]. Do you want to override?", "Marked Ticket", list("Overwrite Mark", "Unmark", "Cancel"))
if(unmark_option == "Unmark")
unmark_ticket()
return
if(unmark_option != "Overwrite Mark")
return
- var/key_name = key_name_admin(usr)
+ var/key_name = key_name_admin(user)
AddInteraction("Marked by [key_name].", player_message = "Ticket marked!")
to_chat(initiator, SPAN_ADMINHELP("An admin is preparing to respond to your ticket."))
var/msg = "Ticket [TicketHref("#[id]")] marked by [key_name]."
message_admins(msg)
log_admin_private(msg)
- log_ahelp(id, "Marked", "Marked by [usr.key]", sender = usr.ckey)
- marked_admin = usr.ckey
+ log_ahelp(id, "Marked", "Marked by [user.key]", sender = user.ckey)
+ marked_admin = user.ckey
/datum/admin_help/proc/unmark_ticket()
var/key_name = key_name_admin(usr)
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 76525b2cae96..a6cf0f02a3de 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -60,6 +60,9 @@
var/message_prompt = "Message:"
+ if(AH && !AH.marked_admin)
+ AH.mark_ticket()
+
if((AH?.opening_responders && length(AH.ticket_interactions) == 1 ) || ((AH?.marked_admin && AH?.marked_admin != usr.ckey) && length(AH.ticket_interactions) == 2))
SEND_SOUND(src, sound('sound/machines/buzz-sigh.ogg', volume=30))
message_prompt += "\n\n**This ticket is already being responded to by: [length(AH.opening_responders) ? english_list(AH.opening_responders) : AH.marked_admin]**"
diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm
index 13f5e2d0df6d..e02bb930d416 100644
--- a/code/modules/cm_marines/marines_consoles.dm
+++ b/code/modules/cm_marines/marines_consoles.dm
@@ -43,12 +43,12 @@
ui = new(user, src, "CardMod", name)
ui.open()
-/obj/structure/machinery/computer/card/ui_act(action, params)
+/obj/structure/machinery/computer/card/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
- var/mob/user = usr
+ var/mob/user = ui.user
playsound(src, pick('sound/machines/computer_typing4.ogg', 'sound/machines/computer_typing5.ogg', 'sound/machines/computer_typing6.ogg'), 5, 1)
switch(action)
@@ -91,18 +91,11 @@
printing = TRUE
playsound(src.loc, 'sound/machines/fax.ogg', 15, 1)
sleep(40)
- var/faction = "N/A"
- if(target_id_card.faction_group && islist(target_id_card.faction_group))
- faction = jointext(target_id_card.faction_group, ", ")
- if(isnull(target_id_card.faction_group))
- target_id_card.faction_group = list()
- else
- faction = target_id_card.faction_group
var/contents = {"
Access Report
Prepared By: [user_id_card?.registered_name ? user_id_card.registered_name : "Unknown"]
For: [target_id_card.registered_name ? target_id_card.registered_name : "Unregistered"]
- Faction: [faction]
+ Faction: [target_id_card.faction ? target_id_card.faction : "N/A"]
Assignment: [target_id_card.assignment]
Account Number: #[target_id_card.associated_account_number]
Blood Type: [target_id_card.blood_type]
@@ -112,7 +105,10 @@
var/known_access_rights = get_access(ACCESS_LIST_MARINE_ALL)
for(var/A in target_id_card.access)
if(A in known_access_rights)
- contents += " [get_access_desc(A)]"
+ contents += " [get_access_desc(A)]
"
+ contents += "
Modification Log:
"
+ for(var/change in target_id_card.modification_log)
+ contents += " [change]
"
var/obj/item/paper/P = new /obj/item/paper(src.loc)
P.name = "Access Report"
@@ -139,9 +135,9 @@
GLOB.data_core.manifest_modify(target_id_card.registered_name, target_id_card.registered_ref, target_id_card.assignment, target_id_card.rank)
target_id_card.name = text("[target_id_card.registered_name]'s ID Card ([target_id_card.assignment])")
if(target_id_card.registered_name != origin_name)
- log_idmod(target_id_card, " [key_name_admin(usr)] changed the registered name of the ID to '[target_id_card.registered_name]'. ")
+ log_idmod(target_id_card, " [user.real_name] changed the registered name of the ID to '[target_id_card.registered_name]'. ", key_name_admin(user))
if(target_id_card.assignment != origin_assignment)
- log_idmod(target_id_card, " [key_name_admin(usr)] changed the assignment of the ID to the custom position '[target_id_card.assignment]'. ")
+ log_idmod(target_id_card, " [user.real_name] changed the assignment of the ID to the custom position '[target_id_card.assignment]'. ", key_name_admin(user))
if(ishuman(user))
target_id_card.forceMove(user.loc)
if(!user.get_active_hand())
@@ -170,8 +166,8 @@
target_id_card.assignment = "Terminated"
target_id_card.access = list()
- log_idmod(target_id_card, " [key_name_admin(usr)] terminated the ID. ")
- message_admins("[key_name_admin(usr)] terminated the ID of [target_id_card.registered_name].")
+ log_idmod(target_id_card, " [user.real_name] terminated the ID. ", key_name_admin(user))
+ message_admins("[user.real_name] terminated the ID of [target_id_card.registered_name].", key_name_admin(user))
return TRUE
if("PRG_edit")
if(!authenticated || !target_id_card)
@@ -221,19 +217,19 @@
target_id_card.faction_group = list()
if(params["access_target"] in target_id_card.faction_group)
target_id_card.faction_group -= params["access_target"]
- log_idmod(target_id_card, " [key_name_admin(usr)] revoked [access_type] IFF. ")
+ log_idmod(target_id_card, " [user.real_name] revoked [access_type] IFF. ", key_name_admin(user))
else
target_id_card.faction_group |= params["access_target"]
- log_idmod(target_id_card, " [key_name_admin(usr)] granted [access_type] IFF. ")
+ log_idmod(target_id_card, " [user.real_name] granted [access_type] IFF. ", key_name_admin(user))
return TRUE
access_type = text2num(params["access_target"])
if(access_type in (is_centcom ? get_access(ACCESS_LIST_WY_ALL) : get_access(ACCESS_LIST_MARINE_MAIN)))
if(access_type in target_id_card.access)
target_id_card.access -= access_type
- log_idmod(target_id_card, " [key_name_admin(usr)] revoked access '[access_type]'. ")
+ log_idmod(target_id_card, " [user.real_name] revoked access '[get_access_desc(access_type)]'. ", key_name_admin(user))
else
target_id_card.access |= access_type
- log_idmod(target_id_card, " [key_name_admin(usr)] granted access '[access_type]'. ")
+ log_idmod(target_id_card, " [user.real_name] granted access '[get_access_desc(access_type)]'. ", key_name_admin(user))
return TRUE
if("PRG_grantall")
if(!authenticated || !target_id_card)
@@ -241,7 +237,7 @@
target_id_card.access |= (is_centcom ? get_access(ACCESS_LIST_WY_ALL) : get_access(ACCESS_LIST_MARINE_MAIN))
target_id_card.faction_group |= factions
- log_idmod(target_id_card, " [key_name_admin(usr)] granted the ID all access and USCM IFF. ")
+ log_idmod(target_id_card, " [user.real_name] granted the ID all access and USCM IFF. ", key_name_admin(user))
return TRUE
if("PRG_denyall")
if(!authenticated || !target_id_card)
@@ -250,7 +246,7 @@
var/list/access = target_id_card.access
access.Cut()
target_id_card.faction_group -= factions
- log_idmod(target_id_card, " [key_name_admin(usr)] removed all accesses and USCM IFF. ")
+ log_idmod(target_id_card, " [user.real_name] removed all accesses and USCM IFF. ", key_name_admin(user))
return TRUE
if("PRG_grantregion")
if(!authenticated || !target_id_card)
@@ -258,14 +254,14 @@
if(params["region"] == "Faction (IFF system)")
target_id_card.faction_group |= factions
- log_idmod(target_id_card, " [key_name_admin(usr)] granted USCM IFF. ")
+ log_idmod(target_id_card, " [user.real_name] granted USCM IFF. ", key_name_admin(user))
return TRUE
var/region = text2num(params["region"])
if(isnull(region))
return
target_id_card.access |= get_region_accesses(region)
var/additions = get_region_accesses_name(region)
- log_idmod(target_id_card, " [key_name_admin(usr)] granted all [additions] accesses. ")
+ log_idmod(target_id_card, " [user.real_name] granted all [additions] accesses. ", key_name_admin(user))
return TRUE
if("PRG_denyregion")
if(!authenticated || !target_id_card)
@@ -273,14 +269,14 @@
if(params["region"] == "Faction (IFF system)")
target_id_card.faction_group -= factions
- log_idmod(target_id_card, " [key_name_admin(usr)] revoked USCM IFF. ")
+ log_idmod(target_id_card, " [user.real_name] revoked USCM IFF. ", key_name_admin(user))
return TRUE
var/region = text2num(params["region"])
if(isnull(region))
return
target_id_card.access -= get_region_accesses(region)
var/additions = get_region_accesses_name(region)
- log_idmod(target_id_card, " [key_name_admin(usr)] revoked all [additions] accesses. ")
+ log_idmod(target_id_card, " [user.real_name] revoked all [additions] accesses. ", key_name_admin(user))
return TRUE
if("PRG_account")
if(!authenticated || !target_id_card)
@@ -288,7 +284,7 @@
var/account = text2num(params["account"])
target_id_card.associated_account_number = account
- log_idmod(target_id_card, " [key_name_admin(usr)] changed the account number to '[account]'. ")
+ log_idmod(target_id_card, " [user.real_name] changed the account number to '[account]'. ", key_name_admin(user))
return TRUE
/obj/structure/machinery/computer/card/ui_static_data(mob/user)
diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm
index 23bce06fdc1a..ce69115cee48 100644
--- a/code/modules/cm_marines/orbital_cannon.dm
+++ b/code/modules/cm_marines/orbital_cannon.dm
@@ -184,9 +184,12 @@ GLOBAL_LIST(ob_type_fuel_requirements)
chambered_tray = TRUE
var/misfuel = get_misfuel_amount()
var/message = "[key_name(user)] chambered the Orbital Bombardment cannon."
+ var/ares_message = "Shell chambered."
if(misfuel)
message += " It is misfueled by [misfuel] units!"
+ ares_message += " Fuel imbalance detected!"
message_admins(message, x, y, z)
+ log_ares_bombardment(user, lowertext(tray.warhead.name), ares_message)
update_icon()
diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm
index 489a7e528832..70b2b82d8c86 100644
--- a/code/modules/cm_marines/overwatch.dm
+++ b/code/modules/cm_marines/overwatch.dm
@@ -800,7 +800,7 @@
notify_ghosts(header = "Bombardment Inbound", message = "\A [ob_name] targeting [get_area(T)] has been fired!", source = T, alert_overlay = warhead_appearance, extra_large = TRUE)
/// Project ARES interface log.
- log_ares_bombardment(user.name, ob_name, "X[x_bomb], Y[y_bomb] in [get_area(T)]")
+ log_ares_bombardment(user.name, ob_name, "Bombardment fired at X[x_bomb], Y[y_bomb] in [get_area(T)]")
busy = FALSE
if(istype(T))
diff --git a/code/modules/cm_tech/droppod/lz_effect.dm b/code/modules/cm_tech/droppod/lz_effect.dm
index 6a73916c7b3f..7ab955d8a00c 100644
--- a/code/modules/cm_tech/droppod/lz_effect.dm
+++ b/code/modules/cm_tech/droppod/lz_effect.dm
@@ -34,6 +34,7 @@
/obj/effect/warning/explosive/proc/disappear()
qdel(src)
+
/obj/effect/warning/explosive/gas
name = "gas warning"
color = "#42acd6"
diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm
index dc6eb34161ee..3ab1dbc99b4e 100644
--- a/code/modules/gear_presets/uscm_event.dm
+++ b/code/modules/gear_presets/uscm_event.dm
@@ -375,6 +375,7 @@
new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder(new_human), WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/pistol/pmc_mateba(new_human), WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/provost/marshal(new_human.back), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/cotablet(new_human.back), WEAR_IN_BACK)
/datum/equipment_preset/uscm_event/provost/marshal/sector
name = "Provost Sector Marshal (MO7)"
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 4f9493cfdf49..d13d5aa94053 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -37,6 +37,7 @@
/// If the observer is an admin, are they excluded from the xeno queue?
var/admin_larva_protection = TRUE // Enabled by default
var/ghostvision = TRUE
+ var/self_visibility = TRUE
var/can_reenter_corpse
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
//If you died in the game and are a ghost - this will remain as null.
@@ -71,10 +72,10 @@
set desc = "Toggles your ability to see things only ghosts can see, like other ghosts"
set category = "Ghost.Settings"
ghostvision = !ghostvision
- if(hud_used)
- var/atom/movable/screen/plane_master/lighting/lighting = hud_used.plane_masters["[GHOST_PLANE]"]
- if (lighting)
- lighting.alpha = ghostvision? 255 : 0
+ if(ghostvision)
+ see_invisible = INVISIBILITY_OBSERVER
+ else
+ see_invisible = HIDE_INVISIBLE_OBSERVER
to_chat(usr, SPAN_NOTICE("You [(ghostvision?"now":"no longer")] have ghost vision."))
/mob/dead/observer/Initialize(mapload, mob/body)
@@ -845,11 +846,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/verb/toggle_self_visibility()
set name = "Toggle Self Visibility"
set category = "Ghost.Settings"
-
- if (alpha)
- alpha = 0
- else
+ self_visibility = !self_visibility
+ if (self_visibility)
alpha = initial(alpha)
+ else
+ alpha = 0
+ to_chat(usr, SPAN_NOTICE("You are now [(self_visibility?"visible":"invisible")]."))
/mob/dead/observer/verb/view_manifest()
set name = "View Crew Manifest"
@@ -1189,7 +1191,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!SSticker.HasRoundStarted())
var/time_remaining = SSticker.GetTimeLeft()
if(time_remaining > 0)
- . += "Time To Start: [round(time_remaining)]s"
+ . += "Time To Start: [round(time_remaining)]s[SSticker.delay_start ? " (DELAYED)" : ""]"
else if(time_remaining == -10)
. += "Time To Start: DELAYED"
else
diff --git a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm
index df272387f001..8aa3000092f5 100644
--- a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm
@@ -38,6 +38,9 @@
/// the nearest human before dying
var/jumps_left = 2
+ var/time_to_live = 30 SECONDS
+ var/death_timer
+
var/icon_xeno = 'icons/mob/xenos/effects.dmi'
var/icon_xenonid = 'icons/mob/xenonids/xenonid_crab.dmi'
@@ -55,6 +58,9 @@
set_hive_data(src, hivenumber)
go_active()
+ if (hivenumber != XENO_HIVE_TUTORIAL)
+ death_timer = addtimer(CALLBACK(src, PROC_REF(end_lifecycle)), time_to_live, TIMER_OVERRIDE|TIMER_STOPPABLE|TIMER_UNIQUE)
+
/obj/item/clothing/mask/facehugger/Destroy()
. = ..()
@@ -75,6 +81,10 @@
if(QDESTROYING(src))
return
addtimer(CALLBACK(src, PROC_REF(check_turf)), 0.2 SECONDS)
+
+ if(!death_timer && hivenumber != XENO_HIVE_TUTORIAL)
+ death_timer = addtimer(CALLBACK(src, PROC_REF(end_lifecycle)), time_to_live, TIMER_OVERRIDE|TIMER_STOPPABLE|TIMER_UNIQUE)
+
if(stat == CONSCIOUS && loc) //Make sure we're conscious and not idle or dead.
go_idle()
if(attached)
@@ -173,9 +183,18 @@
if(exposed_temperature > 300)
die()
-/obj/item/clothing/mask/facehugger/equipped(mob/M)
+/obj/item/clothing/mask/facehugger/equipped(mob/holder)
SHOULD_CALL_PARENT(FALSE) // ugh equip sounds
// So picking up a hugger does not prematurely kill it
+ if (!isxeno(holder))
+ return
+
+ var/mob/living/carbon/xenomorph/xeno = holder
+
+ if ((xeno.caste.hugger_nurturing || hivenumber == XENO_HIVE_TUTORIAL) && death_timer)
+ deltimer(death_timer)
+ death_timer = null
+
go_idle()
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
@@ -410,6 +429,10 @@
deltimer(jump_timer)
jump_timer = null
+ if(death_timer)
+ deltimer(death_timer)
+ death_timer = null
+
if(!impregnated)
icon_state = "[initial(icon_state)]_dead"
stat = DEAD
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
index 0e897335cf10..f62bb9e17421 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
@@ -295,7 +295,6 @@
/datum/action/xeno_action/onclick/toggle_long_range/use_ability(atom/target)
var/mob/living/carbon/xenomorph/xeno = owner
- xeno.speed_modifier = initial(xeno.speed_modifier)// Reset the speed modifier should you be disrupted while zooming or whatnot
if(xeno.observed_xeno)
return
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm
index 8b268ebfce62..9be9e21fd983 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm
@@ -16,9 +16,10 @@
can_be_revived = FALSE
build_time_mult = BUILD_TIME_MULT_LESSER_DRONE
+ behavior_delegate_type = /datum/behavior_delegate/lesser_drone_base
caste_desc = "A builder of hives."
- can_hold_facehuggers = 1
+ can_hold_facehuggers = TRUE
can_hold_eggs = CAN_HOLD_TWO_HANDS
acid_level = 1
weed_level = WEED_LEVEL_STANDARD
@@ -118,3 +119,10 @@
/mob/living/carbon/xenomorph/lesser_drone/handle_ghost_message()
return
+
+/datum/behavior_delegate/lesser_drone_base
+ name = "Base Lesser Drone Behavior Delegate"
+
+/datum/behavior_delegate/lesser_drone_base/on_life()
+ if(bound_xeno.body_position == STANDING_UP && !(locate(/obj/effect/alien/weeds) in get_turf(bound_xeno)))
+ bound_xeno.adjustBruteLoss(5)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index cb36e919e82a..0f128b5bcb46 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -342,7 +342,7 @@ GLOBAL_LIST_INIT(limb_types_by_name, list(
return FALSE
-/mob/proc/abiotic(full_body = 0)
+/mob/proc/abiotic(full_body = FALSE)
if(full_body && ((src.l_hand && !( src.l_hand.flags_item & ITEM_ABSTRACT )) || (src.r_hand && !( src.r_hand.flags_item & ITEM_ABSTRACT )) || (src.back || src.wear_mask)))
return TRUE
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 7917394df830..f436863b2f2f 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -451,7 +451,7 @@
var/time_remaining = SSticker.GetTimeLeft()
if(time_remaining > 0)
- . += "Time To Start: [round(time_remaining)]s"
+ . += "Time To Start: [round(time_remaining)]s[SSticker.delay_start ? " (DELAYED)" : ""]"
else if(time_remaining == -10)
. += "Time To Start: DELAYED"
else
diff --git a/code/modules/movement/launching/launching.dm b/code/modules/movement/launching/launching.dm
index 3e188abb1067..778c452a3240 100644
--- a/code/modules/movement/launching/launching.dm
+++ b/code/modules/movement/launching/launching.dm
@@ -182,17 +182,21 @@
add_temp_pass_flags(pass_flags)
+ var/turf/start_turf = get_step_towards(src, LM.target)
+ var/list/turf/path = get_line(start_turf, LM.target)
var/last_loc = loc
var/early_exit = FALSE
LM.dist = 0
- while (src && throwing && loc == last_loc && isturf(src.loc)) // While looks scary at first but it's basically just a for until LM.dist reaches LM.range
+ for (var/turf/T in path)
+ if (!src || !throwing || loc != last_loc || !isturf(src.loc))
+ break
if (!LM || QDELETED(LM))
early_exit = TRUE
break
if (LM.dist >= LM.range)
break
- if (!Move(get_step_towards(src, LM.target))) // If this returns FALSE, then a collision happened
+ if (!Move(T)) // If this returns FALSE, then a collision happened
break
last_loc = loc
if (++LM.dist >= LM.range)
diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm
index 943cddd27ff5..a2801821349c 100644
--- a/code/modules/projectiles/gun_attachables.dm
+++ b/code/modules/projectiles/gun_attachables.dm
@@ -3221,6 +3221,10 @@ Defined in conflicts.dm of the #defines folder.
to_chat(user, SPAN_WARNING("\The [gun] doesn't have enough fuel to launch a projectile!"))
return
+ if(istype(flamer_reagent, /datum/reagent/foaming_agent/stabilized))
+ to_chat(user, SPAN_WARNING("This chemical will clog the nozzle!"))
+ return
+
gun.last_fired = world.time
gun.current_mag.reagents.remove_reagent(flamer_reagent.id, FLAME_REAGENT_USE_AMOUNT * fuel_per_projectile)
diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm
index 5daef0bdff74..64499a71bb12 100644
--- a/code/modules/projectiles/guns/flamer/flamer.dm
+++ b/code/modules/projectiles/guns/flamer/flamer.dm
@@ -136,7 +136,10 @@
click_empty(user)
else
user.track_shot(initial(name))
- unleash_flame(target, user)
+ if(current_mag.reagents.has_reagent("stablefoam"))
+ unleash_foam(target, user)
+ else
+ unleash_flame(target, user)
return AUTOFIRE_CONTINUE
return NONE
@@ -226,6 +229,59 @@
new /obj/flamer_fire(to_fire, create_cause_data(initial(name), user), R, max_range, current_mag.reagents, flameshape, target, CALLBACK(src, PROC_REF(show_percentage), user), fuel_pressure, fire_type)
+/obj/item/weapon/gun/flamer/proc/unleash_foam(atom/target, mob/living/user)
+ last_fired = world.time
+ if(!current_mag || !current_mag.reagents || !current_mag.reagents.reagent_list.len)
+ return
+
+ var/source_turf = get_turf(user)
+ var/foam_range = 6 // the max range the foam will travel
+ var/distance = 0 // the distance traveled
+ var/use_multiplier = 3 // if you want to increase the ammount of foam drained from the tank
+ var/datum/reagent/chemical = current_mag.reagents.reagent_list[1]
+
+ var/turf/turfs[] = get_line(user, target, FALSE)
+ var/turf/first_turf = turfs[1]
+ var/ammount_required = (min(turfs.len, foam_range) * use_multiplier) // the ammount of units that this click requires
+ for(var/turf/turf in turfs)
+
+ if(chemical.volume < ammount_required)
+ foam_range = round(chemical.volume / use_multiplier)
+
+ if(distance >= foam_range)
+ break
+
+ if(turf.density)
+ break
+ else
+ var/obj/effect/particle_effect/foam/checker = new()
+ var/atom/blocked = LinkBlocked(checker, source_turf, turf)
+ if(blocked)
+ break
+
+ if(turf == first_turf) // this is so the first foam tile doesn't expand and touch the user
+ var/datum/effect_system/foam_spread/foam = new()
+ foam.set_up(0.5, turf, metal_foam = FOAM_METAL_TYPE_IRON)
+ foam.start()
+ else
+ var/datum/effect_system/foam_spread/foam = new()
+ foam.set_up(1, turf, metal_foam = FOAM_METAL_TYPE_IRON)
+ foam.start()
+ sleep(2)
+
+ distance++
+
+ var/ammount_used = distance * use_multiplier // the actual ammount of units that we used
+
+ chemical.volume = max(chemical.volume - ammount_used, 0)
+
+ current_mag.reagents.total_volume = chemical.volume // this is needed for show_percentage to work
+
+ if(chemical.volume < use_multiplier) // there aren't enough units left for a single tile of foam, empty the tank
+ current_mag.reagents.clear_reagents()
+
+ show_percentage(user)
+
/obj/item/weapon/gun/flamer/proc/show_percentage(mob/living/user)
if(current_mag)
to_chat(user, SPAN_WARNING("The gauge reads: [round(current_mag.get_ammo_percent())]% fuel remains!"))
diff --git a/code/modules/projectiles/magazines/flamer.dm b/code/modules/projectiles/magazines/flamer.dm
index 7fba325177c6..dfd9eda20d8a 100644
--- a/code/modules/projectiles/magazines/flamer.dm
+++ b/code/modules/projectiles/magazines/flamer.dm
@@ -90,7 +90,7 @@
to_chat(user, SPAN_WARNING("You can't mix fuel mixtures!"))
return
- if(!to_add.intensityfire)
+ if(!to_add.intensityfire && to_add.id != "stablefoam")
to_chat(user, SPAN_WARNING("This chemical is not potent enough to be used in a flamethrower!"))
return
diff --git a/code/modules/reagents/chemistry_reactions/other.dm b/code/modules/reagents/chemistry_reactions/other.dm
index 24a8563e0848..28250aa38803 100644
--- a/code/modules/reagents/chemistry_reactions/other.dm
+++ b/code/modules/reagents/chemistry_reactions/other.dm
@@ -360,6 +360,12 @@
required_reagents = list("fluorine" = 2, "carbon" = 2, "sulphuric acid" = 1)
result_amount = 5
+/datum/chemical_reaction/stablefoam
+ name = "Stabilized metallic foam"
+ id = "stablefoam"
+ result = "stablefoam"
+ required_reagents = list("fluorosurfactant" = 1, "iron" = 1, "sulphuric acid" = 1)
+ result_amount = 1
/datum/chemical_reaction/foam
name = "Foam"
diff --git a/code/modules/reagents/chemistry_reagents/other.dm b/code/modules/reagents/chemistry_reagents/other.dm
index 786a58857830..dc70d65452fe 100644
--- a/code/modules/reagents/chemistry_reagents/other.dm
+++ b/code/modules/reagents/chemistry_reagents/other.dm
@@ -613,6 +613,15 @@
color = "#664B63" // rgb: 102, 75, 99
chemclass = CHEM_CLASS_UNCOMMON
+/datum/reagent/foaming_agent/stabilized
+ name = "Stabilized metallic foam"
+ id = "stablefoam"
+ description = "Stabilized metallic foam that solidifies when exposed to an open flame"
+ reagent_state = LIQUID
+ color = "#d4b8d1"
+ chemclass = CHEM_CLASS_UNCOMMON
+ properties = list(PROPERTY_TOXIC = 8)
+
/datum/reagent/nicotine
name = "Nicotine"
id = "nicotine"
@@ -696,9 +705,11 @@
description = "A custom napalm mix, stickier and lasts longer but lower damage"
reagent_state = LIQUID
color = "#f8e3b2"
- chemfiresupp = FALSE
burncolor = "#f8e3b2"
burn_sprite = "dynamic"
+ intensitymod = -1.5
+ durationmod = -5
+ radiusmod = -0.5
properties = list(
PROPERTY_INTENSITY = BURN_LEVEL_TIER_2,
PROPERTY_DURATION = BURN_TIME_TIER_5,
@@ -710,10 +721,12 @@
id = "highdamagenapalm"
description = "A custom napalm mix, higher damage but not as sticky"
reagent_state = LIQUID
- color = "#742424"
- chemfiresupp = FALSE
- burncolor = "#742424"
+ color = "#c51c1c"
+ burncolor = "#c51c1c"
burn_sprite = "dynamic"
+ intensitymod = -4.5
+ durationmod = -1
+ radiusmod = -0.5
properties = list(
PROPERTY_INTENSITY = BURN_LEVEL_TIER_8,
PROPERTY_DURATION = BURN_TIME_TIER_1,
diff --git a/html/changelogs/AutoChangeLog-pr-6022.yml b/html/changelogs/AutoChangeLog-pr-6022.yml
deleted file mode 100644
index b5a61f605ed6..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6022.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "QuickLode"
-delete-after: True
-changes:
- - rscadd: "Adds 3 variations of CMB Marshal and 4 variations of a UA Riot Police Officer to Fiorina Prison Riot nightmare. These are fine men and women in uniform prepared to engage what they suspect is a riot(or in the case of CMB, assisting their underfunded and understaffed colleagues) however, they find something much more sinister going on.."
- - rscadd: "Adds a CMB Investigative Synthetic(r) and a UA Police Synthetic."
- - rscadd: "Allows police baton and telescopic baton to shield clash for intimidation and riot tactics."
- - rscadd: "Allows M81 launcher to utilize less lethal baton round"
- - qol: "removes taser from some security synthetics belts, replaced with a more synthetic friendly version"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6124.yml b/html/changelogs/AutoChangeLog-pr-6124.yml
new file mode 100644
index 000000000000..1e02f4897a69
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6124.yml
@@ -0,0 +1,4 @@
+author: "realforest2001"
+delete-after: True
+changes:
+ - rscadd: "Added ID Modification Log to the Access Report printout from an ID Console."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6165.yml b/html/changelogs/AutoChangeLog-pr-6165.yml
new file mode 100644
index 000000000000..0f67210d4ce4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6165.yml
@@ -0,0 +1,4 @@
+author: "Git-Nivrak"
+delete-after: True
+changes:
+ - rscdel: "Reverted back to old throw logic"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6166.yml b/html/changelogs/AutoChangeLog-pr-6166.yml
new file mode 100644
index 000000000000..273b212dbda3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6166.yml
@@ -0,0 +1,4 @@
+author: "realforest2001"
+delete-after: True
+changes:
+ - bugfix: "Delaying round start now shows on the timer again."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6167.yml b/html/changelogs/AutoChangeLog-pr-6167.yml
new file mode 100644
index 000000000000..0406b100623e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6167.yml
@@ -0,0 +1,4 @@
+author: "Zonespace27"
+delete-after: True
+changes:
+ - admin: "Unmarked tickets now mark themselves when an admin starts responding to one"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6168.yml b/html/changelogs/AutoChangeLog-pr-6168.yml
new file mode 100644
index 000000000000..3f1451a862c5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6168.yml
@@ -0,0 +1,4 @@
+author: "harryob"
+delete-after: True
+changes:
+ - bugfix: "you can bind to space again"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6171.yml b/html/changelogs/AutoChangeLog-pr-6171.yml
new file mode 100644
index 000000000000..d9cd7b85fa1a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-6171.yml
@@ -0,0 +1,4 @@
+author: "iloveloopers"
+delete-after: True
+changes:
+ - bugfix: "custom flamer fuels no longer work for increasing OT assembly's caps"
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml
index 82507d62ef9f..b3f9ffa64195 100644
--- a/html/changelogs/archive/2024-04.yml
+++ b/html/changelogs/archive/2024-04.yml
@@ -257,3 +257,45 @@
Steelpoint:
- balance: UPP Synthetic's loadout has been reworked to account for its new status
as a non-combatant.
+2024-04-19:
+ QuickLode:
+ - rscadd: Adds 3 variations of CMB Marshal and 4 variations of a UA Riot Police
+ Officer to Fiorina Prison Riot nightmare. These are fine men and women in uniform
+ prepared to engage what they suspect is a riot(or in the case of CMB, assisting
+ their underfunded and understaffed colleagues) however, they find something
+ much more sinister going on..
+ - rscadd: Adds a CMB Investigative Synthetic(r) and a UA Police Synthetic.
+ - rscadd: Allows police baton and telescopic baton to shield clash for intimidation
+ and riot tactics.
+ - rscadd: Allows M81 launcher to utilize less lethal baton round
+ - qol: removes taser from some security synthetics belts, replaced with a more synthetic
+ friendly version
+2024-04-20:
+ Huffie56:
+ - balance: Increase damage of standard revolver ammo from 55 to 72.
+ - balance: Marksman ammo remains 55 damage.
+ iloveloopers:
+ - rscadd: adds new flamer fuel type, stabilized metallic foam
+ - rscadd: Incinerator tanks can now hold stabilized metallic foam
+ - balance: High-Combustion napalm fuel is now easier to see on the ground
+2024-04-21:
+ 567Turtle:
+ - balance: ' SO can now do basic surgeries'
+ Ben10083:
+ - rscadd: Synthetics when shoved into meat gibber will not be delimbed and spawn
+ their own flesh, but would not die (they are spat out as a torso and head)
+ - admin: Adjustment to meatgibber code to notify admins when a synthetic is being
+ shoved into gibber
+ Git-Nivrak:
+ - bugfix: You can no longer infinitely extend facehugger's lifetime by REDACTED
+ - balance: Lessers now lose 5 hp every 2 seconds off weeds
+ - bugfix: Fixed a bug which made boilers go way faster than they should
+ LTNTS:
+ - rscadd: Adds Command Tablets to Provost Marshal+
+ iloveloopers:
+ - bugfix: White phosphorus will no longer forcefully set a mob's fire_reagent to
+ be UT napthal
+ realforest2001:
+ - rscadd: Added an ARES Log for chambering the OB Cannon.
+ vero5123:
+ - bugfix: toggling ghost vision now keeps the user's mob visible.
diff --git a/tgui/packages/tgui/interfaces/AresAdmin.js b/tgui/packages/tgui/interfaces/AresAdmin.js
index bf9fdfacc1aa..dd51b5a1e007 100644
--- a/tgui/packages/tgui/interfaces/AresAdmin.js
+++ b/tgui/packages/tgui/interfaces/AresAdmin.js
@@ -689,7 +689,7 @@ const BombardmentLogs = (props, context) => {
User
- Coordinates
+ Details
)}
diff --git a/tgui/packages/tgui/interfaces/AresInterface.jsx b/tgui/packages/tgui/interfaces/AresInterface.jsx
index bf7ded50d8ab..be9106e31c25 100644
--- a/tgui/packages/tgui/interfaces/AresInterface.jsx
+++ b/tgui/packages/tgui/interfaces/AresInterface.jsx
@@ -652,7 +652,7 @@ const BombardmentLogs = (props) => {
User
- Coordinates
+ Details
)}
diff --git a/tgui/packages/tgui/interfaces/KeyBinds.jsx b/tgui/packages/tgui/interfaces/KeyBinds.jsx
index b387d6a8dba5..b3b2fd5a8c30 100644
--- a/tgui/packages/tgui/interfaces/KeyBinds.jsx
+++ b/tgui/packages/tgui/interfaces/KeyBinds.jsx
@@ -10,6 +10,20 @@ const KEY_MODS = {
'CONTROL': true,
};
+const KEY_CODE_TO_BYOND = {
+ 'DEL': 'Delete',
+ 'DOWN': 'South',
+ 'END': 'Southwest',
+ 'HOME': 'Northwest',
+ 'INSERT': 'Insert',
+ 'LEFT': 'West',
+ 'PAGEDOWN': 'Southeast',
+ 'PAGEUP': 'Northeast',
+ 'RIGHT': 'East',
+ ' ': 'Space',
+ 'UP': 'North',
+};
+
const getAllKeybinds = (glob_keybinds) => {
const all_keybinds = new Array();
Object.keys(glob_keybinds).map((x) => all_keybinds.push(...glob_keybinds[x]));
@@ -274,6 +288,10 @@ export class ButtonKeybind extends Component {
return;
}
+ if (KEY_CODE_TO_BYOND[pressedKey]) {
+ pressedKey = KEY_CODE_TO_BYOND[pressedKey];
+ }
+
if (e.keyCode >= 96 && e.keyCode <= 105) {
pressedKey = 'Numpad' + pressedKey;
}