From 0ab62db4c77c3dd8818c7cb90ddb5ab7cc30ef74 Mon Sep 17 00:00:00 2001 From: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Thu, 1 Feb 2024 02:38:17 -0300 Subject: [PATCH 01/97] Updates shotgun ammo boxes in ships to the new version. (#2676) ## About The Pull Request Updates shotgun ammo boxes in ships to the new version. Hyena, Halftrack, Cepheus and Twinkleshine. ## Why It's Good For The Game The new version is a lot better to use and this probably overdue. ## Changelog :cl: fix: updated ship shotgun ammo boxes /:cl: --- .../independent/independent_halftrack.dmm | 20 +++++++++---------- .../shuttles/minutemen/minutemen_cepheus.dmm | 10 ++-------- .../syndicate/syndicate_gorlex_hyena.dmm | 2 +- .../syndicate/syndicate_twinkleshine.dmm | 6 +++--- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/_maps/shuttles/independent/independent_halftrack.dmm b/_maps/shuttles/independent/independent_halftrack.dmm index f82d26ffd66d..50988838c657 100644 --- a/_maps/shuttles/independent/independent_halftrack.dmm +++ b/_maps/shuttles/independent/independent_halftrack.dmm @@ -200,16 +200,16 @@ /obj/machinery/airalarm/directional/south, /obj/machinery/firealarm/directional/west, /obj/structure/closet/crate/secure/weapon, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/beanbag, +/obj/item/ammo_box/a12g, +/obj/item/ammo_box/a12g, +/obj/item/ammo_box/a12g, +/obj/item/ammo_box/a12g, +/obj/item/ammo_box/a12g, +/obj/item/ammo_box/a12g/beanbag, +/obj/item/ammo_box/a12g/beanbag, +/obj/item/ammo_box/a12g/beanbag, +/obj/item/ammo_box/a12g/beanbag, +/obj/item/ammo_box/a12g/beanbag, /obj/effect/turf_decal/box/red, /turf/open/floor/plasteel/dark, /area/ship/security) diff --git a/_maps/shuttles/minutemen/minutemen_cepheus.dmm b/_maps/shuttles/minutemen/minutemen_cepheus.dmm index 9686aff53035..0a77ee2ca4ed 100644 --- a/_maps/shuttles/minutemen/minutemen_cepheus.dmm +++ b/_maps/shuttles/minutemen/minutemen_cepheus.dmm @@ -4108,15 +4108,9 @@ /obj/item/ammo_box/magazine/m45{ pixel_x = 6 }, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, +/obj/item/ammo_box/a12g/rubbershot, /obj/item/ammo_box/magazine/cm15_mag, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, +/obj/item/ammo_box/a12g/rubbershot, /turf/open/floor/plasteel/tech/grid, /area/ship/security) "RN" = ( diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm index dae3f0a86b96..46bd016425f1 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm @@ -300,7 +300,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/industrial/outline, -/obj/item/storage/box/lethalshot, +/obj/item/ammo_box/a12g, /obj/item/ammo_box/c10mm, /turf/open/floor/mineral/plastitanium, /area/ship/security/armory) diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm index 6c14c9503772..7914b314998c 100644 --- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm +++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm @@ -3719,9 +3719,9 @@ /obj/item/ammo_casing/caseless/rocket, /obj/item/ammo_casing/caseless/rocket/hedp, /obj/item/ammo_casing/caseless/rocket/hedp, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, +/obj/item/ammo_box/a12g, +/obj/item/ammo_box/a12g, +/obj/item/ammo_box/a12g, /obj/item/gun/ballistic/rocketlauncher, /obj/item/gun/ballistic/automatic/ebr, /obj/item/gun/ballistic/automatic/ebr{ From 05bf997b5ab0896e239a738cac5f177d0bd2f4db Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 31 Jan 2024 23:52:26 -0600 Subject: [PATCH 02/97] Automatic changelog generation for PR #2676 [ci skip] --- html/changelogs/AutoChangeLog-pr-2676.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2676.yml diff --git a/html/changelogs/AutoChangeLog-pr-2676.yml b/html/changelogs/AutoChangeLog-pr-2676.yml new file mode 100644 index 000000000000..59fda4e62156 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2676.yml @@ -0,0 +1,4 @@ +author: Martinpachu +changes: + - {bugfix: updated ship shotgun ammo boxes} +delete-after: true From 9d329c914b00a2f6d7ca03eb7dddc46e82fc7985 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 2 Feb 2024 00:46:53 +0000 Subject: [PATCH 03/97] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2676.yml | 4 ---- html/changelogs/archive/2024-02.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2676.yml create mode 100644 html/changelogs/archive/2024-02.yml diff --git a/html/changelogs/AutoChangeLog-pr-2676.yml b/html/changelogs/AutoChangeLog-pr-2676.yml deleted file mode 100644 index 59fda4e62156..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2676.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Martinpachu -changes: - - {bugfix: updated ship shotgun ammo boxes} -delete-after: true diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml new file mode 100644 index 000000000000..855c28c0800a --- /dev/null +++ b/html/changelogs/archive/2024-02.yml @@ -0,0 +1,3 @@ +2024-02-02: + Martinpachu: + - bugfix: updated ship shotgun ammo boxes From 7ef9bda6706a773a5ac2446a3a24e45e99ab015e Mon Sep 17 00:00:00 2001 From: Theos Date: Fri, 2 Feb 2024 08:09:35 -0500 Subject: [PATCH 04/97] Adds co-op cigarette lighting (#2686) ## About The Pull Request If you have a cigarette equipped, and someone else has an un-lit cigarette equipped, you can light theirs via help intent+target mouth ![image](https://github.com/shiptest-ss13/Shiptest/assets/24857008/c1a352a4-5ae5-41e3-91c7-37780cbb8535) ## Why It's Good For The Game New co-op interaction ## Changelog :cl: add: If you are smoking a cigarette, you can light someone else's cigarette via help intent while targeting the mouth /:cl: --- code/modules/mob/living/carbon/carbon_defense.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index df9b5c22704d..9b50d1827724 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -391,6 +391,14 @@ if(M == src && check_self_for_injuries()) return + if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH) + var/obj/item/clothing/mask/cigarette/theircig = wear_mask + var/obj/item/clothing/mask/cigarette/ourcig = M.wear_mask + if(istype(ourcig) && istype(theircig)) + if(ourcig.lit && !theircig.lit) + theircig.light(span_notice("[M] leans towards [src], lighting [p_their()] [theircig.name] with [M.p_their()] own.")) + return + if(body_position == LYING_DOWN) if(buckled) to_chat(M, "You need to unbuckle [src] first to do that!") From 197fb53ce9f5613a31d7ffde2b5bb6e8e0b39bc0 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 2 Feb 2024 07:24:02 -0600 Subject: [PATCH 05/97] Automatic changelog generation for PR #2686 [ci skip] --- html/changelogs/AutoChangeLog-pr-2686.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2686.yml diff --git a/html/changelogs/AutoChangeLog-pr-2686.yml b/html/changelogs/AutoChangeLog-pr-2686.yml new file mode 100644 index 000000000000..dbc6db844c34 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2686.yml @@ -0,0 +1,5 @@ +author: SomeguyManperson +changes: + - {rscadd: "If you are smoking a cigarette, you can light someone else's cigarette + via help intent while targeting the mouth"} +delete-after: true From e19bc3b001d99c73939db40d466653ed4a01f728 Mon Sep 17 00:00:00 2001 From: GenericDM <34109002+GenericDM@users.noreply.github.com> Date: Fri, 2 Feb 2024 05:11:23 -0800 Subject: [PATCH 06/97] Kills Mutation Toxin (#2659) ## About The Pull Request Kills mutation toxin. Simple as. ## Why It's Good For The Game 1. Xenobio content. Ew. 2. I've only seen this used for griefing or accidentally. 3. Admins already have a dedicated species change button if need be. ## Changelog :cl: del: mutation toxin /:cl: --- .../carbon/human/species_types/spider.dm | 15 -- .../hostile/mining_mobs/hivelord.dm | 1 - .../chemistry/reagents/other_reagents.dm | 223 ------------------ .../reagents/chemistry/recipes/others.dm | 6 - .../chemistry/recipes/slime_extracts.dm | 4 +- .../reagents/reagent_containers/pill.dm | 8 - code/modules/research/experimentor.dm | 2 +- .../xenobiology/crossbreeding/regenerative.dm | 2 - 8 files changed, 3 insertions(+), 258 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm index f7ae4f6bef10..e93ef5baaead 100644 --- a/code/modules/mob/living/carbon/human/species_types/spider.dm +++ b/code/modules/mob/living/carbon/human/species_types/spider.dm @@ -228,18 +228,3 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt")) A.forceMove(C) H.visible_message("[H] wraps [A] into a cocoon!") return - -/datum/reagent/mutationtoxin/arachnid - name = "Arachnid Mutation Toxin" - description = "A glowing toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/spider - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "silk" - -/datum/chemical_reaction/mutationtoxin/arachnid - results = list(/datum/reagent/mutationtoxin/arachnid = 1) - required_reagents = list( - /datum/reagent/mutationtoxin/unstable = 1, - /datum/reagent/toxin/heparin = 10 - ) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 474c9c5d9ca6..087c538a8c3e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -885,7 +885,6 @@ ) if("Shadow") mob_species = /datum/species/shadow - r_pocket = /obj/item/reagent_containers/pill/shadowtoxin neck = /obj/item/clothing/accessory/medal/plasma/nobel_science uniform = /obj/item/clothing/under/color/black shoes = /obj/item/clothing/shoes/sneakers/black diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 05d91f17fe47..d727cbfd0fa6 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -505,221 +505,6 @@ ..() return -#define MUT_MSG_IMMEDIATE 1 -#define MUT_MSG_EXTENDED 2 -#define MUT_MSG_ABOUT2TURN 3 - -/datum/reagent/mutationtoxin - name = "Stable Mutation Toxin" - description = "A humanizing toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - metabolization_rate = 0.2 //metabolizes to prevent micro-dosage - taste_description = "slime" - var/race = /datum/species/human - var/list/mutationtexts = list( "You don't feel very well." = MUT_MSG_IMMEDIATE, - "Your skin feels a bit abnormal." = MUT_MSG_IMMEDIATE, - "Your limbs begin to take on a different shape." = MUT_MSG_EXTENDED, - "Your appendages begin morphing." = MUT_MSG_EXTENDED, - "You feel as though you're about to change at any moment!" = MUT_MSG_ABOUT2TURN) - var/cycles_to_turn = 20 //the current_cycle threshold / iterations needed before one can transform - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - -/datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/human/H) - . = TRUE - if(!istype(H)) - return - if(!(H.dna?.species) || !(H.mob_biotypes & MOB_ORGANIC)) - return - var/datum/species/mutation = pick(race) //I honestly feel extremely uncomfortable. I do not like the fact that this works. - var/current_species = H.dna.species.type - if(mutation && mutation != current_species) - H.set_species(mutation) - else - to_chat(H, "The pain vanishes suddenly. You feel no different.") - H.reagents.del_reagent(type) - - if(prob(10)) - var/list/pick_ur_fav = list() - var/filter = NONE - if(current_cycle <= (cycles_to_turn*0.3)) - filter = MUT_MSG_IMMEDIATE - else if(current_cycle <= (cycles_to_turn*0.8)) - filter = MUT_MSG_EXTENDED - else - filter = MUT_MSG_ABOUT2TURN - - for(var/i in mutationtexts) - if(mutationtexts[i] == filter) - pick_ur_fav += i - to_chat(H, "[pick(pick_ur_fav)]") - - if(current_cycle >= cycles_to_turn) - var/datum/species/species_type = race - H.set_species(species_type) - H.reagents.del_reagent(type) - to_chat(H, "You've become \a [lowertext(initial(species_type.name))]!") - ..() - -/datum/reagent/mutationtoxin/classic //The one from plasma on green slimes - name = "Mutation Toxin" - description = "A corruptive toxin." - color = "#13BC5E" // rgb: 19, 188, 94 - race = /datum/species/jelly/slime - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - -/datum/reagent/mutationtoxin/unstable - name = "Unstable Mutation Toxin" - description = "A mostly safe mutation toxin." - color = "#13BC5E" // rgb: 19, 188, 94 - race = list(/datum/species/jelly/slime, - /datum/species/human, - /datum/species/lizard, - /datum/species/fly, - /datum/species/moth, - /datum/species/pod, - /datum/species/jelly, - /datum/species/abductor - ) - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/mutationtoxin/lizard - name = "Sarathi Mutation Toxin" - description = "A lizarding toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/lizard - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "dragon's breath but not as cool" - -/datum/reagent/mutationtoxin/fly - name = "Fly Mutation Toxin" - description = "An insectifying toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/fly - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "trash" - -/datum/reagent/mutationtoxin/moth - name = "Moth Mutation Toxin" - description = "A glowing toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/moth - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "clothing" - -/datum/reagent/mutationtoxin/pod - name = "Podperson Mutation Toxin" - description = "A vegetalizing toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/pod - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "flowers" - -/datum/reagent/mutationtoxin/jelly - name = "Imperfect Mutation Toxin" - description = "A jellyfying toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/jelly - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "grandma's gelatin" - -/datum/reagent/mutationtoxin/jelly/on_mob_life(mob/living/carbon/human/H) - if(isjellyperson(H)) - to_chat(H, "Your jelly shifts and morphs, turning you into another subspecies!") - var/species_type = pick(subtypesof(/datum/species/jelly)) - H.set_species(species_type) - H.reagents.del_reagent(type) - return TRUE - if(current_cycle >= cycles_to_turn) //overwrite since we want subtypes of jelly - var/datum/species/species_type = pick(subtypesof(race)) - H.set_species(species_type) - H.reagents.del_reagent(type) - to_chat(H, "You've become \a [initial(species_type.name)]!") - return TRUE - return ..() - -/datum/reagent/mutationtoxin/abductor - name = "Abductor Mutation Toxin" - description = "An alien toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/abductor - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "something out of this world... no, universe!" - -/datum/reagent/mutationtoxin/android - name = "Android Mutation Toxin" - description = "A robotic toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/android - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "circuitry and steel" - -/datum/reagent/mutationtoxin/ipc - name = "IPC Mutation Toxin" - description = "An integrated positronic toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/ipc - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/mutationtoxin/kepi //crying - name = "Kepori Mutation Toxin" - description = "A feathery toxin." - race = /datum/species/kepori - process_flags = ORGANIC | SYNTHETIC - taste_description = "a familiar white meat" - -//BLACKLISTED RACES -/datum/reagent/mutationtoxin/skeleton - name = "Skeleton Mutation Toxin" - description = "A scary toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/skeleton - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "milk... and lots of it" - -/datum/reagent/mutationtoxin/zombie - name = "Zombie Mutation Toxin" - description = "An undead toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/zombie //Not the infectious kind. The days of xenobio zombie outbreaks are long past. - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "brai...nothing in particular" - -/datum/reagent/mutationtoxin/goofzombie - name = "Krokodil Zombie Mutation Toxin" - description = "An undead toxin... kinda..." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/human/krokodil_addict //Not the infectious kind. The days of xenobio zombie outbreaks are long past. - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/mutationtoxin/ash - name = "Ash Mutation Toxin" - description = "An ashen toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/lizard/ashwalker - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "savagery" - -//DANGEROUS RACES -/datum/reagent/mutationtoxin/shadow - name = "Shadow Mutation Toxin" - description = "A dark toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/shadow - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "the night" - -/datum/reagent/mutationtoxin/plasma - name = "Plasma Mutation Toxin" - description = "A plasma-based toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/plasmaman - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "plasma" - -#undef MUT_MSG_IMMEDIATE -#undef MUT_MSG_EXTENDED -#undef MUT_MSG_ABOUT2TURN - /datum/reagent/mulligan name = "Mulligan Toxin" description = "This toxin will rapidly change the DNA of human beings. Commonly used by Syndicate spies and assassins in need of an emergency ID change." @@ -2765,14 +2550,6 @@ if(prob(min(current_cycle/4, 10))) M.adjustOrganLoss(ORGAN_SLOT_STOMACH,3*REM) -/datum/reagent/mutationtoxin/kobold - name = "Kobold Mutation Toxin" - description = "An ashen toxin. Something about this seems lesser." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/lizard/ashwalker/kobold - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs - taste_description = "short savagery" - /datum/reagent/polar_bear_fur //used for icewine crafting name = "Polar Bear Fur" description = "Fur obtained from griding up a polar bears hide" diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index d50605dcd7f6..10cd8ffc72eb 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -149,12 +149,6 @@ required_reagents = list(/datum/reagent/ammonia = 2, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 2) required_temp = 525 -//Technically a mutation toxin -/datum/chemical_reaction/mulligan - results = list(/datum/reagent/mulligan = 1) - required_reagents = list(/datum/reagent/mutationtoxin/jelly = 1, /datum/reagent/toxin/mutagen = 1) - - ////////////////////////////////// VIROLOGY ////////////////////////////////////////// /datum/chemical_reaction/virus_food diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 07753cea4a15..97290d54213f 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -44,13 +44,13 @@ //Green /datum/chemical_reaction/slime/slimemutate - results = list(/datum/reagent/mutationtoxin/jelly = 1) + results = list(/datum/reagent/consumable/berryjuice = 1) // Removal of mutation toxins. This used to be jellyperson toxin, but is now just jelly. required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE required_container = /obj/item/slime_extract/green /datum/chemical_reaction/slime/unstabletoxin - results = list(/datum/reagent/mutationtoxin/unstable = 1) + results = list(/datum/reagent/toxin/mutagen = 1) // Removal of mutation toxins. This used to be unstable toxin, but is now unstable mutagen. required_reagents = list(/datum/reagent/uranium/radium = 1) required_other = TRUE required_container = /obj/item/slime_extract/green diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 187935fa0b25..58476c423275 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -182,14 +182,6 @@ icon_state = "pill22" rename_with_volume = TRUE -///////////////////////////////////////// this pill is used only in a legion mob drop -/obj/item/reagent_containers/pill/shadowtoxin - name = "black pill" - desc = "I wouldn't eat this if I were you." - icon_state = "pill9" - color = "#454545" - list_reagents = list(/datum/reagent/mutationtoxin/shadow = 5) - ///////////////////////////////////////// Psychologist inventory pills /obj/item/reagent_containers/pill/happinesspsych name = "mood stabilizer pill" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index f714f65f154d..9016d60515e7 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -322,7 +322,7 @@ ejectItem(TRUE) else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) visible_message("[src]'s chemical chamber has sprung a leak!") - chosenchem = pick(/datum/reagent/mutationtoxin/classic,/datum/reagent/nanomachines,/datum/reagent/toxin/acid) + chosenchem = pick(/datum/reagent/nanomachines,/datum/reagent/toxin/acid) var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src R.add_reagent(chosenchem , 50) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 8e71efc3177d..7cb7f8677408 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -265,8 +265,6 @@ Regenerative extracts: target.visible_message("The [target] suddenly changes color!") var/mob/living/simple_animal/slime/S = target S.random_colour() - if(isjellyperson(target)) - target.reagents.add_reagent(/datum/reagent/mutationtoxin/jelly,5) organ_loss += 17 From 8d3186dae51896ec98d13aa36e0325951c75c9f4 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 2 Feb 2024 07:40:47 -0600 Subject: [PATCH 07/97] Automatic changelog generation for PR #2659 [ci skip] --- html/changelogs/AutoChangeLog-pr-2659.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2659.yml diff --git a/html/changelogs/AutoChangeLog-pr-2659.yml b/html/changelogs/AutoChangeLog-pr-2659.yml new file mode 100644 index 000000000000..38e82309d6bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2659.yml @@ -0,0 +1,4 @@ +author: GenericDM +changes: + - {rscdel: mutation toxin} +delete-after: true From 22610d687448b8dc1312eb05467b22e4cc6f4569 Mon Sep 17 00:00:00 2001 From: meem <75212565+meemofcourse@users.noreply.github.com> Date: Fri, 2 Feb 2024 10:14:04 -0300 Subject: [PATCH 08/97] Fixes #2628 (#2674) ## About The Pull Request Continuation of #2628, which was merged without a testmerge. This fixes some ERT outfits, adds a Syndicate Inspector ERT (which had the outfit defined but not the ERT), and fixes the independent sechud background. Also messes with the CMM Inspector's icon. ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/a3ac82d6-e5c2-4028-9992-f2565604ac0b) ## Why It's Good For The Game blame zephyr ## Changelog :cl: add: ACLF Syndicate Inspector ERT fix: Independent background icons fix: ERT Outfits not having access and proper names /:cl: --- code/datums/ert.dm | 11 +++++++++++ code/modules/antagonists/ert/ert.dm | 12 ++++++++++++ .../modules/clothing/outfits/ert/indie_ert.dm | 12 ++++++++++++ .../modules/clothing/outfits/ert/inteq_ert.dm | 6 ++++++ .../clothing/outfits/ert/minutemen_ert.dm | 11 +++++++++++ .../clothing/outfits/ert/nanotrasen_ert.dm | 4 ++++ .../clothing/outfits/ert/solgov_ert.dm | 3 ++- .../clothing/outfits/ert/syndicate_ert.dm | 18 ++++++++++++++---- .../clothing/outfits/factions/independent.dm | 2 +- .../clothing/outfits/factions/nanotrasen.dm | 1 + icons/mob/hud.dmi | Bin 19255 -> 19376 bytes 11 files changed, 74 insertions(+), 6 deletions(-) diff --git a/code/datums/ert.dm b/code/datums/ert.dm index 2c84f254cd6f..844548748824 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -210,6 +210,17 @@ rename_team = "Cybersun Medical Intervention Team" polldesc = "a Cybersun paramedic team" +/datum/ert/syndicate/inspector + teamsize = 1 + leader_role = /datum/antagonist/ert/official/syndicate + roles = list(/datum/antagonist/ert/official/syndicate) + rename_team = "Syndicate Inspector" + polldesc = "a syndicate inspector" + spawn_at_outpost = FALSE + +/datum/ert/syndicate/inspector/New() + mission = "Conduct a routine review on [station_name()]'s vessels." + // Frontiersmen /datum/ert/frontier teamsize = 4 diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index f529c19901a3..f9741d39e572 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -461,6 +461,18 @@ outfit = /datum/outfit/job/syndicate/ert/cybersun/medic/leader role = "Lead Medical Technician" +/datum/antagonist/ert/official/syndicate + name = "Syndicate Inspector" + outfit = /datum/outfit/job/syndicate/ert/inspector + role = "Syndicate Inspector" + +/datum/antagonist/ert/official/solgov/greet() + to_chat(owner, "You are a Syndicate Inspector.") + if (ert_team) + to_chat(owner, "The Syndicate Coalition is sending you to [station_name()] with the task: [ert_team.mission.explanation_text]") + else + to_chat(owner, "The Syndicate Coalition is sending you to [station_name()] with the task: [mission.explanation_text]") + // ******************************************************************** // ** Frontiersmen ** // ******************************************************************** diff --git a/code/modules/clothing/outfits/ert/indie_ert.dm b/code/modules/clothing/outfits/ert/indie_ert.dm index f64e7f86a99a..6a8b228aec94 100644 --- a/code/modules/clothing/outfits/ert/indie_ert.dm +++ b/code/modules/clothing/outfits/ert/indie_ert.dm @@ -1,5 +1,7 @@ /datum/outfit/job/independent/ert name = "ERT - Independent Security Officer" + jobtype = /datum/job/officer + job_icon = "securityofficer" head = /obj/item/clothing/head/helmet/sec ears = /obj/item/radio/headset/alt @@ -14,6 +16,8 @@ /datum/outfit/job/independent/ert/emt name = "ERT - Independent Paramedic" + jobtype = /datum/job/paramedic + job_icon = "paramedic" head = /obj/item/clothing/head/soft/paramedic mask = null @@ -27,6 +31,8 @@ /datum/outfit/job/independent/ert/firefighter name = "ERT - Independent Firefighter (Standard)" + jobtype = /datum/job/atmos + job_icon = "atmospherictechnician" head = /obj/item/clothing/head/hardhat/red uniform = /obj/item/clothing/under/utility @@ -43,6 +49,8 @@ /datum/outfit/job/independent/ert/firefighter/medic name = "ERT - Independent Firefighter (Medic)" + jobtype = /datum/job/paramedic + job_icon = "paramedic" mask = /obj/item/clothing/mask/breath/medical back = /obj/item/storage/backpack/fireproof @@ -56,6 +64,8 @@ /datum/outfit/job/independent/ert/firefighter/leader name = "ERT - Independent Firefighter (Group Captain)" + jobtype = /datum/job/chief_engineer + job_icon = "chiefengineer" back = /obj/item/fireaxe suit = /obj/item/clothing/suit/space/hardsuit/engine @@ -66,6 +76,8 @@ /datum/outfit/job/independent/ert/technician name = "ERT - Independent Technician" + jobtype = /datum/job/engineer + job_icon = "stationengineer" head = /obj/item/clothing/head/hardhat uniform = /obj/item/clothing/under/rank/engineering/engineer diff --git a/code/modules/clothing/outfits/ert/inteq_ert.dm b/code/modules/clothing/outfits/ert/inteq_ert.dm index f9a0aec2dc57..5a39d3ea3da4 100644 --- a/code/modules/clothing/outfits/ert/inteq_ert.dm +++ b/code/modules/clothing/outfits/ert/inteq_ert.dm @@ -1,5 +1,7 @@ /datum/outfit/job/inteq/ert name = "ERT - Inteq Rifleman" + jobtype = /datum/job/officer + job_icon = "securityofficer" mask = /obj/item/clothing/mask/gas/sechailer/inteq glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq @@ -28,6 +30,8 @@ /datum/outfit/job/inteq/ert/medic name = "ERT - Inteq Corpsman" + jobtype = /datum/job/paramedic + job_icon = "paramedic" uniform = /obj/item/clothing/under/syndicate/inteq/corpsman belt = /obj/item/storage/belt/medical/webbing/paramedic @@ -39,6 +43,8 @@ /datum/outfit/job/inteq/ert/leader name = "ERT - Inteq Vanguard" + jobtype = /datum/job/hos + job_icon = "headofsecurity" ears = /obj/item/radio/headset/inteq/alt/captain back = /obj/item/storage/backpack/messenger/inteq diff --git a/code/modules/clothing/outfits/ert/minutemen_ert.dm b/code/modules/clothing/outfits/ert/minutemen_ert.dm index 6fc4821784b5..8acb733e48f0 100644 --- a/code/modules/clothing/outfits/ert/minutemen_ert.dm +++ b/code/modules/clothing/outfits/ert/minutemen_ert.dm @@ -1,5 +1,7 @@ /datum/outfit/job/minutemen/ert name = "ERT - Minuteman" + jobtype = /datum/job/officer + job_icon = "securityofficerOld" head = /obj/item/clothing/head/helmet/bulletproof/minutemen uniform = /obj/item/clothing/under/rank/security/officer/minutemen @@ -17,6 +19,7 @@ /datum/outfit/job/minutemen/ert/leader name = "ERT - Minuteman Sergeant" + job_icon = "lieutenant" ears = /obj/item/radio/headset/minutemen/alt/captain back = /obj/item/storage/backpack/satchel/sec/cmm @@ -24,6 +27,7 @@ /datum/outfit/job/minutemen/ert/bard name = "ERT - Minuteman (BARD)" + job_icon = "securityofficerOld" suit = /obj/item/clothing/suit/armor/vest/marine/medium suit_store = /obj/item/gun/ballistic/automatic/smg/cm5 @@ -43,6 +47,7 @@ /datum/outfit/job/minutemen/ert/bard/leader name = "ERT - Minuteman Sergeant (BARD)" + job_icon = "lieutenant" belt = /obj/item/storage/belt/military/assault/minutemen uniform = /obj/item/clothing/under/rank/command/minutemen @@ -60,6 +65,7 @@ /datum/outfit/job/minutemen/ert/riot name = "ERT - Minuteman (Riot Officer)" + job_icon = "securityofficerOld" suit = /obj/item/clothing/suit/armor/riot/minutemen head = /obj/item/clothing/head/helmet/riot/minutemen @@ -74,12 +80,15 @@ /datum/outfit/job/minutemen/ert/riot/leader name = "ERT - Minutemen Sergeant (Riot Officer)" + job_icon = "lieutenant" ears = /obj/item/radio/headset/minutemen/alt/captain back = /obj/item/shield/riot/flash /datum/outfit/job/minutemen/ert/inspector name = "ERT - Inspector (Minutemen GOLD)" + jobtype = /datum/job/head_of_personnel + job_icon = "minutemen" head = /obj/item/clothing/head/cowboy/sec/minutemen mask = null @@ -97,12 +106,14 @@ /datum/outfit/job/minutemen/ert/pirate_hunter name = "ERT - Minuteman (Pirate Hunter)" + job_icon = "securityofficerOld" head = null suit = /obj/item/clothing/suit/space/hardsuit/security/independent/minutemen /datum/outfit/job/minutemen/ert/pirate_hunter/leader name = "ERT - Minutemen Sergeant (Pirate Hunter)" + job_icon = "lieutenant" uniform = /obj/item/clothing/under/rank/command/minutemen ears = /obj/item/radio/headset/minutemen/alt/captain diff --git a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm index 2d397b8de828..97c4756bee9a 100644 --- a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm +++ b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm @@ -382,6 +382,7 @@ /datum/outfit/job/nanotrasen/ert/lp name = "ERT - Loss Prevention Security Specialist" jobtype = /datum/job/officer + job_icon = "securityresponseofficer" head = null implants = list(/obj/item/implant/mindshield) @@ -406,6 +407,7 @@ /datum/outfit/job/nanotrasen/ert/lp/medic name = "ERT - Loss Prevention Medical Specialist" jobtype = /datum/job/doctor + job_icon = "medicalresponseofficer" head = null uniform = /obj/item/clothing/under/rank/medical/paramedic/lp @@ -425,6 +427,7 @@ /datum/outfit/job/nanotrasen/ert/lp/engineer name = "ERT - Loss Prevention Engineering Specialist" jobtype = /datum/job/engineer + job_icon = "engineeringresponseofficer" head = null uniform = /obj/item/clothing/under/rank/engineering/engineer/nt/lp @@ -444,6 +447,7 @@ /datum/outfit/job/nanotrasen/ert/lp/lieutenant name = "ERT - Loss Prevention Lieutenant" jobtype = /datum/job/captain + job_icon = "emergencyresponseteamcommander" head = null ears = /obj/item/radio/headset/nanotrasen/alt/captain diff --git a/code/modules/clothing/outfits/ert/solgov_ert.dm b/code/modules/clothing/outfits/ert/solgov_ert.dm index 9962f1d9c74c..bc09a74c1786 100644 --- a/code/modules/clothing/outfits/ert/solgov_ert.dm +++ b/code/modules/clothing/outfits/ert/solgov_ert.dm @@ -18,8 +18,9 @@ /datum/outfit/job/solgov/ert/inspector - name = "ERT - SolGov Inspector" + name = "ERT - Inspector (SolGov)" jobtype = /datum/job/head_of_personnel + job_icon = "solgovrepresentative" uniform = /obj/item/clothing/under/solgov/formal belt = /obj/item/clipboard diff --git a/code/modules/clothing/outfits/ert/syndicate_ert.dm b/code/modules/clothing/outfits/ert/syndicate_ert.dm index 3ef6cea0e53b..ab256d094a38 100644 --- a/code/modules/clothing/outfits/ert/syndicate_ert.dm +++ b/code/modules/clothing/outfits/ert/syndicate_ert.dm @@ -1,5 +1,7 @@ /datum/outfit/job/syndicate/ert name = "ERT - Syndicate Basic" + jobtype = /datum/job/officer + job_icon = "securityofficer" suit = /obj/item/clothing/suit/armor/vest/syndie suit_store = /obj/item/gun/ballistic/automatic/smg/c20r @@ -18,10 +20,9 @@ implants = list(/obj/item/implant/weapons_auth) backpack_contents = list(/obj/item/radio=1) - jobtype = /datum/job/officer // most of these are Shooty Shooty People anyway - /datum/outfit/job/syndicate/ert/leader name = "ERT - Syndicate Basic Leader" + job_icon = "lieutenant" head = /obj/item/clothing/head/HoS/beret/syndicate ears = /obj/item/radio/headset/syndicate/captain @@ -48,6 +49,8 @@ /datum/outfit/job/syndicate/ert/gorlex/medic name = "ERT - Syndicate Gorlex Loyalist Medic" + jobtype = /datum/job/paramedic + job_icon = "paramedic" head = /obj/item/clothing/head/soft/black mask = null @@ -79,6 +82,7 @@ /datum/outfit/job/syndicate/ert/gorlex/leader name = "ERT - Syndicate Gorlex Loyalist Sergeant" + job_icon = "lieutenant" uniform = /obj/item/clothing/under/syndicate/gorlex head = /obj/item/clothing/head/HoS/beret/syndicate @@ -93,6 +97,7 @@ /datum/outfit/job/syndicate/ert/cybersun name = "ERT - Syndicate Cybersun Commando" + job_icon = "syndicate" head = null uniform = /obj/item/clothing/under/syndicate/combat @@ -117,6 +122,7 @@ /datum/outfit/job/syndicate/ert/cybersun/medic name = "ERT - Syndicate Cybersun Paramedic" + job_icon = "paramedic" uniform = /obj/item/clothing/under/syndicate/medic suit = /obj/item/clothing/suit/space/hardsuit/syndi/cybersun/paramed @@ -138,6 +144,7 @@ /datum/outfit/job/syndicate/ert/cybersun/medic/leader name = "ERT - Syndicate Cybersun Lead Paramedic" + job_icon = "chiefmedicalofficer" head = /obj/item/clothing/head/beret/cmo glasses = /obj/item/clothing/glasses/hud/security/night @@ -150,6 +157,8 @@ /datum/outfit/job/syndicate/ert/inspector name = "ERT - Inspector (Syndicate)" + jobtype = /datum/job/head_of_personnel + job_icon = "syndicate" uniform = /obj/item/clothing/under/syndicate/officer head = /obj/item/clothing/head/HoS/beret/syndicate @@ -160,10 +169,11 @@ shoes = /obj/item/clothing/shoes/laceup gloves = /obj/item/clothing/gloves/color/white suit = /obj/item/clothing/suit/armor/hos + l_pocket = null + r_pocket = null suit_store = null - job_icon = "syndicate" - jobtype = /datum/job/head_of_personnel + backpack_contents = list(/obj/item/stamp/syndicate) /datum/outfit/job/syndicate/ert/inspector/post_equip(mob/living/carbon/human/H, visualsOnly) . = ..() diff --git a/code/modules/clothing/outfits/factions/independent.dm b/code/modules/clothing/outfits/factions/independent.dm index 97b806ec4b5b..e31e03e10eba 100644 --- a/code/modules/clothing/outfits/factions/independent.dm +++ b/code/modules/clothing/outfits/factions/independent.dm @@ -1,6 +1,6 @@ /datum/outfit/job/independent name = "Independent - Base Outfit" - faction_icon = "bg_independent" + faction_icon = "bg_indie" uniform = /obj/item/clothing/under/utility box = /obj/item/storage/box/survival diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm index 409a8dd55d47..28ff486e4dc6 100644 --- a/code/modules/clothing/outfits/factions/nanotrasen.dm +++ b/code/modules/clothing/outfits/factions/nanotrasen.dm @@ -380,6 +380,7 @@ job_icon = "medicaldoctor" jobtype = /datum/job/doctor + belt = /obj/item/pda/medical ears = /obj/item/radio/headset/headset_med uniform = /obj/item/clothing/under/rank/medical/doctor shoes = /obj/item/clothing/shoes/sneakers/white diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index e55252e102df1a662d6e79fe8f94cea0f6670b8b..a54640fc17ba2ed2726a844b480cc944463acac5 100644 GIT binary patch literal 19376 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 NJzf1=);T3K0RYFqDaHT* literal 19255 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 From 3fa7f15d81536777bda395c1135f48f875865707 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 2 Feb 2024 07:57:02 -0600 Subject: [PATCH 09/97] Automatic changelog generation for PR #2674 [ci skip] --- html/changelogs/AutoChangeLog-pr-2674.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2674.yml diff --git a/html/changelogs/AutoChangeLog-pr-2674.yml b/html/changelogs/AutoChangeLog-pr-2674.yml new file mode 100644 index 000000000000..110fc871e171 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2674.yml @@ -0,0 +1,6 @@ +author: meemofcourse +changes: + - {rscadd: ACLF Syndicate Inspector ERT} + - {bugfix: Independent background icons} + - {bugfix: ERT Outfits not having access and proper names} +delete-after: true From 559c6ca075e7f189f3abc3146c85f1c389765931 Mon Sep 17 00:00:00 2001 From: Bokkiewokkie <43698041+Bokkiewokkie@users.noreply.github.com> Date: Fri, 2 Feb 2024 14:17:41 +0100 Subject: [PATCH 10/97] Adds more underwear for Kepori and digitigrades (#2690) ## About The Pull Request Adds a bunch of new socks and shirts for Kepori, and digitigrade versions of the pride and grayscale thigh-highs. I also updated some of the already existing socks (like bee and bisexual socks) to use the sprites of their grayscale counterparts as a base so they're not just a flat sprite. On top of this I noticed Kepori their left arms and legs also had right arm and leg sprites and vice versa when facing east/west, so I removed the extra parts from those. In practice there will be no noticeable difference in this outside of amputees now showing their sides correctly. ## Why It's Good For The Game Now you can express your pride as a Kepori or with digitigrade legs! ## Images Kepori with the tank top and the bee socks ![image](https://github.com/shiptest-ss13/Shiptest/assets/43698041/413f292b-10c2-4423-9fa2-fec28ace4efb) Kepori with a polo shirt and nonbinary socks ![image](https://github.com/shiptest-ss13/Shiptest/assets/43698041/750a5ce0-e162-4d5a-9507-47f026e7cc59) Lizard with the trans socks ![image](https://github.com/shiptest-ss13/Shiptest/assets/43698041/c296e97a-e636-4257-b50a-6743b60dc4c3) ## Changelog :cl: imageadd: Added more Kepori socks imageadd: Added more Kepori shirts imageadd: Added digitigrade pride thigh-highs fix: Fixed Kepori arms having both left and right sprites per single arm /:cl: --- .../species/underwear_socks_kepori.dmi | Bin 1636 -> 2905 bytes .../species/underwear_torso_kepori.dmi | Bin 1241 -> 1514 bytes .../clothing/underwear/underwear_socks.dmi | Bin 20805 -> 27123 bytes icons/mob/species/kepori/bodyparts.dmi | Bin 1375 -> 1368 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi index d182ee4c238a4baa02893209ec62893efc856e65..7548aeb3a70243b3bd08e61788cd61aa0a6975e6 100644 GIT binary patch literal 2905 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 diff --git a/icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi index 5574cfb965b7e63121580f08c58f90c5246955ac..19813d4e29462c2bdbfa412239f4f4023e165de9 100644 GIT binary patch delta 1432 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%0DNiLUhMQ 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 MboFyt=akR{0PE`WU;qFB diff --git a/icons/mob/species/kepori/bodyparts.dmi b/icons/mob/species/kepori/bodyparts.dmi index 177efcbbf51ab3b3067421c686061f579a580192..f19aaeacbe08ebafdf5c90f7fe8fd985e6ba2dfc 100644 GIT binary patch delta 1108 zcmV-a1grbs3fKy;6ajxPNkl`*^AS z64VgS##i-uMcX}!)agB3t{-ZU=i;mS6m6C$@A0bWkIEe+#MgiIC5m!~B7l?7I>k6i zqqX)NpZf6=Yx=b4Re~5`meMO4W<`S-U)7fkD>$K>65**Sx3kn<;iB}X)a9zaenZeFPy8t* zko9W`5D|X{e)!ffark61xef!+Ev9%A637{_CL%xh@{Q8^d(RXT-PrQXK7^mBJ?R^Inyw~*s001~K!}kBd zgmWkGalM51qeaL#*}MC=UgO`+VBFt7m~nsqV8;FZgBkbtk7n54Kb&EI9{>OV004jk z5vmZo7bxC1C}mQmy+FNE>MvASD6mo{mD_6{?(`wOz&8q)I;c>{(b_9Sol0sRymyt6 zYaLfeKxuz3)LL+F1=J$(Af-+ngk8>#h}>g)Ej`|a_4Pkwuo`8h&M&lct+e+OaJ79M zq3jqg_4z7i(cim??-`W7Wz5z+)tdhy0q*_MVhNCkhp-M%V&+xhMb7eDf^Gs!b4{7^ za*E4soPR~BB};!Pnw9nT-OaIj(gMoY1g{Pc)VN}oC{ZUxhJZ00hT>JaR zNTPqg?>ZT5sLpgsRMfJA*Z#gKy6o@A)IP7ag{wbNfc`;Cr^%iZ+%)wss_I}?`zfz7>i(i{AXOW!)jMEY3=>-=qs z{cijOocPjBSB?CZzpqLdT7gnPFn$1DK1R_o@^?4)?f(7ge?$+T9{>OV00000002w? z0MMr8?;D54^aAH}VE%=czi%As!wX7e1M@Gm{C(rlm|jrq9GHKhQr aS@;KFB^A&t%D~~ delta 1115 zcmV-h1f=`e3f~H_6ajxWNkl;dYxa425ecxT%5W{oi)7X||Htl8B)+=iKin zvZbpSHjprVdjkLf00000006+t6Nnt6h{B;N+Wt*_fn5o(n!v^3;z|FezJVMW$e2O1 zU!rD>+~MEUHyGOPUbI2)@pAo8=0@xMQ~aCy3~e4S@9EmspCf-zGBQy7+xkXI`T!yE zs92|zCT+H57ys1uKeDCI@?IpU4rVRAtYJ1ZsQyiTqhkeBg_GqWjn)ci{!M+|D=^6l zC6HyYRXJyRO##-3;P zE{18I=c)bJCr^}u_1Idn9M`x0X&lSpJydE8ax<*y8ytW7^Ho68<2}0^prfyV%rMyc z0002IFx}<ZqLM9Ed19+Dq&4F08Hp zA%oQ{FD1TW=hA6!ClHE#?IE8rocr@d&Z56{5#KY&WAmJ?=Tt5JLjv4-(_(QT)8oV2 z&)KJ}3NLb&cL|yaEas9j%W|sA?To)7_mZ`LDXM>+_AH)4`1(n;tK_daFPO~8No>*o z)dSb;qEI_Ase0muA~=*B7J&^};hur04<(_kTPdvTrY`WCU03Y@*Aw{`#$vgerROi>(0pR#&)s1!K{+Oy1wrTVbu52SQp^j#TGbM zxvP6AS#(yGU{&AugfQy+L$OxE_`XY&mDKv2Ia-cdoARx`?+Ibl_tVI=lZd_D0GS*r zHGC?Ebr;UUy*aEFKMQc~krVf|2#v#sP`!VaJev@IIWM08000000000006>FRuk1VP z-&UP}bA5j|e6?MrgHhO8-`@}SyV&X`l+E@1-4Oqd&rW}hY#X=N_y3J>#%~194FX^F zGH74$f1ihos{mZ{Zk2*g9002_} z000000001>POZN0oSMcRDyJRs7i#r==hPwY@HeYE;xE+d`_8Fp+@aao5r3gp-+x-o h6Pz6%006+N@CTMX7MS%pB*y>%002ovPDHLkV1j!_Kehk> From 05e51b4c184d0590b61f35ba9f355738e36e44a3 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 2 Feb 2024 08:13:05 -0600 Subject: [PATCH 11/97] Automatic changelog generation for PR #2690 [ci skip] --- html/changelogs/AutoChangeLog-pr-2690.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2690.yml diff --git a/html/changelogs/AutoChangeLog-pr-2690.yml b/html/changelogs/AutoChangeLog-pr-2690.yml new file mode 100644 index 000000000000..fe04b30d40ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2690.yml @@ -0,0 +1,7 @@ +author: Bokkiewokkie +changes: + - {imageadd: Added more Kepori socks} + - {imageadd: Added more Kepori shirts} + - {imageadd: Added digitigrade pride thigh-highs} + - {bugfix: Fixed Kepori arms having both left and right sprites per single arm} +delete-after: true From 878a80ddc83dda69a2c8c9702643de0f9026c2f5 Mon Sep 17 00:00:00 2001 From: meem <75212565+meemofcourse@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:36:16 -0300 Subject: [PATCH 12/97] Ports the Requests Manager, Minor Fax QOL, Adds factional offices to CentCom (#2653) ## About The Pull Request This pull requests ports: * https://github.com/BeeStation/BeeStation-Hornet/pull/9408 * https://github.com/BeeStation/BeeStation-Hornet/pull/9236 This pull request reverts: * https://github.com/tgstation/tgstation/pull/70072 The requests manager is now a thing. ![264860380-6d27a710-8ac1-4864-9abe-4c13f4885cba](https://github.com/shiptest-ss13/Shiptest/assets/75212565/dc3277d3-9770-4450-97a8-6b4b918cf25b) It also adds little offices with fax machines for factions to CentCom, which recieve the physical paper and can send faxes back (though admins can still make use of the fax panel). ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/1abb223f-1914-4ab9-8240-e2969a4e47f5) They can also fax each other, if ever needed. ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/1d551e8e-cbea-4116-a608-f319411484b6) ## Why It's Good For The Game * Gives admins the ability to see a very easy to use recap of all requests that occur in a round. This system is readily extendible to support other types of requests, should someone care to add it. * Better admin tools, admins can now send faxes directly via the new Fax Manager verb, and faxes are show in the request panel instead of its own panel. * You can now LARP as a Cybersun minimum wage intern handling faxes. ## Changelog :cl: bobbahbrown, itsmeow, meemofcourse add: CentCom now has some small offices, which recieve physical faxes. add: Fax machines now announce that they have received a fax over radio. add: Fax machines announce important faxes VERY LOUDLY. balance: Faxes no longer require a subspace ansible crystal. code: Faxes now use typepath instead of varedit. tweak: Changed how special/faction faxes work. Login is no longer required to use special faxes. admin: Add Requests Manager to view all fax messages/prayers/centcom and syndicate requests/and nuke code requests within a round. admin: Removed old fax manager in favor of Requests Manager, added "Send Fax Message" verb to send admin faxes via a menu. fix: Fixed runtime when ghosts tried to view paper. /:cl: --- .../JungleRuins/jungle_cavecrew.dmm | 2 +- .../JungleRuins/jungle_syndicate.dmm | 2 +- .../SpaceRuins/corporate_mining.dmm | 2 +- .../wasteplanet_fortress_of_solitide.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 1711 ++++++++++++++--- _maps/outpost/hangar/nt_asteroid_20x20.dmm | 2 +- _maps/outpost/hangar/nt_asteroid_40x20.dmm | 2 +- _maps/outpost/nanotrasen_asteroid.dmm | 2 +- _maps/outpost/nanotrasen_ice.dmm | 2 +- code/__DEFINES/admin.dm | 2 + code/_globalvars/lists/faxes.dm | 26 - code/_globalvars/lists/objects.dm | 1 + .../machinery/telecomms/machines/relay.dm | 30 + .../circuitboards/machine_circuitboards.dm | 1 - code/game/turfs/closed/_closed.dm | 2 +- code/modules/admin/admin_fax_panel.dm | 145 ++ code/modules/admin/admin_verbs.dm | 6 +- code/modules/admin/topic.dm | 8 +- code/modules/admin/verbs/fax_manager.dm | 9 - code/modules/admin/verbs/pray.dm | 8 +- code/modules/admin/verbs/requests.dm | 7 + code/modules/client/client_procs.dm | 2 + code/modules/paperwork/fax.dm | 200 +- code/modules/paperwork/fax_manager.dm | 154 -- code/modules/paperwork/paper.dm | 20 +- code/modules/requests/request.dm | 37 + code/modules/requests/requests_manager.dm | 249 +++ shiptest.dme | 7 +- tgui/packages/tgui/interfaces/AdminFax.js | 263 +++ tgui/packages/tgui/interfaces/Fax.tsx | 86 +- tgui/packages/tgui/interfaces/FaxManager.tsx | 317 --- tgui/packages/tgui/interfaces/PaperSheet.tsx | 133 +- .../tgui/interfaces/RequestManager.js | 184 ++ 33 files changed, 2546 insertions(+), 1078 deletions(-) delete mode 100644 code/_globalvars/lists/faxes.dm create mode 100644 code/modules/admin/admin_fax_panel.dm delete mode 100644 code/modules/admin/verbs/fax_manager.dm create mode 100644 code/modules/admin/verbs/requests.dm delete mode 100644 code/modules/paperwork/fax_manager.dm create mode 100644 code/modules/requests/request.dm create mode 100644 code/modules/requests/requests_manager.dm create mode 100644 tgui/packages/tgui/interfaces/AdminFax.js delete mode 100644 tgui/packages/tgui/interfaces/FaxManager.tsx create mode 100644 tgui/packages/tgui/interfaces/RequestManager.js diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm index cca97a317ce2..afa21c752a75 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm @@ -3119,7 +3119,7 @@ /obj/structure/table/reinforced{ color = "#c1b6a5" }, -/obj/machinery/fax/frontiersmen, +/obj/machinery/fax/ruin, /turf/open/floor/plasteel/tech, /area/ruin/jungle/cavecrew/bridge) "Ls" = ( diff --git a/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm b/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm index 018739e20dc4..ebd333289382 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm @@ -1330,7 +1330,7 @@ "OW" = ( /obj/structure/table/reinforced, /obj/item/trash/syndi_cakes, -/obj/machinery/fax, +/obj/machinery/fax/ruin, /turf/open/floor/plating, /area/ruin/jungle/syndifort/jerry) "Ph" = ( diff --git a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm index 6ed5ed67825f..3585b4dcc1e3 100644 --- a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm +++ b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm @@ -956,7 +956,7 @@ /area/ruin/space) "xK" = ( /obj/structure/table/wood, -/obj/machinery/fax, +/obj/machinery/fax/ruin, /turf/open/floor/wood, /area/ruin/space/has_grav/corporatemine/crewquarters) "xT" = ( diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm index 66ab48f18a92..e931e0091d26 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm @@ -401,7 +401,7 @@ /area/ruin/powered) "dT" = ( /obj/structure/table/wood, -/obj/machinery/fax, +/obj/machinery/fax/ruin, /turf/open/floor/plating, /area/ruin/powered) "dU" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index e2b1ff97158c..0eccbd8fc0d0 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -1096,6 +1096,18 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"apm" = ( +/obj/structure/rack, +/obj/item/gun/ballistic/automatic/gal/inteq{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/gun/ballistic/automatic/gal/inteq{ + pixel_x = -4; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/centcom) "apt" = ( /obj/structure/closet/secure_closet/security, /obj/item/storage/belt/security/full, @@ -3419,6 +3431,17 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating/asteroid, /area/tdome/tdomeadmin) +"aIF" = ( +/obj/structure/table/reinforced, +/obj/item/storage/ration/crayons{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/storage/ration/shredded_beef{ + pixel_x = -2 + }, +/turf/open/floor/plasteel, +/area/centcom) "aIH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -4560,6 +4583,9 @@ }, /turf/open/floor/plasteel, /area/tdome/arena) +"aPu" = ( +/turf/closed/indestructible/reinforced, +/area/centcom) "aPw" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security"; @@ -6202,6 +6228,13 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"bbf" = ( +/obj/machinery/door/airlock/command{ + dir = 4; + req_access_txt = "109" + }, +/turf/open/floor/plasteel, +/area/centcom) "bbL" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -6470,6 +6503,13 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/supply) +"bFc" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/wideband/table{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "bIh" = ( /obj/structure/chair{ dir = 4 @@ -6484,6 +6524,16 @@ /obj/effect/turf_decal/industrial/warning, /turf/open/floor/plasteel, /area/centcom/control) +"bIJ" = ( +/obj/structure/sign/minutemen{ + pixel_y = -28 + }, +/obj/machinery/light/directional/west, +/obj/machinery/telecomms/relay/preset/minutemen{ + autolinkers = list("relay") + }, +/turf/open/floor/plasteel, +/area/centcom) "bMY" = ( /obj/effect/turf_decal/corner/opaque/green{ dir = 1 @@ -6526,6 +6576,28 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"bRF" = ( +/obj/structure/table/reinforced, +/obj/structure/sign/poster/minutemen/bard{ + pixel_y = -32 + }, +/obj/item/ammo_box/magazine/p16{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/ammo_box/magazine/p16{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/ammo_casing{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/item/ammo_casing{ + pixel_x = 11 + }, +/turf/open/floor/plasteel, +/area/centcom) "bRK" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law, @@ -6542,6 +6614,26 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"bSy" = ( +/obj/structure/table/wood/fancy/blue, +/obj/structure/sign/solgov_seal{ + pixel_y = 28 + }, +/obj/item/clothing/head/beret/solgov{ + pixel_x = 11; + pixel_y = -1 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom) +"bUH" = ( +/obj/effect/turf_decal/minutemen/corner{ + dir = 1 + }, +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "bVe" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs/cable/zipties, @@ -6664,6 +6756,21 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"ciU" = ( +/obj/structure/table/reinforced, +/obj/structure/sign/poster/contraband/gec{ + pixel_x = 32 + }, +/obj/item/paper_bin/construction, +/obj/item/pen, +/turf/open/floor/mineral/plastitanium, +/area/centcom) +"cjo" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/centcom) "ckq" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -6813,6 +6920,16 @@ }, /turf/open/floor/plasteel, /area/centcom/ferry) +"cxm" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 10 + }, +/obj/effect/turf_decal/steeldecal/steel_decals_central6, +/obj/structure/chair/comfy{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/centcom) "cyx" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -6848,6 +6965,12 @@ }, /turf/open/floor/plasteel/white, /area/tdome/tdomeobserve) +"cCK" = ( +/obj/machinery/telecomms/relay/preset/syndicate{ + autolinkers = list("relay") + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "cDe" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -6937,6 +7060,15 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/evac) +"cIS" = ( +/obj/structure/rack, +/obj/item/gun/ballistic/shotgun/bulldog/inteq, +/obj/item/gun/ballistic/shotgun/bulldog/inteq{ + pixel_x = -5; + pixel_y = -5 + }, +/turf/open/floor/plasteel, +/area/centcom) "cKk" = ( /obj/effect/turf_decal/corner/opaque/green{ dir = 8 @@ -6980,6 +7112,15 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership/control) +"cUG" = ( +/obj/structure/sign/poster/contraband/syndicate_recruitment{ + pixel_x = -32 + }, +/obj/machinery/computer/secure_data/syndie{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "cVC" = ( /obj/structure/noticeboard{ dir = 8; @@ -7047,6 +7188,11 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeobserve) +"cZi" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/centcom) "dhD" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -7115,6 +7261,16 @@ }, /turf/open/floor/plasteel, /area/centcom/supply) +"dom" = ( +/obj/structure/sign/solgov_seal{ + pixel_y = 28 + }, +/obj/structure/table/wood/fancy/blue, +/obj/item/flashlight/lamp/green{ + pixel_y = 3 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom) "dop" = ( /obj/structure/table/reinforced, /obj/item/storage/firstaid/regular, @@ -7185,6 +7341,18 @@ }, /turf/open/floor/plasteel, /area/centcom/evac) +"duw" = ( +/obj/effect/decal/cleanable/blood{ + icon_state = "floor5-old"; + pixel_y = -6; + pixel_x = -3 + }, +/obj/item/restraints/handcuffs/cable/zipties/used{ + pixel_x = -3; + pixel_y = -4 + }, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "dvo" = ( /obj/effect/turf_decal/industrial/warning, /turf/open/floor/plasteel/dark, @@ -7205,6 +7373,9 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"dER" = ( +/turf/open/floor/carpet/royalblue, +/area/centcom) "dGb" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -7270,6 +7441,15 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"dKW" = ( +/obj/structure/closet/crate/bin, +/obj/structure/sign/minutemen{ + pixel_y = 28 + }, +/obj/machinery/light/directional/east, +/obj/item/reagent_containers/food/snacks/pancakes/blueberry, +/turf/open/floor/plasteel, +/area/centcom) "dMa" = ( /obj/item/radio{ pixel_x = 5; @@ -7582,6 +7762,10 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"emF" = ( +/obj/effect/turf_decal/corner/opaque/yellow/full, +/turf/open/floor/plasteel, +/area/centcom) "enx" = ( /obj/item/kirbyplants{ icon_state = "plant-21"; @@ -7620,6 +7804,19 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"eqM" = ( +/obj/effect/turf_decal/solgov/wood/bottom_left, +/obj/effect/turf_decal/siding/wood{ + color = "#543C30" + }, +/turf/open/floor/wood/walnut, +/area/centcom) +"etl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/mahogany, +/area/centcom) "etp" = ( /obj/structure/table, /obj/item/paper_bin, @@ -7730,6 +7927,9 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) +"eAJ" = ( +/turf/closed/indestructible/wood, +/area/centcom) "eCK" = ( /obj/effect/turf_decal/corner/opaque/red{ dir = 1 @@ -7862,6 +8062,13 @@ heat_capacity = 1e+006 }, /area/tdome/tdomeobserve) +"eLy" = ( +/obj/machinery/door/airlock/hatch{ + dir = 4; + req_access = "109" + }, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "eSx" = ( /obj/structure/noticeboard{ dir = 8; @@ -7961,6 +8168,13 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"eWz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/catwalk/over, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/centcom) "eYx" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -8005,6 +8219,12 @@ }, /turf/open/floor/plasteel, /area/centcom/supply) +"fau" = ( +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/centcom) "fda" = ( /obj/machinery/modular_computer/console/preset/command{ dir = 8 @@ -8242,6 +8462,12 @@ }, /turf/open/floor/plasteel, /area/centcom/supply) +"fKt" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen/edagger, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "fLD" = ( /obj/structure/closet/secure_closet/courtroom, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -8385,6 +8611,16 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"fTU" = ( +/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/centcom) +"fUc" = ( +/obj/machinery/door/airlock/security, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "fUK" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/corner/transparent/bar, @@ -8449,6 +8685,12 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) +"gaU" = ( +/obj/effect/turf_decal/minutemen/corner{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "gba" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -8485,6 +8727,12 @@ }, /turf/open/floor/plasteel, /area/centcom/supply) +"gfJ" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom) "ggX" = ( /obj/machinery/pdapainter, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -8596,6 +8844,16 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"gsx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/sign/solgov_seal{ + pixel_y = -28 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/walnut, +/area/centcom) "gwE" = ( /obj/effect/turf_decal/corner/opaque/blue{ dir = 1 @@ -8653,6 +8911,13 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"gDV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/catwalk/over, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/centcom) "gFU" = ( /obj/machinery/computer/helm, /obj/effect/turf_decal/industrial/warning{ @@ -8805,6 +9070,12 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"gTo" = ( +/obj/structure/table/wood/fancy/blue, +/obj/machinery/light/directional/north, +/obj/machinery/fax/admin/solgov, +/turf/open/floor/carpet/royalblue, +/area/centcom) "gUp" = ( /obj/structure/chair{ dir = 1 @@ -8845,6 +9116,20 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/plasteel, /area/centcom/supply) +"hba" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 5 + }, +/obj/item/clothing/head/cowboy/sec/minutemen{ + pixel_y = 8; + pixel_x = -4 + }, +/obj/item/pen/fourcolor{ + pixel_x = 5 + }, +/turf/open/floor/plasteel, +/area/centcom) "hbh" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -9008,6 +9293,9 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"hzJ" = ( +/turf/closed/indestructible/riveted, +/area/centcom) "hzR" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -9043,6 +9331,12 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) +"hBf" = ( +/obj/effect/turf_decal/minutemen/edge{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "hDn" = ( /obj/effect/turf_decal/corner/opaque/blue{ dir = 1 @@ -9200,6 +9494,10 @@ /obj/machinery/vending/wardrobe/cent_wardrobe, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"hYV" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/ship/dirt, +/area/centcom) "hZs" = ( /obj/structure/table/reinforced, /obj/item/folder/red{ @@ -9246,6 +9544,26 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/plasteel/dark, /area/centcom/supply) +"ibc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper/stack{ + dir = 5; + pixel_y = 25; + layer = 2.89 + }, +/obj/structure/fluff/paper/stack{ + dir = 4; + pixel_y = -4; + pixel_x = 11 + }, +/obj/structure/fluff/paper/stack{ + dir = 1; + pixel_x = -16; + pixel_y = -2 + }, +/obj/effect/turf_decal/steeldecal/steel_decals_central4, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "ieA" = ( /obj/item/kirbyplants{ icon_state = "plant-22" @@ -9302,6 +9620,26 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"igC" = ( +/obj/structure/sign/minutemen{ + pixel_y = -28 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/head/helmet/bulletproof/minutemen{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/item/clothing/head/helmet/bulletproof/minutemen{ + pixel_x = 3; + pixel_y = 11 + }, +/obj/machinery/light/directional/east, +/obj/item/reagent_containers/food/drinks/bottle/rum{ + pixel_x = -9; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/centcom) "igW" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -9431,6 +9769,16 @@ }, /turf/open/floor/plasteel/white, /area/tdome/tdomeobserve) +"iti" = ( +/obj/effect/decal/fakelattice{ + color = "#808080"; + layer = 2.038 + }, +/obj/effect/turf_decal/corner_steel_grid/full, +/turf/open/floor/plasteel/elevatorshaft{ + color = "#808080" + }, +/area/centcom) "iuo" = ( /obj/machinery/computer/auxillary_base{ pixel_y = 32 @@ -9472,6 +9820,14 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod) +"iwJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9; + color = "#543C30" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/walnut, +/area/centcom) "iyp" = ( /obj/effect/turf_decal/corner/opaque/green{ dir = 1 @@ -9521,6 +9877,15 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"iyJ" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/hardhat{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "izl" = ( /obj/machinery/computer/secure_data{ dir = 1 @@ -9573,6 +9938,9 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/plasteel/dark, /area/centcom/control) +"iDo" = ( +/turf/open/floor/ship/dirt, +/area/centcom) "iDE" = ( /obj/effect/turf_decal/corner/transparent/bar, /obj/effect/turf_decal/corner/transparent/bar{ @@ -9627,6 +9995,27 @@ }, /turf/open/floor/plasteel, /area/tdome/arena) +"iRP" = ( +/obj/structure/table/glass, +/obj/item/desk_flag{ + pixel_x = -7; + pixel_y = 6; + name = "white flag"; + desc = "Show in case of Minutemen patrols." + }, +/obj/item/radio/intercom/wideband/directional/north, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) +"iSo" = ( +/obj/machinery/door/airlock/solgov{ + req_access_txt = "109" + }, +/turf/open/floor/wood/walnut, +/area/centcom) +"iWI" = ( +/obj/effect/turf_decal/minutemen/middle, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "iWU" = ( /obj/effect/turf_decal/corner/opaque/brown{ dir = 8 @@ -9650,6 +10039,9 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"iZr" = ( +/turf/open/floor/mineral/plastitanium, +/area/centcom) "iZH" = ( /obj/machinery/vending/snack, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -9747,6 +10139,14 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"jja" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9; + color = "#543C30" + }, +/obj/effect/turf_decal/solgov/wood/center_left, +/turf/open/floor/wood/walnut, +/area/centcom) "jjE" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -9760,6 +10160,12 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/ert) +"jly" = ( +/obj/machinery/computer/med_data/syndie{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "jlB" = ( /obj/item/cardboard_cutout{ desc = "They seem to be ignoring you... Typical."; @@ -9870,6 +10276,17 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"jyy" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/bundlenatural{ + pixel_y = 4 + }, +/obj/item/pen/charcoal{ + pixel_x = -5; + pixel_y = -4 + }, +/turf/open/floor/wood/mahogany, +/area/centcom) "jCA" = ( /obj/effect/turf_decal/industrial/warning{ dir = 5 @@ -9898,6 +10315,26 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"jDt" = ( +/obj/item/shard{ + icon_state = "small"; + pixel_x = 9; + pixel_y = -7 + }, +/obj/item/shard{ + icon_state = "medium"; + pixel_x = -10; + pixel_y = 11 + }, +/obj/machinery/fax/admin/frontiersmen, +/obj/structure/table_frame, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) +"jEn" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/mahogany, +/area/centcom) "jEB" = ( /obj/item/kirbyplants{ icon_state = "plant-22" @@ -9910,6 +10347,14 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"jFa" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/HoS/cybersun{ + pixel_x = 2 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "jGz" = ( /obj/item/clipboard, /obj/item/folder/red, @@ -9966,6 +10411,10 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/supply) +"jPn" = ( +/obj/effect/turf_decal/syndicateemblem/middle/middle, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "jPL" = ( /obj/machinery/vending/cola, /obj/effect/turf_decal/corner/transparent/bar, @@ -10196,6 +10645,12 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"kiC" = ( +/obj/effect/turf_decal/minutemen/edge{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "kjt" = ( /obj/machinery/computer/communications{ dir = 8 @@ -10243,12 +10698,27 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"kkC" = ( +/obj/structure/table/reinforced, +/obj/structure/sign/poster/minutemen/gold{ + pixel_y = 32 + }, +/obj/machinery/fax/admin/minutemen, +/turf/open/floor/plasteel, +/area/centcom) "kkV" = ( /obj/effect/turf_decal/corner/opaque/green{ dir = 4 }, /turf/open/floor/plasteel, /area/tdome/arena_source) +"kmQ" = ( +/obj/effect/turf_decal/syndicateemblem/middle/right, +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "kqM" = ( /obj/machinery/shower{ dir = 4 @@ -10346,6 +10816,14 @@ /obj/machinery/light/directional/south, /turf/open/floor/plasteel, /area/centcom/control) +"kFX" = ( +/obj/item/clothing/head/intern{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "kHH" = ( /obj/effect/turf_decal/corner/opaque/red{ dir = 1 @@ -10458,6 +10936,10 @@ }, /turf/open/floor/plasteel/grimy, /area/centcom/control) +"kXn" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/left, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "laX" = ( /obj/structure/chair/office/light{ dir = 8 @@ -10525,6 +11007,11 @@ }, /turf/open/floor/plasteel/dark, /area/ctf) +"lfi" = ( +/obj/structure/table/wood, +/obj/machinery/fax/admin/roumain, +/turf/open/floor/wood/mahogany, +/area/centcom) "lfw" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -10542,6 +11029,10 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"lfK" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "lfS" = ( /obj/effect/turf_decal/corner/opaque/green, /turf/open/floor/plasteel, @@ -10659,6 +11150,11 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"lmY" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/centcom) "lnt" = ( /obj/effect/turf_decal/industrial/warning{ dir = 6 @@ -10875,6 +11371,19 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeobserve) +"lHR" = ( +/obj/item/paper_bin, +/obj/item/clothing/head/beret/sec/frontier/officer{ + pixel_y = 12; + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = -8; + pixel_y = -3 + }, +/obj/structure/table/glass, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "lIm" = ( /obj/structure/table, /obj/item/paper/pamphlet/centcom/visitor_info, @@ -10903,6 +11412,23 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"lJp" = ( +/turf/closed/indestructible/syndicate, +/area/centcom) +"lKP" = ( +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow, +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/machinery/telecomms/relay/preset/inteq{ + autolinkers = list("relay") + }, +/turf/open/floor/plasteel, +/area/centcom) "lMB" = ( /obj/effect/turf_decal/industrial/warning, /turf/open/floor/plasteel, @@ -10933,6 +11459,18 @@ }, /turf/open/floor/plasteel, /area/tdome/arena_source) +"lQr" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp{ + pixel_x = 8; + pixel_y = 3 + }, +/obj/structure/sign/minutemen{ + pixel_y = 28 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel, +/area/centcom) "lQv" = ( /obj/effect/turf_decal/corner/opaque/brown, /obj/effect/turf_decal/corner/opaque/brown{ @@ -10995,6 +11533,28 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) +"lXI" = ( +/obj/item/ammo_casing/spent{ + pixel_x = -6; + pixel_y = -10 + }, +/obj/item/ammo_casing/spent{ + pixel_x = 9; + pixel_y = -6 + }, +/obj/item/ammo_casing/spent{ + pixel_x = 3 + }, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) +"lXQ" = ( +/obj/effect/decal/cleanable/blood{ + icon_state = "floor3-old"; + pixel_x = -9; + pixel_y = -11 + }, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "lYC" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -11004,6 +11564,12 @@ }, /turf/open/floor/plasteel/dark, /area/ctf) +"lYF" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/centcom) "mbm" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -11130,6 +11696,22 @@ }, /turf/open/floor/plasteel/dark, /area/ctf) +"moE" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/secure_data/laptop{ + dir = 4; + pixel_y = 6; + pixel_x = -4 + }, +/turf/open/floor/plasteel, +/area/centcom) +"mpi" = ( +/obj/machinery/door/airlock/hatch{ + dir = 4; + req_access_txt = "109" + }, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "mpw" = ( /obj/effect/landmark/prisonwarp, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -11161,6 +11743,15 @@ /obj/machinery/light/directional/west, /turf/open/floor/plasteel, /area/centcom/control) +"msQ" = ( +/obj/structure/table/reinforced, +/obj/structure/sign/poster/contraband/cybersun{ + pixel_y = -32 + }, +/obj/item/paper_bin/carbon, +/obj/item/pen/fountain, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "mtq" = ( /obj/effect/turf_decal/corner/transparent/bar, /obj/effect/turf_decal/corner/transparent/bar{ @@ -11222,6 +11813,13 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"myU" = ( +/obj/effect/turf_decal/syndicateemblem/middle/left, +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "mzM" = ( /obj/structure/fans/tiny, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -11236,6 +11834,12 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/supply) +"mAL" = ( +/obj/structure/table/reinforced, +/obj/machinery/fax/admin/syndicate, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "mBc" = ( /obj/structure/table/reinforced, /obj/item/stack/packageWrap, @@ -11259,6 +11863,21 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) +"mDT" = ( +/obj/effect/decal/fakelattice{ + color = "#808080"; + layer = 2.038 + }, +/obj/effect/turf_decal/corner_steel_grid/diagonal, +/obj/machinery/light/directional/east, +/obj/effect/decal/cleanable/garbage{ + pixel_x = 5; + pixel_y = -5 + }, +/turf/open/floor/plasteel/elevatorshaft{ + color = "#808080" + }, +/area/centcom) "mEC" = ( /obj/structure/sink{ dir = 8; @@ -11293,6 +11912,32 @@ luminosity = 2 }, /area/ctf) +"mGE" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/centcom) +"mJl" = ( +/obj/effect/turf_decal/syndicateemblem/top/left, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) +"mJP" = ( +/obj/effect/decal/fakelattice{ + color = "#808080"; + layer = 2.038 + }, +/obj/effect/turf_decal/corner_steel_grid/full{ + dir = 4 + }, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/plasteel/elevatorshaft{ + color = "#808080" + }, +/area/centcom) "mKb" = ( /obj/machinery/button/door/indestructible{ id = "thunderdomegen"; @@ -11365,6 +12010,10 @@ }, /turf/open/floor/plasteel, /area/tdome/arena) +"mPN" = ( +/obj/effect/turf_decal/syndicateemblem/top/right, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "mUb" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -11409,6 +12058,10 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"mVC" = ( +/obj/structure/destructible/tribal_torch/lit, +/turf/open/floor/wood/mahogany, +/area/centcom) "mYG" = ( /obj/machinery/airalarm/directional/east, /obj/structure/filingcabinet/filingcabinet, @@ -11442,6 +12095,14 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"naB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5; + color = "#543C30" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/walnut, +/area/centcom) "ncR" = ( /obj/machinery/door/poddoor{ id = "XCCQMLoaddoor2"; @@ -11515,6 +12176,13 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) +"njp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8; + color = "#543C30" + }, +/turf/open/floor/wood/walnut, +/area/centcom) "njY" = ( /obj/machinery/status_display/evac{ pixel_y = 32 @@ -11553,6 +12221,12 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/three) +"nos" = ( +/obj/structure/catwalk/over, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/centcom) "noV" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -11824,6 +12498,41 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"nYl" = ( +/obj/structure/table/wood/fancy/blue, +/obj/item/paper_bin/carbon, +/obj/item/pen/solgov, +/obj/item/pen/fourcolor{ + pixel_x = -9; + pixel_y = -3 + }, +/obj/item/desk_flag/solgov{ + pixel_y = 12; + pixel_x = -8 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom) +"nYZ" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/obj/machinery/computer/secure_data, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel, +/area/centcom) +"oaQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4; + color = "#543C30" + }, +/turf/open/floor/wood/walnut, +/area/centcom) "oba" = ( /obj/structure/table/wood, /obj/structure/safe/floor, @@ -11883,6 +12592,24 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeobserve) +"odH" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/gun/ballistic/automatic/assault/ak47/inteq{ + pixel_y = 3 + }, +/obj/item/gun/ballistic/automatic/assault/ak47/inteq{ + pixel_y = -1; + pixel_x = -5 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel, +/area/centcom) "odV" = ( /obj/structure/chair/office{ dir = 8 @@ -12028,6 +12755,12 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"ouD" = ( +/obj/machinery/door/airlock/grunge{ + req_access = "109" + }, +/turf/open/floor/plasteel, +/area/centcom) "ouO" = ( /obj/effect/turf_decal/corner/opaque/green, /turf/open/floor/plasteel, @@ -12160,6 +12893,13 @@ }, /turf/open/floor/plasteel, /area/centcom/supply) +"oHB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/destructible/tribal_torch/lit, +/turf/open/floor/wood/mahogany, +/area/centcom) "oHU" = ( /obj/machinery/computer/communications{ dir = 8 @@ -12338,6 +13078,16 @@ /obj/effect/turf_decal/corner/opaque/blue, /turf/open/floor/plasteel, /area/centcom/control) +"phf" = ( +/obj/structure/table/wood/fancy/blue, +/obj/structure/sign/poster/solgov/paperwork{ + pixel_y = 32 + }, +/obj/item/radio/intercom/wideband/table{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom) "phB" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -12428,6 +13178,10 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"plP" = ( +/obj/effect/turf_decal/corner/opaque/yellow/three_quarters, +/turf/open/floor/plasteel, +/area/centcom) "pmP" = ( /obj/effect/turf_decal/corner/opaque/green, /obj/effect/turf_decal/corner/opaque/green{ @@ -12435,6 +13189,19 @@ }, /turf/open/floor/plasteel, /area/centcom/ferry) +"psm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10; + color = "#543C30" + }, +/obj/structure/sign/solgov_seal{ + pixel_y = -28 + }, +/obj/machinery/telecomms/relay/preset/solgov{ + autolinkers = list("relay") + }, +/turf/open/floor/wood/walnut, +/area/centcom) "psp" = ( /obj/structure/chair{ dir = 8 @@ -12496,11 +13263,30 @@ /obj/effect/spawner/xmastree, /turf/open/floor/plasteel, /area/syndicate_mothership/control) +"pvN" = ( +/obj/machinery/light/directional/east, +/obj/machinery/telecomms/relay/preset/frontiersmen{ + autolinkers = list("relay") + }, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "pvV" = ( /obj/machinery/igniter/on, /obj/effect/turf_decal/industrial/hatch/yellow, /turf/open/floor/plasteel, /area/tdome/arena_source) +"pvW" = ( +/obj/effect/turf_decal/minutemen/edge, +/turf/open/floor/mineral/plastitanium, +/area/centcom) +"pwr" = ( +/obj/effect/turf_decal/solgov/wood/top_right, +/obj/effect/turf_decal/siding/wood{ + color = "#543C30"; + dir = 1 + }, +/turf/open/floor/wood/walnut, +/area/centcom) "pwJ" = ( /obj/structure/chair/comfy/brown{ color = "#596479" @@ -12724,6 +13510,13 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"pLM" = ( +/obj/effect/turf_decal/siding/wood{ + color = "#543C30" + }, +/obj/effect/turf_decal/solgov/wood/bottom_right, +/turf/open/floor/wood/walnut, +/area/centcom) "pOL" = ( /obj/effect/turf_decal/industrial/warning{ dir = 9 @@ -12819,6 +13612,12 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"pTR" = ( +/obj/effect/turf_decal/minutemen/edge{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "pVF" = ( /obj/machinery/computer/card/centcom{ dir = 8 @@ -12896,6 +13695,11 @@ /obj/effect/turf_decal/corner/opaque/red, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) +"qju" = ( +/obj/structure/table/wood/fancy/blue, +/obj/item/papercutter, +/turf/open/floor/carpet/royalblue, +/area/centcom) "qkb" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -12913,6 +13717,16 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"qkP" = ( +/obj/effect/turf_decal/solgov/wood/bottom_left{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + color = "#543C30"; + dir = 1 + }, +/turf/open/floor/wood/walnut, +/area/centcom) "qmm" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -12927,6 +13741,13 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"qoL" = ( +/turf/open/floor/wood/mahogany, +/area/centcom) +"qqj" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "qsu" = ( /obj/structure/sink{ dir = 4; @@ -13048,6 +13869,27 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeobserve) +"qLN" = ( +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/structure/sign/poster/contraband/inteq{ + pixel_y = 32 + }, +/obj/item/desk_flag/trans{ + pixel_x = 12; + pixel_y = 2 + }, +/obj/item/radio/intercom/wideband/table{ + dir = 1; + pixel_x = -1 + }, +/turf/open/floor/plasteel, +/area/centcom) "qNc" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -13064,6 +13906,14 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"qQe" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/ship/dirt, +/area/centcom) +"qQA" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/mahogany, +/area/centcom) "qSb" = ( /obj/machinery/keycard_auth{ pixel_y = -25 @@ -13094,6 +13944,9 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) +"qVq" = ( +/turf/open/floor/plasteel, +/area/centcom) "qXd" = ( /obj/structure/table/wood, /obj/item/taperecorder, @@ -13324,6 +14177,14 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/plasteel/dark, /area/centcom/control) +"rjV" = ( +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/centcom) "rln" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Supply"; @@ -13347,6 +14208,16 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"rmj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper/stack, +/obj/item/chair/plastic{ + dir = 1; + pixel_x = -9; + pixel_y = 6 + }, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "roJ" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -13451,6 +14322,14 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"rvC" = ( +/obj/structure/table/reinforced, +/obj/item/radio/headset/minutemen/alt/captain{ + pixel_y = 2; + pixel_x = 1 + }, +/turf/open/floor/plasteel, +/area/centcom) "rvW" = ( /obj/structure/sink{ dir = 4; @@ -13684,6 +14563,16 @@ }, /turf/open/floor/plasteel, /area/tdome/arena_source) +"rUa" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/centcom) "rUH" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/snacks/mint, @@ -13967,6 +14856,10 @@ /obj/effect/turf_decal/corner/opaque/blue, /turf/open/floor/plasteel/dark, /area/ctf) +"sMn" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "sMK" = ( /obj/effect/turf_decal/corner/opaque/brown, /obj/effect/turf_decal/corner/opaque/brown{ @@ -13991,6 +14884,13 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"sQw" = ( +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow, +/turf/open/floor/plasteel, +/area/centcom) "sRB" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/corner/transparent/bar, @@ -14051,6 +14951,12 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"sVJ" = ( +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/centcom) "sWb" = ( /obj/item/storage/briefcase{ pixel_x = -3; @@ -14070,6 +14976,22 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) +"sZJ" = ( +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/item/clothing/head/helmet/inteq{ + pixel_x = -12; + pixel_y = 7 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/centcom) "sZS" = ( /obj/effect/turf_decal/industrial/hatch/yellow, /turf/open/floor/plasteel, @@ -14272,12 +15194,44 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/evac) +"ttK" = ( +/obj/effect/decal/fakelattice{ + color = "#808080"; + layer = 2.038 + }, +/obj/effect/turf_decal/corner_steel_grid/full{ + dir = 8 + }, +/obj/item/trash/can{ + pixel_x = -6; + pixel_y = 10 + }, +/turf/open/floor/plasteel/elevatorshaft{ + color = "#808080" + }, +/area/centcom) "tuw" = ( /obj/effect/turf_decal/industrial/loading{ dir = 8 }, /turf/open/floor/plasteel, /area/centcom/supply) +"tvO" = ( +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow, +/obj/structure/rack, +/obj/item/gun/ballistic/automatic/smg/inteq{ + pixel_x = 2 + }, +/obj/item/gun/ballistic/automatic/smg/inteq{ + pixel_x = -1; + pixel_y = -6 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel, +/area/centcom) "tyg" = ( /obj/effect/turf_decal/corner/opaque/blue{ dir = 1 @@ -14307,6 +15261,25 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) +"tAe" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood{ + icon_state = "floor1-old"; + pixel_y = 10; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/blood{ + icon_state = "floor2-old" + }, +/obj/effect/decal/cleanable/shreds{ + pixel_y = 11; + pixel_x = 4 + }, +/obj/effect/turf_decal/steeldecal/steel_decals_central5, +/turf/open/floor/plasteel/patterned/grid, +/area/centcom) "tAB" = ( /obj/structure/filingcabinet/medical, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -14321,6 +15294,21 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"tBa" = ( +/obj/structure/table/wood, +/obj/item/book/manual/srmlore{ + pixel_y = 4; + pixel_x = -4 + }, +/obj/item/flashlight/lantern{ + pixel_x = 8; + pixel_y = 13 + }, +/obj/item/book/manual/trickwines_4_brewers{ + pixel_x = -1 + }, +/turf/open/floor/wood/mahogany, +/area/centcom) "tBL" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -14378,6 +15366,12 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"tGR" = ( +/obj/effect/turf_decal/minutemen/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "tHd" = ( /obj/effect/turf_decal/industrial/warning{ dir = 5 @@ -14410,6 +15404,11 @@ }, /turf/open/floor/plasteel, /area/centcom/evac) +"tOf" = ( +/obj/effect/turf_decal/solgov/wood/center, +/obj/machinery/light/floor, +/turf/open/floor/wood/walnut, +/area/centcom) "tOg" = ( /obj/machinery/computer/prisoner/management{ dir = 1 @@ -14481,6 +15480,10 @@ }, /turf/open/floor/plasteel, /area/tdome/arena_source) +"tUy" = ( +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/centcom) "tWM" = ( /obj/structure/table/reinforced, /obj/item/radio{ @@ -14573,6 +15576,34 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"unc" = ( +/obj/effect/turf_decal/siding/wood{ + color = "#543C30" + }, +/obj/effect/turf_decal/solgov/wood/bottom_center, +/obj/effect/turf_decal/siding/wood{ + color = "#543C30" + }, +/turf/open/floor/wood/walnut, +/area/centcom) +"unP" = ( +/obj/structure/table, +/obj/item/crowbar{ + pixel_y = 8; + pixel_x = -4 + }, +/obj/item/electropack{ + pixel_x = 7; + pixel_y = -2 + }, +/obj/item/kitchen/knife{ + pixel_y = -5; + pixel_x = -5 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/centcom) "uqL" = ( /obj/effect/turf_decal/industrial/warning{ dir = 1 @@ -14586,6 +15617,10 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"uuY" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/right, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "uzX" = ( /obj/structure/table, /obj/item/toy/katana, @@ -14709,6 +15744,9 @@ heat_capacity = 1e+006 }, /area/tdome/tdomeobserve) +"uKW" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "uLr" = ( /obj/item/storage/firstaid/toxin, /obj/item/storage/firstaid/o2{ @@ -14751,6 +15789,11 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/four) +"uOa" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/middle, +/obj/structure/chair/office/dark, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "uRu" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -14847,6 +15890,10 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership/control) +"veN" = ( +/obj/structure/sign/syndicate, +/turf/closed/indestructible/syndicate, +/area/centcom) "veT" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/corner/transparent/bar, @@ -15124,6 +16171,10 @@ }, /turf/open/floor/plasteel/dark, /area/ctf) +"vFM" = ( +/obj/machinery/telecomms/hub/preset, +/turf/open/floor/plasteel, +/area/centcom) "vGf" = ( /obj/effect/turf_decal/industrial/warning{ dir = 10 @@ -15133,6 +16184,18 @@ }, /turf/open/floor/plasteel/dark, /area/ctf) +"vIg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9; + color = "#543C30" + }, +/obj/effect/turf_decal/solgov/wood/top, +/obj/effect/turf_decal/siding/wood{ + color = "#543C30"; + dir = 1 + }, +/turf/open/floor/wood/walnut, +/area/centcom) "vKH" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -15164,6 +16227,12 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeobserve) +"vQk" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/turf/open/floor/wood/mahogany, +/area/centcom) "vQM" = ( /obj/structure/table/wood, /obj/machinery/recharger, @@ -15196,6 +16265,13 @@ }, /turf/open/floor/plasteel, /area/centcom/evac) +"wad" = ( +/obj/effect/turf_decal/minutemen/corner, +/obj/structure/chair/comfy{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom) "wbj" = ( /obj/effect/turf_decal/corner/transparent/neutral, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -15255,6 +16331,15 @@ }, /turf/open/floor/circuit/red, /area/ctf) +"weV" = ( +/obj/structure/fluff/paper/stack{ + dir = 6; + pixel_y = 11; + pixel_x = 7 + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/centcom) "wfQ" = ( /obj/structure/trap/ctf/red, /obj/effect/turf_decal/corner/opaque/red{ @@ -15399,6 +16484,28 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"wAh" = ( +/obj/machinery/fax/admin/inteq, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/centcom) +"wCp" = ( +/obj/structure/table/wood/fancy/blue, +/obj/item/folder/solgov/red{ + pixel_x = -3 + }, +/obj/item/folder/solgov{ + pixel_y = 5; + pixel_x = 2 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom) "wEF" = ( /obj/effect/turf_decal/corner/opaque/red, /obj/effect/turf_decal/corner/opaque/red{ @@ -15553,6 +16660,7 @@ name = "CentCom Stand"; req_access_txt = "109" }, +/obj/machinery/fax/admin, /turf/open/floor/plasteel/grimy, /area/centcom/control) "xaO" = ( @@ -15680,6 +16788,10 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) +"xxi" = ( +/obj/effect/turf_decal/syndicateemblem/top/middle, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom) "xEx" = ( /obj/structure/chair, /obj/effect/turf_decal/industrial/warning{ @@ -15779,6 +16891,10 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"xTt" = ( +/obj/effect/turf_decal/solgov/wood/center_right, +/turf/open/floor/wood/walnut, +/area/centcom) "xWv" = ( /obj/effect/turf_decal/corner/opaque/green{ dir = 1 @@ -15829,6 +16945,13 @@ dir = 1 }, /area/centcom/supply) +"yhk" = ( +/obj/machinery/door/airlock/wood{ + dir = 4; + req_access = "109" + }, +/turf/open/floor/wood/mahogany, +/area/centcom) "yhL" = ( /obj/effect/turf_decal/corner/opaque/red{ dir = 1 @@ -25311,21 +26434,21 @@ aaa aaa aaa aaa +aPu +aPu +aPu +aPu +aPu +aPu +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +hzJ +hzJ +hzJ +bbf +hzJ +hzJ aaa aaa aaa @@ -25568,21 +26691,21 @@ aaa aaa aaa aaa +aPu +bSy +wCp +iwJ +njp +psm +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +lQr +moE +qVq +qVq +bIJ +hzJ aaa aaa aaa @@ -25825,21 +26948,21 @@ aaa aaa aaa aaa +aPu +nYl +dER +qkP +jja +eqM +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +hba +wad +pTR +gaU +vFM +hzJ aaa aaa aaa @@ -26082,21 +27205,21 @@ aaa aaa aaa aaa +aPu +gTo +gfJ +vIg +tOf +unc +iSo aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +kkC +pvW +iWI +hBf +rvC +hzJ aaa aaa aaa @@ -26339,21 +27462,21 @@ aaa aaa aaa aaa +aPu +phf +dER +pwr +xTt +pLM +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +qVq +tGR +kiC +bUH +bRF +hzJ aaa aaa aaa @@ -26596,21 +27719,21 @@ aaa aaa aaa aaa +aPu +dom +qju +naB +oaQ +gsx +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +dKW +qVq +qVq +aIF +igC +hzJ aaa aaa aaa @@ -26853,21 +27976,21 @@ aaa aaa aaa aaa +aPu +aPu +aPu +aPu +aPu +aPu +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +hzJ +hzJ +hzJ +hzJ +hzJ +hzJ aaa aaa aaa @@ -27367,21 +28490,21 @@ aaa aaa aaa aaa +lJp +lJp +lJp +lJp +lJp +lJp +lJp aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +hzJ +hzJ +mpi +hzJ +hzJ +hzJ aaa aaa aaa @@ -27624,21 +28747,21 @@ aaa aaa aaa aaa +veN +cCK +cUG +mAL +fKt +iZr +veN aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +mJP +lmY +tUy +sMn +kFX +hzJ aaa aaa aaa @@ -27881,21 +29004,21 @@ aaa aaa aaa aaa +fUc +uKW +mJl +myU +kXn +msQ +lJp aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +lHR +rmj +weV +lXI +tAe +hzJ aaa aaa aaa @@ -28138,21 +29261,21 @@ aaa aaa aaa aaa +lJp +qqj +xxi +jPn +uOa +jFa +lJp aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +jDt +ibc +eWz +lXQ +duw +hzJ aaa aaa aaa @@ -28395,21 +29518,21 @@ aaa aaa aaa aaa +fUc +uKW +mPN +kmQ +uuY +jly +lJp aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +iRP +fau +gDV +iti +unP +hzJ aaa aaa aaa @@ -28652,21 +29775,21 @@ aaa aaa aaa aaa +veN +lfK +ciU +iyJ +bFc +iZr +veN aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +mDT +ttK +nos +cZi +pvN +hzJ aaa aaa aaa @@ -28909,21 +30032,21 @@ aaa aaa aaa aaa +lJp +lJp +lJp +lJp +lJp +lJp +lJp aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hzJ +hzJ +hzJ +eLy +hzJ +hzJ +hzJ aaa aaa aaa @@ -29423,21 +30546,21 @@ aaa aaa aaa aaa +aPu +aPu +aPu +aPu +aPu +aPu +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eAJ +eAJ +eAJ +eAJ +eAJ +eAJ +eAJ aaa aaa aaa @@ -29680,21 +30803,21 @@ aaa aaa aaa aaa +aPu +nYZ +mGE +rUa +mGE +odH +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eAJ +mVC +qoL +jEn +etl +oHB +eAJ aaa aaa aaa @@ -29937,21 +31060,21 @@ aaa aaa aaa aaa +aPu +qLN +fTU +emF +sVJ +apm +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eAJ +tBa +qoL +qQA +iDo +hYV +eAJ aaa aaa aaa @@ -30194,21 +31317,21 @@ aaa aaa aaa aaa +aPu +wAh +cxm +emF +emF +cjo +ouD aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eAJ +lfi +vQk +qQA +iDo +qQe +eAJ aaa aaa aaa @@ -30451,21 +31574,21 @@ aaa aaa aaa aaa +aPu +sZJ +plP +emF +lYF +cIS +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eAJ +jyy +qoL +qQA +iDo +qQe +eAJ aaa aaa aaa @@ -30708,21 +31831,21 @@ aaa aaa aaa aaa +aPu +lKP +sQw +rjV +sQw +tvO +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eAJ +mVC +qoL +qQA +iDo +hYV +eAJ aaa aaa aaa @@ -30965,21 +32088,21 @@ aaa aaa aaa aaa +aPu +aPu +aPu +aPu +aPu +aPu +aPu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eAJ +eAJ +eAJ +yhk +eAJ +eAJ +eAJ aaa aaa aaa diff --git a/_maps/outpost/hangar/nt_asteroid_20x20.dmm b/_maps/outpost/hangar/nt_asteroid_20x20.dmm index c3d35afcea10..159af62d17cf 100644 --- a/_maps/outpost/hangar/nt_asteroid_20x20.dmm +++ b/_maps/outpost/hangar/nt_asteroid_20x20.dmm @@ -1037,7 +1037,7 @@ /obj/structure/table/reinforced{ color = "#c1b6a5" }, -/obj/machinery/fax, +/obj/machinery/fax/ruin, /turf/open/floor/plasteel/dark{ planetary_atmos = 1 }, diff --git a/_maps/outpost/hangar/nt_asteroid_40x20.dmm b/_maps/outpost/hangar/nt_asteroid_40x20.dmm index 959b27a5dd98..0d229e5d7af9 100644 --- a/_maps/outpost/hangar/nt_asteroid_40x20.dmm +++ b/_maps/outpost/hangar/nt_asteroid_40x20.dmm @@ -1233,7 +1233,7 @@ /obj/structure/table/reinforced{ color = "#c1b6a5" }, -/obj/machinery/fax, +/obj/machinery/fax/ruin, /obj/effect/turf_decal/techfloor{ dir = 4 }, diff --git a/_maps/outpost/nanotrasen_asteroid.dmm b/_maps/outpost/nanotrasen_asteroid.dmm index 8f5c38ded0ea..d5ccb5e0af68 100644 --- a/_maps/outpost/nanotrasen_asteroid.dmm +++ b/_maps/outpost/nanotrasen_asteroid.dmm @@ -3558,7 +3558,7 @@ /area/outpost/crew/library) "mZ" = ( /obj/structure/table/wood, -/obj/machinery/fax, +/obj/machinery/fax/ruin, /turf/open/floor/plasteel, /area/outpost/crew/canteen) "na" = ( diff --git a/_maps/outpost/nanotrasen_ice.dmm b/_maps/outpost/nanotrasen_ice.dmm index bc92fdbc20c0..04b8040a6275 100644 --- a/_maps/outpost/nanotrasen_ice.dmm +++ b/_maps/outpost/nanotrasen_ice.dmm @@ -7463,7 +7463,7 @@ /area/outpost/security/armory) "XG" = ( /obj/structure/table/reinforced, -/obj/machinery/fax, +/obj/machinery/fax/ruin, /obj/machinery/light/directional/south, /turf/open/floor/plasteel/telecomms_floor, /area/outpost/security) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 1adec75b74ac..44f0893cd9a5 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -67,6 +67,8 @@ #define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]" #define ADMIN_VERBOSEJMP(src) "[src ? "[AREACOORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]" #define ADMIN_INDIVIDUALLOG(user) "(LOGS)" +/// Displays "(SHOW)" in the chat, when clicked it tries to show atom(paper). First you need to set the request_state variable to TRUE for the paper. +#define ADMIN_SHOW_PAPER(atom) "(SHOW)" #define ADMIN_PUNISHMENT_BREAK_BONES "Break all bones" #define ADMIN_PUNISHMENT_LIGHTNING "Lightning bolt" diff --git a/code/_globalvars/lists/faxes.dm b/code/_globalvars/lists/faxes.dm deleted file mode 100644 index 5c78629de283..000000000000 --- a/code/_globalvars/lists/faxes.dm +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This defines the list of faxes managed by the server administrators. They are not physically present in - * the game, but are shown in the fax list as existing. - * Lists: - * * additional_faxes_list - A list of "legal" faxes available with authorization. - * * frontier_faxes_list - List of faxes available after hacking. - * - * The list consists of the following elements: - * * fax_name - The name displayed in the fax list. - * * button_color - The color of this fax button in the list of all faxes. - */ -GLOBAL_LIST_INIT(additional_faxes_list, list( - list("fax_name" = "Nanotrasen Central Command", "button_color" = "#46B946"), - list("fax_name" = "Inteq Management Field Command", "button_color" = "#FACE65"), - list("fax_name" = "Colonial Minutemen Headquarters", "button_color" = "#538ACF"), - list("fax_name" = "Saint-Roumain Council of Huntsmen", "button_color" = "#6B443D"), - list("fax_name" = "SolGov Department of Administrative Affairs", "button_color" = "#536380"), - list("fax_name" = "Syndicate Coordination Center", "button_color" = "#B22C20"), - list("fax_name" = "Outpost Administration", "button_color" = "#dddfc9"), -)) - -GLOBAL_LIST_INIT(frontier_faxes_list, list( - list("fax_name" = "Frontiersmen Communications Outpost", "button_color" = "#70654C") -)) - -GLOBAL_LIST_EMPTY(fax_machines) //list of all fax machines diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 82258dfdcd43..ac54c7a39b33 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(wayfindingbeacons) //list of all navigation beacons used GLOBAL_LIST_EMPTY(nuke_list) GLOBAL_LIST_EMPTY(alarmdisplay) //list of all machines or programs that can display station alerts GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the station (actually technically all engines) +GLOBAL_LIST_EMPTY(fax_machines) //list of all fax machines GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 15f96e69022b..773faec875f4 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -73,6 +73,36 @@ toggled = FALSE autolinkers = list("r_relay") +/obj/machinery/telecomms/relay/preset/nanotrasen + freq_listening = list(FREQ_COMMAND, FREQ_NANOTRASEN, FREQ_COMMON) + id = "Nanotrasen Relay" + network = "nt_commnet" + +/obj/machinery/telecomms/relay/preset/inteq + freq_listening = list(FREQ_COMMAND, FREQ_INTEQ, FREQ_COMMON) + id = "IRMG Relay" + network = "irmg_commnet" + +/obj/machinery/telecomms/relay/preset/minutemen + freq_listening = list(FREQ_COMMAND, FREQ_MINUTEMEN, FREQ_COMMON) + id = "CMM Relay" + network = "cmm_commnet" + +/obj/machinery/telecomms/relay/preset/solgov + freq_listening = list(FREQ_COMMAND, FREQ_SOLGOV, FREQ_COMMON) + id = "SolGov Relay" + network = "solgov_commnet" + +/obj/machinery/telecomms/relay/preset/syndicate + freq_listening = list(FREQ_COMMAND, FREQ_SYNDICATE, FREQ_COMMON) + id = "Syndicate Relay" + network = "synd_commnet" + +/obj/machinery/telecomms/relay/preset/frontiersmen + freq_listening = list(FREQ_COMMAND, FREQ_PIRATE, FREQ_COMMON) + id = "Frontiersmen Relay" + network = "frontier_commnet" + //Generic preset relay /obj/machinery/telecomms/relay/preset/auto hide = TRUE diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 7056c7a38d97..306634a639fc 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -687,7 +687,6 @@ name = "Fax Machine" build_path = /obj/machinery/fax req_components = list( - /obj/item/stock_parts/subspace/crystal = 1, /obj/item/stock_parts/scanning_module = 1, /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/manipulator = 1,) diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index d179a2930d2f..c7a1d9dd6f29 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -230,7 +230,7 @@ /turf/closed/indestructible/fakedoor name = "CentCom Access" icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - icon_state = "fake_door" + icon_state = "fakedoor" /turf/closed/indestructible/rock name = "dense rock" diff --git a/code/modules/admin/admin_fax_panel.dm b/code/modules/admin/admin_fax_panel.dm new file mode 100644 index 000000000000..32f523584a39 --- /dev/null +++ b/code/modules/admin/admin_fax_panel.dm @@ -0,0 +1,145 @@ +/** + * If client have R_ADMIN flag, opens an admin fax panel. + */ +/client/proc/fax_panel() + set name = "Send Fax Message" + set category = "Admin" + + if(!check_rights(R_ADMIN)) + return + + var/datum/fax_panel_interface/ui = new(usr) + ui.ui_interact(usr) + +/// Admin Fax Panel. Tool for sending fax messages faster. +/datum/fax_panel_interface + /// All faxes in from machinery list() + var/available_faxes = list() + /// List with available stamps + var/stamp_list = list() + + /// Paper which admin edit and send. + var/obj/item/paper/fax_paper = new /obj/item/paper(null) + + /// Default name of fax. Used when field with fax name not edited. + var/sending_fax_name = "Secret" + /// Default name of paper. paper - bluh-bluh. Used when field with paper name not edited. + var/default_paper_name = "Standard Report" + +/datum/fax_panel_interface/New() + //Get all faxes, and save them to our list. + for(var/obj/machinery/fax/fax as anything in GLOB.fax_machines) + available_faxes += WEAKREF(fax) + + //Get all stamps + for(var/stamp in subtypesof(/obj/item/stamp)) + var/obj/item/stamp/real_stamp = new stamp() + if(!istype(real_stamp, /obj/item/stamp/chameleon)) + var/stamp_detail = real_stamp.get_writing_implement_details() + stamp_list += list(list(real_stamp.name, real_stamp.icon_state, stamp_detail["stamp_class"])) + + //Give our paper special status, to read everywhere. + fax_paper.request_state = TRUE + +/** + * Return fax if name exists + * Arguments: + * * name - Name of fax what we try to find. + */ +/datum/fax_panel_interface/proc/get_fax_by_name(name) + if(!length(available_faxes)) + return null + + for(var/datum/weakref/weakrefed_fax as anything in available_faxes) + var/obj/machinery/fax/potential_fax = weakrefed_fax.resolve() + if(potential_fax && istype(potential_fax)) + if(potential_fax.fax_name == name) + return potential_fax + return null + +/datum/fax_panel_interface/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AdminFax") + ui.open() + +/datum/fax_panel_interface/ui_state(mob/user) + return GLOB.admin_state + +/datum/fax_panel_interface/ui_static_data(mob/user) + var/list/data = list() + + data["faxes"] = list() + data["stamps"] = list() + + for(var/stamp in stamp_list) + data["stamps"] += list(stamp[1]) // send only names. + + for(var/datum/weakref/weakrefed_fax as anything in available_faxes) + var/obj/machinery/fax/another_fax = weakrefed_fax.resolve() + if(another_fax && istype(another_fax)) + data["faxes"] += list(another_fax.fax_name) + + return data + +/datum/fax_panel_interface/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if(..()) + return + + if(!check_rights(R_ADMIN)) + return + + var/obj/machinery/fax/action_fax + + if(params["faxName"]) + action_fax = get_fax_by_name(params["faxName"]) + + switch(action) + + if("follow") + if(!isobserver(usr)) + usr.client?.admin_ghost() + + usr.client?.holder?.admin_follow(action_fax) + + if("preview") // see saved variant + if(!fax_paper) + return + fax_paper.ui_interact(usr) + + if("save") // save paper + if(params["paperName"]) + default_paper_name = params["paperName"] + if(params["fromWho"]) + sending_fax_name = params["fromWho"] + + fax_paper.clear_paper() + var/stamp + var/stamp_class + + for(var/needed_stamp in stamp_list) + if(needed_stamp[1] == params["stamp"]) + stamp = needed_stamp[2] + stamp_class = needed_stamp[3] + break + + fax_paper.name = "paper — [default_paper_name]" + fax_paper.add_raw_text(params["rawText"], advanced_html = TRUE) + + if(stamp) + fax_paper.add_stamp(stamp_class, params["stampX"], params["stampY"], params["stampAngle"], stamp) + + fax_paper.update_static_data(usr) // OK, it's work, and update UI. + + if("send") + //copy + var/obj/item/paper/our_fax = fax_paper.copy(/obj/item/paper) + our_fax.name = fax_paper.name + //send + action_fax.receive(our_fax, sending_fax_name, important = TRUE) + message_admins("[key_name_admin(usr)] has sent a custom fax message to [action_fax.name][ADMIN_FLW(action_fax)][ADMIN_SHOW_PAPER(fax_paper)].") + log_admin("[key_name(usr)] has sent a custom fax message to [action_fax.name]") + + if("createPaper") + var/obj/item/paper/our_paper = fax_paper.copy(/obj/item/paper, usr.loc) + our_paper.name = fax_paper.name diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 929cf33f3315..a853f66963af 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -26,7 +26,9 @@ GLOBAL_PROTECT(admin_verbs_default) /client/proc/resetasaycolor, /client/proc/fix_air, /*resets air in designated radius to its default atmos composition*/ /client/proc/addbunkerbypass, - /client/proc/revokebunkerbypass + /client/proc/revokebunkerbypass, + /client/proc/requests, + /client/proc/fax_panel, /*send a paper to fax*/ ) GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) GLOBAL_PROTECT(admin_verbs_admin) @@ -119,7 +121,6 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/polymorph_all, /client/proc/show_tip, /client/proc/smite, - /client/proc/fax_manager, /client/proc/spawn_ruin, )) GLOBAL_PROTECT(admin_verbs_fun) @@ -283,7 +284,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/cmd_display_del_log, /client/proc/toggle_combo_hud, /client/proc/debug_huds, - /client/proc/fax_manager )) GLOBAL_PROTECT(admin_verbs_hideable) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index bb46d7250b0b..b917501d0bb8 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2218,10 +2218,14 @@ return GLOB.interviews.ui_interact(usr) - else if(href_list["open_fax_manager"]) + else if(href_list["show_paper"]) if(!check_rights(R_ADMIN)) return - usr.client.fax_manager() + + var/obj/item/paper/paper_to_show = locate(href_list["show_paper"]) + if(!istype(paper_to_show)) + return + paper_to_show.ui_interact(usr) /datum/admins/proc/HandleCMode() if(!check_rights(R_ADMIN)) diff --git a/code/modules/admin/verbs/fax_manager.dm b/code/modules/admin/verbs/fax_manager.dm deleted file mode 100644 index 6c6de9d5d100..000000000000 --- a/code/modules/admin/verbs/fax_manager.dm +++ /dev/null @@ -1,9 +0,0 @@ -/client/proc/fax_manager() - set category = "Fun" - set name = "Fax Manager" - set desc = "Open the manager panel to view all requests during the round in progress." - if(!check_rights(R_ADMIN)) - return - - SSblackbox.record_feedback("tally", "admin_verb", 1, "Fax Manager") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - GLOB.fax_manager.ui_interact(usr) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 05dccfc0ca75..c2be9649d7c3 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -44,23 +44,21 @@ deity = "Ashen Hunter" var/msg_tmp = msg + GLOB.requests.pray(usr.client, msg, usr.job == "Chaplain") msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" for(var/client/C in GLOB.admins) if(C.prefs.chat_toggles & CHAT_PRAYER) to_chat(C, msg, confidential = TRUE) - if(C.prefs.toggles & SOUND_PRAYERS) - if(usr.job == "Chaplain") - SEND_SOUND(C, sound('sound/effects/pray.ogg')) to_chat(usr, "You pray to the gods: \"[msg_tmp]\"", confidential = TRUE) SSredbot.send_discord_message("admin", "Prayer from [src.key]/([src.name]): [msg]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - //log_admin("HELP: [key_name(src)]: [msg]") /// Used by communications consoles to message CentCom /proc/message_centcom(text, mob/sender) var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN) + GLOB.requests.message_centcom(sender.client, msg) msg = "CENTCOM:[ADMIN_FULLMONTY(sender)] [ADMIN_CENTCOM_REPLY(sender)]: [msg]" to_chat(GLOB.admins, msg, confidential = TRUE) for(var/obj/machinery/computer/communications/console in GLOB.machines) @@ -69,6 +67,7 @@ /// Used by communications consoles to message the Syndicate /proc/message_syndicate(text, mob/sender) var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN) + GLOB.requests.message_syndicate(sender.client, msg) msg = "SYNDICATE:[ADMIN_FULLMONTY(sender)] [ADMIN_SYNDICATE_REPLY(sender)]: [msg]" to_chat(GLOB.admins, msg, confidential = TRUE) for(var/obj/machinery/computer/communications/console in GLOB.machines) @@ -77,6 +76,7 @@ /// Used by communications consoles to request the nuclear launch codes /proc/nuke_request(text, mob/sender) var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN) + GLOB.requests.nuke_request(sender.client, msg) msg = "NUKE CODE REQUEST:[ADMIN_FULLMONTY(sender)] [ADMIN_CENTCOM_REPLY(sender)] [ADMIN_SET_SD_CODE]: [msg]" to_chat(GLOB.admins, msg, confidential = TRUE) for(var/obj/machinery/computer/communications/console in GLOB.machines) diff --git a/code/modules/admin/verbs/requests.dm b/code/modules/admin/verbs/requests.dm new file mode 100644 index 000000000000..94aa976dbd1a --- /dev/null +++ b/code/modules/admin/verbs/requests.dm @@ -0,0 +1,7 @@ +/// Verb for opening the requests manager panel +/client/proc/requests() + set name = "Requests Manager" + set desc = "Open the request manager panel to view all requests during this round" + set category = "Admin" + SSblackbox.record_feedback("tally", "admin_verb", 1, "Request Manager") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + GLOB.requests.ui_interact(usr) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 06d96d7229cc..8db2e8454828 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -231,6 +231,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( GLOB.ahelp_tickets.client_login(src) GLOB.interviews.client_login(src) + GLOB.requests.client_login(src) var/connecting_admin = FALSE //because de-admined admins connecting should be treated like admins. //Admin Authorisation holder = GLOB.admin_datums[ckey] @@ -501,6 +502,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( log_access("Logout: [key_name(src)]") GLOB.ahelp_tickets.client_logout(src) GLOB.interviews.client_logout(src) + GLOB.requests.client_logout(src) SSserver_maint.UpdateHubStatus() if(credits) QDEL_LIST(credits) diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index b1696a27fca0..a4881fdfee38 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -18,10 +18,6 @@ var/seconds_electrified = MACHINE_NOT_ELECTRIFIED /// If true, the fax machine is jammed and needs cleaning var/jammed = FALSE - /// Determines the possibility of sending papers to the additional faxes. - var/access_additional_faxes = FALSE - /// Defines a list of accesses whose owners can open a connection with the additional faxes. - var/static/access_additional_faxes_required = list(ACCESS_HEADS, ACCESS_LAWYER, ACCESS_SECURITY) /// Necessary to hide syndicate faxes from the general list. Doesn't mean he's EMAGGED! var/frontier_network = FALSE /// True if the fax machine should be visible to other fax machines in general. @@ -53,23 +49,47 @@ /obj/item/holochip, /obj/item/card, ) + /// Internal radio for announcing over comms + var/obj/item/radio/radio + /// Radio channel to speak into + var/radio_channel + /// Cooldown for aformentioned radio, prevents radio spam + COOLDOWN_DECLARE(radio_cooldown) + + /// List with a fake-networks(not a fax actually), for request manager. + var/list/special_networks = list( + list(fax_name = "Nanotrasen Central Command", fax_id = "nanotrasen", color = "green", emag_needed = FALSE), + list(fax_name = "IRMG Mothership", fax_id = "inteq", color = "yellow", emag_needed = FALSE), + list(fax_name = "Solarian Confederation Frontier Affairs", fax_id = "solgov", color = "teal", emag_needed = FALSE), + list(fax_name = "Roumain Council of Huntsmen", fax_id = "roumain", color = "brown", emag_needed = FALSE), + list(fax_name = "Colonial League Leadership", fax_id = "minutemen", color = "blue", emag_needed = FALSE), + list(fax_name = "Syndicate Coalition Coordination Center", fax_id = "syndicate", color = "red", emag_needed = FALSE), + list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE) + ) + // should we make our message be important and be recieved in admin faxes + var/admin_fax_id /obj/machinery/fax/Initialize(mapload) . = ..() GLOB.fax_machines += src if(!fax_id) fax_id = SSnetworks.make_address() - if(fax_name == initial(fax_name)) + if(fax_name == initial(fax_name) && !admin_fax_id) fax_name = "[get_area_name(src)] Fax Machine" wires = new /datum/wires/fax(src) -/obj/machinery/fax/hacked - set_obj_flags = "EMAGGED" - allow_exotic_faxes = TRUE - access_additional_faxes = TRUE + radio = new(src) + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + // Override in subtypes // no + radio.on = TRUE -/obj/machinery/fax/frontiersmen - frontier_network = TRUE +/obj/machinery/fax/ruin + visible_to_network = FALSE + +/obj/machinery/fax/ruin/Initialize(mapload) + . = ..() + fax_name = "Unregistered Fax Machine " + fax_id /obj/machinery/fax/Destroy() GLOB.fax_machines -= src @@ -113,6 +133,20 @@ obj_flags |= EMAGGED to_chat(user, "The screen of the [src] flickers!") +/** + * EMP Interaction + */ +/obj/machinery/fax/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + allow_exotic_faxes = !allow_exotic_faxes + visible_message("[src] [allow_exotic_faxes ? "starts beeping" : "stops beeping"] ominously[allow_exotic_faxes ? "..." : "."]") + +/** + * Unanchor/anchor + */ + /obj/machinery/fax/wrench_act(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool) @@ -161,27 +195,6 @@ return return ..() -// Checks if the card has access to switch "legal" faxes of administrators. -/obj/machinery/fax/proc/access_additional_faxes_check(mob/living/user) - if(isAdminObserver(user)) - return TRUE - - var/obj/item/card/id/used_card = user.get_idcard(TRUE) - if(used_card) - // We check if it makes sense to check access at all. - if(!access_additional_faxes_required || !used_card.access) - return FALSE - - for(var/requested_access in access_additional_faxes_required) - if(requested_access in used_card.access) - return TRUE - return FALSE - -// Switches access to the "legal" administrator's fax list. Access to the "illegal" is switched by hacking. -/obj/machinery/fax/proc/access_additional_faxes_toggle() - access_additional_faxes = !access_additional_faxes - say("Bluespace channel communication [access_additional_faxes ? "opened" : "closed"].") - /** * Attempts to clean out a jammed machine using a passed item. * Returns true if successful. @@ -237,12 +250,6 @@ ui.open() ui.set_autoupdate(TRUE) -/obj/machinery/fax/ui_static_data(mob/user) - var/list/data = list() - data["additional_faxes_list"] = GLOB.additional_faxes_list - data["frontier_faxes_list"] = GLOB.frontier_faxes_list - return data - /obj/machinery/fax/ui_data(mob/user) var/list/data = list() //Record a list of all existing faxes. @@ -264,12 +271,11 @@ data["fax_id"] = fax_id data["fax_name"] = fax_name data["visible"] = visible_to_network - data["access_additional_faxes"] = access_additional_faxes - data["сan_switch_access"] = access_additional_faxes_check(user) // In this case, we don't care if the fax is hacked or in the syndicate's network. The main thing is to check the visibility of other faxes. data["frontier_network"] = (frontier_network || (obj_flags & EMAGGED)) data["has_paper"] = !!loaded_item_ref?.resolve() data["fax_history"] = fax_history + data["special_faxes"] = special_networks return data /obj/machinery/fax/ui_act(action, list/params) @@ -287,8 +293,6 @@ loaded_item_ref = null update_icon() return TRUE - if("access_additional_faxes_toggle") - access_additional_faxes_toggle() if("send") var/obj/item/loaded = loaded_item_ref?.resolve() if(!loaded) @@ -299,17 +303,31 @@ loaded_item_ref = null update_icon() return TRUE - if("send_to_additional_fax") - var/obj/item/loaded = loaded_item_ref?.resolve() - if(!loaded) + if("send_special") + var/obj/item/paper/fax_paper = loaded_item_ref?.resolve() + if(!fax_paper) + return + if(!istype(fax_paper)) + to_chat(usr, icon2html(src.icon, usr) + "ERROR: Failed to send fax.") return - if(istype(loaded, /obj/item/paper)) - if(send_to_additional_faxes(loaded, usr, params["name"], params["color"])) - loaded_item_ref = null - update_icon() - return TRUE - else - say("The destination fax blocks the reception of this item.") + + fax_paper.request_state = TRUE + fax_paper.loc = null + + INVOKE_ASYNC(src, PROC_REF(animate_object_travel), fax_paper, "fax_receive", find_overlay_state(fax_paper, "send")) + history_add("Send", params["name"]) + + GLOB.requests.fax_request(usr.client, "sent a fax message from [fax_name]/[fax_id] to [params["name"]]", fax_paper) + to_chat(GLOB.admins, "[icon2html(src.icon, GLOB.admins)]FAX REQUEST: [ADMIN_FULLMONTY(usr)]: sent a fax message from [fax_name]/[fax_id][ADMIN_FLW(src)] to [html_encode(params["name"])] [ADMIN_SHOW_PAPER(fax_paper)]") + log_fax(fax_paper, params["id"], params["name"]) + loaded_item_ref = null + + for(var/obj/machinery/fax/fax as anything in GLOB.fax_machines) + if(fax.admin_fax_id == params["id"]) + fax.receive(fax_paper, fax_name) + break + update_appearance() + if("history_clear") history_clear() return TRUE @@ -349,40 +367,12 @@ balloon_alert(usr, "destination port jammed") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, -9) return FALSE - fax.receive(loaded, fax_name) - playback_sending(loaded, fax.fax_name) + fax.receive(loaded, fax_name, important = admin_fax_id) + history_add("Send", fax.fax_name) + INVOKE_ASYNC(src, PROC_REF(animate_object_travel), loaded, "fax_receive", find_overlay_state(loaded, "send")) return TRUE return FALSE -/** - * The procedure for sending a item to virtual admins fax machine. - * - * This procedure is similar to the send procedure except that it sends the item to - * a "virtual" fax to a special administrator list. - * Arguments: - * * loaded - The item to be sent. - * * sender - Reference to the sender's substance. - * * receiver_name - The recipient's fax name, which will be displayed in the administrator's list. - * * receiver_color - The color the receiver_name will be colored in. - */ -/obj/machinery/fax/proc/send_to_additional_faxes(obj/item/loaded, mob/sender, receiver_name, receiver_color) - GLOB.fax_manager.receive_request(sender, src, receiver_name, loaded, receiver_color) - playback_sending(loaded, receiver_name) - log_fax(loaded, "ADDITIONAL", receiver_name) - return TRUE - -/** - * The procedure for playing the animation. - * - * Procedure called to add to the history of sending messages, playing the sending animation. - * Arguments: - * * loaded - Sending item to determine the animation.. - * * receiver_name - Recipient's name to be added to the message history. - */ -/obj/machinery/fax/proc/playback_sending(obj/item/loaded, receiver_name) - history_add("Send", receiver_name) - INVOKE_ASYNC(src, PROC_REF(animate_object_travel), loaded, "fax_receive", find_overlay_state(loaded, "send")) - /** * Procedure for accepting papers from another fax machine. * @@ -391,7 +381,7 @@ * * loaded - The object to be printed. * * sender_name - The sender's name, which will be displayed in the message and recorded in the history of operations. */ -/obj/machinery/fax/proc/receive(obj/item/loaded, sender_name) +/obj/machinery/fax/proc/receive(obj/item/loaded, sender_name, important = FALSE) playsound(src, 'sound/items/poster_being_created.ogg', 20, FALSE) INVOKE_ASYNC(src, PROC_REF(animate_object_travel), loaded, "fax_receive", find_overlay_state(loaded, "receive")) say("Received correspondence from [sender_name].") @@ -504,3 +494,45 @@ do_sparks(5, TRUE, src) var/check_range = TRUE return electrocute_mob(user, get_area(src), src, 0.7, check_range) + +/obj/machinery/fax/frontiersmen + frontier_network = TRUE + visible_to_network = FALSE + +/obj/machinery/fax/admin + name = "Central Command Fax Machine" + fax_name = "Nanotrasen Central Command" + radio_channel = RADIO_CHANNEL_CENTCOM + visible_to_network = FALSE + admin_fax_id = "nanotrasen" + +/obj/machinery/fax/admin/solgov + name = "SolGov Frontier Affairs Fax Machine" + fax_name = "Solarian Confederation Frontier Affairs" + admin_fax_id = "solgov" + +/obj/machinery/fax/admin/syndicate + name = "Syndicate Coordination Fax Machine" + fax_name = "Syndicate Coordination Center" + admin_fax_id = "syndicate" + +/obj/machinery/fax/admin/inteq + name = "IRMG Fax Machine" + fax_name = "IRMG Mothership" + admin_fax_id = "inteq" + +/obj/machinery/fax/admin/minutemen + name = "CLIP HiComm Fax Machine" + fax_name = "Colonial League Leadership" + admin_fax_id = "minutemen" + +/obj/machinery/fax/admin/roumain + name = "Huntsman Council Fax Machine" + fax_name = "Saint-Roumain Council of Huntsmen" + admin_fax_id = "roumain" + +/obj/machinery/fax/admin/frontiersmen + name = "old fax machine" + fax_name = "Frontiersmen Communications Quartermaster" + admin_fax_id = "frontiersmen" + frontier_network = TRUE diff --git a/code/modules/paperwork/fax_manager.dm b/code/modules/paperwork/fax_manager.dm deleted file mode 100644 index 0107e440bec2..000000000000 --- a/code/modules/paperwork/fax_manager.dm +++ /dev/null @@ -1,154 +0,0 @@ -GLOBAL_DATUM_INIT(fax_manager, /datum/fax_manager, new) - -/** - * Fax Request Manager - * - * In its functionality it is similar to the usual Request Manager, but respectively for faxes. - * This manager allows you to send faxes on behalf of certain virtual faxes to all existing faxes, - * as well as receive faxes in their name from the players. - */ -/datum/fax_manager - /// A list that contains faxes from players and other related information. You can view the filling of its fields in the procedure receive_request. - var/list/requests = list() - -/datum/fax_manager/Destroy(force, ...) - QDEL_LIST(requests) - return ..() - -/datum/fax_manager/ui_interact(mob/user, datum/tgui/ui = null) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "FaxManager") - ui.open() - ui.set_autoupdate(TRUE) - -/datum/fax_manager/ui_state(mob/user) - return GLOB.admin_state - -/datum/fax_manager/ui_static_data(mob/user) - var/list/data = list() - //Record additional faxes on a separate list - data["additional_faxes"] = GLOB.additional_faxes_list + GLOB.frontier_faxes_list - return data - -/datum/fax_manager/ui_data(mob/user) - var/list/data = list() - //Record a list of all existing faxes. - for(var/obj/machinery/fax/fax as anything in GLOB.fax_machines) - var/list/fax_data = list() - fax_data["fax_name"] = fax.fax_name - fax_data["fax_id"] = fax.fax_id - fax_data["frontier_network"] = fax.frontier_network - data["faxes"] += list(fax_data) - for(var/list/requested in requests) - var/list/request = list() - request["id_message"] = requested["id_message"] - request["time"] = requested["time"] - var/mob/sender = requested["sender"] - request["sender_name"] = sender.name - request["sender_fax_id"] = requested["sender_fax_id"] - request["sender_fax_name"] = requested["sender_fax_name"] - request["receiver_fax_name"] = requested["receiver_fax_name"] - data["requests"] += list(request) - return data - -/datum/fax_manager/ui_act(action, list/params) - . = ..() - if(.) - return - var/datum/admins/admin_datum = GLOB.admin_datums[usr.ckey] - - switch(action) - if("send") - for(var/obj/machinery/fax/fax as anything in GLOB.fax_machines) - if(fax.fax_id == params["fax_id"]) - var/obj/item/paper/paper = new() - paper.add_raw_text(params["message"]) - paper.update_appearance() - fax.receive(paper, params["fax_name"]) - return TRUE - if("flw_fax") - for(var/obj/machinery/fax/fax as anything in GLOB.fax_machines) - if(fax.fax_id == params["fax_id"]) - admin_datum.admin_follow(fax) - return TRUE - if("read_message") - var/list/request = get_request(params["id_message"]) - var/obj/item/paper/request/paper = request["paper"] - paper.ui_interact(usr) - return TRUE - if("flw") - var/list/request = get_request(params["id_message"]) - admin_datum.admin_follow(request["sender"]) - return TRUE - if("pp") - var/list/request = get_request(params["id_message"]) - usr.client.holder.show_player_panel(request["sender"]) - return TRUE - if("vv") - var/list/request = get_request(params["id_message"]) - usr.client.debug_variables(request["sender"]) - return TRUE - if("sm") - var/list/request = get_request(params["id_message"]) - usr.client.cmd_admin_subtle_message(request["sender"]) - return TRUE - if("logs") - var/list/request = get_request(params["id_message"]) - if(!ismob(request["sender"])) - to_chat(usr, "This can only be used on instances of type /mob.") - return TRUE - show_individual_logging_panel(request["sender"], null, null) - return TRUE - if("smite") - var/list/request = get_request(params["id_message"]) - if(!check_rights(R_FUN)) - to_chat(usr, "Insufficient permissions to smite, you require +FUN") - return TRUE - var/mob/living/carbon/human/H = request["sender"] - if (!H || !istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return TRUE - usr.client.smite(H) - return TRUE - -/datum/fax_manager/proc/get_request(id_message) - for(var/list/request in requests) - if(request["id_message"] == id_message) - return request - -/datum/fax_manager/proc/receive_request(mob/sender, obj/machinery/fax/sender_fax, receiver_fax_name, obj/item/paper/paper, receiver_color) - var/list/request = list() - var/obj/item/paper/request/message = new() - request["id_message"] = requests.len - request["time"] = game_timestamp() - request["sender"] = sender - request["sender_fax_id"] = sender_fax.fax_id - request["sender_fax_name"] = sender_fax.fax_name - request["receiver_fax_name"] = receiver_fax_name - message.copy_properties(paper) - request["paper"] = message - requests += list(request) - var/msg = "\"[sanitize(receiver_fax_name)]\" fax received a message from \"[sanitize(sender_fax.fax_name)]\" fax SENT BY [ADMIN_FULLMONTY(sender)] (Open Fax Manager)" - for(var/client/C in GLOB.admins) - if(C.prefs.chat_toggles & CHAT_PRAYER) - to_chat(C, msg) - for(var/client/admin in GLOB.admins) - if((admin.prefs.chat_toggles & CHAT_PRAYER) && (admin.prefs.toggles & SOUND_PRAYERS)) - SEND_SOUND(admin, sound('sound/items/poster_being_created.ogg')) - -// A special piece of paper for the administrator that will open the interface no matter what. -/obj/item/paper/request/ui_status() - return UI_INTERACTIVE - -// I'm sure there's a better way to transfer it, I just couldn't find it -/obj/item/paper/request/proc/copy_properties(obj/item/paper/paper) - raw_text_inputs = paper.raw_text_inputs - raw_stamp_data = paper.raw_stamp_data - raw_field_input_data = paper.raw_field_input_data - show_written_words = paper.show_written_words - stamp_cache = paper.stamp_cache - contact_poison = paper.contact_poison - contact_poison_volume = paper.contact_poison_volume - default_raw_text = paper.default_raw_text - input_field_count = paper.input_field_count diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4080f68c5d74..e30a2bdd9737 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -60,6 +60,9 @@ /// state checking on if it should be shown to a viewer. var/datum/weakref/camera_holder + ///If TRUE, staff can read paper everywhere, but usually from requests panel. + var/request_state = FALSE + /// The (text for the) stamps on the paper. var/list/stamps /// Positioning for the stamp in tgui var/list/stamped /// Overlay info @@ -161,12 +164,13 @@ * * bold - Whether this text should be rendered completely bold. */ -/obj/item/paper/proc/add_raw_text(text, font, color, bold) +/obj/item/paper/proc/add_raw_text(text, font, color, bold, advanced_html) var/new_input_datum = new /datum/paper_input( text, font, color, bold, + advanced_html, ) input_field_count += get_input_field_count(text) @@ -320,7 +324,7 @@ // Are we on fire? Hard to read if so if(resistance_flags & ON_FIRE) return UI_CLOSE - if(camera_holder && can_show_to_mob_through_camera(user)) + if(camera_holder && can_show_to_mob_through_camera(user) || request_state) return UI_UPDATE if(!in_range(user, src) && !isobserver(user)) return UI_CLOSE @@ -373,7 +377,7 @@ return // Handle writing items. - var/writing_stats = attacking_item.get_writing_implement_details() + var/writing_stats = istype(attacking_item) ? attacking_item.get_writing_implement_details() : null if(!writing_stats) ui_interact(user) @@ -576,7 +580,7 @@ // Safe to assume there are writing implement details as user.can_write(...) fails with an invalid writing implement. var/writing_implement_data = holding.get_writing_implement_details() - add_raw_text(paper_input, writing_implement_data["font"], writing_implement_data["color"], writing_implement_data["use_bold"]) + add_raw_text(paper_input, writing_implement_data["font"], writing_implement_data["color"], writing_implement_data["use_bold"], check_rights_for(user?.client, R_FUN)) log_paper("[key_name(user)] wrote to [name]: \"[paper_input]\"") to_chat(user, "You have added to your paper masterpiece!"); @@ -663,15 +667,18 @@ var/colour = "" /// Whether to render the font bold or not. var/bold = FALSE + /// Whether the creator of this input field has the R_FUN permission, thus allowing less sanitization + var/advanced_html = FALSE -/datum/paper_input/New(_raw_text, _font, _colour, _bold) +/datum/paper_input/New(_raw_text, _font, _colour, _bold, _advanced_html) raw_text = _raw_text font = _font colour = _colour bold = _bold + advanced_html = _advanced_html /datum/paper_input/proc/make_copy() - return new /datum/paper_input(raw_text, font, colour, bold); + return new /datum/paper_input(raw_text, font, colour, bold, advanced_html); /datum/paper_input/proc/to_list() return list( @@ -679,6 +686,7 @@ font = font, color = colour, bold = bold, + advanced_html = advanced_html, ) /// A single instance of a saved stamp on paper. diff --git a/code/modules/requests/request.dm b/code/modules/requests/request.dm new file mode 100644 index 000000000000..0ac37f63187e --- /dev/null +++ b/code/modules/requests/request.dm @@ -0,0 +1,37 @@ +/** + * # Request + * + * A representation of an in-game request, such as a prayer. + */ +/datum/request + /// Unique ID of the request + var/id + /// Atomic ID for increment unique request IDs + var/static/atomic_id = 0 + /// The type of request + var/req_type + /// The owner of the request, the player who created it + var/client/owner + /// The ckey of the owner, used for re-binding variables on login + var/owner_ckey + /// The name of the owner, in format /, assigned at time of request creation + var/owner_name + /// The message associated with the request + var/message + /// Just any information, which you can to send with request. For example paper datum. + var/additional_information + /// When the request was created + var/timestamp + +/datum/request/New(client/requestee, type, request, additional_info) + if (!requestee) + qdel(src) + return + id = ++atomic_id + owner = requestee + owner_ckey = owner.ckey + req_type = type + message = request + timestamp = world.time + additional_information = additional_info + owner_name = key_name(requestee, FALSE) diff --git a/code/modules/requests/requests_manager.dm b/code/modules/requests/requests_manager.dm new file mode 100644 index 000000000000..e33da846d4de --- /dev/null +++ b/code/modules/requests/requests_manager.dm @@ -0,0 +1,249 @@ +/// Requests from prayers +#define REQUEST_PRAYER "request_prayer" +/// Requests for Centcom +#define REQUEST_CENTCOM "request_centcom" +/// Requests for the Syndicate +#define REQUEST_SYNDICATE "request_syndicate" +/// Requests for the nuke code +#define REQUEST_NUKE "request_nuke" +/// Requests somebody from fax +#define REQUEST_FAX "request_fax" + +GLOBAL_DATUM_INIT(requests, /datum/request_manager, new) + +/** + * # Request Manager + * + * Handles all player requests (prayers, centcom requests, syndicate requests) + * that occur in the duration of a round. + */ +/datum/request_manager + /// Associative list of ckey -> list of requests + var/list/requests = list() + /// List where requests can be accessed by ID + var/list/requests_by_id = list() + +/datum/request_manager/Destroy(force, ...) + QDEL_LIST(requests) + return ..() + +/** + * Used in the new client pipeline to catch when clients are reconnecting and need to have their + * reference re-assigned to the 'owner' variable of any requests + * + * Arguments: + * * C - The client who is logging in + */ +/datum/request_manager/proc/client_login(client/C) + if (!requests[C.ckey]) + return + for (var/datum/request/request as anything in requests[C.ckey]) + request.owner = C + +/** + * Used in the destroy client pipeline to catch when clients are disconnecting and need to have their + * reference nulled on the 'owner' variable of any requests + * + * Arguments: + * * C - The client who is logging out + */ +/datum/request_manager/proc/client_logout(client/C) + if (!requests[C.ckey]) + return + for (var/datum/request/request as anything in requests[C.ckey]) + request.owner = null + +/** + * Creates a request for a prayer, and notifies admins who have the sound notifications enabled when appropriate + * + * Arguments: + * * C - The client who is praying + * * message - The prayer + * * is_chaplain - Boolean operator describing if the prayer is from a chaplain + */ +/datum/request_manager/proc/pray(client/C, message, is_chaplain) + request_for_client(C, REQUEST_PRAYER, message) + for(var/client/admin in GLOB.admins) + if(is_chaplain && admin.prefs.chat_toggles & CHAT_PRAYER && admin.prefs.toggles & SOUND_PRAYERS) + SEND_SOUND(admin, sound('sound/effects/pray.ogg')) + +/** + * Creates a request for a Centcom message + * + * Arguments: + * * C - The client who is sending the request + * * message - The message + */ +/datum/request_manager/proc/message_centcom(client/C, message) + request_for_client(C, REQUEST_CENTCOM, message) + +/** + * Creates a request for a Syndicate message + * + * Arguments: + * * C - The client who is sending the request + * * message - The message + */ +/datum/request_manager/proc/message_syndicate(client/C, message) + request_for_client(C, REQUEST_SYNDICATE, message) + +/** + * Creates a request for the nuclear self destruct codes + * + * Arguments: + * * C - The client who is sending the request + * * message - The message + */ +/datum/request_manager/proc/nuke_request(client/C, message) + request_for_client(C, REQUEST_NUKE, message) + +/** + * Creates a request for fax answer + * + * Arguments: + * * requester - The client who is sending the request + * * message - Paper with text.. some stamps.. and another things. + */ +/datum/request_manager/proc/fax_request(client/requester, message, additional_info) + request_for_client(requester, REQUEST_FAX, message, additional_info) + +/** + * Creates a request and registers the request with all necessary internal tracking lists + * + * Arguments: + * * C - The client who is sending the request + * * type - The type of request, see defines + * * message - The message + */ +/datum/request_manager/proc/request_for_client(client/C, type, message, additional_info) + var/datum/request/request = new(C, type, message, additional_info) + if (!requests[C.ckey]) + requests[C.ckey] = list() + requests[C.ckey] += request + requests_by_id.len++ + requests_by_id[request.id] = request + +/datum/request_manager/ui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "RequestManager") + ui.open() + +/datum/request_manager/ui_state(mob/user) + return GLOB.admin_state + +/datum/request_manager/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if (..()) + return + + // Only admins should be sending actions + if (!check_rights(R_ADMIN)) + to_chat(usr, "You do not have permission to do this, you require +ADMIN") + return + + // Get the request this relates to + var/id = params["id"] != null ? text2num(params["id"]) : null + if (!id) + to_chat(usr, "Failed to find a request ID in your action, please report this") + CRASH("Received an action without a request ID, this shouldn't happen!") + var/datum/request/request = !id ? null : requests_by_id[id] + var/datum/admins/admin_datum = GLOB.admin_datums[usr.ckey] + + switch(action) + if ("pp") + var/mob/M = request.owner?.mob + usr.client.holder.show_player_panel(M) + return TRUE + if ("vv") + var/mob/M = request.owner?.mob + usr.client.debug_variables(M) + return TRUE + if ("sm") + var/mob/M = request.owner?.mob + usr.client.cmd_admin_subtle_message(M) + return TRUE + if ("flw") + var/mob/M = request.owner?.mob + admin_datum.admin_follow(M) + return TRUE + if ("tp") + if(!SSticker.HasRoundStarted()) + to_chat(usr,"The game hasn't started yet!") + return TRUE + var/mob/M = request.owner?.mob + if(!ismob(M)) + var/datum/mind/D = M + if(!istype(D)) + to_chat(usr, "This can only be used on instances of type /mob and /mind") + return TRUE + else + D.traitor_panel() + return TRUE + else + usr.client.holder.show_traitor_panel(M) + return TRUE + if ("logs") + var/mob/M = request.owner?.mob + if(!ismob(M)) + to_chat(usr, "This can only be used on instances of type /mob.") + return TRUE + show_individual_logging_panel(M, null, null) + return TRUE + if ("smite") + if(!check_rights(R_FUN)) + to_chat(usr, "Insufficient permissions to smite, you require +FUN") + return TRUE + var/mob/living/carbon/human/H = request.owner?.mob + if (!H || !istype(H)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return TRUE + usr.client.smite(H) + return TRUE + if ("rply") + if (request.req_type == REQUEST_PRAYER) + to_chat(usr, "Cannot reply to a prayer") + return TRUE + var/mob/M = request.owner?.mob + usr.client.admin_headset_message(M, request.req_type == REQUEST_SYNDICATE ? RADIO_CHANNEL_SYNDICATE : RADIO_CHANNEL_CENTCOM) + return TRUE + if ("setcode") + if (request.req_type != REQUEST_NUKE) + to_chat(usr, "You cannot set the nuke code for a non-nuke-code-request request!") + return TRUE + var/code = random_nukecode() + for(var/obj/machinery/nuclearbomb/selfdestruct/SD in GLOB.nuke_list) + SD.r_code = code + message_admins("[key_name_admin(usr)] has set the self-destruct code to \"[code]\".") + return TRUE + if ("show") + if(request.req_type != REQUEST_FAX) + to_chat(usr, "Request doesn't have a paper to read.") + return TRUE + var/obj/item/paper/request_message = request.additional_information + request_message.ui_interact(usr) + return TRUE + +/datum/request_manager/ui_data(mob/user) + . = list( + "requests" = list() + ) + for (var/ckey in requests) + for (var/datum/request/request as anything in requests[ckey]) + var/list/data = list( + "id" = request.id, + "req_type" = request.req_type, + "owner" = request.owner ? "[REF(request.owner)]" : null, + "owner_ckey" = request.owner_ckey, + "owner_name" = request.owner_name, + "message" = request.message, + "additional_info" = request.additional_information, + "timestamp" = request.timestamp, + "timestamp_str" = station_time_timestamp(wtime = request.timestamp) + ) + .["requests"] += list(data) + +#undef REQUEST_PRAYER +#undef REQUEST_CENTCOM +#undef REQUEST_SYNDICATE +#undef REQUEST_NUKE +#undef REQUEST_FAX diff --git a/shiptest.dme b/shiptest.dme index 23e855ca6200..4f42a582878f 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -222,7 +222,6 @@ #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\admin.dm" #include "code\_globalvars\lists\client.dm" -#include "code\_globalvars\lists\faxes.dm" #include "code\_globalvars\lists\flavor_misc.dm" #include "code\_globalvars\lists\jobs.dm" #include "code\_globalvars\lists\keybindings.dm" @@ -1466,6 +1465,7 @@ #include "code\game\turfs\open\space\space.dm" #include "code\game\turfs\open\space\transit.dm" #include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_fax_panel.dm" #include "code\modules\admin\admin_follow.dm" #include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_ranks.dm" @@ -1510,7 +1510,6 @@ #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" #include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\fax_manager.dm" #include "code\modules\admin\verbs\fix_air.dm" #include "code\modules\admin\verbs\fps.dm" #include "code\modules\admin\verbs\getlogs.dm" @@ -1531,6 +1530,7 @@ #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\reestablish_db_connection.dm" #include "code\modules\admin\verbs\rejuvenate.dm" +#include "code\modules\admin\verbs\requests.dm" #include "code\modules\admin\verbs\secrets.dm" #include "code\modules\admin\verbs\selectequipment.dm" #include "code\modules\admin\verbs\shuttlepanel.dm" @@ -2863,7 +2863,6 @@ #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\contract.dm" #include "code\modules\paperwork\fax.dm" -#include "code\modules\paperwork\fax_manager.dm" #include "code\modules\paperwork\filingcabinet.dm" #include "code\modules\paperwork\folders.dm" #include "code\modules\paperwork\handlabeler.dm" @@ -3121,6 +3120,8 @@ #include "code\modules\religion\religion_sects.dm" #include "code\modules\religion\religion_structures.dm" #include "code\modules\religion\rites.dm" +#include "code\modules\requests\request.dm" +#include "code\modules\requests\requests_manager.dm" #include "code\modules\research\bepis.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" diff --git a/tgui/packages/tgui/interfaces/AdminFax.js b/tgui/packages/tgui/interfaces/AdminFax.js new file mode 100644 index 000000000000..8245bc4a9ad3 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AdminFax.js @@ -0,0 +1,263 @@ +import { useBackend, useLocalState } from '../backend'; +import { + Section, + Box, + Dropdown, + Button, + Input, + TextArea, + Divider, + NumberInput, + Tooltip, + Knob, +} from '../components'; +import { Window } from '../layouts'; + +export const AdminFax = (props, context) => { + return ( + + + + + + ); +}; + +export const FaxMainPanel = (props, context) => { + const { act, data } = useBackend(context); + + const [fax, setFax] = useLocalState(context, 'fax', ''); + const [saved, setSaved] = useLocalState(context, 'saved', false); + const [paperName, setPaperName] = useLocalState(context, 'paperName', ''); + const [fromWho, setFromWho] = useLocalState(context, 'fromWho', ''); + const [rawText, setRawText] = useLocalState(context, 'rawText', ''); + const [stamp, setStamp] = useLocalState(context, 'stampType', ''); + const [stampCoordX, setStampCoordX] = useLocalState( + context, + 'stampCoordX', + 0 + ); + const [stampCoordY, setStampCoordY] = useLocalState( + context, + 'stampCoordY', + 0 + ); + const [stampAngle, setStampAngle] = useLocalState(context, 'stampAngle', 0); + if (stamp && data.stamps[0] !== 'None') { + data.stamps.unshift('None'); + } + return ( + <> +

+ + + } + > + + setFax(value)} + /> + +
+
+ act('preview', { + faxName: fax, + }) + } + > + Preview + + } + > + + setPaperName(v)} + /> + + + + + + + setFromWho(v)} + /> + + + + + + +