From b9fe8cc6bae9fa430cd26c0e32325f6bb4dd6238 Mon Sep 17 00:00:00 2001 From: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Date: Sun, 26 Mar 2023 20:12:11 -0700 Subject: [PATCH] [SEMI-MODULAR] Advanced engineering response team (#20040) * advanced atmos * radio defines * turn radio on * doc * security level * Update modular_skyrat/modules/alerts/code/security_level_procs.dm Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com> * Update security_level_procs.dm * not needed * Update adv_engineering.dm * move sec level proc * Update sol_fed.dm * Update sol_fed.dm * charge 15k per tech * remove armor from jumpsuit --------- Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com> --- code/__DEFINES/~skyrat_defines/solfed.dm | 5 + code/game/communications.dm | 2 + .../game/machinery/computer/communications.dm | 4 +- .../objects/items/devices/radio/headset.dm | 1 + .../game/objects/items/devices/radio/radio.dm | 2 +- code/game/say.dm | 1 + .../clothing/under/jobs/engineering.dm | 20 +++- .../code/adv_engineering.dm | 47 ++++++++ .../modules/advanced_engineering/readme.md | 20 ++++ .../modules/aesthetics/storage/storage.dm | 12 ++ .../modules/aesthetics/storage/storage.dmi | Bin 10699 -> 11051 bytes .../alerts/code/security_level_procs.dm | 16 +++ .../modules/biohazard_blob/code/mold_event.dm | 2 +- modular_skyrat/modules/cme/code/cme.dm | 9 +- .../custom_meteors/code/custom_meteors.dm | 2 +- .../modules/clothing/masks/gasmask.dm | 14 ++- .../modules/events/code/event_seclevel.dm | 15 --- .../modules/goofsec/code/sol_fed.dm | 104 +++++++++--------- tgstation.dme | 4 +- .../tgui/interfaces/CommunicationsConsole.js | 4 +- 20 files changed, 205 insertions(+), 79 deletions(-) create mode 100644 code/__DEFINES/~skyrat_defines/solfed.dm create mode 100644 modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm create mode 100644 modular_skyrat/modules/advanced_engineering/readme.md create mode 100644 modular_skyrat/modules/alerts/code/security_level_procs.dm delete mode 100644 modular_skyrat/modules/events/code/event_seclevel.dm diff --git a/code/__DEFINES/~skyrat_defines/solfed.dm b/code/__DEFINES/~skyrat_defines/solfed.dm new file mode 100644 index 00000000000..30aef1f464d --- /dev/null +++ b/code/__DEFINES/~skyrat_defines/solfed.dm @@ -0,0 +1,5 @@ +#define RADIO_CHANNEL_SOLFED "SolFed" +#define RADIO_KEY_SOLFED "l" +#define RADIO_TOKEN_SOLFED ":l" + +#define FREQ_SOLFED 1377 diff --git a/code/game/communications.dm b/code/game/communications.dm index 7284d4606c1..cbcb3e65ba2 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -104,6 +104,7 @@ GLOBAL_LIST_INIT(radiochannels, list( RADIO_CHANNEL_INTERDYNE = FREQ_INTERDYNE, //SKYRAT EDIT ADDITION - MAPPING RADIO_CHANNEL_GUILD = FREQ_GUILD, //SKYRAT EDIT ADDITION - ASSAULT OPS RADIO_CHANNEL_TARKON = FREQ_TARKON, //SKYRAT EDIT ADDITION - MAPPING + RADIO_CHANNEL_SOLFED = FREQ_SOLFED, //SKYRAT EDIT ADDITION - SOLFED RADIO_CHANNEL_SYNDICATE = FREQ_SYNDICATE, RADIO_CHANNEL_UPLINK = FREQ_UPLINK, RADIO_CHANNEL_SUPPLY = FREQ_SUPPLY, @@ -127,6 +128,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( "[FREQ_CYBERSUN]" = RADIO_CHANNEL_CYBERSUN, //SKYRAT EDIT ADDITION - MAPPING "[FREQ_INTERDYNE]" = RADIO_CHANNEL_INTERDYNE, //SKYRAT EDIT ADDITION - MAPPING "[FREQ_TARKON]" = RADIO_CHANNEL_TARKON, //SKYRAT EDIT ADDITION - MAPPING + "[FREQ_SOLFED]" = RADIO_CHANNEL_SOLFED, //SKYRAT EDIT ADDITION - SOLFED "[FREQ_SYNDICATE]" = RADIO_CHANNEL_SYNDICATE, "[FREQ_UPLINK]" = RADIO_CHANNEL_UPLINK, "[FREQ_SUPPLY]" = RADIO_CHANNEL_SUPPLY, diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index cf9811207b7..53d9ddd4c78 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -468,10 +468,10 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if(!pre_911_check(usr)) return calling_911(usr, "Marshals", EMERGENCY_RESPONSE_POLICE) - if ("callBreachControl") + if ("callTheCatmos") if(!pre_911_check(usr)) return - calling_911(usr, "Breach Control", EMERGENCY_RESPONSE_ATMOS) + calling_911(usr, "Advanced Atmospherics", EMERGENCY_RESPONSE_ATMOS) if ("callTheParameds") if(!pre_911_check(usr)) return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 7e2bf2fc6ab..f83602e1913 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( RADIO_CHANNEL_INTERDYNE = RADIO_TOKEN_INTERDYNE, //SKYRAT EDIT ADDITION - Mapping RADIO_CHANNEL_GUILD = RADIO_TOKEN_GUILD, //SKYRAT EDIT ADDITION - Mapping RADIO_CHANNEL_TARKON = RADIO_TOKEN_TARKON, //SKYRAT EDIT ADDITION - MAPPING + RADIO_CHANNEL_SOLFED = RADIO_TOKEN_SOLFED, //SKYRAT EDIT ADDITION - SOLFED RADIO_CHANNEL_SYNDICATE = RADIO_TOKEN_SYNDICATE, RADIO_CHANNEL_SUPPLY = RADIO_TOKEN_SUPPLY, RADIO_CHANNEL_SERVICE = RADIO_TOKEN_SERVICE, diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 56146980891..7ad01075992 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -317,7 +317,7 @@ var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, message, spans, message_mods) // Independent radios, on the CentCom frequency, reach all independent radios - if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_CTF_GREEN || freq == FREQ_CTF_YELLOW || freq == FREQ_FACTION || freq == FREQ_CYBERSUN || freq == FREQ_INTERDYNE || freq == FREQ_GUILD || freq == FREQ_TARKON)) //SKYRAT EDIT CHANGE - FACTION, MAPPING + if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_CTF_GREEN || freq == FREQ_CTF_YELLOW || freq == FREQ_FACTION || freq == FREQ_CYBERSUN || freq == FREQ_INTERDYNE || freq == FREQ_GUILD || freq == FREQ_TARKON || freq == FREQ_SOLFED)) //SKYRAT EDIT CHANGE - FACTION, MAPPING, SOLFED signal.data["compression"] = 0 signal.transmission_method = TRANSMISSION_SUPERSPACE signal.levels = list(0) diff --git a/code/game/say.dm b/code/game/say.dm index 1828e5fdc9a..814036301f1 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_INIT(freqtospan, list( "[FREQ_INTERDYNE]" = "syndradio", //SKYRAT EDIT ADDITION - MAPPING "[FREQ_GUILD]" = "syndradio", //SKYRAT EDIT ADDITION - MAPPING "[FREQ_TARKON]" = "engradio", //SKYRAT EDIT ADDITION - MAPPING + "[FREQ_SOLFED]" = "medradio", //SKYRAT EDIT ADDITION - SOLFED "[FREQ_CTF_RED]" = "redteamradio", "[FREQ_CTF_BLUE]" = "blueteamradio", "[FREQ_CTF_GREEN]" = "greenteamradio", diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm index c799aca2997..1df34638f4b 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/engineering.dm @@ -9,7 +9,9 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/under/engineering.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/engineering.dmi' -// Add a /obj/item/clothing/under/rank/engineering/atmospheric_technician/skyrat if you add uniforms for it +/obj/item/clothing/under/rank/engineering/atmospheric_technician/skyrat + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/engineering.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/engineering.dmi' /* * ENGINEER @@ -65,3 +67,19 @@ desc = "A gray naval suit with a lead-lined vest and a rank badge denoting the Officer of the Internal Engineering Division. Doesn't come with a death machine building guide." name = "chief engineer's naval jumpsuit" icon_state = "impce" + +/* +* ATMOS TECH +*/ +/datum/armor/atmos_adv + bio = 40 + fire = 70 + acid = 70 + +/obj/item/clothing/under/rank/engineering/atmospheric_technician/skyrat/utility/advanced + name = "advanced atmospherics uniform" + desc = "A jumpsuit worn by advanced atmospherics crews." + icon_state = "util_atmos" + armor_type = /datum/armor/atmos_adv + icon_state = "util_eng" + can_adjust = FALSE diff --git a/modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm b/modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm new file mode 100644 index 00000000000..962cafe1bef --- /dev/null +++ b/modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm @@ -0,0 +1,47 @@ +/obj/item/storage/belt/utility/full/powertools/ircd/PopulateContents() + new /obj/item/screwdriver/power(src) + new /obj/item/crowbar/power(src) + new /obj/item/weldingtool/electric(src) + new /obj/item/construction/rcd/combat(src) + new /obj/item/pipe_dispenser(src) + new /obj/item/wrench/bolter(src) + new /obj/item/analyzer/ranged(src) + +/obj/item/mod/control/pre_equipped/advanced/atmos + theme = /datum/mod_theme/advanced/atmos + applied_cell = /obj/item/stock_parts/cell/hyper + applied_modules = list( + /obj/item/mod/module/storage/large_capacity, + /obj/item/mod/module/welding, + /obj/item/mod/module/rad_protection, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/t_ray, + /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/visor/meson, + ) + default_pins = list( + /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/magboot/advanced, + ) + +/datum/mod_theme/advanced/atmos //Implement a unique skin for this eventually + ui_theme = "neutral" + +/obj/item/rcd_ammo/combat + name = "industrial RCD matter cartridge" + desc = "A cartridge with one complete refill for an industrial RCD." + w_class = WEIGHT_CLASS_SMALL + custom_materials = list(/datum/material/iron=120000, /datum/material/glass=80000) + ammoamt = 440 + +/obj/item/storage/box/rcd_ammo + name = "industrial RCD matter box" + icon = 'modular_skyrat/modules/aesthetics/storage/storage.dmi' + desc = "A durable box with refill cartridges for an industrial RCD." + icon_state = "engibox" + illustration = "rcd" + custom_materials = list(/datum/material/plastic = 1000) + +/obj/item/storage/box/rcd_ammo/PopulateContents() + for(var/i in 1 to 4) + new/obj/item/rcd_ammo/combat(src) diff --git a/modular_skyrat/modules/advanced_engineering/readme.md b/modular_skyrat/modules/advanced_engineering/readme.md new file mode 100644 index 00000000000..933b4456bc0 --- /dev/null +++ b/modular_skyrat/modules/advanced_engineering/readme.md @@ -0,0 +1,20 @@ +https://github.com/Skyrat-SS13/Skyrat-tg/pull/20040/ + +## Title: +MODULE ID: ADVANCED_ENGINEERING + +### Description: +Adds some new high tier engineering gear for use by ERTs. + +### TG Proc/File Changes: +None + +### Defines +#define RADIO_CHANNEL_SOLFED "SolFed" +#define RADIO_KEY_SOLFED "l" +#define RADIO_TOKEN_SOLFED ":l" + +#define FREQ_SOLFED 1377 + +### Credits: +LT3 diff --git a/modular_skyrat/modules/aesthetics/storage/storage.dm b/modular_skyrat/modules/aesthetics/storage/storage.dm index 2dbfd991152..a3293a2c024 100644 --- a/modular_skyrat/modules/aesthetics/storage/storage.dm +++ b/modular_skyrat/modules/aesthetics/storage/storage.dm @@ -85,6 +85,18 @@ /obj/item/storage/box/silver_sulf icon_state = "medbox" +/* +// Engineering +*/ +/obj/item/storage/box/metalfoam + icon_state = "engibox" + +/obj/item/storage/box/smart_metal_foam + icon_state = "engibox" + +/obj/item/storage/box/material + icon_state = "engibox" + /* // Security */ diff --git a/modular_skyrat/modules/aesthetics/storage/storage.dmi b/modular_skyrat/modules/aesthetics/storage/storage.dmi index 7921f657597ea70cec3886551344e000922416a1..b3f46c9d58ac7facb4b81c67094e016b86f3c293 100644 GIT binary patch delta 10067 zcmXw9Wk6KX*1a@Hi?pF!dxWr(4^@xAxW zuRC+^oPF*-XYalCT4zYRR5#%n3P&|_5eoQ7acpyfzs{Pnc7028q#agea&7pB)Wyty zQjHH^StePwS+RuSm)3TB5Om1vTsKm*aXYfGk`UZJ%V2cpIiRT1AspvXqHHAi;B1@I zcW2EcBt^k#_gc+zRdZCYweyB@CbRU2@7qe=SB?0Nl(r1_L#8Q-t&6OXcAvtAJW;T% z?EpkM_)yrzt)2q|0D3@C_O*`h_rqmB{kPNim?u7>kSIpB{G9o>0&j9<6Qx`}SX*6+ zLgKFFB^FZw59>h3L#<|RKK_g~yUTeE+9g|7kpaYa&9Z53M(`y)D4^*f>Tg?5D z9^MY>p<^tS>fD}Q9zRl+F8aWn@m0*vy)K-LLqA);MzX~C>I)?q#!A2gR)nerr zKG`(rG29^4!~0Mf+#YAE=7G zECIXpB2Gz$msQkVg};bqBEYehZ`3_(Sv*hGV36g9xX{qXSYfKO@xW_))o$VYFF4F3jI zy)0r|+W#FEFC!CP$MEFe#P6@Gqv9pQUZdT7gAQ+Tj-Ol}+fQs(_5o>kr#D@#elPOs zdwOJJDMc|AHsaUTIz#1$P*G8NtPdzuGR59qArMrYLxW9_U6*#785-WhW%ZJ0W$~kT z`mO%Vfq_Sr-hQC*R^U~{&!7b3b`jbmTGvb0O0NtK;}k(=`-WrE-y7&k3;>&Jgz!Wn z21+(Mr)C7}S`-4{JJ2$@ICilQy1Bi8cv#pp3i_0KWh{L+5`Bv$;@1!o8Y)x1Z`9Mf^(qyj5gB76YVx_0=um$g;KYaQ6)ppMM*BtNM&5a3v zGddonh;(3`uT%0xlZQ=r|90>*W}1FO7u8Dd#d1SX>fv5pPgK%!ho?Gtc~C^AV*#;> zIl}*|{mEs)JlsW>_O*gWuoK$ev_lk&-Uoj;RyOG)%}@Te5o9l8y4hrfAnij(drq4J z%RZaNdV1jRKYu!*r`$Z3N3eDOp!9U(IFv7$nV(cwU8JR?fQ5iMh2UTbEp2TSz}eY3 z!Y(;IJ$-#a*+r;FggK>NPpXAi(I&Q;R^)_2XbHnGQpnEns zizj(_QsPgtnFcknfyS`Dfe+M>Qh;lwo|-X~3Jn~XoFwU74#h|LoR$`ClNp2wjLo-u z#EBjptTqh_6~saiw-!}q{x=U!0_B%N&tUiE*>Bf0vsbvLNUU7nQguT!~U;zd*0Z!G>!@<4wst z2Qm&SCOC8ZfHOF}H{iI{CW-O5{UJDG|CabcGS3hG(hiYM-$qSFJIOONgDiKFri&;{V}ss{Ahe*ja%1-XR5DnEATKCiI7QpXcKL0 zo-Uu+rVC9>Of+G}`}OvfZ-vqGX{ZEH7K0HH(NTu*8n@cb9{T*Uc}^qN#KetF0hIaP z%iFVwJ(Blouao%R_px3=1fuwY`taxdoz*NiJD0SkTOt(E|CxI(FslwzBZ)<|B%^Z4 z8FzoSTqgpLh5@-eJoiNc8b$j=1shR?EiHHe-g@4M!&}oI5%HXIPS-y#L4L?)0dCm-8_GduntGjz>PhRZKd zURo3)(i>zK1G8A-Aeji)Jk1?3_`3WPGO~rhXZaCQz4g(NI)aKyBF-;=p+J!Cep4

Ga|${?RSQ4|PE40s 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 delta 9698 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 F{{oj4Jv#sZ diff --git a/modular_skyrat/modules/alerts/code/security_level_procs.dm b/modular_skyrat/modules/alerts/code/security_level_procs.dm new file mode 100644 index 00000000000..b984a61dd5d --- /dev/null +++ b/modular_skyrat/modules/alerts/code/security_level_procs.dm @@ -0,0 +1,16 @@ +/** + * Called to check/change security level. + * Checks if the station security level is at least minimum_level, and if not, sets it to that level. + * Arguments determine if engineering override or maint access is granted. + * Arguments: min_level: number, eng_access: boolean, maint_access: boolean +*/ +/datum/controller/subsystem/security_level/proc/minimum_security_level(min_level = SEC_LEVEL_ORANGE, eng_access = TRUE, maint_access = FALSE) + if(SSsecurity_level.get_current_level_as_number() < min_level) + SSsecurity_level.set_level(min_level) + + if(eng_access) + GLOB.force_eng_override = TRUE + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_FORCE_ENG_OVERRIDE, TRUE) + + if(maint_access) + make_maint_all_access() diff --git a/modular_skyrat/modules/biohazard_blob/code/mold_event.dm b/modular_skyrat/modules/biohazard_blob/code/mold_event.dm index ec4ac4d1797..7c0544bf97a 100644 --- a/modular_skyrat/modules/biohazard_blob/code/mold_event.dm +++ b/modular_skyrat/modules/biohazard_blob/code/mold_event.dm @@ -35,7 +35,7 @@ /datum/round_event/mold/announce(fake) if(!fake) - event_minimum_security_level(SEC_LEVEL_VIOLET, FALSE, FALSE) + INVOKE_ASYNC(SSsecurity_level, TYPE_PROC_REF(/datum/controller/subsystem/security_level/, minimum_security_level), SEC_LEVEL_VIOLET, FALSE, FALSE) priority_announce("Confirmed outbreak of level 6 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK6) /datum/round_event/mold/start() diff --git a/modular_skyrat/modules/cme/code/cme.dm b/modular_skyrat/modules/cme/code/cme.dm index 1ccf5ac9795..bb84ff4ef1c 100644 --- a/modular_skyrat/modules/cme/code/cme.dm +++ b/modular_skyrat/modules/cme/code/cme.dm @@ -133,12 +133,12 @@ All synthetic and non-organic lifeforms should seek shelter immediately! \ Neutralize magnetic field bubbles at all costs.", "Solar Event", sound('modular_skyrat/modules/cme/sound/cme_warning.ogg')) if(CME_EXTREME) - addtimer(CALLBACK(src, PROC_REF(event_minimum_security_level), SEC_LEVEL_ORANGE, TRUE, FALSE), (round((start_when * SSevents.wait) * 0.1, 0.1)) SECONDS) + addtimer(CALLBACK(src, PROC_REF(cme_level_callback), SEC_LEVEL_ORANGE, TRUE, FALSE), (round((start_when * SSevents.wait) * 0.1, 0.1)) SECONDS) priority_announce("Critical Coronal mass ejection detected! Expected intensity: [uppertext(cme_intensity)]. Impact in: [round((start_when * SSevents.wait) * 0.1, 0.1)] seconds. \ All synthetic and non-organic lifeforms should seek shelter immediately! \ Neutralize magnetic field bubbles at all costs.", "Solar Event", sound('modular_skyrat/modules/cme/sound/cme_warning.ogg')) if(CME_ARMAGEDDON) - addtimer(CALLBACK(src, PROC_REF(event_minimum_security_level), SEC_LEVEL_GAMMA, TRUE, TRUE), (round((start_when * SSevents.wait) * 0.1, 0.1)) SECONDS) + addtimer(CALLBACK(src, PROC_REF(cme_level_callback), SEC_LEVEL_GAMMA, TRUE, TRUE), (round((start_when * SSevents.wait) * 0.1, 0.1)) SECONDS) priority_announce("Neutron Mass Ejection Detected! Expected intensity: [uppertext(cme_intensity)]. Impact in: [round((start_when * SSevents.wait) * 0.1, 0.1)] seconds. \ All personnel should proceed to their nearest warpgate for evacuation, the Solar Federation has issued this mandatory alert.", "Solar Event", sound('modular_skyrat/modules/cme/sound/cme_warning.ogg')) @@ -147,11 +147,14 @@ var/turf/spawnpoint = pick(cme_start_locs) spawn_cme(spawnpoint, cme_intensity) +/datum/round_event/cme/proc/cme_level_callback(sec_level = SEC_LEVEL_ORANGE, engi = TRUE, maint = FALSE) + INVOKE_ASYNC(SSsecurity_level, TYPE_PROC_REF(/datum/controller/subsystem/security_level/, minimum_security_level), sec_level, engi, maint) + /datum/round_event/cme/proc/spawn_cme(turf/spawnpoint, intensity) if(intensity == CME_UNKNOWN) intensity = pick(CME_MINIMAL, CME_MODERATE, CME_EXTREME) if(intensity == CME_EXTREME) - event_minimum_security_level(SEC_LEVEL_ORANGE, TRUE, FALSE) + INVOKE_ASYNC(SSsecurity_level, TYPE_PROC_REF(/datum/controller/subsystem/security_level/, minimum_security_level), SEC_LEVEL_ORANGE, TRUE, FALSE) var/area/loc_area_name = get_area(spawnpoint) minor_announce("WARNING! [uppertext(intensity)] PULSE EXPECTED IN: [loc_area_name.name]", "Solar Flare Log:") diff --git a/modular_skyrat/modules/custom_meteors/code/custom_meteors.dm b/modular_skyrat/modules/custom_meteors/code/custom_meteors.dm index feb31f3781e..f1d2d7271a2 100644 --- a/modular_skyrat/modules/custom_meteors/code/custom_meteors.dm +++ b/modular_skyrat/modules/custom_meteors/code/custom_meteors.dm @@ -56,7 +56,7 @@ /datum/round_event/meteor_wave/announce(fake) priority_announce("Meteors have been detected on collision course with the station. The energy field generator is disabled or missing. First collision in approximately [start_when * 2] seconds. Ensure all sensitive areas and equipment are shielded.", "Meteor Alert", ANNOUNCER_METEORS) if(wave_name == "threatening" || wave_name == "spooky") - event_minimum_security_level(SEC_LEVEL_ORANGE, TRUE, FALSE) + INVOKE_ASYNC(SSsecurity_level, TYPE_PROC_REF(/datum/controller/subsystem/security_level/, minimum_security_level), SEC_LEVEL_ORANGE, TRUE, FALSE) /datum/round_event/meteor_wave/tick() if(ISMULTIPLE(activeFor, METEOR_TICKS_BETWEEN_WAVES)) diff --git a/modular_skyrat/modules/customization/modules/clothing/masks/gasmask.dm b/modular_skyrat/modules/customization/modules/clothing/masks/gasmask.dm index f4e9534cfa3..75bd6b05d4a 100644 --- a/modular_skyrat/modules/customization/modules/clothing/masks/gasmask.dm +++ b/modular_skyrat/modules/customization/modules/clothing/masks/gasmask.dm @@ -6,6 +6,14 @@ icon_state = "gas_clear" flags_inv = NONE +/obj/item/clothing/mask/gas/atmos/glass + icon = 'modular_skyrat/master_files/icons/obj/clothing/masks.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/mask.dmi' + name = "advanced gas mask" + desc = "A face-covering mask that can be connected to an air supply. This one doesn't obscure your face however." + icon_state = "gas_clear" + flags_inv = NONE + /obj/item/clothing/mask/gas/alt icon = 'modular_skyrat/master_files/icons/obj/clothing/masks.dmi' icon_state = "gas_alt2" @@ -129,7 +137,7 @@ update_item_action_buttons() to_chat(user, span_notice("Your Clown Mask has now morphed into [choice], all praise the Honkmother!")) return TRUE - + /obj/item/clothing/mask/gas/mime/vox desc = "The traditional mime's mask. It has an eerie facial posture. This one's got an easily accessible feeding port to be more suitable for the Vox crewmembers." icon = 'modular_skyrat/master_files/icons/mob/clothing/species/vox/mask.dmi' @@ -137,7 +145,7 @@ worn_icon_vox = 'modular_skyrat/master_files/icons/mob/clothing/species/vox/mask.dmi' worn_icon_better_vox = 'modular_skyrat/master_files/icons/mob/clothing/species/vox/mask.dmi' starting_filter_type = /obj/item/gas_filter/vox - + /obj/item/clothing/mask/gas/mime/vox/Initialize(mapload) .=..() mimemask_designs = list( @@ -174,7 +182,7 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/species/vox/mask.dmi' icon_state = options[choice] icon_state = options[choice] - + user.update_worn_mask() update_item_action_buttons() to_chat(user, span_notice("Your Mime Mask has now morphed into [choice]!")) diff --git a/modular_skyrat/modules/events/code/event_seclevel.dm b/modular_skyrat/modules/events/code/event_seclevel.dm deleted file mode 100644 index dacc9ccffa4..00000000000 --- a/modular_skyrat/modules/events/code/event_seclevel.dm +++ /dev/null @@ -1,15 +0,0 @@ -/// Called by events to check/change security level. -/// Checks if the station security level is at least minimum_level, and if not, sets it to that level. -/// If orange, also sends the engineering override signal to airlocks to enable additional access. -/// Arguments: min_level: number, eng_access: boolean, maint_access: boolean -/datum/round_event/proc/event_minimum_security_level(min_level = SEC_LEVEL_ORANGE, eng_access = TRUE, maint_access = FALSE) - var/sec_level = SSsecurity_level.get_current_level_as_number() - if(sec_level < min_level) - SSsecurity_level.set_level(min_level) - - if(eng_access) - GLOB.force_eng_override = TRUE - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_FORCE_ENG_OVERRIDE, TRUE) - - if(maint_access) - make_maint_all_access() diff --git a/modular_skyrat/modules/goofsec/code/sol_fed.dm b/modular_skyrat/modules/goofsec/code/sol_fed.dm index c517f59c4f0..c79701c5090 100644 --- a/modular_skyrat/modules/goofsec/code/sol_fed.dm +++ b/modular_skyrat/modules/goofsec/code/sol_fed.dm @@ -6,6 +6,7 @@ GLOBAL_VAR(caller_of_911) GLOBAL_VAR(call_911_msg) GLOBAL_VAR(pizza_order) +GLOBAL_VAR_INIT(solfed_tech_charge, -15000) GLOBAL_LIST_INIT(pizza_names, list( "Dixon Buttes", "I. C. Weiner", @@ -74,11 +75,12 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( You SHOULD NOT call Marshals for:\n\ Corporate affairs, manhunts, settling arguments, etc.\n\ Are you sure you want to call Marshals?", - EMERGENCY_RESPONSE_ATMOS = "You SHOULD call Breach Control for:\n\ - Stationwide atmospherics loss, unending fires filling the hallways, or department-sized breaches with Engineering and Atmospherics unable to handle it, etc. \n\ - You SHOULD NOT call Breach Control for:\n\ + EMERGENCY_RESPONSE_ATMOS = "You SHOULD call Advanced Atmospherics for:\n\ + Stationwide atmospherics loss, wide-scale supermatter delamination related repairs, unending fires filling the hallways, or department-sized breaches with Engineering and Atmospherics unable to handle it, etc. \n\ + You SHOULD NOT call Advanced Atmospherics for:\n\ A trashcan on fire in the library, a single breached room, heating issues, etc. - especially with capable Engineers/Atmos Techs.\n\ - Are you sure you want to call Breach Control?" + There is a response fee of [abs(GLOB.solfed_tech_charge)] credits per emergency responder.\n\ + Are you sure you want to call Advanced Atmospherics?" )) /// Internal. Polls ghosts and sends in a team of space cops according to the alert level, accompanied by an announcement. @@ -103,16 +105,14 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( announcer = "Sol Federation Marshal Department" poll_question = "The station has called for the Marshals. Will you respond?" if(EMERGENCY_RESPONSE_ATMOS) - team_size = 8 + team_size = tgui_input_number(usr, "How many techs would you like dispatched?", "How badly did you screw up?", 3, 3, 1) cops_to_send = /datum/antagonist/ert/request_911/atmos announcement_message = "Crewmembers of [station_name()]. this is the Sol Federation's 811 dispatch. We've recieved a report of stationwide structural damage, atmospherics loss, fire, or otherwise, and we are \ - sending a Breach Control team to support your station.\n\n\ - If the Breach Control team requests that they need SWAT protection to do their job, or to report a faulty 811 call, we will send them in at additional cost to your station to the \ - tune of $20,000.\n\n\ + sending an Advanced Atmospherics team to support your station.\n\n\ The transcript of the call is as follows:\n\ [GLOB.call_911_msg]" - announcer = "Sol Federation 811 Dispatch - Breach Control" - poll_question = "The station has called for a Breach Control team. Will you respond?" + announcer = "Sol Federation 811 Dispatch - Advanced Atmospherics" + poll_question = "The station has called for an advanced engineering support team. Will you respond?" cell_phone_number = "911" //This needs to stay so they can communicate with SWAT if(EMERGENCY_RESPONSE_EMT) team_size = 8 @@ -169,17 +169,23 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( SSjob.SendToLateJoin(cop) cop.grant_language(/datum/language/common, TRUE, TRUE, LANGUAGE_SPAWNER) - var/obj/item/gangster_cellphone/phone = new() // biggest gang in the city - phone.gang_id = cell_phone_number - phone.name = "[cell_phone_number] branded cell phone" - phone.w_class = WEIGHT_CLASS_SMALL //They get that COMPACT phone hell yea - var/phone_equipped = phone.equip_to_best_slot(cop) - if(!phone_equipped) - to_chat(cop, "Your [phone.name] has been placed at your feet.") - phone.forceMove(get_turf(cop)) + if(cops_to_send == /datum/antagonist/ert/request_911/atmos) // charge for atmos techs + var/datum/bank_account/station_balance = SSeconomy.get_dep_account(ACCOUNT_CAR) + station_balance?._adjust_money(GLOB.solfed_tech_charge) + else + var/obj/item/gangster_cellphone/phone = new() // biggest gang in the city + phone.gang_id = cell_phone_number + phone.name = "[cell_phone_number] branded cell phone" + phone.w_class = WEIGHT_CLASS_SMALL //They get that COMPACT phone hell yea + var/phone_equipped = phone.equip_to_best_slot(cop) + if(!phone_equipped) + to_chat(cop, "Your [phone.name] has been placed at your feet.") + phone.forceMove(get_turf(cop)) //Logging and cleanup log_game("[key_name(cop)] has been selected as an [ert_antag.name]") + if(cops_to_send == /datum/antagonist/ert/request_911/atmos) + log_game("[abs(GLOB.solfed_tech_charge)] has been charged from the station budget for [key_name(cop)]") agents_number-- GLOB.cops_arrived = TRUE return TRUE @@ -330,49 +336,49 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( id_trim = /datum/id_trim/solfed /* -* BREACH CONTROL +* ADVANCED ATMOSPHERICS */ /datum/antagonist/ert/request_911/atmos - name = "Breach Control Technician" - role = "Breach Control Technician" - department = "Breach Control" + name = "Advanced Atmospherics Technician" + role = "Advanced Atmospherics Technician" + department = "Advanced Atmospherics" outfit = /datum/outfit/request_911/atmos /datum/outfit/request_911/atmos - name = "811 Response: Breach Control" - back = /obj/item/mod/control/pre_equipped/atmospheric/breach_control - uniform = /obj/item/clothing/under/rank/engineering/engineer/hazard - shoes = /obj/item/clothing/shoes/workboots - ears = /obj/item/radio/headset/headset_eng - mask = /obj/item/clothing/mask/gas/atmos - belt = /obj/item/storage/belt/utility/full + name = "811 Response: Advanced Atmospherics" + back = /obj/item/mod/control/pre_equipped/advanced/atmos + uniform = /obj/item/clothing/under/rank/engineering/atmospheric_technician/skyrat/utility/advanced + shoes = /obj/item/clothing/shoes/jackboots/peacekeeper + ears = /obj/item/radio/headset/headset_solfed/atmos + mask = /obj/item/clothing/mask/gas/atmos/glass + belt = /obj/item/storage/belt/utility/full/powertools/ircd suit_store = /obj/item/tank/internals/oxygen/yellow id = /obj/item/card/id/advanced/solfed - l_pocket = /obj/item/extinguisher/mini - backpack_contents = list(/obj/item/storage/box/survival = 1, - /obj/item/extinguisher = 1, - /obj/item/storage/box/smart_metal_foam = 2, + backpack_contents = list(/obj/item/storage/box/rcd_ammo = 1, + /obj/item/storage/box/smart_metal_foam = 1, + /obj/item/multitool = 1, + /obj/item/extinguisher/advanced = 1, + /obj/item/rwd/loaded = 1, + /obj/item/beamout_tool = 1, /obj/item/solfed_reporter/swat_caller = 1, - /obj/item/beamout_tool = 1) + ) id_trim = /datum/id_trim/solfed -// Breach control MODsuit -/obj/item/mod/control/pre_equipped/atmospheric/breach_control //Just a different kit as 811 wont be raiding Robotics; otherwise the same look (For now???) - theme = /datum/mod_theme/atmospheric/breach_control - applied_cell = /obj/item/stock_parts/cell/super - applied_modules = list( - /obj/item/mod/module/storage/large_capacity, - /obj/item/mod/module/welding, - /obj/item/mod/module/rad_protection, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/t_ray, - /obj/item/mod/module/tether, - /obj/item/mod/module/visor/meson, - ) +/obj/item/radio/headset/headset_solfed/atmos + name = "\improper SolFed advanced atmos headset" + desc = "A headset used by the Solar Federation response teams." + icon_state = "med_headset" + keyslot = /obj/item/encryptionkey/headset_solfed/atmos + radiosound = 'modular_skyrat/modules/radiosound/sound/radio/security.ogg' -/datum/mod_theme/atmospheric/breach_control //Implement a unique skin for this eventually - ui_theme = "neutral" //Le yellow Sol +/obj/item/encryptionkey/headset_solfed/atmos + name = "\improper SolFed advanced atmos encryption key" + icon_state = "cypherkey_medical" + independent = TRUE + channels = list(RADIO_CHANNEL_SOLFED = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_COMMAND = 1) + greyscale_config = /datum/greyscale_config/encryptionkey_medical + greyscale_colors = "#ebebeb#2b2793" /* * EMT diff --git a/tgstation.dme b/tgstation.dme index f8a6eb2d551..2dd2a83a1da 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -378,6 +378,7 @@ #include "code\__DEFINES\~skyrat_defines\say.dm" #include "code\__DEFINES\~skyrat_defines\security_alerts.dm" #include "code\__DEFINES\~skyrat_defines\signals.dm" +#include "code\__DEFINES\~skyrat_defines\solfed.dm" #include "code\__DEFINES\~skyrat_defines\sound.dm" #include "code\__DEFINES\~skyrat_defines\span.dm" #include "code\__DEFINES\~skyrat_defines\species_clothing_paths.dm" @@ -5433,6 +5434,7 @@ #include "modular_skyrat\modules\admin\code\manage_player_ranks.dm" #include "modular_skyrat\modules\admin\code\sooc.dm" #include "modular_skyrat\modules\admin\code\smites\pie.dm" +#include "modular_skyrat\modules\advanced_engineering\code\adv_engineering.dm" #include "modular_skyrat\modules\advanced_shuttles\code\closet.dm" #include "modular_skyrat\modules\advanced_shuttles\code\computer.dm" #include "modular_skyrat\modules\advanced_shuttles\code\decals.dm" @@ -5500,6 +5502,7 @@ #include "modular_skyrat\modules\alerts\code\default_announcer.dm" #include "modular_skyrat\modules\alerts\code\priority_announce.dm" #include "modular_skyrat\modules\alerts\code\security_level_datums.dm" +#include "modular_skyrat\modules\alerts\code\security_level_procs.dm" #include "modular_skyrat\modules\alt_vox\code\voc_sounds_mil.dm" #include "modular_skyrat\modules\alt_vox\code\vox_procs.dm" #include "modular_skyrat\modules\alt_vox\code\vox_sounds_bms.dm" @@ -6027,7 +6030,6 @@ #include "modular_skyrat\modules\event_vote\code\event_vote.dm" #include "modular_skyrat\modules\events\code\_event_globalvars.dm" #include "modular_skyrat\modules\events\code\event_overrides.dm" -#include "modular_skyrat\modules\events\code\event_seclevel.dm" #include "modular_skyrat\modules\events\code\event_spawner.dm" #include "modular_skyrat\modules\events\code\event_spawner_menu.dm" #include "modular_skyrat\modules\examinemore\code\examine_more.dm" diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole.js b/tgui/packages/tgui/interfaces/CommunicationsConsole.js index d27090a57d7..9783fd86432 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsConsole.js +++ b/tgui/packages/tgui/interfaces/CommunicationsConsole.js @@ -471,8 +471,8 @@ const PageMain = (props, context) => { {!!canMakeAnnouncement && (