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; }